]> granicus.if.org Git - pdns/commitdiff
work on zone2sql dot stripping
authorBert Hubert <bert.hubert@netherlabs.nl>
Tue, 25 Feb 2003 12:36:49 +0000 (12:36 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Tue, 25 Feb 2003 12:36:49 +0000 (12:36 +0000)
local-query-address

git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@155 d19b8d6e-7fed-0310-83ef-9ca221ded41b

ChangeLog
pdns/backends/bind/Makefile.am
pdns/backends/bind/zone2sql.cc
pdns/backends/bind/zoneparser2.cc
pdns/common_startup.cc
pdns/communicator.cc
pdns/dnspacket.cc
pdns/packethandler.cc
pdns/resolver.cc

index a09b736ebe3b9e816a92c9ff4bcc986316959a31..5c3ce7405fe395739d2d5dae03142080d153069e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,12 @@
 Changes since 2.9.6:
+       * need to do work on ( and ) in zones!
+       - added local-query-address (Mark Bergsma)
+       - zone2sql now removes dots in the SOA record
+       - zone2sql no longer silently tries to read directories
+       - improved error reporting if unable to figure out IP addresses for
+         slaves
+
+Changes since 2.9.5:
        - implemented isMaster in bindbackend (we now react to notifies)
        - added zoneId to mboxfw stuff - massive speedup
        - $GENERATE off by one bug (Christian Laursen)
index 122666c18e117bfffbe106cb81d1f940e60ac4c8..4aac0074e6be59b846e2e7b09a44bc81bbaa40ba 100644 (file)
@@ -9,7 +9,8 @@ bin_PROGRAMS = zone2sql
 
 zone2sql_SOURCES=bindparser.yy bindlexer.l zoneparser2.cc \
 ../../arguments.cc ../../logger.cc zone2sql.cc ../../statbag.cc ../../misc.cc \
-../../unix_utility.cc ../../qtype.cc
+../../unix_utility.cc ../../qtype.cc ../../dnspacket.cc \
+../../sillyrecords.cc
 
 zone2sql_LDFLAGS=@THREADFLAGS@
 
index 83335126c3b1b51c5ba3a602fb086137e5e78fea..b5a0bb24b462629cf6818d2882da77c841b102a6 100644 (file)
@@ -18,7 +18,7 @@
 */
 /* accepts a named.conf as parameter and outputs heaps of sql */
 
-// $Id: zone2sql.cc,v 1.5 2003/02/02 22:04:51 ahu Exp $ 
+// $Id: zone2sql.cc,v 1.6 2003/02/25 12:36:49 ahu Exp $ 
 #ifdef WIN32
 # pragma warning ( disable: 4786 )
 # include <unistd.h>
@@ -38,6 +38,7 @@ using namespace std;
 #include "bindparser.hh"
 #include "statbag.hh"
 #include "misc.hh"
+#include "dnspacket.hh"
 
 StatBag S;
 
@@ -65,9 +66,10 @@ bool g_intransaction;
 static int num_records;
 static string lastsoa_qname;
 
-static void callback(unsigned int domain_id,const string &domain, const string &qtype, const string &content, int ttl, int prio)
+static void callback(unsigned int domain_id,const string &domain, const string &qtype, const string &ocontent, int ttl, int prio)
 {
   static int lastsoa_domain_id=-1;
+  string content(ocontent);
 
   num_records++;
 
@@ -94,6 +96,13 @@ static void callback(unsigned int domain_id,const string &domain, const string &
        }
       }
     }
+    SOAData soadata;
+    DNSPacket::fillSOAData(content, soadata);
+    soadata.hostmaster=ZoneParser::canonic(soadata.hostmaster);
+    soadata.nameserver=ZoneParser::canonic(soadata.nameserver);
+    content=DNSPacket::serializeSOAData(soadata);
+
+
     lastsoa_qname=ZoneParser::canonic(domain);
   }
   
@@ -160,6 +169,7 @@ int main(int argc, char **argv)
     arg().set("zone","Zonefile with $ORIGIN to parse")="";
     arg().set("zone-name","Specify an $ORIGIN in case it is not present")="";
     arg().set("named-conf","Bind 8 named.conf to parse")="";
+    arg().set("soa-minimum-ttl","Do not change")="0";
 
     arg().setCmd("help","Provide a helpful message");
 
index 11220e6b8e66c8496e4293bce6e3003678a2347a..6a714a1f6e21386b80abff769d49c3b02cefbc4b 100644 (file)
@@ -93,6 +93,12 @@ void ZoneParser::parse(const string &fname, const string &origin, unsigned int d
        for(vector<Record>::const_iterator i=rec.begin();i!=rec.end();++i)
          d_callback(domain_id,i->name, i->qtype,i->content,i->ttl,i->prio);
     }
+
+    if(ferror(fds.top())) {
+      fclose(fds.top());
+      fds.pop();
+      throw AhuException("Error reading from file '"+fname+"': "+stringerror());
+    }
     fclose(fds.top());
     fds.pop();
   }
@@ -139,6 +145,12 @@ void ZoneParser::parse(const string &fname, const string &origin, vector<Record>
        for(vector<Record>::const_iterator i=rec.begin();i!=rec.end();++i)
          records.push_back(*i);
     }
+
+    if(ferror(fds.top())) {
+      fclose(fds.top());
+      fds.pop();
+      throw AhuException("Error reading from file '"+fname+"': "+stringerror());
+    }
     fclose(fds.top());
     fds.pop();
   }
index b3943b9583286eda0116659487501c5353a58ac2..ac6dbd806474ea636f8fc9686edc872800d71baa 100644 (file)
@@ -46,6 +46,7 @@ void declareArguments()
   arg().set("smtpredirector","Our smtpredir MX host")="a.misconfigured.powerdns.smtp.server";
   arg().set("local-address","Local IP address to which we bind")="0.0.0.0";
   arg().set("local-ipv6","Local IP address to which we bind")="";
+  arg().set("query-local-address","Source IP address for sending queries")="";
   arg().set("max-queue-length","Maximum queuelength before considering situation lost")="5000";
   arg().set("soa-serial-offset","Make sure that no SOA serial is less than this number")="0";
   arg().set("only-soa","Make sure that no SOA serial is less than this number")="org";
index 76ce2ff528e4abdaece07a7f5dee3198af711ce0..76df39fb0cfda60c2d470556be5612ed402ede64 100644 (file)
@@ -148,6 +148,8 @@ void CommunicatorClass::queueNotifyDomain(const string &domain, DNSBackend *B)
   
   for(set<string>::const_iterator j=nsset.begin();j!=nsset.end();++j) {
     vector<string>nsips=d_fns.lookup(*j, B);
+    if(nsips.empty())
+      L<<Logger::Warning<<"Unable to queue notification of domain '"<<domain<<"': nameservers do not resolve!"<<endl;
     for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k)
       ips.insert(*k);
   }
@@ -345,7 +347,25 @@ void CommunicatorClass::makeNotifySocket()
   memset((char *)&sin,0, sizeof(sin));
   
   sin.sin_family = AF_INET;
-  sin.sin_addr.s_addr = INADDR_ANY;
+
+  // Bind to a specific IP (query-local-address) if specified
+  string querylocaladdress(arg()["query-local-address"]);
+  if (querylocaladdress=="") {
+    sin.sin_addr.s_addr = INADDR_ANY;
+  }
+  else
+  {
+    struct hostent *h=0;
+    h=gethostbyname(querylocaladdress.c_str());
+    if(!h) {
+      Utility::closesocket(d_nsock);
+      d_nsock=-1;      
+      throw AhuException("Unable to resolve query local address");
+    }
+
+    sin.sin_addr.s_addr = *(int*)h->h_addr;
+  }
+  
   int n=0;
   for(;n<10;n++) {
     sin.sin_port = htons(10000+(Utility::random()%50000));
@@ -356,7 +376,7 @@ void CommunicatorClass::makeNotifySocket()
   if(n==10) {
     Utility::closesocket(d_nsock);
     d_nsock=-1;
-    throw AhuException(string("binding dnsproxy socket: ")+strerror(errno));
+    throw AhuException(string("binding notify socket: ")+strerror(errno));
   }
   if( !Utility::setNonBlocking( d_nsock ))
     throw AhuException(string("error getting or setting notify socket non-blocking: ")+strerror(errno));
index 59228c07f42c6bbea69612c4b7613ee50bef8027..36b8025156c840c39969c6ac4962dd93118d2b2c 100644 (file)
@@ -16,7 +16,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
-// $Id: dnspacket.cc,v 1.16 2003/01/23 15:34:53 ahu Exp $
+// $Id: dnspacket.cc,v 1.17 2003/02/25 12:36:49 ahu Exp $
 #include "utility.hh"
 #include <cstdio>
 
@@ -90,7 +90,6 @@ DNSPacket::DNSPacket(const DNSPacket &orig)
 
   stringbuffer=orig.stringbuffer;
   d=orig.d;
-
 }
 
 int DNSPacket::expand(const unsigned char *begin, const unsigned char *end, string &expanded, int depth)
index 226066d35abbb512953c2cf508632936ff1162a2..8302cb60f00783b09e0b5cb7ee4ce5a9cfd8b44a 100644 (file)
@@ -153,7 +153,7 @@ int PacketHandler::doDNSCheckRequest(DNSPacket *p, DNSPacket *r, string &target)
   DNSResourceRecord rr;
 
   if (p->qclass == 3 && p->qtype.getName() == "HINFO") {
-    rr.content = "PowerDNS $Id: packethandler.cc,v 1.9 2003/02/04 16:33:47 ahu Exp $";
+    rr.content = "PowerDNS $Id: packethandler.cc,v 1.10 2003/02/25 12:36:49 ahu Exp $";
     rr.ttl = 5;
     rr.qname=target;
     rr.qtype=13; // hinfo
@@ -169,7 +169,7 @@ int PacketHandler::doVersionRequest(DNSPacket *p, DNSPacket *r, string &target)
 {
   DNSResourceRecord rr;
   if(p->qtype.getCode()==QType::TXT && target=="version.bind") {// TXT
-    rr.content="Served by POWERDNS "VERSION" $Id: packethandler.cc,v 1.9 2003/02/04 16:33:47 ahu Exp $";
+    rr.content="Served by POWERDNS "VERSION" $Id: packethandler.cc,v 1.10 2003/02/25 12:36:49 ahu Exp $";
     rr.ttl=5;
     rr.qname=target;
     rr.qtype=QType::TXT; // TXT
@@ -334,7 +334,7 @@ int PacketHandler::doAdditionalProcessing(DNSPacket *p, DNSPacket *r)
            }
          }
          catch(ResolverException& re) {
-           L<<Logger::Error<<"Trying to do additional processing for answer to '"<<p->qdomain<<"' query: "<<re.reason<<endl;
+           // L<<Logger::Error<<"Trying to do additional processing for answer to '"<<p->qdomain<<"' query: "<<re.reason<<endl;
          }
        }
       }
index cdf6ab471f354abc4a5b9bdd736251e45a45981d..57769f4ec8b79024ab97a27d2c6af53cd82055eb 100644 (file)
@@ -216,7 +216,31 @@ void Resolver::makeTCPSocket(const string &ip, u_int16_t port)
   d_sock=socket(AF_INET,SOCK_STREAM,0);
   if(d_sock<0)
     throw ResolverException("Unable to make a TCP socket for resolver: "+stringerror());
-  
+
+  // Use query-local-address as source IP for queries, if specified.
+  string querylocaladdress(arg()["query-local-address"]);
+  if (querylocaladdress!="") {
+    struct sockaddr_in fromaddr;
+    struct hostent *h=0;
+
+    h = gethostbyname(querylocaladdress.c_str());
+    if(!h) {
+      Utility::closesocket(d_sock);
+      d_sock=-1;
+      throw ResolverException("Unable to resolve query local address");
+    }
+
+    fromaddr.sin_family = AF_INET;
+    fromaddr.sin_addr.s_addr = *(int*)h->h_addr;
+    fromaddr.sin_port = 0;
+
+    if (bind(d_sock, (struct sockaddr *)&fromaddr, sizeof(fromaddr)) < 0) {
+      Utility::closesocket(d_sock);
+      d_sock=-1;
+      throw ResolverException("Binding to query-local-address: "+stringerror());
+    }
+  }  
+    
   Utility::setNonBlocking( d_sock );
 
   int err;