aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorAndrew Lewis <nerf@judo.za.org>2017-01-31 15:46:49 +0200
committerAndrew Lewis <nerf@judo.za.org>2017-01-31 15:46:49 +0200
commita897c86cfa6c3b78d29f0ab8a5f000ab61e1a422 (patch)
treebb51664c2b547b99053f01e7890996df7afcb0ca /contrib
parent94340378587dd1319f14cb4d58fdd6c1662d3dd7 (diff)
downloadrspamd-a897c86cfa6c3b78d29f0ab8a5f000ab61e1a422.tar.gz
rspamd-a897c86cfa6c3b78d29f0ab8a5f000ab61e1a422.zip
[Feature] Implement rspamdgrep tool
Diffstat (limited to 'contrib')
-rw-r--r--contrib/rspamdgrep/rspamdgrep.lua85
-rwxr-xr-xcontrib/rspamdgrep/rspamdgrep.sh11
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