commit e206dc337c36fa5eb73abd7ba83da87c9f992846
parent 36a558e3efd1ac20af0fb265a71e08b884de28d6
Author: Kirill Elagin <kirelagin@gmail.com>
Date: Fri, 8 Mar 2019 23:47:14 +0100
parent 36a558e3efd1ac20af0fb265a71e08b884de28d6
Author: Kirill Elagin <kirelagin@gmail.com>
Date: Fri, 8 Mar 2019 23:47:14 +0100
Abstract away subzone type
2 files changed, 52 insertions(+), 39 deletions(-)
M
|
89
+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
diff --git a/dns/types/default.nix b/dns/types/default.nix @@ -7,7 +7,7 @@ { pkgs }: { - zone = import ./zone.nix { inherit pkgs; }; + inherit (import ./zone.nix { inherit pkgs; }) zone subzone; record = import ./record.nix { inherit pkgs; }; records = import ./records { inherit pkgs; }; }
diff --git a/dns/types/zone.nix b/dns/types/zone.nix @@ -12,46 +12,59 @@ let inherit (pkgs.lib) mkOption types; record = import ./record.nix { inherit pkgs; }; - recordTypes = import ./records { inherit pkgs; }; + recordTypes = import ./records { inherit pkgs; }; recordTypes' = filterAttrs (n: v: n != "SOA") recordTypes; + + subzoneOptions = name: { + } // + mapAttrs (n: t: mkOption rec { + type = types.listOf (record t name); + default = []; + example = [ t.example ]; + description = "List of ${t} records for this zone/subzone"; + }) recordTypes'; + + writeSubzone = zone: + let + groupToString = n: + concatMapStringsSep "\n" toString (zone."${n}"); + groups = map groupToString (builtins.attrNames recordTypes'); + groups' = filter (s: s != "") groups; + in + concatStringsSep "\n\n" groups'; in -types.submodule ({name, ...}: { - options = { - SOA = mkOption rec { - type = record recordTypes.SOA name; - example = { - ttl = 24 * 60 * 60; - } // type.example; - description = "SOA record"; - }; - __toString = mkOption { - readOnly = true; - visible = false; +{ + zone = types.submodule ({name, ...}: { + options = { + SOA = mkOption rec { + type = record recordTypes.SOA name; + example = { + ttl = 24 * 60 * 60; + } // type.example; + description = "SOA record"; + }; + __toString = mkOption { + readOnly = true; + visible = false; + }; + } // subzoneOptions name; + + config = { + __toString = zone@{SOA, ...}: + '' + $TTL 24h + + $ORIGIN ${SOA.name}. + + ${toString SOA} + + '' + writeSubzone zone + "\n"; }; - } // mapAttrs (n: t: mkOption rec { - type = types.listOf (record t name); - default = []; - example = [ t.example ]; - description = "List of ${t} records for this zone/subzone"; - }) recordTypes'; - - config = { - __toString = zone@{SOA, ...}: - let - groupToString = n: - concatMapStringsSep "\n" toString (zone."${n}"); - groups = map groupToString (builtins.attrNames recordTypes'); - groups' = filter (s: s != "") groups; - in - '' - $TTL 24h - - $ORIGIN ${SOA.name}. - - ${toString SOA} - - '' + concatStringsSep "\n\n" groups' + "\n"; - }; -}) + }); + + subzone = types.submodule ({name, ...}: { + options = subzoneOptions name; + }); +}