]> granicus.if.org Git - pdns/commitdiff
store lmdb metadata in zone record
authorKees Monshouwer <mind04@monshouwer.org>
Sun, 1 Jun 2014 11:09:50 +0000 (13:09 +0200)
committermind04 <mind04@monshouwer.org>
Tue, 24 Jun 2014 16:23:29 +0000 (18:23 +0200)
modules/lmdbbackend/lmdbbackend.cc
pdns/zone2lmdb.cc

index 141c05f577c7309ffca0bb8ee59ef84d4c2afe71..2ba43530a362de6e6009c0dec37024ea1bed9f62 100644 (file)
@@ -114,11 +114,32 @@ void LMDBBackend::reload() {
 
 bool LMDBBackend::getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta)
 {
-  if (kind == "PRESIGNED") {
-    meta.push_back("1");
-  } else if (kind == "NSEC3PARAM") {
-    meta.push_back("1 0 1 abcd");
+  if (kind == "PRESIGNED" || kind == "NSEC3PARAM") {
+    int rc;
+    MDB_val key, data;
+    string key_str, cur_value;
+    vector<string> valparts;
+
+    key_str=d_querykey = string( name.rbegin(), name.rend() );
+    key.mv_data = (char *)key_str.c_str();
+    key.mv_size = key_str.length();
+
+    if ((rc = mdb_cursor_get(zone_cursor, &key, &data, MDB_SET_KEY)) == 0) {
+      cur_value.assign((const char *)data.mv_data, data.mv_size);
+      stringtok(valparts,cur_value,"\t");
+
+      if (valparts.size() == 4) {
+        if (kind == "PRESIGNED")
+          meta.push_back("1");
+        else
+          meta.push_back(valparts[3]);
+      }
+    }
+
+    if (rc == MDB_NOTFOUND)
+      DEBUGLOG("Metadata records for zone: '"<<name<<"'' not found. This is impossible !!!"<<endl);
   }
+
   return true;
 }
 
@@ -281,7 +302,7 @@ bool LMDBBackend::getAuthData( SOAData &soa, DNSPacket *p )
     vector<string>parts;
     stringtok(parts,data,"\t");
 
-    if(parts.size() != 3 )
+    if(parts.size() < 3 )
         throw PDNSException("Invalid record in zone table: " + data );
 
     fillSOAData( parts[2], soa );
index 97684072fdd18bb2a235ba01c29788b38b8dab25..b073022f0850b37337859871b64dfe5a9aea0164 100644 (file)
@@ -84,9 +84,10 @@ string reverse(const string &name) {
 
 void emitData(string zone, ZoneParserTNG &zpt){
 
-  bool hasSOA = false;
+  bool hasSOA=false, isPresigned=false;
   int numRefs=g_numRefs;
   int numRecords=g_numRecords;
+  string metaData;
   SOAData sd;
   DNSResourceRecord rr;
   MDB_val key, data, keyExt, dataExt;
@@ -95,17 +96,20 @@ void emitData(string zone, ZoneParserTNG &zpt){
   while(zpt.get(rr)) {
     numRecords++;
     if (rr.qtype == QType::SOA) {
-      hasSOA = true;
+      hasSOA=true;
       fillSOAData(rr.content, sd);
       sd.ttl=rr.ttl;
       continue;
     }
-    if (rr.qtype == QType::NSEC3PARAM)
+    if (rr.qtype == QType::NSEC3PARAM) {
+      metaData=rr.content;
       continue; // TODO set metadata
+    }
 
     string keyStr, dataStr;
 
     if (rr.qtype == QType::RRSIG) {
+      isPresigned=true;
       RRSIGRecordContent rrc(rr.content);
       keyStr=zone+"\t"+makeRelative(stripDot(rr.qname), zone)+"\t"+DNSRecordContent::NumberToType(rrc.d_type);
       dataStr=itoa(rr.ttl)+"\t"+rr.content;
@@ -161,6 +165,9 @@ void emitData(string zone, ZoneParserTNG &zpt){
     string keyStr=(reverse(stripDot(zone)));
     string dataStr=itoa(g_numZones+1)+"\t"+itoa(sd.ttl)+"\t"+serializeSOAData(sd);
 
+    if (isPresigned)
+      dataStr.append("\t"+metaData);
+
     key.mv_data = (char*)keyStr.c_str();
     key.mv_size = keyStr.length();
     data.mv_data = (char*)dataStr.c_str();