// is the key a full match or does the id part match our zone?
// if it does we have a valid answer.
- if (!key_str.compare(cur_key) || atoi(keyparts[0].c_str()) == (int) id) // FIXME need atoui
+ if (!key_str.compare(cur_key) || atoi(keyparts[0].c_str()) == (int) id) // FIXME we need atoui
goto hasnsecx;
}
// no match, now we look for the last record in the NSECx chain.
key.mv_data = (char *)key_str.c_str();
key.mv_size = key_str.length();
- if(!mdb_cursor_get(nsecx_cursor, &key, &data, MDB_SET_RANGE)) {
+ if(!mdb_cursor_get(nsecx_cursor, &key, &data, MDB_NEXT_NODUP )) {
cur_key.assign((const char *)key.mv_data, key.mv_size);
cur_value.assign((const char *)data.mv_data, data.mv_size);
stringtok(keyparts,cur_key,"\t");
rr.qtype=DNSRecordContent::TypeToNumber(valparts[2]);
rr.content=valparts[3];
rr.d_place=DNSResourceRecord::AUTHORITY;
+ rr.domain_id=id;
rr.auth=true;
return true;
}
+bool LMDBBackend::getDirectRRSIGs(const string &signer, const string &qname, const QType &qtype, vector<DNSResourceRecord> &rrsigs)
+{
+ int rc;
+ MDB_val key, data;
+ string key_str, cur_value;
+ vector<string> valparts;
+
+ key_str=signer+"\t"+makeRelative(qname, signer)+"\t"+qtype.getName();
+ key.mv_data = (char *)key_str.c_str();
+ key.mv_size = key_str.length();
+
+ if ((rc = mdb_cursor_get(rrsig_cursor, &key, &data, MDB_SET_KEY)) == 0) {
+ DNSResourceRecord rr;
+ rr.qname=qname;
+ rr.qtype=QType::RRSIG;
+ //rr.d_place = (DNSResourceRecord::Place) signPlace;
+ rr.auth=false;
+
+ do {
+ cur_value.assign((const char *)data.mv_data, data.mv_size);
+ stringtok(valparts,cur_value,"\t");
+
+ if( valparts.size() != 2 ) {
+ throw PDNSException("Invalid record in rrsig table: qname: '" + qname + "'; value: "+ cur_value);
+ }
+
+ rr.ttl=atoi(valparts[0].c_str());
+ rr.content = valparts[1];
+ rrsigs.push_back(rr);
+
+ } while (mdb_cursor_get(rrsig_cursor, &key, &data, MDB_NEXT_DUP) == 0);
+ }
+
+ if (rc == MDB_NOTFOUND)
+ DEBUGLOG("RRSIG records for qname: '"<<qname"'' with type: '"<<qtype.getName()<<"' not found"<<endl);
+
+ return true;
+}
+
// Get the zone name and value of the requested zone (reversed) OR the entry
// just before where it should have been
bool LMDBBackend::getAuthZone( string &rev_zone )
private:
MDB_env *env;
- MDB_dbi data_db, zone_db, data_extended_db, rrsig_db, nsecx_db,;
+ MDB_dbi data_db, zone_db, data_extended_db, rrsig_db, nsecx_db;
MDB_txn *txn;
MDB_cursor *data_cursor, *zone_cursor, *data_extended_cursor, *rrsig_cursor, *nsecx_cursor;
bool getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta);
bool getDirectNSECx(uint32_t id, const string &hashed, string &before, DNSResourceRecord &rr);
+ bool getDirectRRSIGs(const string &signer, const string &qname, const QType &qtype, vector<DNSResourceRecord> &rrsigs);
bool getAuthZone( string &rev_zone );
bool getAuthData( SOAData &, DNSPacket *);
return addKey(name, true, algorithm, size);
}
-bool DNSSECKeeper::getPreRRSIGs(DNSBackend& db, const std::string& signer, const std::string& qname,
- const std::string& wildcardname, const QType& qtype,
+bool DNSSECKeeper::getPreRRSIGs(DNSBackend& db, const std::string& signer, const std::string& qname,
+ const std::string& wildcardname, const QType& qtype,
DNSPacketWriter::Place signPlace, vector<DNSResourceRecord>& rrsigs, uint32_t signTTL)
{
+ vector<DNSResourceRecord> sigs;
+ if(db.getDirectRRSIGs(toLower(signer), toLower(wildcardname.empty() ? qname : wildcardname), qtype, sigs)) {
+ BOOST_FOREACH(DNSResourceRecord &rr, sigs) {
+ if (!wildcardname.empty())
+ rr.qname = toLower(qname);
+ rr.d_place = (DNSResourceRecord::Place)signPlace;
+ rr.ttl = signTTL;
+ rrsigs.push_back(rr);
+ }
+ return true;
+ }
+
// cerr<<"Doing DB lookup for precomputed RRSIGs for '"<<(wildcardname.empty() ? qname : wildcardname)<<"'"<<endl;
SOAData sd;
sd.db=(DNSBackend *)-1; // force uncached answer
return false;
}
//! called to get RRSIG record(s) from backend
- virtual bool getDirectRRSIGs(uint32_t id, const string &qname, const QType &qtype, const vector<DNSResourceRecord>&rrs)
+ virtual bool getDirectRRSIGs(const string &signer, const string &qname, const QType &qtype, vector<DNSResourceRecord> &rrsigs)
{
return false;
}
return false;
}
-bool UeberBackend::getDirectRRSIGs(uint32_t id, const string &qname, const QType &qtype, const vector<DNSResourceRecord>&rrs)
+bool UeberBackend::getDirectRRSIGs(const string &signer, const string &qname, const QType &qtype, vector<DNSResourceRecord> &rrsigs)
{
BOOST_FOREACH(DNSBackend* db, backends) {
- if(db->getDirectRRSIGs(id, qname, qtype, rrs))
+ if(db->getDirectRRSIGs(signer, qname, qtype, rrsigs))
return true;
}
return false;
bool deactivateDomainKey(const string& name, unsigned int id);
bool getDirectNSECx(uint32_t id, const string &hashed, string &before, DNSResourceRecord &rr);
- bool getDirectRRSIGs(uint32_t id, const string &qname, const QType &qtype, const vector<DNSResourceRecord>&rrs);
+ bool getDirectRRSIGs(const string &signer, const string &qname, const QType &qtype, vector<DNSResourceRecord> &rrsigs);
bool getTSIGKey(const string& name, string* algorithm, string* content);
bool setTSIGKey(const string& name, const string& algorithm, const string& content);
sd.ttl=rr.ttl;
continue;
}
+ if (rr.qtype == QType::NSEC3PARAM)
+ continue; // TODO set metadata
string keyStr, dataStr;
if (rr.qtype == QType::RRSIG) {
RRSIGRecordContent rrc(rr.content);
- keyStr=stripDot(rr.qname)+"\t"+DNSRecordContent::NumberToType(rrc.d_type)+"\t"+itoa(g_numZones+1);
+ keyStr=zone+"\t"+makeRelative(stripDot(rr.qname), zone)+"\t"+DNSRecordContent::NumberToType(rrc.d_type);
dataStr=itoa(rr.ttl)+"\t"+rr.content;
key.mv_data = (char*)keyStr.c_str();
keyStr=stripDot(rr.qname)+"\t"+itoa(g_numZones+1);
else
keyStr=itoa(g_numZones+1)+"\t"+toBase32Hex(bitFlip(fromBase32Hex(makeRelative(stripDot(rr.qname), zone))));
- dataStr=rr.qname+"\t"+itoa(rr.ttl)+"\t"+rr.qtype.getName()+"\t"+rr.content;
+ dataStr=stripDot(rr.qname)+"\t"+itoa(rr.ttl)+"\t"+rr.qtype.getName()+"\t"+rr.content;
key.mv_data = (char*)keyStr.c_str();
key.mv_size = keyStr.length();
/pdns-*.conf
/*.sqlite3*
/named-slave.conf
+/named-lmdb.conf
/bulktest.results
/recursor-bulktest/
/recursor.log
case $context in
- lmdb-nodnssec | lmdb | lmdb-nsec3 | lmdb-nsec3-optout | lmdb-nodnssec-zone | lmdb-zone | lmdb-nsec3-zone | lmdb-nsec3-optout-zone)
+ lmdb-nodnssec | lmdb | lmdb-nsec3 | lmdb-nsec3-optout | lmdb-zone | lmdb-nsec3-zone | lmdb-nsec3-optout-zone)
if [ "${context: -5}" = "-zone" ]
then
orgcontext=$context
case $context in
- lmdb-nodnssec-zone)
- context=bind
- ;;
lmdb-zone)
context=bind-dnssec
;;
source ./backends/bind-master
+ rm -f named-lmdb.conf zones/*.signed
+
for zone in $(grep 'zone ' named.conf | cut -f2 -d\")
do
../pdns/saxfr 127.0.0.1 $port $zone showdetails showflags > zones/$zone.signed
+
+ echo "" >> named-lmdb.conf
+ echo "zone \"${zone}\" {" >> named-lmdb.conf
+ echo " type master;" >> named-lmdb.conf
+ echo " file \"zones/${zone}.signed\";" >> named-lmdb.conf
+ echo "};" >> named-lmdb.conf
done
- kill $(cat pdns*.pid)
- sleep 2
+
+ pids=$(cat pdns*.pid)
+
+ if [ -n "$pids" ]
+ then
+ kill $pids
+ set +e
+ loopcount=0
+ done=0
+ while [ $loopcount -lt 10 ] && [ $done -eq 0 ]
+ do
+ done=1
+ for pid in $pids
+ do
+ kill -0 $pid > /dev/null 2>&1
+ if [ $? -eq 0 ];
+ then
+ done=0
+ fi
+ done
+ let loopcount=loopcount+1
+ sleep 1
+ done
+
+ kill -9 $pids
+ set -e
+ fi
+ rm pdns*.pid
+
context=${orgcontext%-zone}
fi
- ${MAKE} -C ../pdns zone2sql > /dev/null
+ ${MAKE} -C ../pdns zone2lmdb > /dev/null
rm -f data.mdb lock.mdb
- ../pdns/zone2lmdb --named-conf=./named.conf
- $RUNWRAPPER $PDNS --daemon=no --local-port=$port --socket-dir=./ \
+ if [ $context = lmdb-nodnssec ]
+ then
+ ../pdns/zone2lmdb --named-conf=./named.conf
+ else
+ ../pdns/zone2lmdb --named-conf=./named-lmdb.conf
+ fi
+
+ $RUNWRAPPER $PDNS --daemon=no --local-port=$port --config-name=lmdb --socket-dir=./ \
--no-shuffle --launch=lmdb \
--send-root-referral \
--cache-ttl=$cachettl --experimental-dname-processing --no-config \
--lmdb-datapath=./ &
-
+
skipreasons="noent nodyndns nometa lmdb"
if [ $context = lmdb-nsec3 ]