feat(dns): add defaults to each zone through the module system

This commit is contained in:
Julien Malka 2024-08-25 12:13:35 +02:00
parent 55a023f057
commit 5424d9f994
Signed by: Luj
GPG key ID: 6FC74C847011FD83
2 changed files with 29 additions and 28 deletions

View file

@ -24,53 +24,60 @@ let
"ns1"
"ns2"
];
defaults = {
inherit SOA NS;
subdomains = {
ns1 = {
A = [ lib.snowfield.router.ips.public.ipv4 ];
AAAA = [ lib.snowfield.router.ips.public.ipv6 ];
};
ns2 = {
A = [ lib.snowfield.akhaten.ips.public.ipv4 ];
AAAA = [ lib.snowfield.akhaten.ips.public.ipv6 ];
# Set some defaults for a zone
getSubmodulesCustom =
inputs@{ name, ... }:
lib.recursiveUpdate ((lib.head dnsLib.types.zone.getSubModules) ({ inherit name; } // inputs)) {
config = {
SOA = lib.mkDefault SOA;
NS = lib.mkDefault NS;
subdomains = {
ns1 = lib.mkDefault {
A = [ lib.snowfield.router.ips.public.ipv4 ];
AAAA = [ lib.snowfield.router.ips.public.ipv6 ];
};
ns2 = lib.mkDefault {
A = [ lib.snowfield.akhaten.ips.public.ipv4 ];
AAAA = [ lib.snowfield.akhaten.ips.public.ipv6 ];
};
};
};
};
};
in
with lib;
{
options = {
machine.meta.zones = mkOption {
type = types.attrsOf dnsLib.types.zone;
type = types.attrsOf (
recursiveUpdate dnsLib.types.zone { getSubModules = [ getSubmodulesCustom ]; }
);
default = { };
};
};
config =
let
# list of domains that are defined in the current configuration throught virtualHosts
domains = lib.dns.domainsFromConfiguration allowedDomains config;
# list of domains that are defined in the current configuration through virtualHosts
domains = dns.domainsFromConfiguration allowedDomains config;
# AttrSet domain -> { records }
recordsPerDomain = map (
domain:
mapAttrs' (
n: v:
nameValuePair (lib.dns.domainToZone allowedDomains n) (
nameValuePair (dns.domainToZone allowedDomains n) (
let
subdomain = lib.dns.getDomainPrefix allowedDomains n;
subdomain = dns.getDomainPrefix allowedDomains n;
in
lib.recursiveUpdate (
if elem subdomain allowedDomains then v else { subdomains."${subdomain}" = v; }
) defaults
if elem subdomain allowedDomains then v else { subdomains."${subdomain}" = v; }
)
) (lib.dns.domainToRecords domain cfg (isVPNDomain domain))
) (dns.domainToRecords domain cfg (isVPNDomain domain))
) domains;
in
{
machine.meta.zones = lib.mkMerge recordsPerDomain;
machine.meta.zones = mkMerge recordsPerDomain;
};
}

View file

@ -82,12 +82,6 @@
"ipv4"
] config.machine.meta.ips)
{
SOA = {
nameServer = "ns";
adminEmail = "dns@malka.sh";
serial = 0;
};
subdomains.${config.networking.hostName} = {
A = [ config.machine.meta.ips.vpn.ipv4 ];
};