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.stdenv.shell} -e
10 ${pkgs.openresolv}/bin/resolvconf -u
11 '';
12in
13{
14
15 ###### interface
16
17 options = {
18
19 services.rdnssd.enable = mkOption {
20 default = false;
21 #default = config.networking.enableIPv6;
22 description =
23 ''
24 Whether to enable the RDNSS daemon
25 (<command>rdnssd</command>), which configures DNS servers in
26 <filename>/etc/resolv.conf</filename> 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 systemd.services.rdnssd = {
39 description = "RDNSS daemon";
40 after = [ "network.target" ];
41 wantedBy = [ "multi-user.target" ];
42
43 preStart = ''
44 # Create the proper run directory
45 mkdir -p /run/rdnssd
46 touch /run/rdnssd/resolv.conf
47 chown -R rdnssd /run/rdnssd
48
49 # Link the resolvconf interfaces to rdnssd
50 rm -f /run/resolvconf/interfaces/rdnssd
51 ln -s /run/rdnssd/resolv.conf /run/resolvconf/interfaces/rdnssd
52 ${mergeHook}
53 '';
54
55 postStop = ''
56 rm -f /run/resolvconf/interfaces/rdnssd
57 ${mergeHook}
58 '';
59
60 serviceConfig = {
61 ExecStart = "@${pkgs.ndisc6}/bin/rdnssd rdnssd -p /run/rdnssd/rdnssd.pid -r /run/rdnssd/resolv.conf -u rdnssd -H ${mergeHook}";
62 Type = "forking";
63 PIDFile = "/run/rdnssd/rdnssd.pid";
64 };
65 };
66
67 users.extraUsers.rdnssd = {
68 description = "RDNSSD Daemon User";
69 uid = config.ids.uids.rdnssd;
70 };
71
72 };
73
74}