at 23.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{ 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}