diff --git a/src/bin/parkinglot/ccsession.cc b/src/bin/parkinglot/ccsession.cc index 9c69c68f4f..ddbf0900e7 100644 --- a/src/bin/parkinglot/ccsession.cc +++ b/src/bin/parkinglot/ccsession.cc @@ -20,6 +20,9 @@ #include #include +#include + +#include #include #include @@ -37,9 +40,10 @@ CommandSession::CommandSession() : { try { session_.establish(); - session_.subscribe("ParkingLot"); - session_.subscribe("Boss"); - session_.subscribe("statistics"); + session_.subscribe("ParkingLot", "*", "meonly"); + session_.subscribe("Boss", "*", "meonly"); + session_.subscribe("ConfigManager", "*", "meonly"); + session_.subscribe("statistics", "*", "meonly"); } catch (...) { throw std::runtime_error("SessionManager: failed to open sessions"); } @@ -83,3 +87,19 @@ CommandSession::getCommand(int counter) { return std::pair("unknown", ""); } + +std::vector +CommandSession::getZones() { + ElementPtr cmd, result, env; + std::vector zone_names; + std::stringstream cmd_string; + cmd_string << "{ \"command\": [ \"zone\", \"list\" ] }"; + cmd = Element::create_from_string(cmd_string); + sleep(1); + session_.group_sendmsg(cmd, "ConfigManager"); + session_.group_recvmsg(env, result, false); + BOOST_FOREACH(ElementPtr zone_name, result->get("result")->list_value()) { + zone_names.push_back(zone_name->string_value()); + } + return zone_names; +} diff --git a/src/bin/parkinglot/ccsession.h b/src/bin/parkinglot/ccsession.h index e4880b556d..00ed7f18eb 100644 --- a/src/bin/parkinglot/ccsession.h +++ b/src/bin/parkinglot/ccsession.h @@ -26,6 +26,7 @@ public: CommandSession(); int getSocket(); std::pair getCommand(int counter); + std::vector getZones(); private: ISC::CC::Session session_; }; diff --git a/src/bin/parkinglot/main.cc b/src/bin/parkinglot/main.cc index f3314d194d..99f5a3a38b 100644 --- a/src/bin/parkinglot/main.cc +++ b/src/bin/parkinglot/main.cc @@ -23,6 +23,8 @@ #include #include +#include + #include #include #include @@ -76,6 +78,9 @@ main(int argc, char* argv[]) { fd_set fds; int ps = plot.getSocket(); int ss = cs.getSocket(); + BOOST_FOREACH(std::string zone, cs.getZones()) { + plot.serve(zone); + } int nfds = max(ps, ss) + 1; int counter = 0; diff --git a/src/bin/parkinglot/parkinglot.cc b/src/bin/parkinglot/parkinglot.cc index 832239e685..2c4b50c7c4 100644 --- a/src/bin/parkinglot/parkinglot.cc +++ b/src/bin/parkinglot/parkinglot.cc @@ -37,17 +37,7 @@ using namespace isc::dns; using namespace isc::dns::Rdata::IN; using namespace isc::dns::Rdata::Generic; -static void init_zones(ZoneSet& zones) { - zones.serve("jinmei.org"); - zones.serve("nuthaven.org"); - zones.serve("isc.org"); - zones.serve("sisotowbell.org"); - zones.serve("flame.org"); -} - ParkingLot::ParkingLot(int port) { - init_zones(zones); - ns1 = Rdata::RdataPtr(new NS("ns1.parking.example")); ns2 = Rdata::RdataPtr(new NS("ns2.parking.example")); ns3 = Rdata::RdataPtr(new NS("ns3.parking.example")); @@ -196,9 +186,14 @@ ParkingLot::processMessage() { void ParkingLot::command(pair cmd) { if (cmd.first == "addzone") - zones.serve(cmd.second); + serve(cmd.second); else if (cmd.first == "delzone") zones.forget(cmd.second); else if (cmd.first == "shutdown") exit(0); } + +void +ParkingLot::serve(std::string zone_name) { + zones.serve(zone_name); +} diff --git a/src/bin/parkinglot/parkinglot.h b/src/bin/parkinglot/parkinglot.h index 952e2f0bce..dc5e5b98a7 100644 --- a/src/bin/parkinglot/parkinglot.h +++ b/src/bin/parkinglot/parkinglot.h @@ -26,7 +26,8 @@ public: int getSocket() { return (sock); } void processMessage(); void command(std::pair); - + void serve(std::string zone_name); + private: isc::dns::Rdata::RdataPtr ns1, ns2, ns3, a, aaaa, soa; ZoneSet zones;