void moreLua()
{
g_lua.writeFunction("newCA", [](const std::string& name) { return ComboAddress(name); });
- g_lua.writeFunction("newNMG", []() { return std::make_shared<NetmaskGroup>(); });
+ g_lua.writeFunction("newNMG", []() { return NetmaskGroup(); });
g_lua.registerFunction<void(NetmaskGroup::*)(const ComboAddress&)>("add",
[](NetmaskGroup& s, const ComboAddress& ca) { s.addMask(Netmask(ca)); });
+ g_lua.writeFunction("setDynBlockNMG", [](const NetmaskGroup& nmg) {
+ g_dynblockNMG.setState(nmg);
+ });
+
g_lua.registerFunction<void(NetmaskGroup::*)(const map<ComboAddress,int>&)>("add",
[](NetmaskGroup& s, const map<ComboAddress,int>& m) {
for(const auto& capair : m)
auto localPolicy = g_policy.getLocal();
auto localRulactions = g_rulactions.getLocal();
+ auto localDynBlockNMG = g_dynblockNMG.getLocal();
map<ComboAddress,int> sockets;
for(;;) {
struct dnsheader* dh =(dnsheader*)query;
const uint16_t * flags = getFlagsFromDNSHeader(dh);
uint16_t origFlags = *flags;
-
+ struct timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+
+ g_rings.queryRing.push_back({now,ci.remote,qname,qtype}); // XXX LOCK?!
+
+ if(localDynBlockNMG->match(ci.remote)) {
+ vinfolog("Query from %s dropped because of dynamic block", ci.remote.toStringWithPort());
+ g_stats.dynBlocked++;
+ goto drop;
+ }
+
if(blockFilter) {
std::lock_guard<std::mutex> lock(g_luamutex);
Rings g_rings;
GlobalStateHolder<servers_t> g_dstates;
-
+GlobalStateHolder<NetmaskGroup> g_dynblockNMG;
int g_tcpRecvTimeout{2};
int g_tcpSendTimeout{2};
auto localPolicy = g_policy.getLocal();
auto localRulactions = g_rulactions.getLocal();
auto localServers = g_dstates.getLocal();
+ auto localDynBlock = g_dynblockNMG.getLocal();
struct msghdr msgh;
struct iovec iov;
char cbuf[256];
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
g_rings.queryRing.push_back({now,remote,qname,qtype}); // XXX LOCK?!
-
+
+ if(localDynBlock->match(remote)) {
+ vinfolog("Query from %s dropped because of dynamic block", remote.toStringWithPort());
+ g_stats.dynBlocked++;
+ continue;
+ }
+
if(blockFilter) {
std::lock_guard<std::mutex> lock(g_luamutex);
#include "sholder.hh"
void* carbonDumpThread();
uint64_t uptimeOfProcess(const std::string& str);
+
+extern GlobalStateHolder<NetmaskGroup> g_dynblockNMG;
struct DNSDistStats
{
using stat_t=std::atomic<uint64_t>; // aww yiss ;-)
stat_t nonCompliantQueries{0};
stat_t aclDrops{0};
stat_t blockFilter{0};
+ stat_t dynBlocked{0};
stat_t ruleDrop{0};
stat_t ruleNXDomain{0};
stat_t selfAnswered{0};
{"noncompliant-queries", &nonCompliantQueries},
{"cpu-user-msec", getCPUTimeUser},
{"cpu-sys-msec", getCPUTimeSystem},
- {"fd-usage", getOpenFileDescriptors}
+ {"fd-usage", getOpenFileDescriptors}, {"dyn-blocked", &dynBlocked},
+ {"dyn-block-nmg-size", [](const std::string&) { return g_dynblockNMG.getLocal()->size(); }}
};
};