From: Christian Hofstaedtler Date: Fri, 20 Sep 2013 12:54:39 +0000 (+0200) Subject: ws: split zone get/list into it's own function X-Git-Tag: rec-3.6.0-rc1~428^2~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1abb81f489a8a07087487df1fb751433d5a57b0e;p=pdns ws: split zone get/list into it's own function --- diff --git a/pdns/ws.cc b/pdns/ws.cc index 6506b4c91..86781e6f0 100644 --- a/pdns/ws.cc +++ b/pdns/ws.cc @@ -257,6 +257,62 @@ static int int_from_json(const Value& val) { } } +static string getZone(const string& zonename) { + UeberBackend B; + SOAData sd; + DomainInfo di; + sd.db = (DNSBackend*)-1; + if(!B.getSOA(zonename, sd) || !sd.db || !B.getDomainInfo(zonename, di)) { + map err; + err["error"] = "Could not find domain '"+zonename+"'"; + return returnJSONObject(err); + } + + Document doc; + doc.SetObject(); + + Value root; + root.SetObject(); + root.AddMember("name", zonename.c_str(), doc.GetAllocator()); + root.AddMember("type", "Zone", doc.GetAllocator()); + root.AddMember("kind", di.getKindString(), doc.GetAllocator()); + Value masters; + masters.SetArray(); + BOOST_FOREACH(const string& master, di.masters) { + Value value(master.c_str(), doc.GetAllocator()); + masters.PushBack(value, doc.GetAllocator()); + } + root.AddMember("masters", masters, doc.GetAllocator()); + root.AddMember("serial", di.serial, doc.GetAllocator()); + root.AddMember("notified_serial", di.notified_serial, doc.GetAllocator()); + root.AddMember("last_check", (unsigned int) di.last_check, doc.GetAllocator()); + + DNSResourceRecord rr; + Value records; + records.SetArray(); + sd.db->list(zonename, sd.domain_id); + while(sd.db->get(rr)) { + if (!rr.qtype.getCode()) + continue; // skip empty non-terminals + + 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()); + return makeStringFromDocument(doc); +} + static string json_dispatch(const string& method, const string& post, varmap_t& varmap, const string& command) { if(command=="get") { if(varmap.empty()) { @@ -447,60 +503,7 @@ static string json_dispatch(const string& method, const string& post, varmap_t& if(method == "GET") { // get current zone - UeberBackend B; - SOAData sd; - DomainInfo di; - sd.db = (DNSBackend*)-1; - if(!B.getSOA(zonename, sd) || !sd.db || !B.getDomainInfo(zonename, di)) { - map err; - err["error"] = "Could not find domain '"+zonename+"'"; - return returnJSONObject(err); - } - - Document doc; - doc.SetObject(); - - Value root; - root.SetObject(); - root.AddMember("name", zonename.c_str(), doc.GetAllocator()); - root.AddMember("type", "Zone", doc.GetAllocator()); - root.AddMember("kind", di.getKindString(), doc.GetAllocator()); - Value masters; - masters.SetArray(); - BOOST_FOREACH(const string& master, di.masters) { - Value value(master.c_str(), doc.GetAllocator()); - masters.PushBack(value, doc.GetAllocator()); - } - root.AddMember("masters", masters, doc.GetAllocator()); - root.AddMember("serial", di.serial, doc.GetAllocator()); - root.AddMember("notified_serial", di.notified_serial, doc.GetAllocator()); - root.AddMember("last_check", (unsigned int) di.last_check, doc.GetAllocator()); - - DNSResourceRecord rr; - Value records; - records.SetArray(); - sd.db->list(zonename, sd.domain_id); - while(sd.db->get(rr)) { - if (!rr.qtype.getCode()) - continue; // skip empty non-terminals - - 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()); - return makeStringFromDocument(doc); - + return getZone(zonename); } else { map err; err["error"] = "Method not allowed";