void moreLua()
{
- typedef NetmaskTree<string> nmts_t;
+ typedef NetmaskTree<DynBlock> nmts_t;
g_lua.writeFunction("newCA", [](const std::string& name) { return ComboAddress(name); });
g_lua.writeFunction("newNMG", []() { return nmts_t(); });
- g_lua.registerFunction<void(nmts_t::*)(const ComboAddress&, const std::string&)>("add",
- [](nmts_t& s, const ComboAddress& ca, const std::string& msg)
+ g_lua.registerFunction<void(nmts_t::*)(const ComboAddress&, const std::string&, boost::optional<int> seconds)>("add",
+ [](nmts_t& s, const ComboAddress& ca, const std::string& msg, boost::optional<int> seconds)
{
- s.insert(Netmask(ca)).second=msg;
+ struct timespec until;
+ clock_gettime(CLOCK_MONOTONIC, &until);
+ until.tv_sec += seconds ? *seconds : 10;
+
+ s.insert(Netmask(ca)).second={msg, until};
});
g_lua.writeFunction("setDynBlockNMG", [](const nmts_t& nmg) {
g_lua.writeFunction("showDynBlocks", []() {
auto slow = g_dynblockNMG.getCopy();
+ struct timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ boost::format fmt("%-24s %8d %s\n");
+ g_outputBuffer = (fmt % "Netmask" % "Seconds" % "Reason").str();
for(const auto& e: slow) {
- g_outputBuffer+=e->first.toString()+"\t"+e->second+"\n";
+ if(now < e->second.until)
+ g_outputBuffer+= (fmt % e->first.toString() % (e->second.until.tv_sec - now.tv_sec) % e->second.reason).str();
}
});
- g_lua.registerFunction<void(nmts_t::*)(const map<ComboAddress,int>&, const std::string&)>("add",
- [](nmts_t& s, const map<ComboAddress,int>& m, const std::string& msg) {
- for(const auto& capair : m)
- s.insert(Netmask(capair.first)).second=msg;
- });
+ g_lua.writeFunction("clearDynBlocks", []() {
+ nmts_t nmg;
+ g_dynblockNMG.setState(nmg);
+ });
+
+ g_lua.writeFunction("addDynBlocks",
+ [](const map<ComboAddress,int>& m, const std::string& msg, boost::optional<int> seconds) {
+ auto slow = g_dynblockNMG.getCopy();
+ struct timespec until;
+ clock_gettime(CLOCK_MONOTONIC, &until);
+ until.tv_sec += seconds ? *seconds : 10;
+ for(const auto& capair : m)
+ slow.insert(Netmask(capair.first)).second={msg, until};
+ g_dynblockNMG.setState(slow);
+ });
+
+
+
+ g_lua.registerFunction<void(nmts_t::*)(const map<ComboAddress,int>&, const std::string&, boost::optional<int>)>("add",
+ [](nmts_t& s, const map<ComboAddress,int>& m, const std::string& msg, boost::optional<int> seconds) {
+ struct timespec until;
+ clock_gettime(CLOCK_MONOTONIC, &until);
+ until.tv_sec += seconds ? *seconds : 10;
+ for(const auto& capair : m)
+ s.insert(Netmask(capair.first)).second={msg, until};
+ });
g_lua.registerFunction<bool(nmts_t::*)(const ComboAddress&)>("match",
Rings g_rings;
GlobalStateHolder<servers_t> g_dstates;
-GlobalStateHolder<NetmaskTree<string>> g_dynblockNMG;
+GlobalStateHolder<NetmaskTree<DynBlock>> g_dynblockNMG;
int g_tcpRecvTimeout{2};
int g_tcpSendTimeout{2};
g_rings.queryRing.push_back({now,remote,qname,qtype});
}
- if(localDynBlock->match(remote)) {
- vinfolog("Query from %s dropped because of dynamic block", remote.toStringWithPort());
- g_stats.dynBlocked++;
- continue;
+ if(auto got=localDynBlock->lookup(remote)) {
+ if(now < got->second.until) {
+ vinfolog("Query from %s dropped because of dynamic block", remote.toStringWithPort());
+ g_stats.dynBlocked++;
+ got->second.blocks++;
+ continue;
+ }
}
if(blockFilter) {
auto f =g_lua.readVariable<boost::optional<std::function<void()> > >("maintenance");
if(f)
(*f)();
+
+
+ // ponder pruning g_dynblocks of expired entries here
}
return 0;
}
});
- if((intervalcount++)%5)
- return;
+// if((intervalcount++)%5)
+ // return;
// updateRingBuffers();
$.ajax({ url: 'jsonstat?command=dynblocklist', type: 'GET', dataType: 'json',
success: function(data) {
- var bouw='<table width="100%"><tr align=left><th>Dyn blocked netmask</th><th align=left>Reason</th></tr>';
- if(data.length) {
- $.each(data, function(a,b) {
- bouw=bouw+("<tr><td>"+a+"</td><td>"+b+"</td></tr>");
- });
- }
- else
- bouw = bouw + '<tr><td align="center" colspan="2"><font color="#aaaaaa">No dynamic blocks active</font></td></tr>';
+ var bouw='<table width="100%"><tr align=left><th>Dyn blocked netmask</th><th>Seconds</th><th>Blocks</th><th align=left>Reason</th></tr>';
+ var gotsome=false;
+ $.each(data, function(a,b) {
+ bouw=bouw+("<tr><td>"+a+"</td><td>"+b.seconds+"</td><td>"+b.blocks+"</td><td>"+b.reason+"</td></tr>");
+ gotsome=true;
+ });
+
+ if(!gotsome)
+ bouw = bouw + '<tr><td align="center" colspan="4"><font color="#aaaaaa">No dynamic blocks active</font></td></tr>';
bouw=bouw+"</table>";
$("#dynblock").html(bouw);