vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / zeronsd.nix
blob23f1a5fa7e4f8aa8be55d71089ef69d35c45348d
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   cfg = config.services.zeronsd;
10   settingsFormat = pkgs.formats.json { };
13   options.services.zeronsd.servedNetworks = lib.mkOption {
14     default = { };
15     example = {
16       "a8a2c3c10c1a68de".settings.token = "/var/lib/zeronsd/apitoken";
17     };
18     description = "ZeroTier Networks to start zeronsd instances for.";
19     type = lib.types.attrsOf (
20       lib.types.submodule {
21         options = {
22           package = lib.mkPackageOption pkgs "zeronsd" { };
24           settings = lib.mkOption {
25             description = "Settings for zeronsd";
26             default = { };
27             type = lib.types.submodule {
28               freeformType = settingsFormat.type;
30               options = {
31                 domain = lib.mkOption {
32                   default = "home.arpa";
33                   type = lib.types.singleLineStr;
34                   description = "Domain under which ZeroTier records will be available.";
35                 };
37                 token = lib.mkOption {
38                   type = lib.types.path;
39                   description = "Path to a file containing the API Token for ZeroTier Central.";
40                 };
42                 log_level = lib.mkOption {
43                   default = "warn";
44                   type = lib.types.enum [
45                     "off"
46                     "error"
47                     "warn"
48                     "info"
49                     "debug"
50                     "trace"
51                   ];
52                   description = "Log Level.";
53                 };
55                 wildcard = lib.mkOption {
56                   default = false;
57                   type = lib.types.bool;
58                   description = "Whether to serve a wildcard record for ZeroTier Nodes.";
59                 };
60               };
61             };
62           };
63         };
64       }
65     );
66   };
68   config = lib.mkIf (cfg.servedNetworks != { }) {
69     assertions = [
70       {
71         assertion = config.services.zerotierone.enable;
72         message = "zeronsd needs a configured zerotier-one";
73       }
74     ];
76     systemd.services = lib.mapAttrs' (netname: netcfg: {
77       name = "zeronsd-${netname}";
78       value = {
79         description = "ZeroTier DNS server for Network ${netname}";
81         wantedBy = [ "multi-user.target" ];
82         after = [
83           "network.target"
84           "zerotierone.service"
85         ];
86         wants = [ "network-online.target" ];
88         serviceConfig =
89           let
90             configFile = pkgs.writeText "zeronsd.json" (builtins.toJSON netcfg.settings);
91           in
92           {
93             ExecStart = "${netcfg.package}/bin/zeronsd start --config ${configFile} --config-type json ${netname}";
94             Restart = "on-failure";
95             RestartSec = 2;
96             TimeoutStopSec = 5;
97             User = "zeronsd";
98             Group = "zeronsd";
99             AmbientCapabilities = "CAP_NET_BIND_SERVICE";
100           };
101       };
102     }) cfg.servedNetworks;
104     systemd.tmpfiles.rules = [
105       "a+ /var/lib/zerotier-one - - - - u:zeronsd:x"
106       "a+ /var/lib/zerotier-one/authtoken.secret - - - - mask::r,u:zeronsd:r"
107     ];
109     users.users.zeronsd = {
110       group = "zeronsd";
111       description = "Service user for running zeronsd";
112       isSystemUser = true;
113     };
115     users.groups.zeronsd = { };
116   };