]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
make pdnsutil edit-zone operate on a 'prettysorted' zone in canonical order, except...
authorbert hubert <bert.hubert@powerdns.com>
Mon, 18 Apr 2016 10:10:44 +0000 (12:10 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Mon, 18 Apr 2016 10:10:44 +0000 (12:10 +0200)
pdns/pdnsutil.cc

index bd123d28c208a2af8c3e866f4b86bbc56544aa0a..b664268918112e8c6505f773ba6983898787940f 100644 (file)
@@ -923,6 +923,16 @@ int clearZone(DNSSECKeeper& dk, const DNSName &zone) {
   return EXIT_SUCCESS;
 }
 
+bool prettyDROrder(const DNSRecord& a, const DNSRecord& b) 
+{
+  if(a.d_type == QType::SOA && b.d_type != QType::SOA)
+    return true;
+  if(a.d_type != QType::SOA && b.d_type == QType::SOA)
+    return false;
+
+  return a<b;
+}
+
 int editZone(DNSSECKeeper& dk, const DNSName &zone) {
   UeberBackend B;
   DomainInfo di;
@@ -964,12 +974,14 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
         continue;
       DNSRecord dr(rr);
       pre.push_back(dr);
+    }
+    sort(pre.begin(), pre.end(), prettyDROrder);
+    for(const auto& dr : pre) {
       ostringstream os;
       os<<dr.d_name<<"\t"<<dr.d_ttl<<"\tIN\t"<<DNSRecordContent::NumberToType(dr.d_type)<<"\t"<<dr.d_content->getZoneRepresentation(true)<<endl;
       if(write(tmpfd, os.str().c_str(), os.str().length()) < 0)
         unixDie("Writing zone to temporary file");
     }
-    sort(pre.begin(), pre.end());
     close(tmpfd);
     tmpfd=-1;
   }
@@ -1006,7 +1018,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
       goto reAsk;
     }
   }
-  sort(post.begin(), post.end());
+  sort(post.begin(), post.end(), prettyDROrder);
   checkrr.clear();
 
   for(const DNSRecord& rr : post) {
@@ -1034,8 +1046,9 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
   cout<<"Detected the following changes:\n"<<endl;
 
   vector<DNSRecord> diff;
+
   map<pair<DNSName,uint16_t>, string> changed;
-  set_difference(pre.cbegin(), pre.cend(), post.cbegin(), post.cend(), back_inserter(diff));
+  set_difference(pre.cbegin(), pre.cend(), post.cbegin(), post.cend(), back_inserter(diff), prettyDROrder);
   for(const auto& d : diff) {
     ostringstream str;
     str<<'-'<< d.d_name <<" "<<d.d_ttl<<" IN "<<DNSRecordContent::NumberToType(d.d_type)<<" "<<d.d_content->getZoneRepresentation(true)<<endl;
@@ -1043,7 +1056,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
 
   }
   diff.clear();
-  set_difference(post.cbegin(), post.cend(), pre.cbegin(), pre.cend(), back_inserter(diff));
+  set_difference(post.cbegin(), post.cend(), pre.cbegin(), pre.cend(), back_inserter(diff), prettyDROrder);
   for(const auto& d : diff) {
     ostringstream str;