existing zones configured on the server as it would effectively "shadow"
part of your DNS subtree.
-Upon catalog zone (re)load or change, all the PTR records in the zone
-sub-tree *zones* (e.g. ``unique-id1.zones.catalog. 0 IN PTR member.com.``)
+Upon catalog zone (re)load or change, all the PTR records in the format
+``unique-id.zones.catalog. 0 IN PTR member.com.`` (but not ``too.deep.zones.catalog.``!)
are processed and member zones created, with zone names taken from the
PTR records' RData, and zone settings taken from the configuration
template specified by :ref:`zone_catalog-template`.
.. code-block:: console
- <any-junk>.<unique-id>.zones.<catalog-zone>.
+ <unique-id>.zones.<catalog-zone>.
where the mentioned group of labels shall match:
-- *<any-junk>* — (optional) Any additional labels with no particular meaning.
- *<unique-id>* — Single label that is recommended to be unique among member zones.
- ``zones`` — Required label.
- *<catalog-zone>* — Name of the catalog zone.
typedef struct {
catalog_update_t *u;
const knot_dname_t *apex;
+ int apex_labels;
bool remove;
catalog_t *check;
} cat_upd_ctx_t;
static int cat_update_add_node(zone_node_t *node, void *data)
{
cat_upd_ctx_t *ctx = data;
+ int labels_diff = knot_dname_labels(node->owner, NULL) - ctx->apex_labels
+ - 1 /* "zones" label */ - 1 /* unique-N label */;
+ assert(labels_diff >= 0);
+ if (labels_diff > 0) {
+ return KNOT_EOK;
+ }
+
const knot_rdataset_t *ptr = node_rdataset(node, KNOT_RRTYPE_PTR);
if (ptr == NULL || ptr->count == 0) {
return KNOT_EOK;
return KNOT_EOK;
}
- cat_upd_ctx_t ctx = { u, zone->apex->owner, remove, check };
+ cat_upd_ctx_t ctx = { u, zone->apex->owner, knot_dname_labels(zone->apex->owner, NULL), remove, check };
pthread_mutex_lock(&u->mutex);
- int ret = zone_tree_sub_apply(zone->nodes, sub, false, cat_update_add_node, &ctx);
+ int ret = zone_tree_sub_apply(zone->nodes, sub, true, cat_update_add_node, &ctx);
pthread_mutex_unlock(&u->mutex);
return ret;
}
resp.check_count(1, "RRSIG")
resp = master.dig("not-cataloged1.", "SOA")
resp.check(rcode="REFUSED")
+resp = master.dig("not-cataloged2.", "SOA")
+resp.check(rcode="REFUSED")
+resp = master.dig("not-cataloged3.", "SOA")
+resp.check(rcode="REFUSED")
# Udating a cataloged zone
subprocess.run(["sed", "-i", "s/10001/10002/;$s/$/\\nxyz A 1.2.3.4/", master.dir + "/master/cataloged1.zone"])
# Check adding cataloged zone.
up = master.update(zone[1])
-up.add("junk.bar.zones.catalog1.", 0, "PTR", "cataloged2.")
+up.add("bar.zones.catalog1.", 0, "PTR", "cataloged2.")
up.send("NOERROR")
t.sleep(6)
resp = master.dig("cataloged2.", "NS")
resp0.check_count(2, "DNSKEY")
dnskey0 = resp0.resp.answer[0].to_rdataset()[0]
up = master.update(zone[1])
-up.delete("junk.bar.zones.catalog1.", "PTR", "cataloged2.")
-up.add("junk.bar.zones.catalog1.", 0, "PTR", "cataloged2.")
+up.delete("bar.zones.catalog1.", "PTR", "cataloged2.")
+up.add("bar.zones.catalog1.", 0, "PTR", "cataloged2.")
up.send("NOERROR")
t.sleep(4)
resp1 = slave.dig("cataloged2.", "DNSKEY")
# Check remove-adding the zone: shall effectively purge it
up = master.update(zone[1])
-up.delete("junk.bar.zones.catalog1.", "PTR", "cataloged2.")
-up.add("junk.bar2.zones.catalog1.", 0, "PTR", "cataloged2.")
+up.delete("bar.zones.catalog1.", "PTR", "cataloged2.")
+up.add("bar2.zones.catalog1.", 0, "PTR", "cataloged2.")
up.send("NOERROR")
t.sleep(4)
shutil.copy(t.data_dir + "/cataloged2.zone", master.dir + "/master") # because the purge deletes even zonefile
set_err("ZONE NOT PURGED")
dnskey2 = resp2.resp.answer[0].to_rdataset()[0]
-# Check remove-adding while keeping the 'uniq' label
-up = master.update(zone[1])
-up.delete("junk.bar2.zones.catalog1.", "PTR", "cataloged2.")
-up.add("jang.bar2.zones.catalog1.", 0, "PTR", "cataloged2.")
-up.send("NOERROR")
-t.sleep(4)
-resp3 = slave.dig("cataloged2.", "DNSKEY")
-resp3.check_count(2, "DNSKEY")
-match = 0
-if resp3.count("DNSKEY") > 0:
- for dnskey3 in resp3.resp.answer[0].to_rdataset():
- if dnskey3.to_text() == dnskey2.to_text():
- match = match + 1
-if match < 1:
- set_err("ZONE PURGED2")
-
# Check persistence after server restart
slave.stop()
slave.start()
master.ctl("zone-backup +journal +backupdir %s/backup %s" % (master.dir, zone[1].name))
# Check removing cataloged zone
up = master.update(zone[1])
-up.delete("foo.bar.zones.catalog1.", "PTR")
+up.delete("foo.zones.catalog1.", "PTR")
up.send("NOERROR")
t.sleep(6)
resp = master.dig("cataloged1.", "SOA")