From: Christian Hofstaedtler Date: Wed, 28 Aug 2013 14:33:51 +0000 (+0200) Subject: recursor json: implement zone command X-Git-Tag: rec-3.6.0-rc1~462^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb4b38f1ca330d753bfd8aa81a921cab76726795;p=pdns recursor json: implement zone command --- diff --git a/pdns/json_ws.cc b/pdns/json_ws.cc index b4daaa0a7..faa2c5c1b 100644 --- a/pdns/json_ws.cc +++ b/pdns/json_ws.cc @@ -27,6 +27,11 @@ #include "misc.hh" #include "syncres.hh" #include "config.h" +#include "rapidjson/document.h" +#include "rapidjson/stringbuffer.h" +#include "rapidjson/writer.h" + +using namespace rapidjson; JWebserver::JWebserver(FDMultiplexer* fdm) : d_fdm(fdm) { @@ -169,6 +174,54 @@ string JWebserver::handleRequest(const string &method, const string &uri, const } content += "]"; } + else if(command == "zone") { + SyncRes::domainmap_t::const_iterator ret = t_sstorage->domainmap->find(varmap["zone"]); + if (ret != t_sstorage->domainmap->end()) { + Document doc; + doc.SetObject(); + Value root; + root.SetObject(); + + const SyncRes::AuthDomain& zone = ret->second; + Value zonename(ret->first.c_str(), doc.GetAllocator()); + root.AddMember("name", zonename, doc.GetAllocator()); + root.AddMember("type", "Zone", doc.GetAllocator()); + root.AddMember("kind", zone.d_servers.empty() ? "Native" : "Forwarded", doc.GetAllocator()); + Value servers; + servers.SetArray(); + BOOST_FOREACH(const ComboAddress& server, zone.d_servers) { + Value value(server.toStringWithPort().c_str(), doc.GetAllocator()); + servers.PushBack(value, doc.GetAllocator()); + } + root.AddMember("servers", servers, doc.GetAllocator()); + bool rdbit = zone.d_servers.empty() ? false : zone.d_rdForward; + root.AddMember("rdbit", rdbit, doc.GetAllocator()); + + Value records; + records.SetArray(); + BOOST_FOREACH(const SyncRes::AuthDomain::records_t::value_type& rr, zone.d_records) { + Value object; + object.SetObject(); + Value jname(rr.qname.c_str(), doc.GetAllocator()); // copy + object.AddMember("name", jname, doc.GetAllocator()); + Value jtype(rr.qtype.getName().c_str(), doc.GetAllocator()); // copy + object.AddMember("type", jtype, doc.GetAllocator()); + object.AddMember("ttl", rr.ttl, doc.GetAllocator()); + object.AddMember("priority", rr.priority, doc.GetAllocator()); + Value jcontent(rr.content.c_str(), doc.GetAllocator()); // copy + object.AddMember("content", jcontent, doc.GetAllocator()); + records.PushBack(object, doc.GetAllocator()); + } + root.AddMember("records", records, doc.GetAllocator()); + + doc.AddMember("zone", root, doc.GetAllocator()); + content += makeStringFromDocument(doc); + } else { + map err; + err["error"] = "Could not find domain '"+varmap["zone"]+"'"; + content += returnJSONObject(err); + } + } else if(command == "flush-cache") { string canon=toCanonic("", varmap["domain"]); int count = broadcastAccFunction(boost::bind(pleaseWipeCache, canon));