[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