]> granicus.if.org Git - pdns/commitdiff
Rectify records
authorAki Tuomi <cmouse@cmouse.fi>
Fri, 11 Sep 2015 09:17:12 +0000 (12:17 +0300)
committerAki Tuomi <cmouse@cmouse.fi>
Wed, 16 Sep 2015 12:51:30 +0000 (15:51 +0300)
modules/geoipbackend/geoipbackend.cc

index 0d6e23466e4b56e0599cf39df7233cdaf0380e8f..71aed12aba8072dc20796ecced5e11c2582cf17b 100644 (file)
@@ -128,6 +128,48 @@ void GeoIPBackend::initialize() {
       dom.services[service->first.as<string>()] = service->second.as<string>();
     }
 
+    // rectify the zone, first static records
+    for(auto &item : dom.records) {
+      // ensure we have parent in records
+      DNSName name = item.first;
+      while(name.chopOff() && name.isPartOf(dom.domain)) {
+        if (dom.records.find(name) == dom.records.end()) {
+          DNSResourceRecord rr;
+          vector<DNSResourceRecord> rrs;
+          rr.domain_id = dom.id;
+          rr.ttl = dom.ttl;
+          rr.qname = name;
+          rr.qtype = "NULL";
+          rr.content = "";
+          rr.auth = 1;
+          rr.d_place = DNSResourceRecord::ANSWER;
+          rrs.push_back(rr);
+          std::swap(dom.records[name], rrs);
+        }
+      }
+    }
+
+    // then services
+    for(auto &item : dom.services) {
+      // ensure we have parent in records
+      DNSName name = item.first;
+      while(name.chopOff() && name.isPartOf(dom.domain)) {
+        if (dom.records.find(name) == dom.records.end()) {
+          DNSResourceRecord rr;
+          vector<DNSResourceRecord> rrs;
+          rr.domain_id = dom.id;
+          rr.ttl = dom.ttl;
+          rr.qname = name;
+          rr.qtype = "NULL";
+          rr.content = "";
+          rr.auth = 1;
+          rr.d_place = DNSResourceRecord::ANSWER;
+          rrs.push_back(rr);
+          std::swap(dom.records[name], rrs);
+        }
+      }
+    }
+
     tmp_domains.push_back(dom);
   }