vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / rdnssd.nix
blob726ba409a81a338ed4eace4ae05662e663878c42
1 # Module for rdnssd, a daemon that configures DNS servers in
2 # /etc/resolv/conf from IPv6 RDNSS advertisements.
4 { config, lib, pkgs, ... }:
6 with lib;
7 let
8   mergeHook = pkgs.writeScript "rdnssd-merge-hook" ''
9     #! ${pkgs.runtimeShell} -e
10     ${pkgs.openresolv}/bin/resolvconf -u
11   '';
15   ###### interface
17   options = {
19     services.rdnssd.enable = mkOption {
20       type = types.bool;
21       default = false;
22       #default = config.networking.enableIPv6;
23       description = ''
24           Whether to enable the RDNSS daemon
25           ({command}`rdnssd`), which configures DNS servers in
26           {file}`/etc/resolv.conf` from RDNSS
27           advertisements sent by IPv6 routers.
28         '';
29     };
31   };
34   ###### implementation
36   config = mkIf config.services.rdnssd.enable {
38     assertions = [{
39       assertion = config.networking.resolvconf.enable;
40       message = "rdnssd needs resolvconf to work (probably something sets up a static resolv.conf)";
41     }];
43     systemd.services.rdnssd = {
44       description = "RDNSS daemon";
45       after = [ "network.target" ];
46       wantedBy = [ "multi-user.target" ];
48       preStart = ''
49         # Create the proper run directory
50         mkdir -p /run/rdnssd
51         touch /run/rdnssd/resolv.conf
52         chown -R rdnssd /run/rdnssd
54         # Link the resolvconf interfaces to rdnssd
55         rm -f /run/resolvconf/interfaces/rdnssd
56         ln -s /run/rdnssd/resolv.conf /run/resolvconf/interfaces/rdnssd
57         ${mergeHook}
58       '';
60       postStop = ''
61         rm -f /run/resolvconf/interfaces/rdnssd
62         ${mergeHook}
63       '';
65       serviceConfig = {
66         ExecStart = "@${pkgs.ndisc6}/bin/rdnssd rdnssd -p /run/rdnssd/rdnssd.pid -r /run/rdnssd/resolv.conf -u rdnssd -H ${mergeHook}";
67         Type = "forking";
68         PIDFile = "/run/rdnssd/rdnssd.pid";
69       };
70     };
72     users.users.rdnssd = {
73       description = "RDNSSD Daemon User";
74       isSystemUser = true;
75       group = "rdnssd";
76     };
77     users.groups.rdnssd = {};
79   };