1# Module for rdnssd, a daemon that configures DNS servers in
2# /etc/resolv/conf from IPv6 RDNSS advertisements.
3
4{ config, lib, pkgs, ... }:
5
6with lib;
7let
8 mergeHook = pkgs.writeScript "rdnssd-merge-hook" ''
9 #! ${pkgs.runtimeShell} -e
10 ${pkgs.openresolv}/bin/resolvconf -u
11 '';
12in
13{
14
15 ###### interface
16
17 options = {
18
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 };
30
31 };
32
33
34 ###### implementation
35
36 config = mkIf config.services.rdnssd.enable {
37
38 assertions = [{
39 assertion = config.networking.resolvconf.enable;
40 message = "rdnssd needs resolvconf to work (probably something sets up a static resolv.conf)";
41 }];
42
43 systemd.services.rdnssd = {
44 description = "RDNSS daemon";
45 after = [ "network.target" ];
46 wantedBy = [ "multi-user.target" ];
47
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
53
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 '';
59
60 postStop = ''
61 rm -f /run/resolvconf/interfaces/rdnssd
62 ${mergeHook}
63 '';
64
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 };
71
72 users.users.rdnssd = {
73 description = "RDNSSD Daemon User";
74 isSystemUser = true;
75 group = "rdnssd";
76 };
77 users.groups.rdnssd = {};
78
79 };
80
81}