]> granicus.if.org Git - pdns/commitdiff
appears to do something
authorbert hubert <bert.hubert@netherlabs.nl>
Tue, 22 Apr 2014 11:22:03 +0000 (13:22 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Tue, 22 Apr 2014 11:22:03 +0000 (13:22 +0200)
pdns/Makefile.am
pdns/zone2sql.cc
pdns/zoneparser-tng.cc
pdns/zoneparser-tng.hh

index 5acc3b6f29c84a010990a33507829aefaae43128..0bf2fd040c1792430ce089fd857032b1d7cd1c92 100644 (file)
@@ -113,7 +113,7 @@ zone2sql_SOURCES=bindparser.yy bindlexer.l bind-dnssec.schema.sqlite3.sql.h \
        zoneparser-tng.cc dnsrecords.cc sillyrecords.cc \
        dnswriter.cc dnslabeltext.cc rcpgenerator.cc dnsparser.cc base64.cc \
        nsecrecords.cc dnssecinfra.cc base32.cc bindparserclasses.hh \
-       dns_random.cc
+       dns_random.cc json.cc json.hh
 
 zone2sql_LDFLAGS=@THREADFLAGS@
 zone2sql_LDADD= $(POLARSSL_LIBS)
index 250c31ec01c6532ffa4cfecbfc22ec30701c19c0..15d183210741511c0a01faa0d4d5783eb98f4827 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PowerDNS Versatile Database Driven Nameserver
-    Copyright (C) 2002 - 2011  PowerDNS.COM BV
+    Copyright (C) 2002 - 2014  PowerDNS.COM BV
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License version 2
@@ -24,7 +24,7 @@
 #include <unistd.h>
 #include <string>
 #include <map>
-
+#include "json.hh"
 #include <iostream>
 #include <stdio.h>
 #include "namespaces.hh"
@@ -142,8 +142,23 @@ static void emitDomain(const string& domain, const vector<string> *masters = 0)
   }
 }
 
-static void emitRecord(const string& zoneName, const string &qname, const string &qtype, const string &ocontent, int ttl, int prio)
+static void emitRecord(const string& zoneName, const string &qname, const string &qtype, const string &ocontent, int ttl, int prio, const string& comment="")
 {
+  int disabled=0;
+  string recordcomment;
+
+  if(!comment.empty()) {
+    string::size_type pos = comment.find("json={");
+    if(pos!=string::npos) {
+      string json = comment.substr(pos+5);
+      rapidjson::Document document;
+      if(document.Parse<0>(json.c_str()).HasParseError())
+       throw runtime_error("Could not parse JSON '"+json+"'");
+
+      disabled=boolFromJson(document, "disabled", false);
+      recordcomment=stringFromJson(document, "comment", "");
+    }
+  }
   g_numRecords++;
   string content(ocontent);
 
@@ -169,15 +184,22 @@ static void emitRecord(const string& zoneName, const string &qname, const string
       cout<<"insert into records (domain_id, name, type,content,ttl,prio,disabled) select id ,"<<
         sqlstr(toLower(stripDot(qname)))<<", "<<
         sqlstr(qtype)<<", "<<
-        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", 0"<<
+        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<disabled<<
         " from domains where name="<<toLower(sqlstr(zoneName))<<";\n";
+
+      if(!recordcomment.empty()) {
+       cout<<"insert into comments (domain_id,name,type,modified_at, comment) select id, "<<toLower(sqlstr(zoneName))<<", "<<sqlstr(qtype)<<", "<<time(0)<<", "<<sqlstr(recordcomment)<<" from domains where name="<<toLower(sqlstr(zoneName))<<";\n";
+       
+      }
+
+
     } else
     {
       cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio,disabled) select id ,"<<
         sqlstr(toLower(stripDot(qname)))<<", "<<
         sqlstr(toLower(labelReverse(makeRelative(stripDot(qname), zoneName))))<<", "<<auth<<", "<<
         sqlstr(qtype)<<", "<<
-        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", 0"<<
+        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<disabled<<
         " from domains where name="<<toLower(sqlstr(zoneName))<<";\n";
     }
   }
@@ -186,7 +208,7 @@ static void emitRecord(const string& zoneName, const string &qname, const string
       cout<<"insert into records (domain_id, name,type,content,ttl,prio,disabled) select id ,"<<
         sqlstr(toLower(stripDot(qname)))<<", "<<
         sqlstr(qtype)<<", "<<
-        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", 'f'"<<
+        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<< (disabled ? 't': 'f')<<
         " from domains where name="<<toLower(sqlstr(zoneName))<<";\n";
     } else
     {
@@ -194,7 +216,7 @@ static void emitRecord(const string& zoneName, const string &qname, const string
         sqlstr(toLower(stripDot(qname)))<<", "<<
         sqlstr(toLower(labelReverse(makeRelative(stripDot(qname), zoneName))))<<", '"<< (auth  ? 't' : 'f') <<"', "<<
         sqlstr(qtype)<<", "<<
-        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", 'f'"<<
+        sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<(disabled ? 't': 'f') <<
         " from domains where name="<<toLower(sqlstr(zoneName))<<";\n";
     }
   }
@@ -202,7 +224,7 @@ static void emitRecord(const string& zoneName, const string &qname, const string
     cout<<"insert into Records (id, domain_id, name, type, content, ttl, prio, disabled) select RECORDS_ID_SEQUENCE.nextval,id ,"<<
       sqlstr(toLower(stripDot(qname)))<<", "<<
       sqlstr(qtype)<<", "<<
-      sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", 0"
+      sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<disabled<<
       " from Domains where name="<<toLower(sqlstr(zoneName))<<";\n";
   }
   else if(g_mode==ORACLE) {
@@ -389,8 +411,12 @@ try
       DNSResourceRecord rr;
       startNewTransaction();
       emitDomain(zonename);
-      while(zpt.get(rr)) 
-        emitRecord(zonename, rr.qname, rr.qtype.getName(), rr.content, rr.ttl, rr.priority);
+      string comment;
+      
+      while(zpt.get(rr, &comment))  {
+       
+        emitRecord(zonename, rr.qname, rr.qtype.getName(), rr.content, rr.ttl, rr.priority, comment);
+      }
       num_domainsdone=1;
     }
     cerr<<num_domainsdone<<" domains were fully parsed, containing "<<g_numRecords<<" records\n";
index c241e90f67386825e21cfa2d1617989c021c3786..ff6a3e8f2e2889f6cdaf5a066a95a4b216a4d79b 100644 (file)
@@ -35,7 +35,7 @@
 
 ZoneParserTNG::ZoneParserTNG(const string& fname, const string& zname, const string& reldir) : d_reldir(reldir), 
                                                                                                d_zonename(zname), d_defaultttl(3600), 
-                                                                                               d_havedollarttl(false)
+                                                                                               d_havedollarttl(false), d_doPassComments(0)
 {
   d_zonename = toCanonic("", d_zonename);
   stackFile(fname);
@@ -230,14 +230,17 @@ string ZoneParserTNG::getLineOfFile()
 }
 
 // ODD: this function never fills out the prio field! rest of pdns compensates though
-bool ZoneParserTNG::get(DNSResourceRecord& rr) 
+bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment
 {
  retry:;
   if(!getTemplateLine() && !getLine())
     return false;
 
   boost::trim_right_if(d_line, is_any_of(" \r\n\x1a"));
-
+  if(comment)
+    comment->clear();
+  if(comment && d_line.find(';') != string::npos)
+    *comment = d_line.substr(d_line.find(';'));
   parts_t parts;
   vstringtok(parts, d_line);
 
@@ -314,8 +317,9 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
     if(nextpart.empty())
       break;
 
-    if(nextpart.find(';')!=string::npos)
+    if(nextpart.find(';')!=string::npos) {
       break;
+    }
 
     // cout<<"Next part: '"<<nextpart<<"'"<<endl;
     
index 8d5b23860ff6f341406b0011bbc6cb462f6a0c56..8a865d30b24c13da571e1934a8535e4b929dfd5f 100644 (file)
@@ -35,8 +35,8 @@ public:
   ZoneParserTNG(const string& fname, const string& zname="", const string& reldir="");
 
   ~ZoneParserTNG();
-
-  bool get(DNSResourceRecord& rr);
+  void enableComments();
+  bool get(DNSResourceRecord& rr, std::string* comment=0);
   typedef runtime_error exception;
   typedef deque<pair<string::size_type, string::size_type> > parts_t;
 private:
@@ -54,6 +54,7 @@ private:
   uint32_t d_templatecounter, d_templatestop, d_templatestep;
   string d_templateline;
   parts_t d_templateparts;
+  bool d_doPassComments;
 
   struct filestate {
     filestate(FILE* fp, string filename) : d_fp(fp), d_filename(filename), d_lineno(0){}