nixos/exportarr: init

This commit is contained in:
Felix Buehler 2023-10-18 00:06:26 +02:00
parent a8e6f0a81a
commit 4d1680ccc7
4 changed files with 110 additions and 8 deletions

View file

@ -123,6 +123,8 @@
- [ZITADEL](https://zitadel.com), a turnkey identity and access management platform. Available as [services.zitadel](#opt-services.zitadel.enable).
- [exportarr](https://github.com/onedr0p/exportarr), Prometheus Exporters for Bazarr, Lidarr, Prowlarr, Radarr, Readarr, and Sonarr. Available as [services.prometheus.exporters.exportarr-bazarr](#opt-services.prometheus.exporters.exportarr-bazarr.enable)/[services.prometheus.exporters.exportarr-lidarr](#opt-services.prometheus.exporters.exportarr-lidarr.enable)/[services.prometheus.exporters.exportarr-prowlarr](#opt-services.prometheus.exporters.exportarr-prowlarr.enable)/[services.prometheus.exporters.exportarr-radarr](#opt-services.prometheus.exporters.exportarr-radarr.enable)/[services.prometheus.exporters.exportarr-readarr](#opt-services.prometheus.exporters.exportarr-readarr.enable)/[services.prometheus.exporters.exportarr-sonarr](#opt-services.prometheus.exporters.exportarr-sonarr.enable).
- [netclient](https://github.com/gravitl/netclient), an automated WireGuard® Management Client. Available as [services.netclient](#opt-services.netclient.enable).
- [trunk-ng](https://github.com/ctron/trunk), A fork of `trunk`: Build, bundle & ship your Rust WASM application to the web

View file

@ -2,7 +2,7 @@
let
inherit (lib) concatStrings foldl foldl' genAttrs literalExpression maintainers
mapAttrsToList mkDefault mkEnableOption mkIf mkMerge mkOption
mapAttrs mapAttrsToList mkDefault mkEnableOption mkIf mkMerge mkOption
optional types mkOptionDefault flip attrNames;
cfg = config.services.prometheus.exporters;
@ -20,7 +20,7 @@ let
# systemd service must be provided by specifying either
# `serviceOpts.script` or `serviceOpts.serviceConfig.ExecStart`
exporterOpts = genAttrs [
exporterOpts = (genAttrs [
"apcupsd"
"artifactory"
"bind"
@ -34,14 +34,15 @@ let
"domain"
"dovecot"
"fastly"
"flow"
"fritzbox"
"graphite"
"idrac"
"imap-mailstat"
"influxdb"
"ipmi"
"json"
"jitsi"
"json"
"junos-czerwonk"
"kea"
"keylight"
@ -74,9 +75,9 @@ let
"scaphandre"
"script"
"shelly"
"snmp"
"smartctl"
"smokeping"
"snmp"
"sql"
"statsd"
"surfboard"
@ -88,10 +89,39 @@ let
"v2ray"
"varnish"
"wireguard"
"flow"
"zfs"
] (name:
]
(name:
import (./. + "/exporters/${name}.nix") { inherit config lib pkgs options; }
)) // (mapAttrs
(name: params:
import (./. + "/exporters/${params.name}.nix") { inherit config lib pkgs options; type = params.type ; })
{
exportarr-bazarr = {
name = "exportarr";
type = "bazarr";
};
exportarr-lidarr = {
name = "exportarr";
type = "lidarr";
};
exportarr-prowlarr = {
name = "exportarr";
type = "prowlarr";
};
exportarr-radarr = {
name = "exportarr";
type = "radarr";
};
exportarr-readarr = {
name = "exportarr";
type = "readarr";
};
exportarr-sonarr = {
name = "exportarr";
type = "sonarr";
};
}
);
mkExporterOpts = ({ name, port }: {

View file

@ -0,0 +1,55 @@
{ config, lib, pkgs, options, type }:
let
cfg = config.services.prometheus.exporters."exportarr-${type}";
exportarrEnvironment = (
lib.mapAttrs (_: toString) cfg.environment
) // {
PORT = toString cfg.port;
URL = cfg.url;
API_KEY_FILE = lib.mkIf (cfg.apiKeyFile != null) "%d/api-key";
};
in
{
port = 9708;
extraOpts = {
url = lib.mkOption {
type = lib.types.str;
default = "http://127.0.0.1";
description = lib.mdDoc ''
The full URL to Sonarr, Radarr, or Lidarr.
'';
};
apiKeyFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = lib.mdDoc ''
File containing the api-key.
'';
};
package = lib.mkPackageOptionMD pkgs "exportarr" { };
environment = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
description = lib.mdDoc ''
See [the configuration guide](https://github.com/onedr0p/exportarr#configuration) for available options.
'';
example = {
PROWLARR__BACKFILL = true;
};
};
};
serviceOpts = {
serviceConfig = {
LoadCredential = lib.optionalString (cfg.apiKeyFile != null) "api-key:${cfg.apiKeyFile}";
ExecStart = ''${cfg.package}/bin/exportarr ${type} "$@"'';
ProcSubset = "pid";
ProtectProc = "invisible";
SystemCallFilter = ["@system-service" "~@privileged"];
};
environment = exportarrEnvironment;
};
}

View file

@ -257,6 +257,21 @@ let
'';
};
exportarr-sonarr = {
nodeName = "exportarr_sonarr";
exporterConfig = {
enable = true;
url = "http://127.0.0.1:8989";
# testing for real data is tricky, because the api key can not be preconfigured
apiKeyFile = pkgs.writeText "dummy-api-key" "eccff6a992bc2e4b88e46d064b26bb4e";
};
exporterTest = ''
wait_for_unit("prometheus-exportarr-sonarr-exporter.service")
wait_for_open_port(9707)
succeed("curl -sSf 'http://localhost:9707/metrics")
'';
};
fastly = {
exporterConfig = {
enable = true;