at 25.11-pre 3.7 kB view raw
1{ 2 config, 3 pkgs, 4 lib, 5 ... 6}: 7let 8 cfg = config.services.nzbget; 9 stateDir = "/var/lib/nzbget"; 10 configFile = "${stateDir}/nzbget.conf"; 11 configOpts = lib.concatStringsSep " " ( 12 lib.mapAttrsToList (name: value: "-o ${name}=${lib.escapeShellArg (toStr value)}") cfg.settings 13 ); 14 toStr = 15 v: 16 if v == true then 17 "yes" 18 else if v == false then 19 "no" 20 else if lib.isInt v then 21 toString v 22 else 23 v; 24in 25{ 26 imports = [ 27 (lib.mkRemovedOptionModule [ 28 "services" 29 "misc" 30 "nzbget" 31 "configFile" 32 ] "The configuration of nzbget is now managed by users through the web interface.") 33 (lib.mkRemovedOptionModule [ 34 "services" 35 "misc" 36 "nzbget" 37 "dataDir" 38 ] "The data directory for nzbget is now /var/lib/nzbget.") 39 (lib.mkRemovedOptionModule [ "services" "misc" "nzbget" "openFirewall" ] 40 "The port used by nzbget is managed through the web interface so you should adjust your firewall rules accordingly." 41 ) 42 ]; 43 44 # interface 45 46 options = { 47 services.nzbget = { 48 enable = lib.mkEnableOption "NZBGet, for downloading files from news servers"; 49 50 package = lib.mkPackageOption pkgs "nzbget" { }; 51 52 user = lib.mkOption { 53 type = lib.types.str; 54 default = "nzbget"; 55 description = "User account under which NZBGet runs"; 56 }; 57 58 group = lib.mkOption { 59 type = lib.types.str; 60 default = "nzbget"; 61 description = "Group under which NZBGet runs"; 62 }; 63 64 settings = lib.mkOption { 65 type = 66 with lib.types; 67 attrsOf (oneOf [ 68 bool 69 int 70 str 71 ]); 72 default = { }; 73 description = '' 74 NZBGet configuration, passed via command line using switch -o. Refer to 75 <https://github.com/nzbget/nzbget/blob/master/nzbget.conf> 76 for details on supported values. 77 ''; 78 example = { 79 MainDir = "/data"; 80 }; 81 }; 82 }; 83 }; 84 85 # implementation 86 87 config = lib.mkIf cfg.enable { 88 services.nzbget.settings = { 89 # allows nzbget to run as a "simple" service 90 OutputMode = "loggable"; 91 # use journald for logging 92 WriteLog = "none"; 93 ErrorTarget = "screen"; 94 WarningTarget = "screen"; 95 InfoTarget = "screen"; 96 DetailTarget = "screen"; 97 # required paths 98 ConfigTemplate = "${cfg.package}/share/nzbget/nzbget.conf"; 99 WebDir = "${cfg.package}/share/nzbget/webui"; 100 # nixos handles package updates 101 UpdateCheck = "none"; 102 }; 103 104 systemd.services.nzbget = { 105 description = "NZBGet Daemon"; 106 after = [ "network.target" ]; 107 wantedBy = [ "multi-user.target" ]; 108 path = with pkgs; [ 109 unrar 110 p7zip 111 ]; 112 113 preStart = '' 114 if [ ! -f ${configFile} ]; then 115 ${pkgs.coreutils}/bin/install -m 0700 ${cfg.package}/share/nzbget/nzbget.conf ${configFile} 116 fi 117 ''; 118 119 serviceConfig = { 120 StateDirectory = "nzbget"; 121 StateDirectoryMode = "0750"; 122 User = cfg.user; 123 Group = cfg.group; 124 UMask = "0002"; 125 Restart = "on-failure"; 126 ExecStart = "${cfg.package}/bin/nzbget --server --configfile ${stateDir}/nzbget.conf ${configOpts}"; 127 ExecStop = "${cfg.package}/bin/nzbget --quit"; 128 }; 129 }; 130 131 users.users = lib.mkIf (cfg.user == "nzbget") { 132 nzbget = { 133 home = stateDir; 134 group = cfg.group; 135 uid = config.ids.uids.nzbget; 136 }; 137 }; 138 139 users.groups = lib.mkIf (cfg.group == "nzbget") { 140 nzbget = { 141 gid = config.ids.gids.nzbget; 142 }; 143 }; 144 }; 145}