-
Notifications
You must be signed in to change notification settings - Fork 905
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
abstract out StatNode class from dnsscope, move dnsscope to more stan…
…dard iputils infra
- Loading branch information
1 parent
74fa045
commit 6264512
Showing
3 changed files
with
176 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
#include "statnode.hh" | ||
|
||
StatNode::Stat StatNode::print(int depth, Stat newstat, bool silent) const | ||
{ | ||
if(!silent) { | ||
cout<<string(depth, ' '); | ||
cout<<name<<": "<<endl; | ||
} | ||
Stat childstat; | ||
childstat.queries += s.queries; | ||
childstat.noerrors += s.noerrors; | ||
childstat.nxdomains += s.nxdomains; | ||
childstat.servfails += s.servfails; | ||
childstat.drops += s.drops; | ||
if(children.size()>1024 && !silent) { | ||
cout<<string(depth, ' ')<<name<<": too many to print"<<endl; | ||
} | ||
for(const children_t::value_type& child : children) { | ||
childstat=child.second.print(depth+8, childstat, silent || children.size()>1024); | ||
} | ||
if(!silent || children.size()>1) | ||
cout<<string(depth, ' ')<<childstat.queries<<" queries, " << | ||
childstat.noerrors<<" noerrors, "<< | ||
childstat.nxdomains<<" nxdomains, "<< | ||
childstat.servfails<<" servfails, "<< | ||
childstat.drops<<" drops"<<endl; | ||
|
||
newstat+=childstat; | ||
|
||
return newstat; | ||
} | ||
|
||
|
||
void StatNode::visit(visitor_t visitor, Stat &newstat, int depth) const | ||
{ | ||
Stat childstat; | ||
childstat.queries += s.queries; | ||
childstat.noerrors += s.noerrors; | ||
childstat.nxdomains += s.nxdomains; | ||
childstat.servfails += s.servfails; | ||
childstat.drops += s.drops; | ||
childstat.remotes = s.remotes; | ||
|
||
Stat selfstat(childstat); | ||
|
||
|
||
for(const children_t::value_type& child : children) { | ||
child.second.visit(visitor, childstat, depth+8); | ||
} | ||
|
||
visitor(this, selfstat, childstat); | ||
|
||
newstat+=childstat; | ||
} | ||
|
||
|
||
void StatNode::submit(const DNSName& domain, int rcode, const ComboAddress& remote) | ||
{ | ||
// cerr<<"FIRST submit called on '"<<domain<<"'"<<endl; | ||
vector<string> tmp = domain.getRawLabels(); | ||
if(tmp.empty()) | ||
return; | ||
|
||
deque<string> 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<string>& labels, const std::string& domain, int rcode, const ComboAddress& remote) | ||
{ | ||
if(labels.empty()) | ||
return; | ||
// cerr<<"Submit called for domain='"<<domain<<"': "; | ||
// for(const std::string& n : labels) | ||
// cerr<<n<<"."; | ||
// cerr<<endl; | ||
if(name.empty()) { | ||
|
||
name=labels.back(); | ||
// cerr<<"Set short name to '"<<name<<"'"<<endl; | ||
} | ||
else | ||
; // cerr<<"Short name was already set to '"<<name<<"'"<<endl; | ||
|
||
if(labels.size()==1) { | ||
fullname=name+"."+domain; | ||
// cerr<<"Hit the end, set our fullname to '"<<fullname<<"'"<<endl<<endl; | ||
s.queries++; | ||
if(rcode<0) | ||
s.drops++; | ||
else if(rcode==0) | ||
s.noerrors++; | ||
else if(rcode==2) | ||
s.servfails++; | ||
else if(rcode==3) | ||
s.nxdomains++; | ||
s.remotes[remote]++; | ||
} | ||
else { | ||
fullname=name+"."+domain; | ||
// cerr<<"Not yet end, set our fullname to '"<<fullname<<"', recursing"<<endl; | ||
labels.pop_back(); | ||
children[labels.back()].submit(labels, fullname, rcode, remote); | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
#pragma once | ||
#include "dnsname.hh" | ||
#include <deque> | ||
#include <map> | ||
#include "iputils.hh" | ||
|
||
class StatNode | ||
{ | ||
public: | ||
void submit(const DNSName& domain, int rcode, const ComboAddress& remote); | ||
void submit(std::deque<std::string>& 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<ComboAddress,int,ComboAddress::addressOnlyLessThan> remotes_t; | ||
remotes_t remotes; | ||
}; | ||
|
||
Stat s; | ||
Stat print(int depth=0, Stat newstat=Stat(), bool silent=false) const; | ||
typedef boost::function<void(const StatNode*, const Stat& selfstat, const Stat& childstat)> visitor_t; | ||
void visit(visitor_t visitor, Stat& newstat, int depth=0) const; | ||
typedef std::map<std::string,StatNode, CIStringCompare> children_t; | ||
children_t children; | ||
|
||
}; |