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