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