[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