From 44af2887a5d60ff0fb942232d5e798ec8af90cea Mon Sep 17 00:00:00 2001 From: "Giulio De Pasquale (aider)" Date: Thu, 5 Jun 2025 12:42:14 +0100 Subject: [PATCH] feat: Allow network devices to define DNS resolvable names --- modules/core/dns.nix | 33 +++++++++++++++++++++++++++++++++ modules/core/network.nix | 8 +++++++- 2 files changed, 40 insertions(+), 1 deletion(-) 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 = { };