# ISC DHCP/IPv4 server configuration { hostName, config, lib, ... }: let dhcpNets = lib.filterAttrs (_: { dhcp, ... }: dhcp != null && dhcp.server == hostName ) config.site.net; enabled = builtins.length (builtins.attrNames dhcpNets) > 0; in { services.dhcpd4 = lib.optionalAttrs enabled { enable = true; interfaces = builtins.attrNames dhcpNets; extraConfig = '' ${builtins.concatStringsSep "\n" ( builtins.attrValues ( builtins.mapAttrs (net: { dhcp, subnet4Net, subnet4Len, domainName, ...}: '' group { default-lease-time ${toString dhcp.time}; max-lease-time ${toString dhcp.max-time}; option routers ${config.site.net.${net}.hosts4.${builtins.replaceStrings [".${net}"] [""] dhcp.router}}; option domain-name "${domainName}"; option domain-name-servers 172.20.73.8, 9.9.9.9; subnet ${subnet4Net} netmask ${lib.netmasks.${toString subnet4Len}} { range ${dhcp.start} ${dhcp.end}; } ${builtins.concatStringsSep "\n" ( builtins.attrValues ( builtins.mapAttrs (addr: hwaddr: '' host ${addr} { hardware ethernet ${hwaddr}; fixed-address ${addr}; } '' ) dhcp.fixed-hosts ) )} } '' ) dhcpNets ) )} ''; }; }