From 8a316c1ba630b336526ce2750750e3c09a932817 Mon Sep 17 00:00:00 2001 From: Kees Monshouwer Date: Sun, 1 Jun 2014 13:09:50 +0200 Subject: [PATCH] store lmdb metadata in zone record --- modules/lmdbbackend/lmdbbackend.cc | 31 +++++++++++++++++++++++++----- pdns/zone2lmdb.cc | 13 ++++++++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 141c05f577..2ba43530a3 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -114,11 +114,32 @@ void LMDBBackend::reload() { bool LMDBBackend::getDomainMetadata(const string& name, const std::string& kind, std::vector& 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 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: '"<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 ); diff --git a/pdns/zone2lmdb.cc b/pdns/zone2lmdb.cc index 97684072fd..b073022f08 100644 --- a/pdns/zone2lmdb.cc +++ b/pdns/zone2lmdb.cc @@ -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(); -- 2.47.2