47 lines
1.4 KiB
Nix
47 lines
1.4 KiB
Nix
|
{ config, pkgs, lib, ... }:
|
||
|
let
|
||
|
format = pkgs.formats.yaml { };
|
||
|
cfg = config.satellite.dns;
|
||
|
in
|
||
|
{
|
||
|
options.satellite.dns.octodns = lib.mkOption {
|
||
|
description = "Derivation building a directory containing all the zone files";
|
||
|
type = lib.types.path;
|
||
|
};
|
||
|
|
||
|
config.satellite.dns.octodns =
|
||
|
let
|
||
|
grouped = builtins.groupBy (entry: entry.zone) cfg.records;
|
||
|
cpLines = lib.mapAttrsToList
|
||
|
(zone: group:
|
||
|
let
|
||
|
grouped = builtins.groupBy (entry: entry.at) group;
|
||
|
contents = lib.mapAttrs
|
||
|
(at: entries: lib.lists.forEach entries
|
||
|
(entry:
|
||
|
let
|
||
|
content =
|
||
|
if builtins.typeOf entry.value == "list"
|
||
|
then { values = entry.value; }
|
||
|
else { inherit (entry) value; };
|
||
|
cloudflare =
|
||
|
if entry.enableCloudflareProxy then {
|
||
|
octodns.cloudflare.proxied = true;
|
||
|
} else { };
|
||
|
in
|
||
|
{ inherit (entry) ttl type; }
|
||
|
// content // cloudflare
|
||
|
))
|
||
|
grouped;
|
||
|
file = format.generate "${zone}.yaml" contents;
|
||
|
in
|
||
|
"cp ${file} $out/${zone}.yaml"
|
||
|
)
|
||
|
grouped;
|
||
|
in
|
||
|
pkgs.runCommand "octodns-zones" { } ''
|
||
|
mkdir $out
|
||
|
${lib.concatStringsSep "\n" cpLines}
|
||
|
'';
|
||
|
}
|