From 2f5e5c965d3136cf4a23bf232edfdeb6833c0b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0pa=C4=8Dek?= Date: Fri, 11 Jul 2025 21:10:19 +0200 Subject: [PATCH] Add ability to load root zone into AsyncServer We would prefer if explicit $ORIGIN is used only for root zone and nothing else, solely to avoid zone files named "..db". For all other zones the file name should match zone name. (cherry picked from commit 339e5162d6a5e3f0ebb7ba38218159d7e53cb81f) --- bin/tests/system/isctest/asyncserver.py | 29 ++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/bin/tests/system/isctest/asyncserver.py b/bin/tests/system/isctest/asyncserver.py index 3f9b4c2c5a..01d79e2351 100644 --- a/bin/tests/system/isctest/asyncserver.py +++ b/bin/tests/system/isctest/asyncserver.py @@ -768,13 +768,36 @@ class AsyncDnsServer(AsyncServer): self._zone_tree.add(zone) def _load_zone(self, zone_file_path: pathlib.Path) -> dns.zone.Zone: - origin = dns.name.from_text(zone_file_path.stem) logging.info("Loading zone file %s", zone_file_path) - with open(zone_file_path, encoding="utf-8") as zone_file: - zone = dns.zone.from_file(zone_file, origin, relativize=False) + zone = self._load_zone_file(zone_file_path) self._abort_if_dname_found_unless_acknowledged(zone) return zone + def _load_zone_file(self, zone_file_path: pathlib.Path) -> dns.zone.Zone: + try: + zone = self._load_zone_file_with_origin(zone_file_path) + except dns.zone.UnknownOrigin: + zone = self._load_zone_file_without_origin(zone_file_path) + + return zone + + def _load_zone_file_with_origin( + self, zone_file_path: pathlib.Path + ) -> dns.zone.Zone: + zone = dns.zone.from_file(str(zone_file_path), origin=None, relativize=False) + if zone.origin != dns.name.root: + error = "only the root zone may use $ORIGIN in the zone file; " + error += "for every other zone, its origin is determined by " + error += "the name of the file it is loaded from" + raise ValueError(error) + return zone + + def _load_zone_file_without_origin( + self, zone_file_path: pathlib.Path + ) -> dns.zone.Zone: + origin = dns.name.from_text(zone_file_path.stem) + return dns.zone.from_file(str(zone_file_path), origin=origin, relativize=False) + def _abort_if_dname_found_unless_acknowledged(self, zone: dns.zone.Zone) -> None: if self._acknowledge_manual_dname_handling: return