]> granicus.if.org Git - pdns/commitdiff
add dnsbulktest infra
authorBert Hubert <bert.hubert@netherlabs.nl>
Wed, 9 Jun 2010 19:17:25 +0000 (19:17 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Wed, 9 Jun 2010 19:17:25 +0000 (19:17 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1626 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/Makefile.am
pdns/dnsbulktest.cc [new file with mode: 0644]

index b76b00c718d5d297f04e4d9768ba93ceaca9f526..53c070965907f19d7925444bbcfedb3ef6bc3fc7 100644 (file)
@@ -21,7 +21,7 @@ bin_PROGRAMS = pdns_control pdnssec dnsreplay
 endif
 
 EXTRA_PROGRAMS=pdns_recursor sdig tsig-tests speedtest pdns_control dnsscope dnsgram \
- dnsdemog dnswasher dnsscan dnslog nproxy notify pdnssec
+ dnsdemog dnswasher dnsscan dnslog nproxy notify pdnssec dnsbulktest
 
 pdns_server_SOURCES=dnspacket.cc nameserver.cc tcpreceiver.hh \
 qtype.cc logger.cc arguments.cc packethandler.cc tcpreceiver.cc \
@@ -83,8 +83,9 @@ dnswasher_SOURCES=dnswasher.cc misc.cc unix_utility.cc qtype.cc \
 
 dnswasher_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@
 
-#inflighter_SOURCES=inflighter.cc misc.cc unix_utility.cc qtype.cc logger.cc statbag.cc
-#inflighter_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@
+dnsbulktest_SOURCES=dnsbulktest.cc misc.cc unix_utility.cc qtype.cc logger.cc statbag.cc dnsparser.cc \
+       dnsrecords.cc dnswriter.cc rcpgenerator.cc base32.cc base64.cc sillyrecords.cc nsecrecords.cc 
+dnsbulktest_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@
 
 
 # unix_utility.cc
diff --git a/pdns/dnsbulktest.cc b/pdns/dnsbulktest.cc
new file mode 100644 (file)
index 0000000..1821909
--- /dev/null
@@ -0,0 +1,125 @@
+#include "inflighter.cc"
+#include "namespaces.hh"
+#include "dnsparser.hh"
+#include "sstuff.hh"
+#include "misc.hh"
+#include "dnswriter.hh"
+#include "dnsrecords.hh"
+
+StatBag S;
+
+struct DNSResult
+{
+  vector<ComboAddress> ips;
+  int rcode;
+};
+
+struct SendReceive
+{
+  typedef int Identifier;
+  typedef DNSResult Answer; // ip 
+  int d_socket;
+  uint16_t d_id;
+  
+  SendReceive()
+  {
+    d_socket = socket(AF_INET, SOCK_DGRAM, 0);
+    int val=1;
+    setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+    
+    ComboAddress remote("127.0.0.1", 5300);
+    connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen());
+  }
+  
+  ~SendReceive()
+  {
+    close(d_socket);
+  }
+  
+  Identifier send(string& domain)
+  {
+    //cerr<<"Sending query for '"<<domain<<"'"<<endl;
+    
+    // send it, copy code from 'sdig'
+    vector<uint8_t> packet;
+  
+    DNSPacketWriter pw(packet, domain, QType::A);
+    
+    pw.getHeader()->id = d_id++;
+    pw.getHeader()->rd = 1;
+    pw.getHeader()->qr = 0;
+    
+    ::send(d_socket, &*packet.begin(), packet.size(), 0);
+    
+    return pw.getHeader()->id;
+  }
+  
+  bool receive(Identifier& id, DNSResult& dr)
+  {
+    if(waitForData(d_socket, 0, 500000) > 0) {
+      char buf[512];
+    
+      int len = recv(d_socket, buf, sizeof(buf), 0);
+      if(len < 0)
+        return 0;
+      // parse packet, set 'id', fill out 'ip' 
+      
+      MOADNSParser mdp(string(buf, len));
+      //cout<<"Reply to question for qname='"<<mdp.d_qname<<"', qtype="<<DNSRecordContent::NumberToType(mdp.d_qtype)<<endl;
+      //cout<<"Rcode: "<<mdp.d_header.rcode<<", RD: "<<mdp.d_header.rd<<", QR: "<<mdp.d_header.qr;
+      //cout<<", TC: "<<mdp.d_header.tc<<", AA: "<<mdp.d_header.aa<<", opcode: "<<mdp.d_header.opcode<<endl;
+      dr.rcode = mdp.d_header.rcode;
+      for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {          
+        if(i->first.d_place == 1 && i->first.d_type == QType::A)
+          dr.ips.push_back(ComboAddress(i->first.d_content->getZoneRepresentation()));
+        //cout<<i->first.d_place-1<<"\t"<<i->first.d_label<<"\tIN\t"<<DNSRecordContent::NumberToType(i->first.d_type);
+        //cout<<"\t"<<i->first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<"\n";
+      }
+      id = mdp.d_header.id;
+      return 1;
+    }
+    return 0;
+  }
+  
+  void deliverAnswer(string& domain, const DNSResult& dr)
+  {
+    cerr<<domain<<": rcode: "<<dr.rcode;
+    BOOST_FOREACH(const ComboAddress& ca, dr.ips) {
+      cerr<<", "<<ca.toString();
+    }
+    cerr<<endl;
+  }
+};
+
+
+int main()
+{
+  SendReceive sr;
+  reportAllTypes();
+  vector<string> domains;
+    
+  Inflighter<vector<string>, SendReceive> inflighter(domains, sr);
+  inflighter.d_maxInFlight = 1000;
+  string line;
+  
+  pair<string, string> split;
+  while(stringfgets(stdin, line)) {
+    trim_right(line);
+    split=splitField(line,',');
+    domains.push_back(split.second);
+  }
+  cerr<<"Read "<<domains.size()<<" domains!"<<endl;
+
+
+  for(;;) {
+    try {
+      inflighter.run();
+      break;
+    }
+    catch(exception& e) {
+      cerr<<"Caught exception: "<<e.what()<<endl;
+    }
+  }
+}
+
+