]> granicus.if.org Git - pdns/commitdiff
teach gsql backend about --dnssec switch, plus revamp getBeforeAndAfter, you need...
authorBert Hubert <bert.hubert@netherlabs.nl>
Sat, 8 May 2010 20:19:39 +0000 (20:19 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sat, 8 May 2010 20:19:39 +0000 (20:19 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1600 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/backends/bind/bindbackend2.cc
pdns/backends/bind/bindbackend2.hh
pdns/backends/bind/zone2sql.cc
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.hh

index be9e7f95650c20aa325516fdcbd927820acfc276..0d857349765289acc93e32fe07b8ab71a30ec924 100644 (file)
@@ -789,7 +789,7 @@ string dotConcat(const std::string& a, const std::string &b)
     return a+"."+b;
 }
 
-bool Bind2Backend::getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+bool Bind2Backend::getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
 {
   shared_ptr<State> state = s_state;
 
index 624092c50418813c075fb8c51280a8561ed56cc6..cbe11b6ad35f4acfeecfdc184bb8b1f3bb3b5c80 100644 (file)
@@ -108,7 +108,7 @@ public:
   void getUpdatedMasters(vector<DomainInfo> *changedDomains);
   bool getDomainInfo(const string &domain, DomainInfo &di);
   time_t getCtime(const string &fname);
-  virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after);
+  virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& zname, const std::string& qname, std::string& before, std::string& after);
   void lookup(const QType &, const string &qdomain, DNSPacket *p=0, int zoneId=-1);
   bool list(const string &target, int id);
   bool get(DNSResourceRecord &);
index 65a112abe45e277804c7c500e18318f583b78268..f1a1f5c7e17c3e3d5f3c404bb395f2d6647e6571 100644 (file)
@@ -138,9 +138,10 @@ static void callback(unsigned int domain_id,const string &domain, const string &
         sqlstr(qtype)<<", "<<
         sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<<");\n";
     } else {
+    
       cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio) values ("<< dirty_hack_num<<", "<<
         sqlstr(stripDot(domain))<<", "<<
-        sqlstr(toLower(labelReverse(domain)))<<", "<< auth <<" ,"<<
+        sqlstr(toLower(labelReverse(makeRelative(domain, lastsoa_qname))))<<", "<< auth <<" ,"<<
         sqlstr(qtype)<<", "<<
         sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<<");\n";
     }
@@ -154,9 +155,10 @@ static void callback(unsigned int domain_id,const string &domain, const string &
         " from domains where name="<<toLower(sqlstr(lastsoa_qname))<<";\n";
     } else
     {
+      cerr<<"makeRelative('"<<stripDot(domain)<<"', '"<<lastsoa_qname<<"');"<<endl;
       cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio) select id ,"<<
         sqlstr(toLower(stripDot(domain)))<<", "<<
-        sqlstr(toLower(labelReverse(domain)))<<", "<<auth<<", "<<
+        sqlstr(toLower(labelReverse(makeRelative(stripDot(domain), lastsoa_qname))))<<", "<<auth<<", "<<
         sqlstr(qtype)<<", "<<
         sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<< 
         " from domains where name="<<toLower(sqlstr(lastsoa_qname))<<";\n";
@@ -245,6 +247,8 @@ int main(int argc, char **argv)
         cout<<"set autocommit on;"<<endl;
     }
 
+    cerr<<"mode = POSTGRES: "<< (mode == POSTGRES) <<endl;
+
     g_doDNSSEC=::arg().mustDo("dnssec");
       
 
@@ -252,8 +256,6 @@ int main(int argc, char **argv)
     namedfile=::arg()["named-conf"];
     zonefile=::arg()["zone"];
 
-    
-
     int count=0, num_domainsdone=0;
 
     if(zonefile.empty()) {
@@ -283,33 +285,33 @@ int main(int argc, char **argv)
           try {
             if(mode==POSTGRES || mode==ORACLE) {
               if(g_intransaction && ::arg().mustDo("transactions")) {
-               cout<<"COMMIT WORK;"<<endl;
+                cout<<"COMMIT WORK;"<<endl;
               }
               if(::arg().mustDo("transactions")) {
-               if(mode==POSTGRES)
-                 cout<<"BEGIN TRANSACTION;"<<endl;
-               g_intransaction=1;
+                if(mode==POSTGRES)
+                  cout<<"BEGIN TRANSACTION;"<<endl;
+                g_intransaction=1;
               }
 
               if(mode==POSTGRES) {
-               if(::arg().mustDo("slave")) {
-                 if(i->masters.empty())
-                   cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
-                 else {
-                   string masters;
-                   for(vector<string>::const_iterator iter = i->masters.begin(); iter != i->masters.end(); ++iter) {
-                     if(iter != i->masters.begin())
-                       masters.append(1, ' ');
-                     masters+=*iter;
-                   }
-                   cout<<"insert into domains (name,type,master) values ("<<sqlstr(i->name)<<",'SLAVE'"<<", '"<<masters<<"');"<<endl;
-                 }
-               }
-               else
-                 cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
+                if(::arg().mustDo("slave")) {
+                  if(i->masters.empty())
+                    cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
+                  else {
+                    string masters;
+                    for(vector<string>::const_iterator iter = i->masters.begin(); iter != i->masters.end(); ++iter) {
+                      if(iter != i->masters.begin())
+                        masters.append(1, ' ');
+                      masters+=*iter;
+                      }
+                    cout<<"insert into domains (name,type,master) values ("<<sqlstr(i->name)<<",'SLAVE'"<<", '"<<masters<<"');"<<endl;
+                  }
+                }
+                else
+                  cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
               }
               else if(mode==ORACLE) {
-               cout<<"insert into domains (id,name,type) values (domains_id_sequence.nextval,"<<toLower(sqlstr(i->name))<<",'NATIVE');"<<endl;
+                cout<<"insert into domains (id,name,type) values (domains_id_sequence.nextval,"<<toLower(sqlstr(i->name))<<",'NATIVE');"<<endl;
               }
               lastsoa_qname=i->name;
             }
index f341779a0dfa3f4ece9d475aeb9dc512193c68a5..d672d000f67f3627eab53684ed572cafe9ffcc10 100644 (file)
@@ -211,18 +211,20 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix)
   setArgPrefix(mode+suffix);
   d_db=0;
   d_logprefix="["+mode+"Backend"+suffix+"] ";
-                 
-  d_noWildCardNoIDQuery=getArg("basic-query");
-  d_noWildCardIDQuery=getArg("id-query");
-  d_wildCardNoIDQuery=getArg("wildcard-query");
-  d_wildCardIDQuery=getArg("wildcard-id-query");
-
-  d_noWildCardANYNoIDQuery=getArg("any-query");
-  d_noWildCardANYIDQuery=getArg("any-id-query");
-  d_wildCardANYNoIDQuery=getArg("wildcard-any-query");
-  d_wildCardANYIDQuery=getArg("wildcard-any-id-query");
+       
+  d_dnssecQueries = mustDo("dnssec");
+  string authswitch = d_dnssecQueries ? "-auth" : "";    
+  d_noWildCardNoIDQuery=getArg("basic-query"+authswitch);
+  d_noWildCardIDQuery=getArg("id-query"+authswitch);
+  d_wildCardNoIDQuery=getArg("wildcard-query"+authswitch);
+  d_wildCardIDQuery=getArg("wildcard-id-query"+authswitch);
+
+  d_noWildCardANYNoIDQuery=getArg("any-query"+authswitch);
+  d_noWildCardANYIDQuery=getArg("any-id-query"+authswitch);
+  d_wildCardANYNoIDQuery=getArg("wildcard-any-query"+authswitch);
+  d_wildCardANYIDQuery=getArg("wildcard-any-id-query"+authswitch);
   
-  d_listQuery=getArg("list-query");
+  d_listQuery=getArg("list-query"+authswitch);
 
   d_MasterOfDomainsZoneQuery=getArg("master-zone-query");
   d_InfoOfDomainsZoneQuery=getArg("info-zone-query");
@@ -235,25 +237,38 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix)
   d_InfoOfAllMasterDomainsQuery=getArg("info-all-master-query");
   d_DeleteZoneQuery=getArg("delete-zone-query");
   d_CheckACLQuery=getArg("check-acl-query");
+  
+  d_beforeOrderQuery = getArg("get-order-before-query");
+  d_afterOrderQuery = getArg("get-order-after-query");
+  d_setOrderAuthQuery = getArg("set-order-and-auth-query");
 }
 
-bool GSQLBackend::getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+bool GSQLBackend::getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
 {
   cerr<<"gsql before/after called for id="<<id<<", qname="<<qname<<endl;
   string lcqname=toLower(qname);
+
+  if(lcqname == zonename)  // XXX FIXME NEED A CALL THAT DOES THIS RIGHT
+    lcqname.clear();
+  else 
+    lcqname = lcqname.substr(0, lcqname.size() - zonename.length() - 1); // strip domain name
   
   lcqname=labelReverse(lcqname);
 
   SSql::row_t row;
 
-  d_db->doQuery("select min(ordername) from records where ordername > '"+sqlEscape(lcqname)+"' and auth=1");
+  char output[1024];
+  snprintf(output, sizeof(output)-1, d_afterOrderQuery.c_str(), sqlEscape(lcqname).c_str(), id);
+  
+  d_db->doQuery(output);
   while(d_db->getRow(row)) {
-    after=labelReverse(row[0]);
+    after=labelReverse(row[0])+"."+zonename;
   }
 
-  d_db->doQuery("select max(ordername) from records where ordername < '"+sqlEscape(lcqname)+"' and auth=1");
+  snprintf(output, sizeof(output)-1, d_beforeOrderQuery.c_str(), sqlEscape(lcqname).c_str(), id);
+  d_db->doQuery(output);
   while(d_db->getRow(row)) {
-    before=labelReverse(row[0]);
+    before=labelReverse(row[0])+"."+zonename;
   }
 
   return false;
@@ -275,17 +290,17 @@ void GSQLBackend::lookup(const QType &qtype,const string &qname, DNSPacket *pkt_
     // qtype qname domain_id
     if(domain_id<0) {
       if(qname[0]=='%')
-       format=d_wildCardNoIDQuery;
+        format=d_wildCardNoIDQuery;
       else
-       format=d_noWildCardNoIDQuery;
+        format=d_noWildCardNoIDQuery;
 
       snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(), sqlEscape(lcqname).c_str());
     }
     else {
       if(qname[0]!='%')
-       format=d_noWildCardIDQuery;
+        format=d_noWildCardIDQuery;
       else
-       format=d_wildCardIDQuery;
+        format=d_wildCardIDQuery;
       snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(),sqlEscape(lcqname).c_str(),domain_id);
     }
   }
@@ -294,17 +309,17 @@ void GSQLBackend::lookup(const QType &qtype,const string &qname, DNSPacket *pkt_
     // qname domain_id
     if(domain_id<0) {
       if(qname[0]=='%')
-       format=d_wildCardANYNoIDQuery;
+        format=d_wildCardANYNoIDQuery;
       else
-       format=d_noWildCardANYNoIDQuery;
+        format=d_noWildCardANYNoIDQuery;
 
       snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str());
     }
     else {
       if(qname[0]!='%')
-       format=d_noWildCardANYIDQuery;
+        format=d_noWildCardANYIDQuery;
       else
-       format=d_wildCardANYIDQuery;
+        format=d_wildCardANYIDQuery;
       snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str(),domain_id);
     }
   }
@@ -422,6 +437,9 @@ bool GSQLBackend::get(DNSResourceRecord &r)
     r.qtype=row[3];
     r.last_modified=0;
     
+    if(d_dnssecQueries)
+      r.auth = !row[6].empty() && row[6][0]=='1';
+    
     r.domain_id=atoi(row[4].c_str());
     return true;
   }
index b3199632b79e215910ef8df7c17b43a576610f94..8d6d1c00020086fe51d6768b8f7f796b2e3042a0 100644 (file)
@@ -39,7 +39,7 @@ public:
   void getUpdatedMasters(vector<DomainInfo> *updatedDomains);
   bool getDomainInfo(const string &domain, DomainInfo &di);
   void setNotified(uint32_t domain_id, uint32_t serial);
-  bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after);
+  bool getBeforeAndAfterNames(uint32_t id, const std::string& zname, const std::string& qname, std::string& before, std::string& after);
 private:
   string d_qname;
   QType d_qtype;
@@ -69,4 +69,11 @@ private:
   string d_InfoOfAllMasterDomainsQuery;
   string d_DeleteZoneQuery;            
   string d_CheckACLQuery;   
+  
+  string d_beforeOrderQuery;
+  string d_afterOrderQuery;
+  string d_setOrderAuthQuery;
+
+protected:  
+  bool d_dnssecQueries;
 };
index 1414542e779c2401912ce089297816cf69b4cf15..e046ae10de4d0e8e1f618b45d6dc3c566e639ba6 100644 (file)
@@ -74,7 +74,7 @@ public:
   virtual void lookup(const QType &qtype, const string &qdomain, DNSPacket *pkt_p=0, int zoneId=-1)=0; 
   virtual bool get(DNSResourceRecord &)=0; //!< retrieves one DNSResource record, returns false if no more were available
 
-  virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+  virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
   {
     std::cerr<<"Default beforeAndAfter called!"<<std::endl;
     return false;