diff --git a/modules/core/dns.nix b/modules/core/dns.nix index bbdc15b..3e4732f 100644 --- a/modules/core/dns.nix +++ b/modules/core/dns.nix @@ -117,8 +117,41 @@ in allDomains = config.pepe.core.vhost.hosts // cfg.extraDomains; in + let + # Function to generate DNS records for individual devices based on dnsResolvableName + generateDeviceHostRecords = + let + generateRecordsForInterface = ifaceName: ifaceConfig: + lib.concatStringsSep "\n" (lib.mapAttrsToList (deviceName: deviceConfig: + if deviceConfig.dnsResolvableName != null then + let + serverIP = deviceConfig.address; + interfaceNet = ifaceConfig.net; + domain = deviceConfig.dnsResolvableName; + in + '' + ${domain} { + view ${ifaceName} { + expr incidr(client_ip(), '${interfaceNet}') + } + + template IN A ${domain} { + answer "${domain}. 60 IN A ${serverIP}" + } + + cache + log + } + '' + else "" + ) ifaceConfig.devices); + in + lib.concatStringsSep "\n" (lib.mapAttrsToList generateRecordsForInterface config.pepe.core.network.interfaces); + in '' ${generateCoreDNSConfig allDomains} + + ${generateDeviceHostRecords} ${allDeviceViews} diff --git a/modules/core/network.nix b/modules/core/network.nix index 28380d5..71af459 100644 --- a/modules/core/network.nix +++ b/modules/core/network.nix @@ -41,7 +41,13 @@ in type = types.bool; default = false; description = "Whether this device serves as a DNS endpoint for this interface."; - }; + }; + + dnsResolvableName = mkOption { + type = types.nullOr types.str; + default = null; + description = "The fully qualified domain name that should resolve to this device's IP address. e.g., my-device.lan.example.com"; + }; }; }); default = { };