# # SPDX-FileCopyrightText: 2019 Kirill Elagin # # SPDX-License-Identifier: MPL-2.0 or MIT # # RFC 1035, 3.3.13 { lib }: let inherit (lib) concatStringsSep removeSuffix replaceStrings; inherit (lib) dns mkOption types; in { rtype = "SOA"; options = { nameServer = mkOption { type = dns.types.domain-name; example = "ns1.example.com"; description = "The of the name server that was the original or primary source of data for this zone. Don't forget the dot at the end!"; }; adminEmail = mkOption { type = dns.types.domain-name; example = "admin@example.com"; description = "An email address of the person responsible for this zone. (Note: in traditional zone files you are supposed to put a dot instead of `@` in your address; you can use `@` with this module and it is recommended to do so. Also don't put the dot at the end!)"; apply = s: replaceStrings ["@"] ["."] (removeSuffix "." s); }; serial = mkOption { type = types.ints.unsigned; # TODO: u32 example = 20; description = "Version number of the original copy of the zone"; }; refresh = mkOption { type = types.ints.unsigned; # TODO: u32 default = 24 * 60 * 60; example = 7200; description = "Time interval before the zone should be refreshed"; }; retry = mkOption { type = types.ints.unsigned; # TODO: u32 default = 10 * 60; example = 600; description = "Time interval that should elapse before a failed refresh should be retried"; }; expire = mkOption { type = types.ints.unsigned; # TODO: u32 default = 10 * 24 * 60 * 60; example = 3600000; description = "Time value that specifies the upper limit on the time interval that can elapse before the zone is no longer authoritative"; }; minimum = mkOption { type = types.ints.unsigned; # TODO: u32 default = 60; example = 60; description = "Minimum TTL field that should be exported with any RR from this zone"; }; }; dataToString = data@{nameServer, adminEmail, ...}: let numbers = map toString (with data; [serial refresh retry expire minimum]); in "${nameServer} ${adminEmail}. (${concatStringsSep " " numbers})"; }