]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: add new autosecondary domains to the zone cache
authorKees Monshouwer <mind04@monshouwer.org>
Thu, 20 May 2021 13:17:40 +0000 (15:17 +0200)
committermind04 <mind04@monshouwer.org>
Fri, 21 May 2021 07:45:54 +0000 (09:45 +0200)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.hh
pdns/packethandler.cc
regression-tests.nobackend/supermaster-unsigned/command

index 30423dc600e039dcea4edfe2b4dc7dfe7d862b6d..f3757c0604b2cb191ff85a6b98f9c058eb657aa6 100644 (file)
@@ -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;
 }
 
index 93c1fe85e1d6de702f3b61ce563857eeeabbba3b..c1081b0c8646a4d5295c53725979ff52c22cb8e7 100644 (file)
@@ -239,7 +239,7 @@ public:
   // for supermaster support
   bool superMasterBackend(const string& ip, const DNSName& domain, const vector<DNSResourceRecord>& 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();
index dc30d2cc22f96a01ad707cc6847340c34ef33af0..0842e036398c7a09f901c7a149798f56d2de42b2 100644 (file)
@@ -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"},
index 7c2b6c129f78edf5bf978998cab15c0a13833fb9..379106cdc7728d021e1bf319d52cc5dc49647fc8 100644 (file)
@@ -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<DNSResourceRecord>& 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<DNSResourceRecord>& rrset) override;
   bool feedRecord(const DNSResourceRecord& r, const DNSName& ordername, bool ordernameIsNSEC3 = false) override;
   bool feedEnts(int domain_id, map<DNSName, bool>& nonterm) override;
index 068f7d99d4c1c8d7fdf68df87608553033aab214..35f9783193374fce6416dd7541e5f3adac2829b3 100644 (file)
@@ -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<ComboAddress> 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());
index 396ff7e0c7896ac979335884a0e6a33f7785a4d4..efe8a758be2312818c05acd8bc6c4f9481c505a0 100644 (file)
@@ -194,7 +194,7 @@ public:
   bool feedEnts(int domain_id, map<DNSName,bool>& nonterm) override;
   bool feedEnts3(int domain_id, const DNSName &domain, map<DNSName,bool> &nonterm, const NSEC3PARAMRecordContent& ns3prc, bool narrow) override;
   bool createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector<ComboAddress> &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<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db) override;
index ee9ddca5e9159f579916a96784155a6711d7f07a..642e492e93f720d3a7acb2d076516394bccbda82 100644 (file)
@@ -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;
   }
index 58325b6ef1c3214ef68c5f5427650151a4435332..bb9b16320f3aebc2bbb2ad6cd7126c018945a2e3 100644 (file)
@@ -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<string> meta;
       meta.push_back(tsigkeyname.toStringNoDot());
index a695c063d9d45e3bdc32e2700527f40b000426ae..6108a757546ab4b248ae45a9ce278e1180ea1529 100755 (executable)
@@ -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