at 25.11-pre 2.0 kB view raw
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}