diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-01-30 15:21:45 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-01-30 15:21:45 +0200 |
commit | 6e5fc5f53ca959dbbe03a1a927c6eadc518c4cd8 (patch) | |
tree | 0c6304fd2cfe78419ffecbfdaa1fb157dd94c4f0 | |
parent | b562959332856a4e0b013676b75151a7b475d3dd (diff) | |
download | awall-6e5fc5f53ca959dbbe03a1a927c6eadc518c4cd8.tar.bz2 awall-6e5fc5f53ca959dbbe03a1a927c6eadc518c4cd8.tar.xz |
statistical packet logging
fixes #1587
-rw-r--r-- | awall/modules/filter.lua | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/awall/modules/filter.lua b/awall/modules/filter.lua index 15d3629..85df460 100644 --- a/awall/modules/filter.lua +++ b/awall/modules/filter.lua @@ -39,16 +39,32 @@ function Log:optfrag() local mode = self.mode or 'log' if not optmap[mode] then self:error('Invalid logging mode: '..mode) end + local selector, opts + for i, sel in ipairs{'every', 'limit', 'probability'} do + local value = self[sel] + if value then + if selector then + self:error('Cannot combine '..sel..' with '..selector) + end + selector = sel + + if sel == 'every' then + opts = '-m statistic --mode nth --every '..value..' --packet 0' + elseif sel == 'limit' then + opts = '-m limit --limit '..value..'/second' + elseif sel == 'probability' then + opts = '-m statistic --mode random --probability '..value + else assert(false) end + end + end + local target = string.upper(mode) for s, t in pairs(optmap[mode]) do if self[s] then target = target..' --'..mode..'-'..t..' '..self[s] end end - return { - opts=self.limit and '-m limit --limit '..self.limit..'/second', - target=target - } + return {opts=opts, target=target} end |