From 6264512bd15c68563a656e4d57dbc04e4edbe608 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Thu, 9 Jun 2016 16:33:31 +0200 Subject: [PATCH] abstract out StatNode class from dnsscope, move dnsscope to more standard iputils infra --- pdns/dnsscope.cc | 188 +++++------------------------------------------ pdns/statnode.cc | 115 +++++++++++++++++++++++++++++ pdns/statnode.hh | 43 +++++++++++ 3 files changed, 176 insertions(+), 170 deletions(-) create mode 100644 pdns/statnode.cc create mode 100644 pdns/statnode.hh diff --git a/pdns/dnsscope.cc b/pdns/dnsscope.cc index 52dfdfaaf..ba7c20c44 100644 --- a/pdns/dnsscope.cc +++ b/pdns/dnsscope.cc @@ -20,6 +20,7 @@ #include "namespaces.hh" #include #include "dnsrecords.hh" +#include "statnode.hh" namespace po = boost::program_options; po::variables_map g_vm; @@ -31,176 +32,8 @@ ArgvMap& arg() } StatBag S; -struct comboCompare -{ - bool operator()(const ComboAddress& a, const ComboAddress& b) const - { - return ntohl(a.sin4.sin_addr.s_addr) < ntohl(b.sin4.sin_addr.s_addr); - } -}; - - -class StatNode -{ -public: - void submit(const DNSName& domain, int rcode, const ComboAddress& remote); - void submit(deque& labels, const std::string& domain, int rcode, const ComboAddress& remote); - - string name; - string fullname; - struct Stat - { - Stat() : queries(0), noerrors(0), nxdomains(0), servfails(0), drops(0){} - int queries, noerrors, nxdomains, servfails, drops; - - Stat& operator+=(const Stat& rhs) { - queries+=rhs.queries; - noerrors+=rhs.noerrors; - nxdomains+=rhs.nxdomains; - servfails+=rhs.servfails; - drops+=rhs.drops; - - for(const remotes_t::value_type& rem : rhs.remotes) { - remotes[rem.first]+=rem.second; - } - return *this; - } - typedef map remotes_t; - remotes_t remotes; - }; - - Stat s; - Stat print(int depth=0, Stat newstat=Stat(), bool silent=false) const; - typedef boost::function visitor_t; - void visit(visitor_t visitor, Stat& newstat, int depth=0) const; - typedef map children_t; - children_t children; - -}; - -StatNode::Stat StatNode::print(int depth, Stat newstat, bool silent) const -{ - if(!silent) { - cout<1024 && !silent) { - cout<1024); - } - if(!silent || children.size()>1) - cout< tmp = domain.getRawLabels(); - if(tmp.empty()) - return; - - deque parts; - for(auto const i : tmp) { - parts.push_back(i); - } - children[parts.back()].submit(parts, "", rcode, remote); -} - -/* www.powerdns.com. -> - . <- fullnames - com. - powerdns.com - www.powerdns.com. -*/ - -void StatNode::submit(deque& labels, const std::string& domain, int rcode, const ComboAddress& remote) -{ - if(labels.empty()) - return; - // cerr<<"Submit called for domain='"< 0.8 && node->children.size()>100) { - cout<fullname<<", servfails: "<children.size()<fullname<<"\t"<100 children, on average less than 2 copies of a query + // >100 different subqueries + double dups=1.0*childstat.queries/node->children.size(); + if(dups > 2.0) + return; + if(1.0*childstat.servfails / childstat.queries > 0.2 && node->children.size()>100) { + cout<fullname<<", servfails: "<children.size()<<", childstat.queries: "<fullname<<"\t"< requestors, recipients, rdnonra; + set requestors, recipients, rdnonra; typedef vector > pcounts_t; pcounts_t pcounts; OPTRecordContent::report(); @@ -578,7 +426,7 @@ try } vector diff; - set_difference(requestors.begin(), requestors.end(), recipients.begin(), recipients.end(), back_inserter(diff), comboCompare()); + set_difference(requestors.begin(), requestors.end(), recipients.begin(), recipients.end(), back_inserter(diff), ComboAddress::addressOnlyLessThan()); cout<<"Saw "<1024 && !silent) { + cout<1024); + } + if(!silent || children.size()>1) + cout< tmp = domain.getRawLabels(); + if(tmp.empty()) + return; + + deque parts; + for(auto const i : tmp) { + parts.push_back(i); + } + children[parts.back()].submit(parts, "", rcode, remote); +} + +/* www.powerdns.com. -> + . <- fullnames + com. + powerdns.com + www.powerdns.com. +*/ + +void StatNode::submit(deque& labels, const std::string& domain, int rcode, const ComboAddress& remote) +{ + if(labels.empty()) + return; + // cerr<<"Submit called for domain='"< +#include +#include "iputils.hh" + +class StatNode +{ +public: + void submit(const DNSName& domain, int rcode, const ComboAddress& remote); + void submit(std::deque& labels, const std::string& domain, int rcode, const ComboAddress& remote); + + std::string name; + std::string fullname; + struct Stat + { + Stat() : queries(0), noerrors(0), nxdomains(0), servfails(0), drops(0){} + int queries, noerrors, nxdomains, servfails, drops; + + Stat& operator+=(const Stat& rhs) { + queries+=rhs.queries; + noerrors+=rhs.noerrors; + nxdomains+=rhs.nxdomains; + servfails+=rhs.servfails; + drops+=rhs.drops; + + for(const remotes_t::value_type& rem : rhs.remotes) { + remotes[rem.first]+=rem.second; + } + return *this; + } +typedef std::map remotes_t; + remotes_t remotes; + }; + + Stat s; + Stat print(int depth=0, Stat newstat=Stat(), bool silent=false) const; + typedef boost::function visitor_t; + void visit(visitor_t visitor, Stat& newstat, int depth=0) const; + typedef std::map children_t; + children_t children; + +}; -- 2.40.0