]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Implement ForwardingCatalogZone.to_yaml_map()
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 5 Nov 2024 13:52:45 +0000 (14:52 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 5 Nov 2024 13:52:45 +0000 (14:52 +0100)
pdns/recursordist/rec-xfr.cc
pdns/recursordist/settings/rust/src/bridge.rs

index fc26abf1fb9c752d98c738127f00e1c4fc3c2ec0..c43b09d7fca1ea09fe1edd6ce608c3d406944478 100644 (file)
@@ -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;
index 3a846430790b083472e6f2429e73703815bf7f1a..e0764109798cacd67b96f371a01441d7b8110415 100644 (file)
@@ -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)
     }
 }