diff --git a/nixos/modules/services/misc/sonarr.nix b/nixos/modules/services/misc/sonarr.nix
index b11293cbd27a..65f43df08312 100644
--- a/nixos/modules/services/misc/sonarr.nix
+++ b/nixos/modules/services/misc/sonarr.nix
@@ -7,18 +7,6 @@
}:
let
cfg = config.services.sonarr;
-
- settingsEnvVars = lib.pipe cfg.settings [
- (lib.mapAttrsRecursive (
- path: value:
- lib.optionalAttrs (value != null) {
- name = lib.toUpper "SONARR__${lib.concatStringsSep "__" path}";
- value = toString (if lib.isBool value then lib.boolToString value else value);
- }
- ))
- (lib.collect (x: lib.isString x.name or false && lib.isString x.value or false))
- lib.listToAttrs
- ];
in
{
options = {
@@ -39,85 +27,6 @@ in
'';
};
- apiKeyFile = lib.mkOption {
- type = lib.types.nullOr lib.types.path;
- description = ''
- Path to the file containing the API key for Sonarr (32 chars).
- This will overwrite the API key in the config file.
- '';
- example = "/run/secrets/sonarr-apikey";
- default = null;
- };
-
- environmentFiles = lib.mkOption {
- type = lib.types.listOf lib.types.path;
- default = [ ];
- description = ''
- Environment file to pass secret configuration values.
-
- Each line must follow the `SONARR__SECTION__KEY=value` pattern.
- Please consult the documentation at the [wiki](https://wiki.servarr.com/useful-tools#using-environment-variables-for-config).
- '';
- };
-
- settings = lib.mkOption {
- type = lib.types.submodule {
- freeformType = (pkgs.formats.ini { }).type;
- options = {
- update = {
- mechanism = lib.mkOption {
- type =
- with lib.types;
- nullOr (enum [
- "external"
- "builtIn"
- "script"
- ]);
- description = "which update mechanism to use";
- default = "external";
- };
- automatically = lib.mkOption {
- type = lib.types.bool;
- description = "Automatically download and install updates.";
- default = false;
- };
- };
- server = {
- port = lib.mkOption {
- type = lib.types.int;
- description = "Port Number";
- default = 8989;
- };
- };
- log = {
- analyticsEnabled = lib.mkOption {
- type = lib.types.bool;
- description = "Send Anonymous Usage Data";
- default = false;
- };
- };
- };
- };
- example = lib.options.literalExpression ''
- {
- update.mechanism = "internal";
- server = {
- urlbase = "localhost";
- port = 8989;
- bindaddress = "*";
- };
- }
- '';
- default = { };
- description = ''
- Attribute set of arbitrary config options.
- Please consult the documentation at the [wiki](https://wiki.servarr.com/useful-tools#using-environment-variables-for-config).
-
- WARNING: this configuration is stored in the world-readable Nix store!
- Use [](#opt-services.sonarr.environmentFiles) if it contains a secret.
- '';
- };
-
user = lib.mkOption {
type = lib.types.str;
default = "sonarr";
@@ -135,15 +44,6 @@ in
};
config = lib.mkIf cfg.enable {
- assertions = [
- {
- assertion = !(cfg.settings ? auth && cfg.settings.auth ? apikey);
- message = ''
- The `services.sonarr.settings` attribute set must not contain `ApiKey`, you should instead use `services.sonarr.apiKeyFile` to avoid storing secrets in the Nix store.
- '';
- }
- ];
-
systemd.tmpfiles.rules = [
"d '${cfg.dataDir}' 0700 ${cfg.user} ${cfg.group} - -"
];
@@ -152,20 +52,11 @@ in
description = "Sonarr";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
- environment = settingsEnvVars;
+
serviceConfig = {
Type = "simple";
User = cfg.user;
Group = cfg.group;
- EnvironmentFile = cfg.environmentFiles;
- LoadCredential = lib.optional (cfg.apiKeyFile != null) "SONARR__AUTH__APIKEY:${cfg.apiKeyFile}";
- ExecStartPre = lib.optionalString (cfg.apiKeyFile != null) pkgs.writeShellScript "sonarr-apikey" ''
- if [ ! -s config.xml ]; then
- echo '' > "${cfg.dataDir}/config.xml"
- fi
- ${lib.getExe pkgs.xmlstarlet} ed -L -u "/Config/ApiKey" -v "@API_KEY@" "${cfg.dataDir}/config.xml"
- ${lib.getExe pkgs.replace-secret} '@API_KEY@' ''${CREDENTIALS_DIRECTORY}/SONARR__AUTH__APIKEY "${cfg.dataDir}/config.xml"
- '';
ExecStart = utils.escapeSystemdExecArgs [
(lib.getExe cfg.package)
"-nobrowser"
@@ -176,7 +67,7 @@ in
};
networking.firewall = lib.mkIf cfg.openFirewall {
- allowedTCPPorts = [ cfg.settings.server.port ];
+ allowedTCPPorts = [ 8989 ];
};
users.users = lib.mkIf (cfg.user == "sonarr") {
diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix
index 7b2b757f6479..be11bddb9329 100644
--- a/nixos/tests/prometheus-exporters.nix
+++ b/nixos/tests/prometheus-exporters.nix
@@ -356,18 +356,36 @@ let
'';
};
- exportarr-sonarr = let apiKeyFile = pkgs.writeText "dummy-api-key" "eccff6a992bc2e4b88e46d064b26bb4e"; in {
+ exportarr-sonarr = let apikey = "eccff6a992bc2e4b88e46d064b26bb4e"; in {
nodeName = "exportarr_sonarr";
exporterConfig = {
enable = true;
url = "http://127.0.0.1:8989";
- inherit apiKeyFile;
+ apiKeyFile = pkgs.writeText "dummy-api-key" apikey;
};
metricProvider = {
- services.sonarr = {
- enable = true;
- inherit apiKeyFile;
- };
+ services.sonarr.enable = true;
+ systemd.services.sonarr.serviceConfig.ExecStartPre =
+ let
+ sonarr_config = pkgs.writeText "config.xml" ''
+
+ info
+ False
+ 8989
+ 9898
+
+ *
+ ${apikey}
+ None
+ BuiltIn
+ main
+ Sonarr
+
+ '';
+ in
+ [
+ ''${pkgs.coreutils}/bin/install -D -m 777 ${sonarr_config} -T /var/lib/sonarr/.config/NzbDrone/config.xml''
+ ];
};
exporterTest = ''
wait_for_unit("sonarr.service")