Merge #361424: refactor lib.packagesFromDirectoryRecursive (v2)
[NixPkgs.git] / nixos / modules / services / networking / gnunet.nix
bloba00c0e8e923d7535600c6d5c0543ee8dd854b2a9
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
9   cfg = config.services.gnunet;
11   stateDir = "/var/lib/gnunet";
13   configFile = with cfg; ''
14     [PATHS]
15     GNUNET_HOME = ${stateDir}
16     GNUNET_RUNTIME_DIR = /run/gnunet
17     GNUNET_USER_RUNTIME_DIR = /run/gnunet
18     GNUNET_DATA_HOME = ${stateDir}/data
20     [ats]
21     WAN_QUOTA_IN = ${toString load.maxNetDownBandwidth} b
22     WAN_QUOTA_OUT = ${toString load.maxNetUpBandwidth} b
24     [datastore]
25     QUOTA = ${toString fileSharing.quota} MB
27     [transport-udp]
28     PORT = ${toString udp.port}
29     ADVERTISED_PORT = ${toString udp.port}
31     [transport-tcp]
32     PORT = ${toString tcp.port}
33     ADVERTISED_PORT = ${toString tcp.port}
35     ${extraOptions}
36   '';
42   ###### interface
44   options = {
46     services.gnunet = {
48       enable = lib.mkOption {
49         type = lib.types.bool;
50         default = false;
51         description = ''
52           Whether to run the GNUnet daemon.  GNUnet is GNU's anonymous
53           peer-to-peer communication and file sharing framework.
54         '';
55       };
57       fileSharing = {
58         quota = lib.mkOption {
59           type = lib.types.int;
60           default = 1024;
61           description = ''
62             Maximum file system usage (in MiB) for file sharing.
63           '';
64         };
65       };
67       udp = {
68         port = lib.mkOption {
69           type = lib.types.port;
70           default = 2086; # assigned by IANA
71           description = ''
72             The UDP port for use by GNUnet.
73           '';
74         };
75       };
77       tcp = {
78         port = lib.mkOption {
79           type = lib.types.port;
80           default = 2086; # assigned by IANA
81           description = ''
82             The TCP port for use by GNUnet.
83           '';
84         };
85       };
87       load = {
88         maxNetDownBandwidth = lib.mkOption {
89           type = lib.types.int;
90           default = 50000;
91           description = ''
92             Maximum bandwidth usage (in bits per second) for GNUnet
93             when downloading data.
94           '';
95         };
97         maxNetUpBandwidth = lib.mkOption {
98           type = lib.types.int;
99           default = 50000;
100           description = ''
101             Maximum bandwidth usage (in bits per second) for GNUnet
102             when downloading data.
103           '';
104         };
106         hardNetUpBandwidth = lib.mkOption {
107           type = lib.types.int;
108           default = 0;
109           description = ''
110             Hard bandwidth limit (in bits per second) when uploading
111             data.
112           '';
113         };
114       };
116       package = lib.mkPackageOption pkgs "gnunet" {
117         example = "gnunet_git";
118       };
120       extraOptions = lib.mkOption {
121         type = lib.types.lines;
122         default = "";
123         description = ''
124           Additional options that will be copied verbatim in `gnunet.conf`.
125           See {manpage}`gnunet.conf(5)` for details.
126         '';
127       };
128     };
130   };
132   ###### implementation
134   config = lib.mkIf config.services.gnunet.enable {
136     users.users.gnunet = {
137       group = "gnunet";
138       description = "GNUnet User";
139       uid = config.ids.uids.gnunet;
140     };
142     users.groups.gnunet.gid = config.ids.gids.gnunet;
144     # The user tools that talk to `gnunetd' should come from the same source,
145     # so install them globally.
146     environment.systemPackages = [ cfg.package ];
148     environment.etc."gnunet.conf".text = configFile;
150     systemd.services.gnunet = {
151       description = "GNUnet";
152       after = [ "network.target" ];
153       wantedBy = [ "multi-user.target" ];
154       restartTriggers = [ config.environment.etc."gnunet.conf".source ];
155       path = [
156         cfg.package
157         pkgs.miniupnpc
158       ];
159       serviceConfig.ExecStart = "${cfg.package}/lib/gnunet/libexec/gnunet-service-arm -c /etc/gnunet.conf";
160       serviceConfig.User = "gnunet";
161       serviceConfig.UMask = "0007";
162       serviceConfig.WorkingDirectory = stateDir;
163       serviceConfig.RuntimeDirectory = "gnunet";
164       serviceConfig.StateDirectory = "gnunet";
165     };
167   };