From: bert hubert Date: Thu, 11 Jul 2013 20:47:40 +0000 (+0200) Subject: teach dnsscope command line parameters like --rd to only look at recursion desired... X-Git-Tag: rec-3.6.0-rc1~573 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=611a846ed87d6895abb914b51b317cd556737df1;p=thirdparty%2Fpdns.git teach dnsscope command line parameters like --rd to only look at recursion desired, --ipv4 and --ipv6 to configure ipv4 and ipv6 filtering --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index 5df6c7075c..cf1f2b6516 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -111,7 +111,7 @@ pdnssec_SOURCES=pdnssec.cc dbdnsseckeeper.cc sstuff.hh dnsparser.cc dnsparser.hh serialtweaker.cc -pdnssec_LDFLAGS=@moduleobjects@ @modulelibs@ @DYNLINKFLAGS@ @LIBDL@ @THREADFLAGS@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) $(BOOST_SERIALIZATION_LDFLAGS) +pdnssec_LDFLAGS=@moduleobjects@ @modulelibs@ @DYNLINKFLAGS@ @LIBDL@ @THREADFLAGS@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) $(BOOST_SERIALIZATION_LDFLAGS) pdnssec_LDADD= ext/polarssl-1.1.2/library/libpolarssl.a $(BOOST_PROGRAM_OPTIONS_LIBS) $(BOOST_SERIALIZATION_LIBS) $(SQLITE3_LIBS) $(LIBCURL_LIBS) $(MYSQL_lib) if BOTAN110 @@ -241,7 +241,8 @@ dnsscope_SOURCES=dnsscope.cc misc.cc unix_utility.cc qtype.cc \ base64.cc base64.hh dnswriter.cc dnslabeltext.cc dnswriter.hh rcpgenerator.cc rcpgenerator.hh \ utility.hh dnsparser.hh sillyrecords.cc nsecrecords.cc base32.cc -dnsscope_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@ +dnsscope_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@ $(BOOST_PROGRAM_OPTIONS_LDFLAGS) +dnsscope_LDADD = $(BOOST_PROGRAM_OPTIONS_LIBS) dnsgram_SOURCES=dnsgram.cc misc.cc unix_utility.cc qtype.cc \ logger.cc statbag.cc dnspcap.cc dnspcap.hh dnsparser.cc dnsrecords.cc \ diff --git a/pdns/dnsscope.cc b/pdns/dnsscope.cc index 6e6176915a..fd08c75003 100644 --- a/pdns/dnsscope.cc +++ b/pdns/dnsscope.cc @@ -9,12 +9,15 @@ #include #include #include "anadns.hh" - -#include "namespaces.hh" +#include +#include +#include #include "namespaces.hh" -StatBag S; +namespace po = boost::program_options; +po::variables_map g_vm; +StatBag S; struct QuestionData { @@ -35,15 +38,47 @@ statmap_t statmap; int main(int argc, char** argv) try { - if(argc!=2) { + po::options_description desc("Allowed options"), hidden, alloptions; + desc.add_options() + ("help,h", "produce help message") + ("rd", po::value(), "If set to true, only process RD packets, to false only non-RD, unset: both") + ("ipv4", po::value()->default_value(true), "Process IPv4 packets") + ("ipv6", po::value()->default_value(true), "Process IPv6 packets") + ("verbose,v", "be verbose"); + + hidden.add_options() + ("files", po::value >(), "files"); + + alloptions.add(desc).add(hidden); + + po::positional_options_description p; + p.add("files", -1); + + po::store(po::command_line_parser(argc, argv).options(alloptions).positional(p).run(), g_vm); + po::notify(g_vm); + + vector files = g_vm["files"].as >(); + if(files.size() != 1 || g_vm.count("help")) { cerr<<"Syntax: dnsscope filename.pcap"<(); + haveRDFilter=1; + } + + bool doIPv4 = g_vm["ipv4"].as(); + bool doIPv6 = g_vm["ipv6"].as(); + + PcapPacketReader pr(files[0]); + PcapPacketWriter* pw=0; + /* if(argc==3) pw=new PcapPacketWriter(argv[2], pr); + */ int dnserrors=0, bogus=0; typedef map cumul_t; @@ -61,7 +96,12 @@ try ntohs(pr.d_udp->uh_dport)==53 || ntohs(pr.d_udp->uh_sport)==53) && pr.d_len > 12) { try { + if((pr.d_ip->ip_v == 4 && !doIPv4) || (pr.d_ip->ip_v == 6 && !doIPv6)) + continue; MOADNSParser mdp((const char*)pr.d_payload, pr.d_len); + if(haveRDFilter && mdp.d_header.rd != rdFilter) + continue; + if(pr.d_ip->ip_v == 4) ++ipv4Packets; else @@ -173,27 +213,21 @@ try tottime+=i->first*i->second; } - typedef map done_t; done_t done; done[50]; done[100]; done[200]; - done[250]; done[300]; - done[350]; done[400]; done[800]; done[1000]; done[2000]; done[4000]; done[8000]; - done[16000]; done[32000]; done[64000]; - done[128000]; done[256000]; - done[512000]; done[1024000]; done[2048000];