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