}
}
-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;
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);
#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;
});
}
+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)