]> granicus.if.org Git - pdns/commitdiff
Expose rpz stats in the web-interface
authorPieter Lexis <pieter.lexis@powerdns.com>
Thu, 22 Mar 2018 16:53:00 +0000 (17:53 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 26 Mar 2018 09:14:54 +0000 (11:14 +0200)
(cherry picked from commit 2278ffdab2c5a3ff47c56021892926d7b47a811c)

pdns/rpzloader.cc
pdns/rpzloader.hh
pdns/ws-recursor.cc

index 0326befee7599e11e39e4598cf57b3e7088717e9..55adb452c7c97cce6bff754400a6710b9e99e357 100644 (file)
@@ -250,16 +250,6 @@ void loadRPZFromFile(const std::string& fname, std::shared_ptr<DNSFilterEngine::
   }
 }
 
-struct rpzStats
-{
-  std::atomic<uint64_t> d_failedTransfers;
-  std::atomic<uint64_t> d_successfulTransfers;
-  std::atomic<uint64_t> d_fullTransfers;
-  std::atomic<uint64_t> d_numberOfRecords;
-  std::atomic<time_t> d_lastUpdate;
-  std::atomic<uint32_t> d_serial;
-};
-
 static std::unordered_map<std::string, rpzStats> s_rpzStats;
 static std::mutex s_rpzStatsMutex;
 
index 900ea23b0555b9e0f1029be69b17fe175e954d13..71e4de0b4ff8fb3f751e91ff12e7526fabe4dcce 100644 (file)
@@ -30,3 +30,15 @@ void loadRPZFromFile(const std::string& fname, std::shared_ptr<DNSFilterEngine::
 std::shared_ptr<SOARecordContent> loadRPZFromServer(const ComboAddress& master, const DNSName& zoneName, std::shared_ptr<DNSFilterEngine::Zone> zone, boost::optional<DNSFilterEngine::Policy> defpol, uint32_t maxTTL, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, const uint16_t axfrTimeout);
 void RPZRecordToPolicy(const DNSRecord& dr, std::shared_ptr<DNSFilterEngine::Zone> zone, bool addOrRemove, boost::optional<DNSFilterEngine::Policy> defpol, uint32_t maxTTL);
 void RPZIXFRTracker(const ComboAddress& master, boost::optional<DNSFilterEngine::Policy> defpol, uint32_t maxTTL, size_t polZone, const TSIGTriplet &tt, size_t maxReceivedBytes, const ComboAddress& localAddress, std::shared_ptr<DNSFilterEngine::Zone> zone, const uint16_t axfrTimeout);
+
+struct rpzStats
+{
+  std::atomic<uint64_t> d_failedTransfers;
+  std::atomic<uint64_t> d_successfulTransfers;
+  std::atomic<uint64_t> d_fullTransfers;
+  std::atomic<uint64_t> d_numberOfRecords;
+  std::atomic<time_t> d_lastUpdate;
+  std::atomic<uint32_t> d_serial;
+};
+
+rpzStats& getRPZZoneStats(const std::string& zone);
index 1701e6c103f9c86cb65e184b81c9d57797c24707..74d74d9d58f7bc38a128e8a40b98fcd54bfcc470 100644 (file)
@@ -39,6 +39,8 @@
 #include "ws-api.hh"
 #include "logger.hh"
 #include "ext/incbin/incbin.h"
+#include "rec-lua-conf.hh"
+#include "rpzloader.hh"
 
 extern thread_local FDMultiplexer* t_fdm;
 
@@ -381,6 +383,34 @@ static void apiServerCacheFlush(HttpRequest* req, HttpResponse* resp) {
   });
 }
 
+static void apiServerRPZ(HttpRequest* req, HttpResponse* resp) {
+  if(req->method != "GET")
+    throw HttpMethodNotAllowedException();
+
+  auto luaconf = g_luaconfs.getLocal();
+  auto numZones = luaconf->dfe.size();
+
+  Json::object ret;
+
+  for (size_t i=0; i < numZones; i++) {
+    auto zone = luaconf->dfe.getZone(i);
+    if (zone == nullptr)
+      continue;
+    auto name = zone->getName();
+    auto& stats = getRPZZoneStats(*name);
+    Json::object zoneInfo = {
+      {"transfers_failed", (double)stats.d_failedTransfers},
+      {"transfers_success", (double)stats.d_successfulTransfers},
+      {"transfers_full", (double)stats.d_fullTransfers},
+      {"records", (double)stats.d_numberOfRecords},
+      {"last_update", (double)stats.d_lastUpdate},
+      {"serial", (double)stats.d_serial},
+    };
+    ret[*name] = zoneInfo;
+  }
+  resp->setBody(ret);
+}
+
 #include "htmlfiles.h"
 
 static void serveStuff(HttpRequest* req, HttpResponse* resp)