[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