From: Otto Moerbeek Date: Tue, 5 Nov 2024 13:52:45 +0000 (+0100) Subject: Implement ForwardingCatalogZone.to_yaml_map() X-Git-Tag: rec-5.2.0-alpha1~7^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3965ddd5e74477cb9d678e161dd46215c134dd85;p=thirdparty%2Fpdns.git Implement ForwardingCatalogZone.to_yaml_map() --- diff --git a/pdns/recursordist/rec-xfr.cc b/pdns/recursordist/rec-xfr.cc index fc26abf1fb..c43b09d7fc 100644 --- a/pdns/recursordist/rec-xfr.cc +++ b/pdns/recursordist/rec-xfr.cc @@ -35,19 +35,27 @@ static const DNSName cVersion("version"); // TODO: cleanup files if not in catalogzones? -void CatalogZone::add(const DNSRecord& record, Logr::log_t logger) +static bool validate(const DNSRecord& record, Logr::log_t logger) { if (record.d_name.empty()) { logger->info(Logr::Warning, "Record is not part of zone, skipping", "name", Logging::Loggable(record.d_name)); - return; + return false; } if (record.d_class != QClass::IN) { logger->info(Logr::Warning, "Record class is not IN, skipping", "name", Logging::Loggable(record.d_name)); - return; + return false; } if (record.d_name.getLastLabel() != cZones && record.d_name != cVersion) { logger->info(Logr::Warning, "Record is not a catalog zone entry, skipping", "name", Logging::Loggable(record.d_name)); + return false; + } + return true; +} + +void CatalogZone::add(const DNSRecord& record, Logr::log_t logger) +{ + if (!validate(record, logger)) { return; } const auto& key = record.d_name; @@ -57,17 +65,7 @@ void CatalogZone::add(const DNSRecord& record, Logr::log_t logger) void CatalogZone::remove(const DNSRecord& record, Logr::log_t logger) { - if (record.d_name.empty()) { - logger->info(Logr::Warning, "Record is not part of zone, skipping", "name", Logging::Loggable(record.d_name)); - return; - } - if (record.d_class != QClass::IN) { - logger->info(Logr::Warning, "Record class is not IN, skipping", "name", Logging::Loggable(record.d_name)); - return; - } - - if (record.d_name.getLastLabel() != cZones && record.d_name != cVersion) { - logger->info(Logr::Warning, "Record is not a catalog zone entry, skipping", "name", Logging::Loggable(record.d_name)); + if (!validate(record, logger)) { return; } const auto& key = record.d_name; diff --git a/pdns/recursordist/settings/rust/src/bridge.rs b/pdns/recursordist/settings/rust/src/bridge.rs index 3a84643079..e076410979 100644 --- a/pdns/recursordist/settings/rust/src/bridge.rs +++ b/pdns/recursordist/settings/rust/src/bridge.rs @@ -661,12 +661,48 @@ impl ForwardingCatalogZone { } fn to_yaml_map(&self) -> serde_yaml::Value { - // XXX INCOMPLETE - let seq = serde_yaml::Sequence::new(); let mut map = serde_yaml::Mapping::new(); inserts(&mut map, "zone", &self.zone); insertb(&mut map, "notify_allowed", self.notify_allowed); - insertseq(&mut map, "groups", &seq); + + let mut xfrmap = serde_yaml::Mapping::new(); + let mut addrs = serde_yaml::Sequence::new(); + for address in &self.xfr.addresses { + addrs.push(serde_yaml::Value::String(address.to_owned())); + } + insertseq(&mut xfrmap, "addresses", &addrs); + insertu32(&mut xfrmap, "zoneSizeHint", self.xfr.zoneSizeHint); + let mut tsigmap = serde_yaml::Mapping::new(); + inserts(&mut tsigmap, "name", &self.xfr.tsig.name); + inserts(&mut tsigmap, "algo", &self.xfr.tsig.algo); + inserts(&mut tsigmap, "secret", &self.xfr.tsig.secret); + xfrmap.insert( + serde_yaml::Value::String("tsig".to_owned()), + serde_yaml::Value::Mapping(tsigmap), + ); + insertu32(&mut xfrmap, "refresh", self.xfr.refresh); + insertu32(&mut xfrmap, "maxReceivedMBytes", self.xfr.maxReceivedMBytes); + inserts(&mut xfrmap, "localAddress", &self.xfr.localAddress); + insertu32(&mut xfrmap, "axfrTimeout", self.xfr.axfrTimeout); + map.insert( + serde_yaml::Value::String("xfr".to_owned()), + serde_yaml::Value::Mapping(xfrmap), + ); + + let mut groupseq = serde_yaml::Sequence::new(); + for entry in &self.groups { + let mut submap = serde_yaml::Mapping::new(); + inserts(&mut submap, "name", &entry.name); + let mut fwseq = serde_yaml::Sequence::new(); + for forwarder in &entry.forwarders { + fwseq.push(serde_yaml::Value::String(forwarder.to_owned())); + } + insertseq(&mut submap, "forwarders", &fwseq); + insertb(&mut submap, "recurse", entry.recurse); + insertb(&mut submap, "notify_allowed", entry.notify_allowed); + groupseq.push(serde_yaml::Value::Mapping(submap)); + } + insertseq(&mut map, "groups", &groupseq); serde_yaml::Value::Mapping(map) } }