vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / syncthing-relay.nix
blobb6bf3944e94ccb587c6926044615eddce6fe5731
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.syncthing.relay;
8   dataDirectory = "/var/lib/syncthing-relay";
10   relayOptions =
11     [
12       "--keys=${dataDirectory}"
13       "--listen=${cfg.listenAddress}:${toString cfg.port}"
14       "--status-srv=${cfg.statusListenAddress}:${toString cfg.statusPort}"
15       "--provided-by=${escapeShellArg cfg.providedBy}"
16     ]
17     ++ optional (cfg.pools != null) "--pools=${escapeShellArg (concatStringsSep "," cfg.pools)}"
18     ++ optional (cfg.globalRateBps != null) "--global-rate=${toString cfg.globalRateBps}"
19     ++ optional (cfg.perSessionRateBps != null) "--per-session-rate=${toString cfg.perSessionRateBps}"
20     ++ cfg.extraOptions;
21 in {
22   ###### interface
24   options.services.syncthing.relay = {
25     enable = mkEnableOption "Syncthing relay service";
27     listenAddress = mkOption {
28       type = types.str;
29       default = "";
30       example = "1.2.3.4";
31       description = ''
32         Address to listen on for relay traffic.
33       '';
34     };
36     port = mkOption {
37       type = types.port;
38       default = 22067;
39       description = ''
40         Port to listen on for relay traffic. This port should be added to
41         `networking.firewall.allowedTCPPorts`.
42       '';
43     };
45     statusListenAddress = mkOption {
46       type = types.str;
47       default = "";
48       example = "1.2.3.4";
49       description = ''
50         Address to listen on for serving the relay status API.
51       '';
52     };
54     statusPort = mkOption {
55       type = types.port;
56       default = 22070;
57       description = ''
58         Port to listen on for serving the relay status API. This port should be
59         added to `networking.firewall.allowedTCPPorts`.
60       '';
61     };
63     pools = mkOption {
64       type = types.nullOr (types.listOf types.str);
65       default = null;
66       description = ''
67         Relay pools to join. If null, uses the default global pool.
68       '';
69     };
71     providedBy = mkOption {
72       type = types.str;
73       default = "";
74       description = ''
75         Human-readable description of the provider of the relay (you).
76       '';
77     };
79     globalRateBps = mkOption {
80       type = types.nullOr types.ints.positive;
81       default = null;
82       description = ''
83         Global bandwidth rate limit in bytes per second.
84       '';
85     };
87     perSessionRateBps = mkOption {
88       type = types.nullOr types.ints.positive;
89       default = null;
90       description = ''
91         Per session bandwidth rate limit in bytes per second.
92       '';
93     };
95     extraOptions = mkOption {
96       type = types.listOf types.str;
97       default = [];
98       description = ''
99         Extra command line arguments to pass to strelaysrv.
100       '';
101     };
102   };
104   ###### implementation
106   config = mkIf cfg.enable {
107     systemd.services.syncthing-relay = {
108       description = "Syncthing relay service";
109       wantedBy = [ "multi-user.target" ];
110       after = [ "network.target" ];
112       serviceConfig = {
113         DynamicUser = true;
114         StateDirectory = baseNameOf dataDirectory;
116         Restart = "on-failure";
117         ExecStart = "${pkgs.syncthing-relay}/bin/strelaysrv ${concatStringsSep " " relayOptions}";
118       };
119     };
120   };