zones: add zonefile packages for i, r, and w
This commit is contained in:
parent
31b30c5f22
commit
e542525314
@ -30,6 +30,73 @@ with import <stockholm/lib>;
|
||||
all-zones;
|
||||
};
|
||||
})
|
||||
|
||||
# Implicit zones generated from config.krebs.hosts.*.nets.*.ip{4,6}.addr
|
||||
(self: super: let
|
||||
# record : { name : str, type : enum [ "A" "AAAA" ], data : str }
|
||||
|
||||
# toRecord : record.name -> record.type -> record.data -> record
|
||||
toRecord = name: type: data:
|
||||
{ inherit name type data; };
|
||||
|
||||
# toRecords : str -> host -> [record]
|
||||
toRecords = netname: host:
|
||||
let
|
||||
net = host.nets.${netname};
|
||||
in
|
||||
optionals
|
||||
(hasAttr netname host.nets)
|
||||
(filter
|
||||
(x: x.data != null)
|
||||
(concatLists [
|
||||
(map
|
||||
(name: toRecord name "A" (net.ip4.addr or null))
|
||||
(concatMap
|
||||
(name: [ "${name}." "4.${name}." ])
|
||||
(net.aliases or [])))
|
||||
(map
|
||||
(name: toRecord name "AAAA" (net.ip6.addr or null))
|
||||
(concatMap
|
||||
(name: [ "${name}." "6.${name}." ])
|
||||
(net.aliases or [])))
|
||||
]));
|
||||
|
||||
# formatRecord : record -> str
|
||||
formatRecord = { name, type, data }: "${name} IN ${type} ${data}";
|
||||
|
||||
# writeZone : attrs -> package
|
||||
writeZone =
|
||||
{ name ? "${domain}.zone"
|
||||
, domain ? substring 0 1 netname
|
||||
, nameservers ? [ "ni" ]
|
||||
, netname
|
||||
, hosts ? config.krebs.hosts
|
||||
}:
|
||||
self.writeText name /* bindzone */ ''
|
||||
$TTL 60
|
||||
@ IN SOA ns admin 1 3600 600 86400 60
|
||||
@ IN NS ns
|
||||
${concatMapStringsSep "\n"
|
||||
(name: /* bindzone */ "ns IN CNAME ${name}")
|
||||
nameservers
|
||||
}
|
||||
${concatMapStringsSep
|
||||
"\n"
|
||||
formatRecord
|
||||
(concatMap
|
||||
(toRecords netname)
|
||||
(attrValues hosts))
|
||||
}
|
||||
'';
|
||||
in {
|
||||
krebs = super.krebs or {} // {
|
||||
zones = super.krebs.zones or {} // {
|
||||
i = writeZone { netname = "internet"; };
|
||||
r = writeZone { netname = "retiolum"; };
|
||||
w = writeZone { netname = "wiregrill"; };
|
||||
};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user