From: Bert Hubert Date: Wed, 9 Jun 2010 19:17:25 +0000 (+0000) Subject: add dnsbulktest infra X-Git-Tag: rec-3.3~76 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4dd35bb17e97bf442329f565d1223ac82f577396;p=pdns add dnsbulktest infra git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1626 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index b76b00c71..53c070965 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -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 index 000000000..1821909b5 --- /dev/null +++ b/pdns/dnsbulktest.cc @@ -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 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 '"< 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='"<first.d_place == 1 && i->first.d_type == QType::A) + dr.ips.push_back(ComboAddress(i->first.d_content->getZoneRepresentation())); + //cout<first.d_place-1<<"\t"<first.d_label<<"\tIN\t"<first.d_type); + //cout<<"\t"<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< domains; + + Inflighter, SendReceive> inflighter(domains, sr); + inflighter.d_maxInFlight = 1000; + string line; + + pair split; + while(stringfgets(stdin, line)) { + trim_right(line); + split=splitField(line,','); + domains.push_back(split.second); + } + cerr<<"Read "<