{pkgs, config}: let cfg = config.services.dhcpd; stateDir = "/var/lib/dhcp"; # Don't use /var/state/dhcp; not FHS-compliant. machines = pkgs.lib.concatMapStrings (machine: '' host ${machine.hostName} { hardware ethernet ${machine.ethernetAddress}; fixed-address ${machine.ipAddress}; } '') cfg.machines; configFile = if cfg.configFile != null then cfg.configFile else pkgs.writeText "dhcpd.conf" '' default-lease-time 600; max-lease-time 7200; authoritative; ddns-update-style ad-hoc; log-facility local1; # see dhcpd.nix ${cfg.extraConfig} ${machines} ''; in { name = "dhcpd"; job = '' description "DHCP server" start on network-interfaces/started stop on network-interfaces/stop script mkdir -m 755 -p ${stateDir} touch ${stateDir}/dhcpd.leases exec ${pkgs.dhcp}/sbin/dhcpd -f -cf ${configFile} \ -lf ${stateDir}/dhcpd.leases \ ${toString cfg.interfaces} end script ''; }