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 lib.mdDoc ''
25 Whether to enable the RDNSS daemon
26 ({command}`rdnssd`), which configures DNS servers in
27 {file}`/etc/resolv.conf` from RDNSS
28 advertisements sent by IPv6 routers.
29 '';
30 };
31
32 };
33
34
35 ###### implementation
36
37 config = mkIf config.services.rdnssd.enable {
38
39 assertions = [{
40 assertion = config.networking.resolvconf.enable;
41 message = "rdnssd needs resolvconf to work (probably something sets up a static resolv.conf)";
42 }];
43
44 systemd.services.rdnssd = {
45 description = "RDNSS daemon";
46 after = [ "network.target" ];
47 wantedBy = [ "multi-user.target" ];
48
49 preStart = ''
50 # Create the proper run directory
51 mkdir -p /run/rdnssd
52 touch /run/rdnssd/resolv.conf
53 chown -R rdnssd /run/rdnssd
54
55 # Link the resolvconf interfaces to rdnssd
56 rm -f /run/resolvconf/interfaces/rdnssd
57 ln -s /run/rdnssd/resolv.conf /run/resolvconf/interfaces/rdnssd
58 ${mergeHook}
59 '';
60
61 postStop = ''
62 rm -f /run/resolvconf/interfaces/rdnssd
63 ${mergeHook}
64 '';
65
66 serviceConfig = {
67 ExecStart = "@${pkgs.ndisc6}/bin/rdnssd rdnssd -p /run/rdnssd/rdnssd.pid -r /run/rdnssd/resolv.conf -u rdnssd -H ${mergeHook}";
68 Type = "forking";
69 PIDFile = "/run/rdnssd/rdnssd.pid";
70 };
71 };
72
73 users.users.rdnssd = {
74 description = "RDNSSD Daemon User";
75 isSystemUser = true;
76 group = "rdnssd";
77 };
78 users.groups.rdnssd = {};
79
80 };
81
82}