From 24317c7fc7d6ece5e1ea092ccea352c82632a9cb Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Mon, 2 May 2016 12:39:29 +0200 Subject: [PATCH] move stub code into stubresolver.cc/hh --- pdns/Makefile.am | 1 + pdns/secpoll-auth.cc | 105 +------------------------------------ pdns/secpoll-auth.hh | 2 +- pdns/stubresolver.cc | 121 +++++++++++++++++++++++++++++++++++++++++++ pdns/stubresolver.hh | 6 +++ 5 files changed, 130 insertions(+), 105 deletions(-) create mode 100644 pdns/stubresolver.cc create mode 100644 pdns/stubresolver.hh diff --git a/pdns/Makefile.am b/pdns/Makefile.am index d14b6f67a0..07f1e1fca3 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -186,6 +186,7 @@ pdns_server_SOURCES = \ sillyrecords.cc \ slavecommunicator.cc \ statbag.cc statbag.hh \ + stubresolver.cc stubresolver.hh \ tcpreceiver.cc tcpreceiver.hh \ tkey.cc \ ueberbackend.cc ueberbackend.hh \ diff --git a/pdns/secpoll-auth.cc b/pdns/secpoll-auth.cc index 3bf0fce0f2..33570afb26 100644 --- a/pdns/secpoll-auth.cc +++ b/pdns/secpoll-auth.cc @@ -14,6 +14,7 @@ #include "dns_random.hh" #include "namespaces.hh" #include "statbag.hh" +#include "stubresolver.hh" #include #ifndef PACKAGEVERSION #define PACKAGEVERSION getPDNSVersion() @@ -23,107 +24,6 @@ string g_security_message; extern StatBag S; -// s_secpollresolvers contains the ComboAddresses that are used to resolve the -// secpoll status of PowerDNS -static vector s_secpollresolvers; - -/** Parse /etc/resolv.conf and add the nameservers to the vector - * s_secpollresolvers. - */ -void secPollParseResolveConf() -{ - ifstream ifs("/etc/resolv.conf"); - if(!ifs) - return; - - string line; - while(std::getline(ifs, line)) { - boost::trim_right_if(line, is_any_of(" \r\n\x1a")); - boost::trim_left(line); // leading spaces, let's be nice - - string::size_type tpos = line.find_first_of(";#"); - if(tpos != string::npos) - line.resize(tpos); - - if(boost::starts_with(line, "nameserver ") || boost::starts_with(line, "nameserver\t")) { - vector parts; - stringtok(parts, line, " \t,"); // be REALLY nice - for(vector::const_iterator iter = parts.begin()+1; iter != parts.end(); ++iter) { - try { - s_secpollresolvers.push_back(ComboAddress(*iter, 53)); - } - catch(...) - { - } - } - } - } - // Last resort, add 127.0.0.1 - if(s_secpollresolvers.empty()) { - s_secpollresolvers.push_back(ComboAddress("127.0.0.1", 53)); - } -} - -int doResolve(const string& qname, uint16_t qtype, vector& ret) -{ - vector packet; - - DNSPacketWriter pw(packet, DNSName(qname), qtype); - pw.getHeader()->id=dns_random(0xffff); - pw.getHeader()->rd=1; - if (s_secpollresolvers.empty()) { - L< sizeof(struct dnsheader)) { - struct dnsheader d; - memcpy(&d, reply.c_str(), sizeof(d)); - if(d.id != pw.getHeader()->id) - goto retry; - } - } - catch(...) { - continue; - } - MOADNSParser mdp(reply); - if(mdp.d_header.rcode == RCode::ServFail) - continue; - - - 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) { - DNSResourceRecord rr; - rr.qname = i->first.d_name; - rr.qtype = QType(i->first.d_type); - rr.content = i->first.d_content->getZoneRepresentation(); - rr.ttl=i->first.d_ttl; - ret.push_back(rr); - } - } - L< #include "namespaces.hh" +#include "stubresolver.hh" void doSecPoll(bool first); -void secPollParseResolveConf(); extern std::string g_security_message; #endif diff --git a/pdns/stubresolver.cc b/pdns/stubresolver.cc new file mode 100644 index 0000000000..7dbcf97e58 --- /dev/null +++ b/pdns/stubresolver.cc @@ -0,0 +1,121 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "logger.hh" +#include "arguments.hh" +#include "version.hh" +#include "misc.hh" + +#include "sstuff.hh" +#include "dnswriter.hh" +#include "dns_random.hh" +#include "namespaces.hh" +#include "statbag.hh" +#include "stubresolver.hh" + +// s_secpollresolvers contains the ComboAddresses that are used to resolve the +// secpoll status of PowerDNS +static vector s_secpollresolvers; + +/** Parse /etc/resolv.conf and add the nameservers to the vector + * s_secpollresolvers. + */ +void secPollParseResolveConf() +{ + ifstream ifs("/etc/resolv.conf"); + if(!ifs) + return; + + string line; + while(std::getline(ifs, line)) { + boost::trim_right_if(line, is_any_of(" \r\n\x1a")); + boost::trim_left(line); // leading spaces, let's be nice + + string::size_type tpos = line.find_first_of(";#"); + if(tpos != string::npos) + line.resize(tpos); + + if(boost::starts_with(line, "nameserver ") || boost::starts_with(line, "nameserver\t")) { + vector parts; + stringtok(parts, line, " \t,"); // be REALLY nice + for(vector::const_iterator iter = parts.begin()+1; iter != parts.end(); ++iter) { + try { + s_secpollresolvers.push_back(ComboAddress(*iter, 53)); + } + catch(...) + { + } + } + } + } + + if(::arg().mustDo("recursor")) + s_secpollresolvers.push_back(ComboAddress(::arg()["recursor"], 53)); + + // Last resort, add 127.0.0.1 + if(s_secpollresolvers.empty()) { + s_secpollresolvers.push_back(ComboAddress("127.0.0.1", 53)); + } +} + +// s_secpollresolvers contains the ComboAddresses that are used to resolve the +int doResolve(const string& qname, uint16_t qtype, vector& ret) +{ + vector packet; + + DNSPacketWriter pw(packet, DNSName(qname), qtype); + pw.getHeader()->id=dns_random(0xffff); + pw.getHeader()->rd=1; + if (s_secpollresolvers.empty()) { + L< sizeof(struct dnsheader)) { + struct dnsheader d; + memcpy(&d, reply.c_str(), sizeof(d)); + if(d.id != pw.getHeader()->id) + goto retry; + } + } + catch(...) { + continue; + } + MOADNSParser mdp(reply); + if(mdp.d_header.rcode == RCode::ServFail) + continue; + + + 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) { + DNSResourceRecord rr; + rr.qname = i->first.d_name; + rr.qtype = QType(i->first.d_type); + rr.content = i->first.d_content->getZoneRepresentation(); + rr.ttl=i->first.d_ttl; + ret.push_back(rr); + } + } + L<& ret); -- 2.47.2