diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-01-31 17:47:38 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-31 17:47:38 +0000 |
commit | c154108c89c345cb3ef6702200487cc9a81ae27c (patch) | |
tree | 6810dba224e66355b27249e8dfa7fa3edbcce702 | |
parent | 2c3d38f507cfe7410a763d4f7c9af278184fcc44 (diff) | |
parent | a897c86cfa6c3b78d29f0ab8a5f000ab61e1a422 (diff) | |
download | rspamd-c154108c89c345cb3ef6702200487cc9a81ae27c.tar.gz rspamd-c154108c89c345cb3ef6702200487cc9a81ae27c.zip |
Merge pull request #1387 from fatalbanana/branch2
[Feature] Implement rspamdgrep tool
-rw-r--r-- | contrib/rspamdgrep/rspamdgrep.lua | 85 | ||||
-rwxr-xr-x | contrib/rspamdgrep/rspamdgrep.sh | 11 |
2 files changed, 96 insertions, 0 deletions
diff --git a/contrib/rspamdgrep/rspamdgrep.lua b/contrib/rspamdgrep/rspamdgrep.lua new file mode 100644 index 000000000..7529c7c9c --- /dev/null +++ b/contrib/rspamdgrep/rspamdgrep.lua @@ -0,0 +1,85 @@ +local rspamd_regexp = require 'rspamd_regexp' +local rspamd_logger = require 'rspamd_logger' + +local BUF_SIZE = 10240 +local E = {} + +local buffer = {} +local matches = {} +local count = 0 + +if type(arg) ~= 'table' then + io.stderr:write('No files specified for search\n') + os.exit(1) +end + +local pattern = table.remove(arg, 1) +local re = rspamd_regexp.create(pattern) +if not re then + io.stderr:write("Couldn't compile regex: " .. pattern .. '\n') + os.exit(1) +end + +for _, n in ipairs(arg) do + local h, err + if string.match(n, '%.xz$') then + h, err = io.popen('xzcat ' .. n, 'r') + elseif string.match(n, '%.bz2$') then + h, err = io.popen('bzcat ' .. n, 'r') + elseif string.match(n, '%.gz$') then + h, err = io.popen('zcat ' .. n, 'r') + elseif string.match(n, '%.log$') then + h, err = io.open(n, 'r') + else + io.stderr:write("Couldn't identify log format: " .. n .. '\n') + end + if not h then + if err then + io.stderr:write("Couldn't open file (" .. n .. '): ' .. err .. '\n') + end + else + for line in h:lines() do + local hash = string.match(line, '^%d+-%d+-%d+ %d+:%d+:%d+ #%d+%(%a+%) <(%x+)>') + if hash then + if matches[hash] then + table.insert(matches[hash], line) + else + if buffer[hash] then + table.insert(buffer[hash], line) + else + buffer[hash] = {line} + end + count = count + 1 + if count >= BUF_SIZE then + local k = next(buffer) + buffer[k] = nil + count = count - 1 + end + end + end + if re:match(line) then + if not hash then + hash = 'orphaned' + end + if matches[hash] then + table.insert(matches[hash], line) + else + local old = buffer[hash] or E + table.insert(old, line) + matches[hash] = old + end + end + local is_end = string.match(line, '^%d+-%d+-%d+ %d+:%d+:%d+ #%d+%(%a+%) <%x+>; task; rspamd_protocol_http_reply:') + if is_end then + buffer[hash] = nil + end + end + end +end + +for k, v in pairs(matches) do + for _, vv in ipairs(v) do + print(vv) + end + print() +end diff --git a/contrib/rspamdgrep/rspamdgrep.sh b/contrib/rspamdgrep/rspamdgrep.sh new file mode 100755 index 000000000..08a5fea2f --- /dev/null +++ b/contrib/rspamdgrep/rspamdgrep.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Process command-line arguments +LARG="" +for i in "$@" +do + LARG="$LARG -a $i" +done + +# Call rspamadm lua +rspamadm lua $LARG rspamdgrep.lua |