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}