]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
fix: store master serial once on-slave-signing turned on...
authorLibor Peltan <libor.peltan@nic.cz>
Wed, 18 Aug 2021 15:52:29 +0000 (17:52 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Thu, 19 Aug 2021 17:52:09 +0000 (19:52 +0200)
...in case the zone had been XFRed before, the master serial
was not stored and after local signing, it was doomed

src/knot/dnssec/zone-events.c
tests-extra/tests/dnssec/start_slave_sign/test.py [new file with mode: 0644]

index 7c6f875e145a9848fa7ecfc78da1256aeaf9713e..0b6eeed036abf967a4c802abd78fac3461484ee3 100644 (file)
@@ -39,6 +39,12 @@ static int sign_init(zone_update_t *update, conf_t *conf, zone_sign_flags_t flag
 
        const knot_dname_t *zone_name = update->new_cont->apex->owner;
 
+       uint32_t ms;
+       if (zone_is_slave(conf, update->zone) && zone_get_master_serial(update->zone, &ms) == KNOT_ENOENT) {
+               // zone had been XFRed before on-slave-signing turned on
+               zone_set_master_serial(update->zone, zone_contents_serial(update->new_cont));
+       }
+
        int r = kdnssec_ctx_init(conf, ctx, zone_name, kaspdb, NULL);
        if (r != KNOT_EOK) {
                return r;
diff --git a/tests-extra/tests/dnssec/start_slave_sign/test.py b/tests-extra/tests/dnssec/start_slave_sign/test.py
new file mode 100644 (file)
index 0000000..1d3afe6
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+'''Test of turning on signing on already running slave.'''
+
+from dnstest.utils import *
+from dnstest.test import Test
+import shutil
+import random
+
+t = Test()
+
+master = t.server("knot")
+slave  = t.server("knot")
+
+zone = t.zone("example.") # has SOA serial lower than @now
+
+t.link(zone, master, slave, ddns=True)
+
+master.serial_policy = random.choice(["increment", "unixtime", "dateserial"])
+slave.serial_policy = random.choice(["increment", "unixtime", "dateserial"])
+
+slave.dnssec(zone).nsec3 = random.choice([False, True])
+
+slave.zonefile_load = random.choice(["none", "whole"])
+for z in zone:
+    slave.zones[z.name].journal_content = random.choice(["all", "none", "changes"])
+
+cold_reload = random.choice([False, True])
+if slave.zonefile_load == "none" and slave.zones[zone[0].name].journal_content != "all":
+    cold_reload = False
+
+t.start()
+
+serial = slave.zone_wait(zone)
+
+slave.dnssec(zone).enable = True
+slave.gen_confile()
+
+if cold_reload:
+    slave.stop()
+    t.sleep(2)
+    slave.start()
+    serial = slave.zone_wait(zone)
+else:
+    slave.reload()
+    serial = slave.zone_wait(zone, serial)
+
+slave.ctl("-f -b zone-flush")
+slave.zone_verify(zone)
+
+t.sleep(2)
+up = master.update(zone)
+up.add("hjk.%s" % zone[0].name, 3600, "TXT", "hjk")
+up.send()
+
+slave.zone_wait(zone, serial)
+slave.ctl("-f -b zone-flush")
+slave.zone_verify(zone)
+
+t.end()