]> granicus.if.org Git - pdns/commitdiff
allow DNSSECKeeper to share a database connection on construction. Use this new featu...
authorBert Hubert <bert.hubert@netherlabs.nl>
Tue, 12 Apr 2011 09:30:35 +0000 (09:30 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Tue, 12 Apr 2011 09:30:35 +0000 (09:30 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2153 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dbdnsseckeeper.cc
pdns/dnsseckeeper.hh
pdns/slavecommunicator.cc

index fc04268b2aeda9a0c6141071a722ea972e9a1ed0..a47c54c90d175008ff9e26092d5e629e9a312df5 100644 (file)
@@ -120,7 +120,7 @@ bool DNSSECKeeper::addKey(const std::string& name, const DNSSECPrivateKey& dpk,
   kd.active = active;
   kd.content = dpk.getKey()->convertToISC();
  // now store it
-  return d_keymetadb.addDomainKey(name, kd) >= 0; // >= 0 == s
+  return d_keymetadb->addDomainKey(name, kd) >= 0; // >= 0 == s
 }
 
 
@@ -133,7 +133,7 @@ static bool keyCompareByKindAndID(const DNSSECKeeper::keyset_t::value_type& a, c
 DNSSECPrivateKey DNSSECKeeper::getKeyById(const std::string& zname, unsigned int id)
 {  
   vector<DNSBackend::KeyData> keys;
-  d_keymetadb.getDomainKeys(zname, 0, keys);
+  d_keymetadb->getDomainKeys(zname, 0, keys);
   BOOST_FOREACH(const DNSBackend::KeyData& kd, keys) {
     if(kd.id != id) 
       continue;
@@ -157,19 +157,19 @@ DNSSECPrivateKey DNSSECKeeper::getKeyById(const std::string& zname, unsigned int
 void DNSSECKeeper::removeKey(const std::string& zname, unsigned int id)
 {
   clearCaches(zname);
-  d_keymetadb.removeDomainKey(zname, id);
+  d_keymetadb->removeDomainKey(zname, id);
 }
 
 void DNSSECKeeper::deactivateKey(const std::string& zname, unsigned int id)
 {
   clearCaches(zname);
-  d_keymetadb.deactivateDomainKey(zname, id);
+  d_keymetadb->deactivateDomainKey(zname, id);
 }
 
 void DNSSECKeeper::activateKey(const std::string& zname, unsigned int id)
 {
   clearCaches(zname);
-  d_keymetadb.activateDomainKey(zname, id);
+  d_keymetadb->activateDomainKey(zname, id);
 }
 
 
@@ -187,7 +187,7 @@ void DNSSECKeeper::getFromMeta(const std::string& zname, const std::string& key,
     }
   }
   vector<string> meta;
-  d_keymetadb.getDomainMetadata(zname, key, meta);
+  d_keymetadb->getDomainMetadata(zname, key, meta);
   if(!meta.empty())
     value=*meta.begin();
     
@@ -229,19 +229,19 @@ void DNSSECKeeper::setNSEC3PARAM(const std::string& zname, const NSEC3PARAMRecor
   string descr = ns3p.getZoneRepresentation();
   vector<string> meta;
   meta.push_back(descr);
-  d_keymetadb.setDomainMetadata(zname, "NSEC3PARAM", meta);
+  d_keymetadb->setDomainMetadata(zname, "NSEC3PARAM", meta);
   
   meta.clear();
   if(narrow)
     meta.push_back("1");
-  d_keymetadb.setDomainMetadata(zname, "NSEC3NARROW", meta);
+  d_keymetadb->setDomainMetadata(zname, "NSEC3NARROW", meta);
 }
 
 void DNSSECKeeper::unsetNSEC3PARAM(const std::string& zname)
 {
   clearCaches(zname);
-  d_keymetadb.setDomainMetadata(zname, "NSEC3PARAM", vector<string>());
-  d_keymetadb.setDomainMetadata(zname, "NSEC3NARROW", vector<string>());
+  d_keymetadb->setDomainMetadata(zname, "NSEC3PARAM", vector<string>());
+  d_keymetadb->setDomainMetadata(zname, "NSEC3NARROW", vector<string>());
 }
 
 
@@ -250,13 +250,13 @@ void DNSSECKeeper::setPresigned(const std::string& zname)
   clearCaches(zname);
   vector<string> meta;
   meta.push_back("1");
-  d_keymetadb.setDomainMetadata(zname, "PRESIGNED", meta);
+  d_keymetadb->setDomainMetadata(zname, "PRESIGNED", meta);
 }
 
 void DNSSECKeeper::unsetPresigned(const std::string& zname)
 {
   clearCaches(zname);
-  d_keymetadb.setDomainMetadata(zname, "PRESIGNED", vector<string>());
+  d_keymetadb->setDomainMetadata(zname, "PRESIGNED", vector<string>());
 }
 
 
@@ -279,7 +279,7 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const std::string& zone, boost::tri
   keyset_t retkeyset, allkeyset;
   vector<UeberBackend::KeyData> dbkeyset;
   
-  d_keymetadb.getDomainKeys(zone, 0, dbkeyset);
+  d_keymetadb->getDomainKeys(zone, 0, dbkeyset);
   
   BOOST_FOREACH(UeberBackend::KeyData& kd, dbkeyset) 
   {
@@ -347,7 +347,7 @@ bool DNSSECKeeper::TSIGGrantsAccess(const string& zone, const string& keyname, c
 {
   vector<string> allowed;
   
-  d_keymetadb.getDomainMetadata(zone, "TSIG-ALLOW-AXFR", allowed);
+  d_keymetadb->getDomainMetadata(zone, "TSIG-ALLOW-AXFR", allowed);
   
   BOOST_FOREACH(const string& dbkey, allowed) {
     if(pdns_iequals(dbkey, keyname))
@@ -359,13 +359,12 @@ bool DNSSECKeeper::TSIGGrantsAccess(const string& zone, const string& keyname, c
 bool DNSSECKeeper::getTSIGForAccess(const string& zone, const string& master, string* keyname)
 {
   vector<string> keynames;
-  d_keymetadb.getDomainMetadata(zone, "AXFR-MASTER-TSIG", keynames);
+  d_keymetadb->getDomainMetadata(zone, "AXFR-MASTER-TSIG", keynames);
   keyname->clear();
   
   // XXX FIXME this should check for a specific master!
   BOOST_FOREACH(const string& dbkey, keynames) {
     *keyname=dbkey;
-  
     return true;
   }
   return false;
index a3581ca23941ef9baeea4be20511627b02f5a666..68c15e51f748b017ccd9e1ddf6083b4f2f766be6 100644 (file)
@@ -33,7 +33,7 @@
 
 using namespace ::boost::multi_index;
 
-class DNSSECKeeper
+class DNSSECKeeper : public boost::noncopyable
 {
 public:
   struct KeyMetaData
@@ -47,11 +47,23 @@ public:
   typedef std::vector<keymeta_t > keyset_t;
 
 private:
-  UeberBackend d_keymetadb;
+  UeberBackend* d_keymetadb;
+  bool d_ourDB;
 
 public:
-  DNSSECKeeper() : d_keymetadb("key-only")
+  DNSSECKeeper() : d_keymetadb( new UeberBackend("key-only")), d_ourDB(true)
   {
+    
+  }
+  
+  DNSSECKeeper(UeberBackend* db) : d_keymetadb(db), d_ourDB(false)
+  {
+  }
+  
+  ~DNSSECKeeper()
+  {
+    if(d_ourDB)
+      delete d_keymetadb;
   }
   bool isSecuredZone(const std::string& zone);
   
@@ -79,12 +91,12 @@ public:
   
   void startTransaction()
   {
-         (*d_keymetadb.backends.begin())->startTransaction("", -1);
+         (*d_keymetadb->backends.begin())->startTransaction("", -1);
   }
   
   void commitTransaction()
   {
-         (*d_keymetadb.backends.begin())->commitTransaction();
+         (*d_keymetadb->backends.begin())->commitTransaction();
   }
   
   void getFromMeta(const std::string& zname, const std::string& key, std::string& value);
index cf888a2918febae1348dfba723a39ae370446d3a..5370131606b0d428103b3078cd48fc31f7fcf8a8 100644 (file)
@@ -323,7 +323,7 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
   if(rdomains.empty()) // if we have priority domains, check them first
     B->getUnfreshSlaveInfos(&rdomains);
     
-  DNSSECKeeper dk;
+  DNSSECKeeper dk(B); // NOW HEAR THIS! This DK uses our B backend, so no interleaved access!
   {
     Lock l(&d_lock);
     typedef UniQueue::index<IDTag>::type domains_by_name_t;
@@ -341,6 +341,7 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
       DomainNotificationInfo dni;
       dni.di=di;
       dni.dnssecOk = dk.isPresigned(di.zone);
+      
       if(dk.getTSIGForAccess(di.zone, sr.master, &dni.tsigkeyname)) {
         string secret64;
         B->getTSIGKey(dni.tsigkeyname, &dni.tsigalgname, &secret64);
@@ -405,7 +406,7 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
         di.backend->setFresh(di.id);
       }
       else {
-        B->lookup(QType(QType::RRSIG), di.zone);
+        B->lookup(QType(QType::RRSIG), di.zone); // can't use DK before we are done with this lookup!
         DNSResourceRecord rr;
         uint32_t maxExpire=0, maxInception=0;
         while(B->get(rr)) {