{ 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} ''; }