Unverified Commit f2fc5b41 authored by Felix Bühler's avatar Felix Bühler Committed by GitHub
Browse files

Merge pull request #265696 from Stunkymonkey/nixos-exportarr

nixos/exportarr: init
parents 582f1e73 4d1680cc
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -127,6 +127,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
+38 −8
Original line number Diff line number Diff line
@@ -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 }: {
+55 −0
Original line number Diff line number Diff line
{ 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;
  };
}
+15 −0
Original line number Diff line number Diff line
@@ -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;