[svn] commit: r446 - in /branches/jelte-datasource1: ./ src/bin/parkinglot/ src/lib/dns/

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jan 12 10:32:29 UTC 2010


Author: jelte
Date: Tue Jan 12 10:32:29 2010
New Revision: 446

Log:
temporary branch for example implementation of original data source proposal. Mainly for archival purposes, will be removed once definite design is agreed upon.

Added:
    branches/jelte-datasource1/
      - copied from r440, branches/parkinglot/
    branches/jelte-datasource1/src/bin/parkinglot/data_source_plot.cc
    branches/jelte-datasource1/src/bin/parkinglot/data_source_plot.h
    branches/jelte-datasource1/src/lib/dns/data_source.cc
    branches/jelte-datasource1/src/lib/dns/data_source.h
Modified:
    branches/jelte-datasource1/src/bin/parkinglot/Makefile.am
    branches/jelte-datasource1/src/bin/parkinglot/main.cc
    branches/jelte-datasource1/src/bin/parkinglot/parkinglot.cc
    branches/jelte-datasource1/src/bin/parkinglot/parkinglot.h
    branches/jelte-datasource1/src/lib/dns/Makefile.am
    branches/jelte-datasource1/src/lib/dns/message.cc

Modified: branches/jelte-datasource1/src/bin/parkinglot/Makefile.am
==============================================================================
--- branches/jelte-datasource1/src/bin/parkinglot/Makefile.am (original)
+++ branches/jelte-datasource1/src/bin/parkinglot/Makefile.am Tue Jan 12 10:32:29 2010
@@ -1,5 +1,7 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_srcdir)/ext
 
 bin_PROGRAMS = parkinglot
-parkinglot_SOURCES = common.cc common.h zoneset.h parkinglot.cc parkinglot.h ccsession.cc ccsession.h main.cc
+parkinglot_SOURCES = common.cc common.h zoneset.h parkinglot.cc
+parkinglot_SOURCES += parkinglot.h ccsession.cc ccsession.h main.cc
+parkinglot_SOURCES += data_source_plot.h data_source_plot.cc
 parkinglot_LDADD = $(top_srcdir)/src/lib/dns/libdns.a $(top_srcdir)/src/lib/cc/cpp/libcc.a

Modified: branches/jelte-datasource1/src/bin/parkinglot/main.cc
==============================================================================
--- branches/jelte-datasource1/src/bin/parkinglot/main.cc (original)
+++ branches/jelte-datasource1/src/bin/parkinglot/main.cc Tue Jan 12 10:32:29 2010
@@ -61,36 +61,7 @@
 isc::data::ElementPtr
 my_config_handler(isc::data::ElementPtr config)
 {
-    cout << "[XX] Handle config: " << endl << config->str() << endl;
-    if (config->contains("zones")) {
-        plot.clear_zones();
-        BOOST_FOREACH(isc::data::ElementPtr zone_el, config->get("zones")->listValue()) {
-            plot.serve(zone_el->stringValue());
-        }
-    }
-    if (config->contains("port")) {
-        // todo: what to do with port change. restart automatically?
-        // ignore atm
-    }
-    if (config->contains("a_records")) {
-        plot.clearARecords();
-        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("a_records")->listValue()) {
-            plot.addARecord(rel->stringValue());
-        }
-    }
-    if (config->contains("aaaa_records")) {
-        plot.clearAAAARecords();
-        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("aaaa_records")->listValue()) {
-            plot.addAAAARecord(rel->stringValue());
-        }
-    }
-    if (config->contains("ns_records")) {
-        plot.clearNSRecords();
-        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("ns_records")->listValue()) {
-            plot.addNSRecord(rel->stringValue());
-        }
-    }
-    return isc::data::Element::createFromString("{ \"result\": [0] }");
+    return plot.updateConfig(config);
 }
 
 isc::data::ElementPtr

Modified: branches/jelte-datasource1/src/bin/parkinglot/parkinglot.cc
==============================================================================
--- branches/jelte-datasource1/src/bin/parkinglot/parkinglot.cc (original)
+++ branches/jelte-datasource1/src/bin/parkinglot/parkinglot.cc Tue Jan 12 10:32:29 2010
@@ -42,48 +42,13 @@
 using namespace isc::dns::Rdata::Generic;
 using namespace isc::data;
 
-void
-ParkingLot::addARecord(std::string data) {
-    a_records.push_back(Rdata::RdataPtr(new A(data)));
-}
-
-void
-ParkingLot::addAAAARecord(std::string data) {
-    aaaa_records.push_back(Rdata::RdataPtr(new AAAA(data)));
-}
-
-void
-ParkingLot::addNSRecord(std::string data) {
-    ns_records.push_back(Rdata::RdataPtr(new NS(data)));
-}
-
-void
-ParkingLot::setSOARecord(isc::dns::Rdata::RdataPtr soa_record) {
-}
-
-void
-ParkingLot::setDefaultZoneData() {
-    clearARecords();
-    clearAAAARecords();
-    clearNSRecords();
-
-    addARecord("127.0.0.1");
-    addAAAARecord("::1");
-    addNSRecord("ns1.parking.example");
-    addNSRecord("ns2.parking.example");
-    addNSRecord("ns3.parking.example");
-}
-
 ParkingLot::ParkingLot(int port) {
-    setDefaultZoneData();
     /*ns1 = Rdata::RdataPtr(new NS("ns1.parking.example"));
     ns2 = Rdata::RdataPtr(new NS("ns2.parking.example"));
     ns3 = Rdata::RdataPtr(new NS("ns3.parking.example"));
     a = Rdata::RdataPtr(new A("127.0.0.1"));
     aaaa = Rdata::RdataPtr(new AAAA("::1"));
     */
-    soa = Rdata::RdataPtr(new SOA("parking.example", "noc.parking.example",
-                                        1, 1800, 900, 604800, TTL(86400)));
 
     int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if (s < 0)
@@ -107,6 +72,68 @@
 
 void
 ParkingLot::processMessage() {
+    struct sockaddr_storage ss;
+    socklen_t sa_len = sizeof(ss);
+    struct sockaddr* sa = static_cast<struct sockaddr*>((void*)&ss);
+    int s = sock;
+    Message msg;
+
+    if (msg.getBuffer().recvFrom(s, sa, &sa_len) > 0) {
+        try {
+            msg.fromWire();
+        } catch (...) {
+            cerr << "parse failed" << endl;
+            return;
+        }
+
+        cout << "received a message:\n" << msg.toText() << endl;
+
+        if (msg.getSection(SECTION_QUESTION).size() != 1)
+            return;
+
+        msg.makeResponse();
+        msg.setAA(true);
+
+        RRsetPtr query = msg.getSection(SECTION_QUESTION)[0];
+
+        DataSource::result result;
+
+        msg.makeResponse();
+        msg.setAA(true);
+        TTL default_ttl = TTL(3600);
+
+        // ok this part of the api needs improvenemt
+        RRset *rrset = new RRset(query->getName(), query->getClass(), query->getType(), default_ttl);
+        RRsetPtr answer = RRsetPtr(rrset);
+        RRset *ns_rrset = new RRset(query->getName(), query->getClass(), RRType::NS, default_ttl);
+        RRsetPtr ns_answer = RRsetPtr(ns_rrset);
+        RRset *soa_rrset = new RRset(query->getName(), query->getClass(), RRType::SOA, default_ttl);
+        RRsetPtr soa_answer = RRsetPtr(soa_rrset);
+        
+        result = data_source.findRRset(answer, query->getName(), query->getClass(), query->getType());
+        switch (result) {
+        case DataSource::success:
+            msg.addRRset(SECTION_ANSWER, answer);
+            if (data_source.findRRset(ns_answer, query->getName(), query->getClass(), RRType::NS) == DataSource::success) {
+                msg.addRRset(SECTION_AUTHORITY, ns_answer);
+            }
+            break;
+        case DataSource::zone_not_found:
+            msg.setRcode(Message::RCODE_NXDOMAIN);
+            break;
+        case DataSource::name_not_found:
+            if (data_source.findRRset(soa_answer, query->getName(), query->getClass(), RRType::SOA) == DataSource::success) {
+                msg.addRRset(SECTION_AUTHORITY, soa_answer);
+            }
+            break;
+        }
+        msg.toWire();
+        cout << "sending a response (" <<
+            boost::lexical_cast<string>(msg.getBuffer().getSize())
+                  << " bytes):\n" << msg.toText() << endl;
+        msg.getBuffer().sendTo(s, *sa, sa_len);
+    }
+/*
     Name authors_name("authors.bind");
     Name version_name("version.bind");
     struct sockaddr_storage ss;
@@ -223,6 +250,7 @@
                   << " bytes):\n" << msg.toText() << endl;
         msg.getBuffer().sendTo(s, *sa, sa_len);
     }
+*/
 }
 
 void
@@ -234,14 +262,44 @@
         ElementPtr zonelist_el = (cmd.second)->get("zones");
         // We could walk through both lists and remove and serve
         // accordingly, or simply clear all and add everything
-        zones.clear_zones();
+        //zones.clear_zones();
         BOOST_FOREACH(ElementPtr zone, zonelist_el->listValue()) {
-            zones.serve(zone->stringValue());
+            //zones.serve(zone->stringValue());
         }
     }
 }
 
-void
-ParkingLot::serve(std::string zone_name) {
-    zones.serve(zone_name);
+ElementPtr
+ParkingLot::updateConfig(isc::data::ElementPtr config) {
+    if (config->contains("zones")) {
+        data_source.clear_zones();
+        BOOST_FOREACH(isc::data::ElementPtr zone_el, config->get("zones")->listValue()) {
+            data_source.serve(zone_el->stringValue());
+        }
+    }
+    if (config->contains("port")) {
+        // todo: what to do with port change. restart automatically?
+        // ignore atm
+    }
+    if (config->contains("a_records")) {
+        data_source.clearARecords();
+        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("a_records")->listValue()) {
+            data_source.addARecord(rel->stringValue());
+        }
+    }
+    if (config->contains("aaaa_records")) {
+        data_source.clearAAAARecords();
+        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("aaaa_records")->listValue()) {
+            data_source.addAAAARecord(rel->stringValue());
+        }
+    }
+    if (config->contains("ns_records")) {
+        data_source.clearNSRecords();
+        BOOST_FOREACH(isc::data::ElementPtr rel, config->get("ns_records")->listValue()) {
+            data_source.addNSRecord(rel->stringValue());
+        }
+    }
+    return isc::data::Element::createFromString("{ \"result\": [0] }");
 }
+
+

Modified: branches/jelte-datasource1/src/bin/parkinglot/parkinglot.h
==============================================================================
--- branches/jelte-datasource1/src/bin/parkinglot/parkinglot.h (original)
+++ branches/jelte-datasource1/src/bin/parkinglot/parkinglot.h Tue Jan 12 10:32:29 2010
@@ -19,6 +19,7 @@
 
 #include "zoneset.h"
 #include <cc/cpp/data.h>
+#include "data_source_plot.h"
 
 class ParkingLot {
 public:
@@ -28,24 +29,11 @@
     void processMessage();
     void command(std::pair<std::string,isc::data::ElementPtr>);
     void serve(std::string zone_name);
-    void clear_zones() { zones.clear_zones(); };
 
-    void clearARecords() { a_records.clear(); };
-    void clearAAAARecords() { aaaa_records.clear(); };
-    void clearNSRecords() { ns_records.clear(); };
+    isc::data::ElementPtr updateConfig(isc::data::ElementPtr config);
+private:
 
-    void addARecord(std::string data);
-    void addAAAARecord(std::string data);
-    void addNSRecord(std::string data);
-
-    void setSOARecord(isc::dns::Rdata::RdataPtr soa_record);
-
-private:
-    void setDefaultZoneData();
-
-    std::vector<isc::dns::Rdata::RdataPtr> a_records, aaaa_records, ns_records;
-    isc::dns::Rdata::RdataPtr soa;
-    ZoneSet zones;
+    isc::dns::DataSourceParkingLot data_source;
     int sock;
 };
 

Modified: branches/jelte-datasource1/src/lib/dns/Makefile.am
==============================================================================
--- branches/jelte-datasource1/src/lib/dns/Makefile.am (original)
+++ branches/jelte-datasource1/src/lib/dns/Makefile.am Tue Jan 12 10:32:29 2010
@@ -2,7 +2,7 @@
 
 lib_LIBRARIES = libdns.a
 libdns_a_SOURCES = name.cc buffer.cc rrset.cc message.cc \
-	name.h buffer.h rrset.h message.h
+	name.h buffer.h rrset.h message.h data_source.cc data_source.h
 
 TESTS =
 if HAVE_GTEST

Modified: branches/jelte-datasource1/src/lib/dns/message.cc
==============================================================================
--- branches/jelte-datasource1/src/lib/dns/message.cc (original)
+++ branches/jelte-datasource1/src/lib/dns/message.cc Tue Jan 12 10:32:29 2010
@@ -20,6 +20,8 @@
 #include <stdexcept>
 #include <functional>
 #include <algorithm>
+
+#include <iostream>
 
 #include <boost/lexical_cast.hpp>
 




More information about the bind10-changes mailing list