From: Christian Hofstaedtler Date: Wed, 28 Aug 2013 14:12:47 +0000 (+0200) Subject: json webserver: add new 'zone' command X-Git-Tag: rec-3.6.0-rc1~462^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ea12b64a98f9227cff7b71d3b4fee0cc32f8fed6;p=thirdparty%2Fpdns.git json webserver: add new 'zone' command Replaces get-zone. Intended to replace zone-rest in the future, also create/delete of zones should also go through this. --- diff --git a/pdns/ws.cc b/pdns/ws.cc index 49c95c4e94..1322e0cb4d 100644 --- a/pdns/ws.cc +++ b/pdns/ws.cc @@ -494,6 +494,76 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m return ret+post; } } + else if(command == "zone") { + string zonename = ourvarmap["zone"]; + if (zonename.empty()) { + map err; + err["error"] = "Must give zone parameter"; + return ret+returnJSONObject(err); + } + + 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 ret+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 ret + makeStringFromDocument(doc); + + } else { + map err; + err["error"] = "Method not allowed"; + return ret+returnJSONObject(err); + } + } else if(command=="log-grep") { ret += makeLogGrepJSON(ourvarmap, ::arg()["experimental-logfile"], " pdns["); }