From: Kees Monshouwer Date: Thu, 20 May 2021 13:17:40 +0000 (+0200) Subject: auth: add new autosecondary domains to the zone cache X-Git-Tag: auth-4.5.0-alpha1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91b6667177a43a09cb3ae1174c3a9586e29bfb25;p=thirdparty%2Fpdns.git auth: add new autosecondary domains to the zone cache --- diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index 30423dc600..f3757c0604 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -1378,7 +1378,7 @@ BB2DomainInfo Bind2Backend::createDomainEntry(const DNSName& domain, const strin return bbd; } -bool Bind2Backend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) +bool Bind2Backend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId) { string filename = getArg("supermaster-destdir") + '/' + domain.toStringNoDot(); @@ -1410,6 +1410,13 @@ bool Bind2Backend::createSlaveDomain(const string& ip, const DNSName& domain, co bbd.d_masters.push_back(ComboAddress(ip, 53)); bbd.setCtime(); safePutBBDomainInfo(bbd); + + if (zoneId) { + if (!safeGetBBDomainInfo(domain, &bbd)) + return false; + *zoneId = bbd.d_id; + } + return true; } diff --git a/modules/bindbackend/bindbackend2.hh b/modules/bindbackend/bindbackend2.hh index 93c1fe85e1..c1081b0c86 100644 --- a/modules/bindbackend/bindbackend2.hh +++ b/modules/bindbackend/bindbackend2.hh @@ -239,7 +239,7 @@ public: // for supermaster support bool superMasterBackend(const string& ip, const DNSName& domain, const vector& nsset, string* nameserver, string* account, DNSBackend** db) override; static std::mutex s_supermaster_config_lock; - bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) override; + bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) override; private: void setupDNSSEC(); diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index dc30d2cc22..0842e03639 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -664,7 +664,7 @@ bool RemoteBackend::superMasterBackend(const string& ip, const DNSName& domain, return true; } -bool RemoteBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) +bool RemoteBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId) { Json query = Json::object{ {"method", "createSlaveDomain"}, diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 7c2b6c129f..379106cdc7 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -184,7 +184,7 @@ public: void setNotified(uint32_t id, uint32_t serial) override; bool doesDNSSEC() override; bool superMasterBackend(const string& ip, const DNSName& domain, const vector& nsset, string* nameserver, string* account, DNSBackend** ddb) override; - bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account) override; + bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) override; bool replaceRRSet(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector& rrset) override; bool feedRecord(const DNSResourceRecord& r, const DNSName& ordername, bool ordernameIsNSEC3 = false) override; bool feedEnts(int domain_id, map& nonterm) override; diff --git a/pdns/backends/gsql/gsqlbackend.cc b/pdns/backends/gsql/gsqlbackend.cc index 068f7d99d4..35f9783193 100644 --- a/pdns/backends/gsql/gsqlbackend.cc +++ b/pdns/backends/gsql/gsqlbackend.cc @@ -1341,7 +1341,7 @@ bool GSQLBackend::createDomain(const DNSName &domain, const DomainInfo::DomainKi return true; } -bool GSQLBackend::createSlaveDomain(const string &ip, const DNSName &domain, const string &nameserver, const string &account) +bool GSQLBackend::createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId) { string name; vector masters({ComboAddress(ip, 53)}); @@ -1367,7 +1367,7 @@ bool GSQLBackend::createSlaveDomain(const string &ip, const DNSName &domain, con masters = tmp; } } - createDomain(domain, DomainInfo::Slave, masters, account, nullptr); + createDomain(domain, DomainInfo::Slave, masters, account, zoneId); } catch(SSqlException &e) { throw PDNSException("Database error trying to insert new slave domain '"+domain.toLogString()+"': "+ e.txtReason()); diff --git a/pdns/backends/gsql/gsqlbackend.hh b/pdns/backends/gsql/gsqlbackend.hh index 396ff7e0c7..efe8a758be 100644 --- a/pdns/backends/gsql/gsqlbackend.hh +++ b/pdns/backends/gsql/gsqlbackend.hh @@ -194,7 +194,7 @@ public: bool feedEnts(int domain_id, map& nonterm) override; bool feedEnts3(int domain_id, const DNSName &domain, map &nonterm, const NSEC3PARAMRecordContent& ns3prc, bool narrow) override; bool createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector &masters, const string &account, int* zoneId=nullptr) override; - bool createSlaveDomain(const string &ip, const DNSName &domain, const string &nameserver, const string &account) override; + bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) override; bool deleteDomain(const DNSName &domain) override; bool superMasterAdd(const string &ip, const string &nameserver, const string &account) override; bool superMasterBackend(const string &ip, const DNSName &domain, const vector&nsset, string *nameserver, string *account, DNSBackend **db) override; diff --git a/pdns/dnsbackend.hh b/pdns/dnsbackend.hh index ee9ddca5e9..642e492e93 100644 --- a/pdns/dnsbackend.hh +++ b/pdns/dnsbackend.hh @@ -362,7 +362,7 @@ public: } //! called by PowerDNS to create a slave record for a superMaster - virtual bool createSlaveDomain(const string &ip, const DNSName &domain, const string &nameserver, const string &account) + virtual bool createSlaveDomain(const string& ip, const DNSName& domain, const string& nameserver, const string& account, int* zoneId = nullptr) { return false; } diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 58325b6ef1..bb9b16320f 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -964,7 +964,9 @@ int PacketHandler::trySuperMasterSynchronous(const DNSPacket& p, const DNSName& return RCode::Refused; } try { - db->createSlaveDomain(remote.toString(), p.qdomain, nameserver, account); + int zoneId{-1}; + db->createSlaveDomain(remote.toString(), p.qdomain, nameserver, account, &zoneId); + g_zoneCache.add(p.qdomain, zoneId); if (tsigkeyname.empty() == false) { vector meta; meta.push_back(tsigkeyname.toStringNoDot()); diff --git a/regression-tests.nobackend/supermaster-unsigned/command b/regression-tests.nobackend/supermaster-unsigned/command index a695c063d9..6108a75754 100755 --- a/regression-tests.nobackend/supermaster-unsigned/command +++ b/regression-tests.nobackend/supermaster-unsigned/command @@ -50,6 +50,7 @@ module-dir=../regression-tests/modules launch=gsqlite3 gsqlite3-dnssec=yes gsqlite3-database=slave.db +zone-cache-refresh-interval=900 EOF rm -f master.db slave.db sqlite3 master.db < ../modules/gsqlite3backend/schema.sqlite3.sql