From d267d1bf1e6cb12f99df4d2a5b93407d124cf5fe Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Tue, 4 Dec 2012 12:07:55 +0000 Subject: [PATCH] add experimental json interface bridge to all pdns_control commands (command=pdns-control, do a POST with a JSON object with a parameters field, you'll get a json response too) git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2964 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/dynlistener.hh | 1 + pdns/ws.cc | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pdns/dynlistener.hh b/pdns/dynlistener.hh index 3dbea2fb73..769aa470d7 100644 --- a/pdns/dynlistener.hh +++ b/pdns/dynlistener.hh @@ -55,6 +55,7 @@ public: static void registerFunc(const string &name, g_funk_t *gf, const string &usage="", const string &args=""); static void registerRestFunc(g_funk_t *gf); + static g_funk_t* getFunc(const string& fname) { return s_funcdb[fname].func; } private: void sendLine(const string &line); string getHelp(); diff --git a/pdns/ws.cc b/pdns/ws.cc index a848e9c1ad..ee5d38d40b 100644 --- a/pdns/ws.cc +++ b/pdns/ws.cc @@ -15,6 +15,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "utility.hh" +#include "dynlistener.hh" #include "ws.hh" #include "json.hh" #include "webserver.hh" @@ -327,7 +328,7 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m map object; object["number"]=lexical_cast(number); - cerr<<"Flushed cache for '"< m; + m["error"]="pdns-control requires a POST"; + return ret + returnJSONObject(m); + } + // cout<<"post: "<(post.c_str()).HasParseError()) { + return ret+"{\"error\": \"Unable to parse JSON\""; + } + // cout<<"Parameters: '"< parameters; + stringtok(parameters, document["parameters"].GetString(), " \t"); + + DynListener::g_funk_t* ptr=0; + if(!parameters.empty()) + ptr = DynListener::getFunc(toUpper(parameters[0])); + map m; + + if(ptr) { + m["result"] = (*ptr)(parameters, 0); + } else { + m["error"]="No such function "+toUpper(parameters[0]); + } + ret+= returnJSONObject(m); + + } if(command == "zone-rest") { // http://jsonstat?command=zone-rest&rest=/powerdns.nl/www.powerdns.nl/a vector parts; stringtok(parts, ourvarmap["rest"], "/"); @@ -410,7 +439,6 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m return ret+"{\"error\": \"Unable to parse JSON\""; } - DNSResourceRecord rr; vector rrset; const rapidjson::Value &records= document["records"]; -- 2.39.5