[svn] commit: r515 - in /branches/parkinglot: ./ src/bin/parkinglot/ src/lib/dns/

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jan 26 18:44:38 UTC 2010


Author: jelte
Date: Tue Jan 26 18:44:38 2010
New Revision: 515

Log:
merged back branches/jelte_datasource1 branch

Added:
    branches/parkinglot/src/bin/parkinglot/data_source_plot.cc
      - copied unchanged from r507, branches/jelte-datasource1/src/bin/parkinglot/data_source_plot.cc
    branches/parkinglot/src/bin/parkinglot/data_source_plot.h
      - copied unchanged from r507, branches/jelte-datasource1/src/bin/parkinglot/data_source_plot.h
    branches/parkinglot/src/bin/parkinglot/zoneset.cc
    branches/parkinglot/src/lib/dns/data_source.cc
      - copied unchanged from r507, branches/jelte-datasource1/src/lib/dns/data_source.cc
    branches/parkinglot/src/lib/dns/data_source.h
      - copied unchanged from r507, branches/jelte-datasource1/src/lib/dns/data_source.h
Modified:
    branches/parkinglot/   (props changed)
    branches/parkinglot/src/bin/parkinglot/Makefile.am
    branches/parkinglot/src/bin/parkinglot/main.cc
    branches/parkinglot/src/bin/parkinglot/parkinglot.cc
    branches/parkinglot/src/bin/parkinglot/parkinglot.h
    branches/parkinglot/src/bin/parkinglot/zoneset.h
    branches/parkinglot/src/lib/dns/Makefile.am
    branches/parkinglot/src/lib/dns/message.cc
    branches/parkinglot/src/lib/dns/name.cc

Modified: branches/parkinglot/src/bin/parkinglot/Makefile.am
==============================================================================
--- branches/parkinglot/src/bin/parkinglot/Makefile.am (original)
+++ branches/parkinglot/src/bin/parkinglot/Makefile.am Tue Jan 26 18:44:38 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 zoneset.cc 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/parkinglot/src/bin/parkinglot/main.cc
==============================================================================
--- branches/parkinglot/src/bin/parkinglot/main.cc (original)
+++ branches/parkinglot/src/bin/parkinglot/main.cc Tue Jan 26 18:44:38 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/parkinglot/src/bin/parkinglot/parkinglot.cc
==============================================================================
--- branches/parkinglot/src/bin/parkinglot/parkinglot.cc (original)
+++ branches/parkinglot/src/bin/parkinglot/parkinglot.cc Tue Jan 26 18:44:38 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,8 +72,6 @@
 
 void
 ParkingLot::processMessage() {
-    Name authors_name("authors.bind");
-    Name version_name("version.bind");
     struct sockaddr_storage ss;
     socklen_t sa_len = sizeof(ss);
     struct sockaddr* sa = static_cast<struct sockaddr*>((void*)&ss);
@@ -133,90 +96,56 @@
 
         RRsetPtr query = msg.getSection(SECTION_QUESTION)[0];
 
-        string name = query->getName().toText(true);
-        if (query->getClass() == RRClass::CH &&
-            query->getType() == RRType::TXT &&
-            query->getName() == authors_name) {
-            msg.setRcode(Message::RCODE_NOERROR);
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Han Feng")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Kazunori Fujiwara")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Michael Graff")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH,
-                                         RRType::TXT, TTL(0),
-                                         TXT("Evan Hunt")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH,
-                                         RRType::TXT, TTL(0),
-                                         TXT("Jelte Jansen")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Jin Jian")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH,
-                                         RRType::TXT, TTL(0),
-                                         TXT("JINMEI Tatuya")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Naoki Kambe")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Shane Kerr"))); 
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Zhang Likun")));
-            msg.addRR(SECTION_ANSWER, RR(authors_name, RRClass::CH, 
-                                         RRType::TXT, TTL(0), 
-                                         TXT("Jeremy C. Reed"))); 
-            msg.addRR(SECTION_AUTHORITY, RR(authors_name, RRClass::CH,
-                                            RRType::NS, TTL(0),
-                                            NS("authors.bind")));
-        } else if (query->getClass() == RRClass::CH &&
-                   query->getType() == RRType::TXT &&
-                   query->getName() == version_name) {            
-            msg.setRcode(Message::RCODE_NOERROR);
-            msg.addRR(SECTION_ANSWER, RR(version_name, RRClass::CH,
-                                         RRType::TXT, TTL(0),
-                                         TXT("10.0.0s20091030")));
-            msg.addRR(SECTION_AUTHORITY, RR(version_name, RRClass::CH,
-                                            RRType::NS, TTL(0),
-                                            NS("version.bind")));
-        } else if (zones.contains(name)) {
-            msg.setRcode(Message::RCODE_NOERROR);
-            RRset* nsset = new RRset(query->getName(), RRClass::IN,
-                                     RRType::NS, TTL(3600));
-            BOOST_FOREACH(isc::dns::Rdata::RdataPtr ns, ns_records) {
-                nsset->addRdata(ns);
-            }
+        msg.makeResponse();
+        msg.setAA(true);
+        TTL default_ttl = TTL(3600);
 
-            if (query->getType() == RRType::NS)
-                msg.addRRset(SECTION_ANSWER, RRsetPtr(nsset));
-            else if (query->getType() == RRType::A) {
-                msg.addRRset(SECTION_AUTHORITY, RRsetPtr(nsset));
-
-                BOOST_FOREACH(isc::dns::Rdata::RdataPtr a, a_records) {
-                    RR arr(query->getName(), RRClass::IN, RRType::A, TTL(3600), a);
-                    msg.addRR(SECTION_ANSWER, arr);
-                }
-            } else if (query->getType() == RRType::AAAA) {
-                msg.addRRset(SECTION_AUTHORITY, RRsetPtr(nsset));
-                BOOST_FOREACH(isc::dns::Rdata::RdataPtr aaaa, aaaa_records) {
-                    RR aaaarr(query->getName(), RRClass::IN, RRType::AAAA,
-                              TTL(3600), aaaa);
-                    msg.addRR(SECTION_ANSWER, aaaarr);
+        Name zname;
+        Name name = query->getName();
+        RRClass qclass = query->getClass();
+        RRType qtype = query->getType();
+        SearchResult::status_type status;
+        bool included_ns = false;
+        if (data_source.hasZoneFor(query->getName(), zname)) {
+            status = data_source.addToMessage(msg, SECTION_ANSWER, zname, name, qclass, qtype);
+            // rcode is based on this result?
+            if (status == SearchResult::name_not_found) {
+                msg.setRcode(Message::RCODE_NXDOMAIN);
+                if (qtype != RRType::NS) {
+                    status = data_source.addToMessage(msg, SECTION_AUTHORITY, zname, zname, qclass, RRType::SOA);
                 }
             } else {
-                RR soarr(query->getName(), RRClass::IN, RRType::SOA,
-                         TTL(3600), soa);
-                msg.addRR(SECTION_AUTHORITY, soarr);
+                if (qtype != RRType::NS) {
+                    status = data_source.addToMessage(msg, SECTION_AUTHORITY, zname, zname, qclass, RRType::NS);
+                }
+                included_ns = true;
+            }
+            // If we included NS records, and their target falls below the zone, add glue
+            if (included_ns) {
+                BOOST_FOREACH(RRsetPtr rrset, msg.getSection(SECTION_ANSWER)) {
+                    if (rrset->getType() == RRType::NS) {
+                        BOOST_FOREACH(Rdata::RdataPtr rdata, rrset->getRdatalist()) {
+                            /* no direct way to get the Name from the rdata fields? */
+                            Name ns_name = Name(rdata->toText());
+                            data_source.addToMessage(msg, SECTION_ADDITIONAL, zname, ns_name, qclass, RRType::A);
+                            data_source.addToMessage(msg, SECTION_ADDITIONAL, zname, ns_name, qclass, RRType::AAAA);
+                        }
+                    }
+                }
+                BOOST_FOREACH(RRsetPtr rrset, msg.getSection(SECTION_AUTHORITY)) {
+                    if (rrset->getType() == RRType::NS) {
+                        BOOST_FOREACH(Rdata::RdataPtr rdata, rrset->getRdatalist()) {
+                            /* no direct way to get the Name from the rdata fields? */
+                            Name ns_name = Name(rdata->toText());
+                            data_source.addToMessage(msg, SECTION_ADDITIONAL, zname, ns_name, qclass, RRType::A);
+                            data_source.addToMessage(msg, SECTION_ADDITIONAL, zname, ns_name, qclass, RRType::AAAA);
+                        }
+                    }
+                }
             }
         } else {
-            msg.setRcode(Message::RCODE_NXDOMAIN);
+            msg.setRcode(Message::RCODE_SERVFAIL);
         }
-
         msg.toWire();
         cout << "sending a response (" <<
             boost::lexical_cast<string>(msg.getBuffer().getSize())
@@ -225,23 +154,37 @@
     }
 }
 
-void
-ParkingLot::command(pair<string,ElementPtr> cmd) {
-    if (cmd.first == "shutdown")
-        exit(0);
-    else if (cmd.first == "config_update") {
-        // what to do with port settings?
-        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();
-        BOOST_FOREACH(ElementPtr zone, zonelist_el->listValue()) {
-            zones.serve(zone->stringValue());
+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] }");
 }
 
-void
-ParkingLot::serve(std::string zone_name) {
-    zones.serve(zone_name);
-}
+

Modified: branches/parkinglot/src/bin/parkinglot/parkinglot.h
==============================================================================
--- branches/parkinglot/src/bin/parkinglot/parkinglot.h (original)
+++ branches/parkinglot/src/bin/parkinglot/parkinglot.h Tue Jan 26 18:44:38 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/parkinglot/src/bin/parkinglot/zoneset.h
==============================================================================
--- branches/parkinglot/src/bin/parkinglot/zoneset.h (original)
+++ branches/parkinglot/src/bin/parkinglot/zoneset.h Tue Jan 26 18:44:38 2010
@@ -18,23 +18,43 @@
 #define __ZONESET_H 1
 
 #include <set>
+#include <dns/buffer.h>
+#include <dns/name.h>
 
-class ZoneSet : std::set<std::string> {
-    public:
-        void serve(std::string s) {
-            std::cout << "now serving: " << s << std::endl;
-            this->insert(s);
-        }
-        void forget(std::string s) {
-            std::cout << "no longer serving: " << s << std::endl;
-            this->erase(s);
-        }
-        void clear_zones() {
-            this->clear();
-        }
-        bool contains(std::string s) {
-            return (this->find(s) != this->end());
-        }
+class ZoneSet {
+public:
+    void serve(const std::string& s) {
+        serve(isc::dns::Name(s));
+    }
+
+    void serve(const isc::dns::Name& n) {
+        elements.insert(n);
+    }
+    
+    void forget(const std::string& s) {
+        forget(isc::dns::Name(s));
+    }
+
+    void forget(const isc::dns::Name& n) {
+        elements.erase(n);
+    }
+
+    void clear_zones() {
+        elements.clear();
+    }
+
+    bool contains(const std::string& s) {
+        return contains(isc::dns::Name(s));
+    }
+
+    bool contains(const isc::dns::Name& n) {
+        return (elements.find(n) != elements.end());
+    }
+
+    bool findClosest(const isc::dns::Name& n, isc::dns::Name& closest);
+
+private:
+    std::set<isc::dns::Name> elements;
 };
 
 #endif // __ZONESET_H

Modified: branches/parkinglot/src/lib/dns/Makefile.am
==============================================================================
--- branches/parkinglot/src/lib/dns/Makefile.am (original)
+++ branches/parkinglot/src/lib/dns/Makefile.am Tue Jan 26 18:44:38 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/parkinglot/src/lib/dns/message.cc
==============================================================================
--- branches/parkinglot/src/lib/dns/message.cc (original)
+++ branches/parkinglot/src/lib/dns/message.cc Tue Jan 26 18:44:38 2010
@@ -20,6 +20,8 @@
 #include <stdexcept>
 #include <functional>
 #include <algorithm>
+
+#include <iostream>
 
 #include <boost/lexical_cast.hpp>
 

Modified: branches/parkinglot/src/lib/dns/name.cc
==============================================================================
--- branches/parkinglot/src/lib/dns/name.cc (original)
+++ branches/parkinglot/src/lib/dns/name.cc Tue Jan 26 18:44:38 2010
@@ -550,3 +550,15 @@
     os << name.toText();
     return (os);
 }
+
+// temp (bad) comparison, compare not merged yet; needed for zoneset
+// in parkinglot, real version is in trunk, but currently incompatible
+// with this branch
+bool
+Name::operator<(const Name&other) const
+{
+    std::string a = toText();
+    std::string b = other.toText();
+    return a.compare(b);
+}
+




More information about the bind10-changes mailing list