]> granicus.if.org Git - pdns/commitdiff
make our pdns_control "show" stats available as JSON via our webinterface, http:...
authorBert Hubert <bert.hubert@netherlabs.nl>
Tue, 13 Nov 2012 10:41:39 +0000 (10:41 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Tue, 13 Nov 2012 10:41:39 +0000 (10:41 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2890 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/webserver.cc
pdns/ws.cc
pdns/ws.hh

index 4923e121b2b0714c87df2bb66d780980dbe24e36..8e94d90278d51eca8569b26079ced43d5670f959 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PowerDNS Versatile Database Driven Nameserver
-    Copyright (C) 2002-2010  PowerDNS.COM BV
+    Copyright (C) 2002-2012  PowerDNS.COM BV
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License version 2
@@ -123,7 +123,6 @@ void *WebServer::serveConnection(void *p)
       }
     }while(!line.empty());
 
-
     if(!d_password.empty() && !authOK) {
       client->putLine("HTTP/1.1 401 OK\n");
       client->putLine("WWW-Authenticate: Basic realm=\"PowerDNS\"\n");
index 3ddbbb8f4ebb03f71a2510d5317dd8e712d045db..38b49b40d6cf9fd49185ed8af56a8e6af39f206f 100644 (file)
@@ -149,7 +149,6 @@ string StatWebServer::makePercentage(const double& val)
 
 string StatWebServer::indexfunction(const map<string,string> &varmap, void *ptr, bool *custom)
 {
-
   StatWebServer *sws=static_cast<StatWebServer *>(ptr);
   map<string,string>rvarmap=varmap;
   if(!rvarmap["resetring"].empty()){
@@ -226,12 +225,44 @@ string StatWebServer::indexfunction(const map<string,string> &varmap, void *ptr,
   return ret.str();
 }
 
+string StatWebServer::jsonstat(const map<string,string> &varmap, void *ptr, bool *custom)
+{
+  *custom=1;
+  string ret="HTTP/1.1 200 OK\r\n"
+  "Date: Wed, 30 Nov 2011 22:01:15 GMT\r\n" // XXX FIXME real date!
+  "Server: PowerDNS/"VERSION"\r\n"
+  "Connection: Keep-Alive\r\n"
+  "Transfer-Encoding: chunked\r\n"
+  "Access-Control-Allow-Origin: *\r\n"
+  "Content-Type: application/json\r\n"
+  "\r\n" ;
+
+  typedef map<string,string> varmap_t;
+  string variable, value;
+  ret="{";
+  for(varmap_t::const_iterator iter = varmap.begin(); iter != varmap.end() ; ++iter) {
+    if(iter != varmap.begin())
+      ret += ",";
+      
+    variable = iter->first;
+    if(variable == "version")
+      value = '"'+string(VERSION)+'"';
+    else 
+      value = lexical_cast<string>(S.read(variable));
+      
+    ret += '"'+ variable +"\": "+ value;
+  }
+  ret+="}";
+  return ret;
+}
+
 void StatWebServer::launch()
 {
   try {
     
     d_ws->setCaller(this);
     d_ws->registerHandler("",&indexfunction);
+    d_ws->registerHandler("jsonstat", &jsonstat);
     d_ws->go();
   }
   catch(...) {
index bc887b5c30519ae2c83801f57f76c4b8cdba326d..63f1fc9968132c7bee8b32411915aff53f64c64f 100644 (file)
@@ -87,7 +87,7 @@ private:
   static void *threadHelper(void *);
   static void *statThreadHelper(void *p);
   static string indexfunction(const map<string,string> &varmap, void *ptr, bool *custom);
-
+  static string jsonstat(const map<string,string> &varmap, void *ptr, bool *custom);
   void printvars(ostringstream &ret);
   void printargs(ostringstream &ret);
   void launch();