]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Juraj Lutter contributed this patch which implements the AXFR-SOURCE per-zone metadat...
authorBert Hubert <bert.hubert@netherlabs.nl>
Thu, 10 May 2012 20:27:50 +0000 (20:27 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Thu, 10 May 2012 20:27:50 +0000 (20:27 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2616 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/resolver.cc
pdns/resolver.hh
pdns/slavecommunicator.cc

index e0e647bfe5b02c7eb89b859df29de1aca1c65c27..262a601a06ee94d19c13cfbebe8de4a2899772a9 100644 (file)
@@ -306,17 +306,25 @@ void Resolver::getSoaSerial(const string &ipport, const string &domain, uint32_t
   *serial=(uint32_t)atol(parts[2].c_str());
 }
 
-AXFRRetriever::AXFRRetriever(const ComboAddress& remote, const string& domain, const string& tsigkeyname, const string& tsigalgorithm, 
-  const string& tsigsecret)
+AXFRRetriever::AXFRRetriever(const ComboAddress& remote,
+       const string& domain,
+       const string& tsigkeyname,
+       const string& tsigalgorithm, 
+       const string& tsigsecret,
+       const ComboAddress* laddr)
 : d_tsigkeyname(tsigkeyname), d_tsigsecret(tsigsecret), d_tsigPos(0), d_nonSignedMessages(0)
 {
   ComboAddress local;
-  if(remote.sin4.sin_family == AF_INET)
-    local=ComboAddress(::arg()["query-local-address"]);
-  else if(!::arg()["query-local-address6"].empty())
-    local=ComboAddress(::arg()["query-local-address6"]);
-  else
-    local=ComboAddress("::");
+  if (laddr != NULL) {
+         local = (ComboAddress) (*laddr);
+  } else {
+         if(remote.sin4.sin_family == AF_INET)
+           local=ComboAddress(::arg()["query-local-address"]);
+         else if(!::arg()["query-local-address6"].empty())
+           local=ComboAddress(::arg()["query-local-address6"]);
+         else
+           local=ComboAddress("::");
+  }
   d_sock = -1;
   try {
     d_sock = makeQuerySocket(local, false); // make a TCP socket
index d58d4e75fb6fb4b6a3ceb07db676d4d863da67f4..391de613be43e4073734b35002658ec9951ce70c 100644 (file)
@@ -84,7 +84,12 @@ private:
 class AXFRRetriever : public boost::noncopyable
 {
   public:
-    AXFRRetriever(const ComboAddress& remote, const string& zone, const string& tsigkeyname=string(), const string& tsigalgorithm=string(), const string& tsigsecret=string());
+    AXFRRetriever(const ComboAddress& remote,
+        const string& zone,
+        const string& tsigkeyname=string(),
+        const string& tsigalgorithm=string(),
+        const string& tsigsecret=string(),
+        const ComboAddress* laddr = NULL);
        ~AXFRRetriever();
     int getChunk(Resolver::res_t &res);  
   
index 28b30fe7022e4735bbc253aaa78c8422dc8dc47b..e01262085a06ef6652a2096ac0b1c0124ad88951 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PowerDNS Versatile Database Driven Nameserver
-    Copyright (C) 2002-2011  PowerDNS.COM BV
+    Copyright (C) 2002-2012  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 as 
@@ -144,7 +144,25 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
         return;
       }
     }
-    AXFRRetriever retriever(raddr, domain.c_str(), tsigkeyname, tsigalgorithm, tsigsecret);
+    
+    vector<string> localaddr;
+    ComboAddress laddr;
+    
+    if(B->getDomainMetadata(domain, "AXFR-SOURCE", localaddr) && !localaddr.empty()) {
+      try {
+        laddr = ComboAddress(localaddr[0]);
+        L<<Logger::Info<<"AXFR source for domain '"<<domain<<"' set to "<<localaddr[0]<<endl;
+      }
+      catch(std::exception& e) {
+        L<<Logger::Error<<"Failed to load AXFR source '"<<localaddr[0]<<"' for incoming AXFR of '"<<domain<<"': "<<e.what()<<endl;
+        return;
+      }
+    } else {
+               laddr.sin4.sin_family = 0;
+       }
+
+    AXFRRetriever retriever(raddr, domain.c_str(), tsigkeyname, tsigalgorithm, tsigsecret,
+               (laddr.sin4.sin_family == 0) ? NULL : &laddr);
 
     bool gotPresigned = false;
     bool gotNSEC3 = false;