From: Bert Hubert Date: Sun, 18 Nov 2012 19:08:04 +0000 (+0000) Subject: hook up the json log-grep plus change all recursor urls (sorry) and actually parse... X-Git-Tag: auth-3.2-rc2~98 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ac4a7c69411a7d03b0bec1fef85bbf4e49cc051;p=pdns hook up the json log-grep plus change all recursor urls (sorry) and actually parse urls (yay) git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2903 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/json_ws.cc b/pdns/json_ws.cc index 772b9e22e..91c56525d 100644 --- a/pdns/json_ws.cc +++ b/pdns/json_ws.cc @@ -26,6 +26,7 @@ #include "arguments.hh" #include "misc.hh" #include "syncres.hh" +#include "config.h" JWebserver::JWebserver(FDMultiplexer* fdm) : d_fdm(fdm) { @@ -47,23 +48,40 @@ void JWebserver::readRequest(int fd) d_fdm->removeReadFD(fd); close(fd); cerr<<"Lost connection"<removeReadFD(fd); + close(fd); + cerr<<"Invalid request"< varmap; + if((p = strchr(buffer, '?'))) { + vector variables; + string line(p+1); + line.resize(line.length() - strlen(" HTTP/1.0")); + + stringtok(variables, line, "&"); + BOOST_FOREACH(const string& var, variables) { + varmap.insert(splitField(var, '=')); + cout<<"Variable: '"< stats; - if(sbuffer.find("stats") != string::npos) { - stats = getAllStatsMap(); - content += returnJSONObject(stats); - } else if(sbuffer.find("domains") != string::npos) { + if(varmap["command"] =="domains") { content += "["; bool first=1; BOOST_FOREACH(const SyncRes::domainmap_t::value_type& val, *t_sstorage->domainmap) { @@ -88,26 +103,49 @@ void JWebserver::readRequest(int fd) stats.clear(); stats["name"] = val.first; stats["type"] = val.second.d_servers.empty() ? "Native" : "Forwarded"; + stats["servers"]; + BOOST_FOREACH(const ComboAddress& server, val.second.d_servers) { + stats["servers"]+= server.toStringWithPort() + " "; + } + stats["rdbit"] = lexical_cast(val.second.d_servers.empty() ? 0 : val.second.d_rdForward); // fill out forwarders too one day, and rdrequired content += returnJSONObject(stats); } content += "]"; + } + else if(varmap["command"]=="flush-cache") { + string canon=toCanonic("", varmap["domain"]); + cerr<<"Canon: '"<(boost::bind(pleaseWipeCache, canon)); + count+=broadcastAccFunction(boost::bind(pleaseWipeAndCountNegCache, canon)); + stats["number"]=lexical_cast(count); + content += returnJSONObject(stats); } - else { + else if(varmap["command"] == "config") { vector items = ::arg().list(); BOOST_FOREACH(const string& var, items) { stats[var] = ::arg()[var]; } content += returnJSONObject(stats); } - + else if(varmap["command"]=="log-grep") { + content += makeLogGrepJSON(varmap, "/var/log/pdns.log", " pdns_recursor["); + } + else { // if(varmap["command"] == "stats") { + stats = getAllStatsMap(); + content += returnJSONObject(stats); + } if(!callback.empty()) content += ");"; - string header = (boost::format(response) % content.length()).str(); - write(fd, header.c_str(), header.length()); - write(fd, content.c_str(), content.length()); + string tot = (boost::format(response) % content.length()).str(); + tot += content; + cout << "Starting write"< #include +#include "namespaces.hh" extern StatBag S; @@ -229,6 +230,7 @@ string StatWebServer::indexfunction(const map &varmap, void *ptr, return ret.str(); } + string StatWebServer::jsonstat(const map &varmap, void *ptr, bool *custom) { *custom=1; @@ -348,7 +350,9 @@ string StatWebServer::jsonstat(const map &varmap, void *ptr, bool ret += "]"; } - + if(command=="log-grep") { + ret += makeLogGrepJSON(ourvarmap, ::arg()["logfile"], " pdns["); + } const char *kinds[]={"Master", "Slave", "Native"}; if(command=="domains") {