]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Handle "type mirror;" when parsing zone configuration
authorMichał Kępień <michal@isc.org>
Tue, 9 Oct 2018 08:54:51 +0000 (10:54 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 24 Oct 2018 18:32:55 +0000 (20:32 +0200)
Add a new zone type, CFG_ZONE_MIRROR, to libisccfg, in order to limit
the list of options which are considered valid for mirror zones.  Update
the relevant configuration checks.

lib/bind9/check.c
lib/isccfg/include/isccfg/grammar.h
lib/isccfg/namedconf.c

index 40608518881eb4b272362f08c93a4bb6baabd7d2..bfb891700189a846925dae82661598e4704f03e1 100644 (file)
@@ -1989,6 +1989,8 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
                           strcasecmp(typestr, "secondary") == 0)
                {
                        ztype = CFG_ZONE_SLAVE;
+               } else if (strcasecmp(typestr, "mirror") == 0) {
+                       ztype = CFG_ZONE_MIRROR;
                } else if (strcasecmp(typestr, "stub") == 0) {
                        ztype = CFG_ZONE_STUB;
                } else if (strcasecmp(typestr, "static-stub") == 0) {
@@ -2100,6 +2102,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
 
                case CFG_ZONE_MASTER:
                case CFG_ZONE_SLAVE:
+               case CFG_ZONE_MIRROR:
                case CFG_ZONE_HINT:
                case CFG_ZONE_STUB:
                case CFG_ZONE_STATICSTUB:
@@ -2184,10 +2187,12 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
        }
 
        /*
-        * Master & slave zones may have an "also-notify" field, but
+        * Master, slave, and mirror zones may have an "also-notify" field, but
         * shouldn't if notify is disabled.
         */
-       if (ztype == CFG_ZONE_MASTER || ztype == CFG_ZONE_SLAVE) {
+       if (ztype == CFG_ZONE_MASTER || ztype == CFG_ZONE_SLAVE ||
+           ztype == CFG_ZONE_MIRROR)
+       {
                bool donotify = true;
 
                obj = NULL;
@@ -2228,9 +2233,11 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
        }
 
        /*
-        * Slave & stub zones must have a "masters" field.
+        * Slave, mirror, and stub zones must have a "masters" field.
         */
-       if (ztype == CFG_ZONE_SLAVE || ztype == CFG_ZONE_STUB) {
+       if (ztype == CFG_ZONE_SLAVE || ztype == CFG_ZONE_MIRROR ||
+           ztype == CFG_ZONE_STUB)
+       {
                obj = NULL;
                if (cfg_map_get(zoptions, "masters", &obj) != ISC_R_SUCCESS) {
                        cfg_obj_log(zoptions, logctx, ISC_LOG_ERROR,
@@ -2621,7 +2628,9 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
                            znamestr);
                        result = tresult;
                } else if (tresult == ISC_R_SUCCESS &&
-                          (ztype == CFG_ZONE_SLAVE || ddns)) {
+                          (ztype == CFG_ZONE_SLAVE ||
+                           ztype == CFG_ZONE_MIRROR || ddns))
+               {
                        tresult = fileexist(fileobj, files, true, logctx);
                        if (tresult != ISC_R_SUCCESS)
                                result = tresult;
index a066cd13e966539ce5f86e23e820dd302629d765..93ff3df15677914740e77995f10ee0bdab24f644 100644 (file)
@@ -72,6 +72,7 @@
 #define CFG_ZONE_REDIRECT              0x02000000
 #define CFG_ZONE_DELEGATION            0x01000000
 #define CFG_ZONE_INVIEW                        0x00800000
+#define CFG_ZONE_MIRROR                        0x00400000
 
 typedef struct cfg_clausedef cfg_clausedef_t;
 typedef struct cfg_tuplefielddef cfg_tuplefielddef_t;
index 3b51a080bab5b9a7933950e774fd16ea609531c0..960e03d3087a7c3d604b64c408328d75a9619f2f 100644 (file)
@@ -668,7 +668,7 @@ static cfg_type_t cfg_type_forwardtype = {
 };
 
 static const char *zonetype_enums[] = {
-       "primary", "master", "secondary", "slave",
+       "primary", "master", "secondary", "slave", "mirror",
        "delegation-only", "forward", "hint", "redirect",
        "static-stub", "stub", NULL
 };
@@ -2020,33 +2020,33 @@ static cfg_type_t cfg_type_validityinterval = {
 static cfg_clausedef_t
 zone_clauses[] = {
        { "allow-notify", &cfg_type_bracketed_aml,
-               CFG_ZONE_SLAVE
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "allow-query", &cfg_type_bracketed_aml,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_REDIRECT | CFG_ZONE_STATICSTUB
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_REDIRECT | CFG_ZONE_STATICSTUB
        },
        { "allow-query-on", &cfg_type_bracketed_aml,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_REDIRECT | CFG_ZONE_STATICSTUB
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_REDIRECT | CFG_ZONE_STATICSTUB
        },
        { "allow-transfer", &cfg_type_bracketed_aml,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "allow-update", &cfg_type_bracketed_aml,
                CFG_ZONE_MASTER
        },
        { "allow-update-forwarding", &cfg_type_bracketed_aml,
-               CFG_ZONE_SLAVE
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "also-notify", &cfg_type_namesockaddrkeylist,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "alt-transfer-source", &cfg_type_sockaddr4wild,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "alt-transfer-source-v6", &cfg_type_sockaddr6wild,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "auto-dnssec", &cfg_type_autodnssec,
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE
@@ -2108,67 +2108,67 @@ zone_clauses[] = {
                CFG_CLAUSEFLAG_OBSOLETE
        },
        { "masterfile-format", &cfg_type_masterformat,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE |
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
                CFG_ZONE_STUB | CFG_ZONE_REDIRECT
        },
        { "masterfile-style", &cfg_type_masterstyle,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE |
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
                CFG_ZONE_STUB | CFG_ZONE_REDIRECT
        },
        { "max-ixfr-log-size", &cfg_type_size,
                CFG_CLAUSEFLAG_OBSOLETE
        },
        { "max-journal-size", &cfg_type_size,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "max-records", &cfg_type_uint32,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_STATICSTUB | CFG_ZONE_REDIRECT
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_STATICSTUB | CFG_ZONE_REDIRECT
        },
        { "max-refresh-time", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "max-retry-time", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "max-transfer-idle-in", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "max-transfer-idle-out", &cfg_type_uint32,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_MIRROR | CFG_ZONE_SLAVE
        },
        { "max-transfer-time-in", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "max-transfer-time-out", &cfg_type_uint32,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_MIRROR | CFG_ZONE_SLAVE
        },
        { "max-zone-ttl", &cfg_type_maxttl,
                CFG_ZONE_MASTER | CFG_ZONE_REDIRECT
        },
        { "min-refresh-time", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "min-retry-time", &cfg_type_uint32,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "mirror", &cfg_type_boolean,
                CFG_ZONE_SLAVE
        },
        { "multi-master", &cfg_type_boolean,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "notify", &cfg_type_notifytype,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "notify-delay", &cfg_type_uint32,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "notify-source", &cfg_type_sockaddr4wild,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "notify-source-v6", &cfg_type_sockaddr6wild,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "notify-to-soa", &cfg_type_boolean,
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE
@@ -2178,10 +2178,10 @@ zone_clauses[] = {
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE
        },
        { "request-expire", &cfg_type_boolean,
-               CFG_ZONE_SLAVE
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "request-ixfr", &cfg_type_boolean,
-               CFG_ZONE_SLAVE
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "serial-update-method", &cfg_type_updatemethod,
                CFG_ZONE_MASTER
@@ -2202,26 +2202,26 @@ zone_clauses[] = {
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE
        },
        { "transfer-source", &cfg_type_sockaddr4wild,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "transfer-source-v6", &cfg_type_sockaddr6wild,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "try-tcp-refresh", &cfg_type_boolean,
-               CFG_ZONE_SLAVE
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "update-check-ksk", &cfg_type_boolean,
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE
        },
        { "use-alt-transfer-source", &cfg_type_boolean,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB
        },
        { "zero-no-soa-ttl", &cfg_type_boolean,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "zone-statistics", &cfg_type_zonestat,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_STATICSTUB | CFG_ZONE_REDIRECT
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_STATICSTUB | CFG_ZONE_REDIRECT
        },
        { NULL, NULL, 0 }
 };
@@ -2239,16 +2239,17 @@ zone_only_clauses[] = {
         * the zone options and the global/view options.  Ugh.
         */
        { "type", &cfg_type_zonetype,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_STATICSTUB | CFG_ZONE_DELEGATION | CFG_ZONE_HINT |
-               CFG_ZONE_REDIRECT | CFG_ZONE_FORWARD
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_STATICSTUB | CFG_ZONE_DELEGATION |
+               CFG_ZONE_HINT | CFG_ZONE_REDIRECT | CFG_ZONE_FORWARD
        },
        { "check-names", &cfg_type_checkmode,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE |
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
                CFG_ZONE_HINT | CFG_ZONE_STUB
        },
        { "database", &cfg_type_astring,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB
        },
        { "delegation-only", &cfg_type_boolean,
                CFG_ZONE_HINT | CFG_ZONE_STUB | CFG_ZONE_FORWARD
@@ -2257,8 +2258,8 @@ zone_only_clauses[] = {
                CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_REDIRECT
        },
        { "file", &cfg_type_qstring,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_STUB |
-               CFG_ZONE_HINT | CFG_ZONE_REDIRECT
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR |
+               CFG_ZONE_STUB | CFG_ZONE_HINT | CFG_ZONE_REDIRECT
        },
        { "in-view", &cfg_type_astring,
                CFG_ZONE_INVIEW
@@ -2267,16 +2268,17 @@ zone_only_clauses[] = {
                CFG_CLAUSEFLAG_OBSOLETE
        },
        { "ixfr-from-differences", &cfg_type_boolean,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "ixfr-tmp-file", &cfg_type_qstring,
                CFG_CLAUSEFLAG_OBSOLETE
        },
        { "journal", &cfg_type_qstring,
-               CFG_ZONE_MASTER | CFG_ZONE_SLAVE
+               CFG_ZONE_MASTER | CFG_ZONE_SLAVE | CFG_ZONE_MIRROR
        },
        { "masters", &cfg_type_namesockaddrkeylist,
-               CFG_ZONE_SLAVE | CFG_ZONE_STUB | CFG_ZONE_REDIRECT
+               CFG_ZONE_SLAVE | CFG_ZONE_MIRROR | CFG_ZONE_STUB |
+               CFG_ZONE_REDIRECT
        },
        { "pubkey", &cfg_type_pubkey,
                CFG_CLAUSEFLAG_MULTI | CFG_CLAUSEFLAG_OBSOLETE
@@ -4121,6 +4123,10 @@ cfg_print_zonegrammar(const unsigned int zonetype,
                cfg_print_indent(&pctx);
                cfg_print_cstr(&pctx, "type ( slave | secondary );\n");
                break;
+       case CFG_ZONE_MIRROR:
+               cfg_print_indent(&pctx);
+               cfg_print_cstr(&pctx, "type mirror;\n");
+               break;
        case CFG_ZONE_STUB:
                cfg_print_indent(&pctx);
                cfg_print_cstr(&pctx, "type stub;\n");