class FindNS
{
public:
- vector<string> lookup(const DNSName &name, UeberBackend *b)
+ vector<string> lookup(const DNSName &name, UeberBackend *b, const DNSName& zone)
{
vector<string> addresses;
this->resolve_name(&addresses, name);
if(b) {
- b->lookup(QType(QType::ANY),name);
- DNSZoneRecord rr;
- while(b->get(rr))
- if(rr.dr.d_type == QType::A || rr.dr.d_type==QType::AAAA)
+ b->lookup(QType(QType::ANY),name);
+ while (true) {
+ try {
+ DNSZoneRecord rr;
+ if (!b->get(rr))
+ break;
+ if (rr.dr.d_type == QType::A || rr.dr.d_type == QType::AAAA)
addresses.push_back(rr.dr.d_content->getZoneRepresentation()); // SOL if you have a CNAME for an NS
+ }
+ // After an exception, b can be inconsistent so break
+ catch (PDNSException &ae) {
+ L << Logger::Error << "Could not lookup address for nameserver " << name << " in zone " << zone << ", cannot notify: " << ae.reason << endl;
+ break;
+ }
+ catch (std::exception &e) {
+ L << Logger::Error << "Could not lookup address for nameserver " << name << " in zone " << zone << ", cannot notify: " << e.what() << endl;
+ break;
+ }
+ }
}
return addresses;
}
nsset.insert(getRR<NSRecordContent>(rr.dr)->getNS().toString());
for(set<string>::const_iterator j=nsset.begin();j!=nsset.end();++j) {
- vector<string> nsips=fns.lookup(DNSName(*j), B);
+ vector<string> nsips=fns.lookup(DNSName(*j), B, di.zone);
if(nsips.empty())
L<<Logger::Warning<<"Unable to queue notification of domain '"<<di.zone<<"': nameservers do not resolve!"<<endl;
else
while(B->get(rr))
nsset.insert(DNSName(rr.content));
for(const auto & j: nsset) {
- vector<string> nsips=fns.lookup(j, s_P->getBackend());
+ vector<string> nsips=fns.lookup(j, s_P->getBackend(),q->qdomain);
for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k) {
// cerr<<"got "<<*k<<" from AUTO-NS"<<endl;
if(*k == q->getRemote().toString())