vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / monero.nix
blob5cb418a9f1e62d26468df8fb521e2ed9594cfd6d
1 { config, lib, pkgs, ... }:
3 let
4   cfg     = config.services.monero;
6   listToConf = option: list:
7     lib.concatMapStrings (value: "${option}=${value}\n") list;
9   login = (cfg.rpc.user != null && cfg.rpc.password != null);
11   configFile = with cfg; pkgs.writeText "monero.conf" ''
12     log-file=/dev/stdout
13     data-dir=${dataDir}
15     ${lib.optionalString mining.enable ''
16       start-mining=${mining.address}
17       mining-threads=${toString mining.threads}
18     ''}
20     rpc-bind-ip=${rpc.address}
21     rpc-bind-port=${toString rpc.port}
22     ${lib.optionalString login ''
23       rpc-login=${rpc.user}:${rpc.password}
24     ''}
25     ${lib.optionalString rpc.restricted ''
26       restricted-rpc=1
27     ''}
29     limit-rate-up=${toString limits.upload}
30     limit-rate-down=${toString limits.download}
31     max-concurrency=${toString limits.threads}
32     block-sync-size=${toString limits.syncSize}
34     ${listToConf "add-peer" extraNodes}
35     ${listToConf "add-priority-node" priorityNodes}
36     ${listToConf "add-exclusive-node" exclusiveNodes}
38     ${extraConfig}
39   '';
45   ###### interface
47   options = {
49     services.monero = {
51       enable = lib.mkEnableOption "Monero node daemon";
53       dataDir = lib.mkOption {
54         type = lib.types.str;
55         default = "/var/lib/monero";
56         description = ''
57           The directory where Monero stores its data files.
58         '';
59       };
61       mining.enable = lib.mkOption {
62         type = lib.types.bool;
63         default = false;
64         description = ''
65           Whether to mine monero.
66         '';
67       };
69       mining.address = lib.mkOption {
70         type = lib.types.str;
71         default = "";
72         description = ''
73           Monero address where to send mining rewards.
74         '';
75       };
77       mining.threads = lib.mkOption {
78         type = lib.types.addCheck lib.types.int (x: x>=0);
79         default = 0;
80         description = ''
81           Number of threads used for mining.
82           Set to `0` to use all available.
83         '';
84       };
86       rpc.user = lib.mkOption {
87         type = lib.types.nullOr lib.types.str;
88         default = null;
89         description = ''
90           User name for RPC connections.
91         '';
92       };
94       rpc.password = lib.mkOption {
95         type = lib.types.nullOr lib.types.str;
96         default = null;
97         description = ''
98           Password for RPC connections.
99         '';
100       };
102       rpc.address = lib.mkOption {
103         type = lib.types.str;
104         default = "127.0.0.1";
105         description = ''
106           IP address the RPC server will bind to.
107         '';
108       };
110       rpc.port = lib.mkOption {
111         type = lib.types.port;
112         default = 18081;
113         description = ''
114           Port the RPC server will bind to.
115         '';
116       };
118       rpc.restricted = lib.mkOption {
119         type = lib.types.bool;
120         default = false;
121         description = ''
122           Whether to restrict RPC to view only commands.
123         '';
124       };
126       limits.upload = lib.mkOption {
127         type = lib.types.addCheck lib.types.int (x: x>=-1);
128         default = -1;
129         description = ''
130           Limit of the upload rate in kB/s.
131           Set to `-1` to leave unlimited.
132         '';
133       };
135       limits.download = lib.mkOption {
136         type = lib.types.addCheck lib.types.int (x: x>=-1);
137         default = -1;
138         description = ''
139           Limit of the download rate in kB/s.
140           Set to `-1` to leave unlimited.
141         '';
142       };
144       limits.threads = lib.mkOption {
145         type = lib.types.addCheck lib.types.int (x: x>=0);
146         default = 0;
147         description = ''
148           Maximum number of threads used for a parallel job.
149           Set to `0` to leave unlimited.
150         '';
151       };
153       limits.syncSize = lib.mkOption {
154         type = lib.types.addCheck lib.types.int (x: x>=0);
155         default = 0;
156         description = ''
157           Maximum number of blocks to sync at once.
158           Set to `0` for adaptive.
159         '';
160       };
162       extraNodes = lib.mkOption {
163         type = lib.types.listOf lib.types.str;
164         default = [ ];
165         description = ''
166           List of additional peer IP addresses to add to the local list.
167         '';
168       };
170       priorityNodes = lib.mkOption {
171         type = lib.types.listOf lib.types.str;
172         default = [ ];
173         description = ''
174           List of peer IP addresses to connect to and
175           attempt to keep the connection open.
176         '';
177       };
179       exclusiveNodes = lib.mkOption {
180         type = lib.types.listOf lib.types.str;
181         default = [ ];
182         description = ''
183           List of peer IP addresses to connect to *only*.
184           If given the other peer options will be ignored.
185         '';
186       };
188       extraConfig = lib.mkOption {
189         type = lib.types.lines;
190         default = "";
191         description = ''
192           Extra lines to be added verbatim to monerod configuration.
193         '';
194       };
196     };
198   };
201   ###### implementation
203   config = lib.mkIf cfg.enable {
205     users.users.monero = {
206       isSystemUser = true;
207       group = "monero";
208       description = "Monero daemon user";
209       home = cfg.dataDir;
210       createHome = true;
211     };
213     users.groups.monero = { };
215     systemd.services.monero = {
216       description = "monero daemon";
217       after    = [ "network.target" ];
218       wantedBy = [ "multi-user.target" ];
220       serviceConfig = {
221         User  = "monero";
222         Group = "monero";
223         ExecStart = "${pkgs.monero-cli}/bin/monerod --config-file=${configFile} --non-interactive";
224         Restart = "always";
225         SuccessExitStatus = [ 0 1 ];
226       };
227     };
229     assertions = lib.singleton {
230       assertion = cfg.mining.enable -> cfg.mining.address != "";
231       message   = ''
232        You need a Monero address to receive mining rewards:
233        specify one using option monero.mining.address.
234       '';
235     };
237   };
239   meta.maintainers = with lib.maintainers; [ rnhmjoj ];