[svn] commit: r2217 - in /branches/trac232/src: bin/auth/ lib/datasrc/ lib/dns/ lib/dns/tests/
BIND 10 source code commits
bind10-changes at lists.isc.org
Tue Jun 22 11:31:46 UTC 2010
Author: jelte
Date: Tue Jun 22 11:31:46 2010
New Revision: 2217
Log:
very primitive load_zone function in auth (should be done by loadzone tool, but there is no python interface yet), to test replaceZone() functionality
had to update rrsetlist.[cc|h] to allow for multiple rrsets with different names but the same class and type.
Modified:
branches/trac232/src/bin/auth/auth.spec.pre.in
branches/trac232/src/bin/auth/auth_srv.cc
branches/trac232/src/bin/auth/auth_srv.h
branches/trac232/src/bin/auth/main.cc
branches/trac232/src/lib/datasrc/data_source.cc
branches/trac232/src/lib/datasrc/data_source.h
branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
branches/trac232/src/lib/dns/python_dns.cc
branches/trac232/src/lib/dns/rrsetlist.cc
branches/trac232/src/lib/dns/rrsetlist.h
branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc
Modified: branches/trac232/src/bin/auth/auth.spec.pre.in
==============================================================================
--- branches/trac232/src/bin/auth/auth.spec.pre.in (original)
+++ branches/trac232/src/bin/auth/auth.spec.pre.in Tue Jun 22 11:31:46 2010
@@ -81,6 +81,27 @@
"item_default": ""
}
]
+ },
+ {
+ "command_name": "load_zone",
+ "command_description": "Load a zone (temp for testing)",
+ "command_args": [
+ { "item_name": "zone_name",
+ "item_type": "string",
+ "item_optional": false,
+ "item_default": ""
+ },
+ { "item_name": "rr_class",
+ "item_type": "string",
+ "item_optional": false,
+ "item_default": ""
+ },
+ { "item_name": "file_name",
+ "item_type": "string",
+ "item_optional": false,
+ "item_default": ""
+ },
+ ]
}
]
}
Modified: branches/trac232/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/trac232/src/bin/auth/auth_srv.cc (original)
+++ branches/trac232/src/bin/auth/auth_srv.cc Tue Jun 22 11:31:46 2010
@@ -27,6 +27,7 @@
#include <dns/name.h>
#include <dns/question.h>
#include <dns/rrset.h>
+#include <dns/rrsetlist.h>
#include <dns/rrttl.h>
#include <dns/message.h>
#include <config/ccsession.h>
@@ -44,6 +45,10 @@
#include "auth_srv.h"
#include <boost/lexical_cast.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <boost/foreach.hpp>
using namespace std;
@@ -409,5 +414,97 @@
} else {
return isc::config::createAnswer(1, "No data store found for zone");
}
-
-}
+}
+
+//
+// ALSO TEMP, just a bindctl command to load a zone
+// (not smart and probably fails on almost everything, is just here
+// to quickly test the backend)
+// one RR per line, must be fully 'expanded'
+// can only handle 1 rr per name/class/type
+ElementPtr
+AuthSrv::loadZone(isc::data::ElementPtr args)
+{
+ ifstream myfile(args->get("file_name")->stringValue().c_str());
+
+ RRsetList rrsetlist;
+ try {
+ if (myfile.is_open()) {
+ while (! myfile.eof() ) {
+ //stringstream ss;
+ //ss << myfile;
+ //cout << "X: " << ss.str() << endl;
+ string s;
+ myfile >> s;
+ Name n(s);
+ myfile >> s;
+ RRTTL ttl(s);
+ myfile >> s;
+ RRClass rrclass(s);
+ myfile >> s;
+ RRType rrtype(s);
+ string line;
+ getline(myfile, line);
+ while (line[0] == ' ' || line[0] == '\t') {
+ line.erase(0, 1);
+ }
+ std::cout << "[XX] rdata: " << line << std::endl;
+ RdataPtr rdata = createRdata(rrtype, rrclass, line);
+ std::cout << "[XX] rdata read: " << line << std::endl;
+ RRsetPtr rrset = RRsetPtr(new RRset(n,
+ rrclass,
+ rrtype,
+ ttl));
+ rrset->addRdata(rdata);
+
+ try {
+ rrsetlist.addRRset(rrset);
+ } catch (DuplicateRRset ds) {
+ rrsetlist.findRRset(n, rrtype, rrclass)->addRdata(rdata);
+ }
+ }
+ myfile.close();
+ } else {
+ return isc::config::createAnswer(1, "unable to open file");
+ }
+
+ std::cout << "[XX] RRSETLIST: " << std::endl;
+ BOOST_FOREACH(RRsetPtr rrs, rrsetlist) {
+ std::cout << rrs->toText() << std::endl;
+ }
+
+ std::cout << "[XX] END OF RRSETLIST" << std::endl;
+ Name zone_name(args->get("zone_name")->stringValue());
+ RRClass rrclass(args->get("rr_class")->stringValue());
+ NameMatch match(zone_name);
+ impl_->data_sources_.findClosestEnclosure(match, rrclass);
+ DataSrc* datasource = (DataSrc*) match.bestDataSrc();
+ // hmz can't we assign RRTypes?
+ if (datasource) {
+ DataSrcTransaction* transaction;
+ DataSrc::Result r = datasource->startTransaction(&transaction, zone_name);
+ if (r != DataSrc::SUCCESS) {
+ return isc::config::createAnswer(r, "error starting transaction");
+ }
+ r = datasource->replaceZone(transaction, rrsetlist);
+ std::cout << "[XX] RESULT: " << r << std::endl;
+ if (r != DataSrc::SUCCESS) {
+ // log? rollback immediately?
+ }
+ r = datasource->commitTransaction(transaction);
+ std::cout << "[XX] RESULT rollback: " << r << std::endl;
+ if (r == DataSrc::SUCCESS) {
+ return isc::config::createAnswer();
+ } else {
+ return isc::config::createAnswer(r, "error");
+ }
+ } else {
+ return isc::config::createAnswer(1, "No data store found for zone");
+ }
+ return isc::config::createAnswer();
+ } catch (isc::Exception exc) {
+ return isc::config::createAnswer(1, exc.what());
+ }
+
+}
+
Modified: branches/trac232/src/bin/auth/auth_srv.h
==============================================================================
--- branches/trac232/src/bin/auth/auth_srv.h (original)
+++ branches/trac232/src/bin/auth/auth_srv.h Tue Jun 22 11:31:46 2010
@@ -61,6 +61,7 @@
// temporarily added for manual testing of writable data sources
isc::data::ElementPtr addRR(isc::data::ElementPtr arg);
isc::data::ElementPtr delRR(isc::data::ElementPtr arg);
+ isc::data::ElementPtr loadZone(isc::data::ElementPtr arg);
// end temp add
private:
AuthSrvImpl* impl_;
Modified: branches/trac232/src/bin/auth/main.cc
==============================================================================
--- branches/trac232/src/bin/auth/main.cc (original)
+++ branches/trac232/src/bin/auth/main.cc Tue Jun 22 11:31:46 2010
@@ -81,6 +81,8 @@
answer = auth_server->addRR(args);
} else if (command == "del_rr") {
answer = auth_server->delRR(args);
+ } else if (command == "load_zone") {
+ answer = auth_server->loadZone(args);
} else if (command == "shutdown") {
io_service->stop();
}
Modified: branches/trac232/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.cc (original)
+++ branches/trac232/src/lib/datasrc/data_source.cc Tue Jun 22 11:31:46 2010
@@ -955,6 +955,13 @@
}
DataSrc::Result
+DataSrc::replaceZone(DataSrcTransaction* transaction UNUSED_PARAM,
+ RRsetList& rrsets UNUSED_PARAM)
+{
+ return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
MetaDataSrc::findRRset(const isc::dns::Name& qname UNUSED_PARAM,
const isc::dns::RRClass& qclass UNUSED_PARAM,
const isc::dns::RRType& qtype UNUSED_PARAM,
@@ -1050,5 +1057,13 @@
return NOT_IMPLEMENTED;
}
-}
-}
+DataSrc::Result
+MetaDataSrc::replaceZone(DataSrcTransaction* transaction UNUSED_PARAM,
+ RRsetList& rrsets UNUSED_PARAM)
+{
+ return NOT_IMPLEMENTED;
+}
+
+
+}
+}
Modified: branches/trac232/src/lib/datasrc/data_source.h
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.h (original)
+++ branches/trac232/src/lib/datasrc/data_source.h Tue Jun 22 11:31:46 2010
@@ -249,6 +249,8 @@
virtual Result delRRset(DataSrcTransaction* transaction,
isc::dns::ConstRRsetPtr rrset);
virtual Result delZone(DataSrcTransaction* transaction);
+ virtual Result replaceZone(DataSrcTransaction* transaction,
+ isc::dns::RRsetList& rrsets);
virtual Result startTransaction(DataSrcTransaction** transaction, const isc::dns::Name& zonename);
virtual Result commitTransaction(DataSrcTransaction *transaction);
virtual Result rollbackTransaction(DataSrcTransaction *transaction);
@@ -335,6 +337,8 @@
virtual Result delRRset(DataSrcTransaction* transaction,
isc::dns::ConstRRsetPtr rrset);
virtual Result delZone(DataSrcTransaction* transaction);
+ virtual Result replaceZone(DataSrcTransaction* transaction,
+ isc::dns::RRsetList& rrsets);
// end of writable data sources part
private:
std::vector<ConstDataSrcPtr> data_sources;
Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc Tue Jun 22 11:31:46 2010
@@ -1062,7 +1062,7 @@
if (result != DataSrc::SUCCESS) {
return result;
}
- BOOST_FOREACH(isc::dns::ConstRRsetPtr rrset, rrsets) {
+ BOOST_FOREACH(isc::dns::RRsetPtr rrset, rrsets) {
addRRset(transaction, rrset);
}
return DataSrc::SUCCESS;
Modified: branches/trac232/src/lib/dns/python_dns.cc
==============================================================================
--- branches/trac232/src/lib/dns/python_dns.cc (original)
+++ branches/trac232/src/lib/dns/python_dns.cc Tue Jun 22 11:31:46 2010
@@ -465,7 +465,7 @@
class_<RRsetList, boost::noncopyable>("rrset_list", init<>())
.def("add_rrset", &RRsetList::addRRset)
- .def("find_rrset", &RRsetList::findRRset)
+ //.def("find_rrset", &RRsetList::findRRset)
.def("__iter__", &RRsetList_iterator_wrapper::create)
.def("__len__", &RRsetList::size);
Modified: branches/trac232/src/lib/dns/rrsetlist.cc
==============================================================================
--- branches/trac232/src/lib/dns/rrsetlist.cc (original)
+++ branches/trac232/src/lib/dns/rrsetlist.cc Tue Jun 22 11:31:46 2010
@@ -23,6 +23,7 @@
#include <dns/rrclass.h>
#include <dns/rrtype.h>
#include <dns/rrset.h>
+#include <dns/name.h>
#include <dns/rrsetlist.h>
namespace isc {
@@ -31,7 +32,8 @@
void
RRsetList::addRRset(RRsetPtr rrsetptr)
{
- ConstRRsetPtr rrset_found = findRRset(rrsetptr->getType(),
+ ConstRRsetPtr rrset_found = findRRset(rrsetptr->getName(),
+ rrsetptr->getType(),
rrsetptr->getClass());
if (rrset_found != NULL) {
isc_throw(DuplicateRRset, "RRset is being doubly added to RRsetList: "
@@ -39,6 +41,19 @@
rrsetptr->getClass());
}
rrsets_.push_back(rrsetptr);
+}
+
+RRsetPtr
+RRsetList::findRRset(const Name& name, const RRType& rrtype, const RRClass& rrclass)
+{
+ BOOST_FOREACH(RRsetPtr rrsetptr, rrsets_) {
+ if ((rrsetptr->getName().equals(name)) &&
+ (rrsetptr->getClass() == rrclass) &&
+ (rrsetptr->getType() == rrtype)) {
+ return rrsetptr;
+ }
+ }
+ return RRsetPtr();
}
RRsetPtr
Modified: branches/trac232/src/lib/dns/rrsetlist.h
==============================================================================
--- branches/trac232/src/lib/dns/rrsetlist.h (original)
+++ branches/trac232/src/lib/dns/rrsetlist.h Tue Jun 22 11:31:46 2010
@@ -82,6 +82,7 @@
public:
RRsetList() {}
void addRRset(RRsetPtr new_rrsetptr);
+ RRsetPtr findRRset(const Name& name, const RRType& rrtype, const RRClass& rrclass);
RRsetPtr findRRset(const RRType& rrtype, const RRClass& rrclass);
typedef RRsetListIterator<std::vector<RRsetPtr>::iterator,
Modified: branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc
==============================================================================
--- branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc (original)
+++ branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc Tue Jun 22 11:31:46 2010
@@ -99,7 +99,7 @@
const RRType& rrtype, const RRClass& rrclass,
const RRTTL& rrttl)
{
- RRsetPtr rrset = list.findRRset(rrtype, rrclass);;
+ RRsetPtr rrset = list.findRRset(name, rrtype, rrclass);;
EXPECT_EQ(name, rrset->getName());
EXPECT_EQ(rrtype, rrset->getType());
EXPECT_EQ(rrclass, rrset->getClass());
@@ -130,7 +130,7 @@
list.addRRset(a);
RdataIteratorPtr it =
- list.findRRset(RRType::A(), RRClass::IN())->getRdataIterator();
+ list.findRRset(Name("example.com"), RRType::A(), RRClass::IN())->getRdataIterator();
it->first();
EXPECT_FALSE(it->isLast());
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
More information about the bind10-changes
mailing list