* `exceedServFails(rate, seconds)`: get set of addresses that exceed `rate` servails/s over `seconds` seconds
* `exceedNXDOMAINs(rate, seconds)`: get set of addresses that exceed `rate` NXDOMAIN/s over `seconds` seconds
* `exceedRespByterate(rate, seconds)`: get set of addresses that exeeded `rate` bytes/s answers over `seconds` seconds
+ * `exceedQRate(rate, seconds)`: get set of address that exceed `rate` queries/s over `seconds` seconds
* `exceedQTypeRate(type, rate, seconds)`: get set of address that exceed `rate` queries/s for queries of type `type` over `seconds` seconds
* Advanced functions for writing your own policies and hooks
* ComboAddress related:
{"None",(int)DNSAction::Action::None},
{"Delay", (int)DNSAction::Action::Delay}}
);
+
+ vector<pair<string, int> > dd;
+ for(const auto& n : QType::names)
+ dd.push_back({n.first, n.second});
+ g_lua.writeVariable("dnsdist", dd);
g_lua.writeFunction("newServer",
[client](boost::variant<string,newserver_t> pvars, boost::optional<int> qps)
until.tv_sec += actualSeconds;
for(const auto& capair : m) {
unsigned int count = 0;
- if(auto got = slow.lookup(Netmask(capair.first))) {
+ auto got = slow.lookup(Netmask(capair.first));
+ if(got) {
if(until < got->second.until) // had a longer policy
continue;
if(now < got->second.until) // don't inherit count on expired entry
}
DynBlock db{msg,until};
db.blocks=count;
- warnlog("Inserting dynamic block for %s for %d seconds: %s", capair.first.toString(), actualSeconds, msg);
+ if(!got)
+ warnlog("Inserting dynamic block for %s for %d seconds: %s", capair.first.toString(), actualSeconds, msg);
slow.insert(Netmask(capair.first)).second=db;
}
g_dynblockNMG.setState(slow);
if(q.qtype==type)
counts[q.requestor]++;
});
+ });
-
+ g_lua.writeFunction("exceedQRate", [](unsigned int rate, int seconds) {
+ setLuaNoSideEffect();
+ return exceedQueryGen(rate, seconds, [](counts_t& counts, const Rings::Query& q) {
+ counts[q.requestor]++;
+ });
});
+
g_lua.writeFunction("topBandwidth", [](boost::optional<unsigned int> top_) {
setLuaNoSideEffect();
auto top = top_.get_value_or(10);
end
end
--- setServerPolicyLua("splitSetup", splitSetup)
\ No newline at end of file
+-- setServerPolicyLua("splitSetup", splitSetup)
+
+function maintenance()
+ addDynBlocks(exceedQRate(20, 10), "Exceeded query rate", 60)
+end
+