]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Add preliminary mime stat command
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Jun 2018 13:19:10 +0000 (14:19 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Jun 2018 13:19:10 +0000 (14:19 +0100)
lualib/rspamadm/mime.lua

index cf9276e81385dd08f946d28db36b21c2bd7bc0a5..8fe345a7259059f46bcc5519333244cecebb02f4 100644 (file)
@@ -18,6 +18,7 @@ local argparse = require "argparse"
 local rspamd_util = require "rspamd_util"
 local rspamd_task = require "rspamd_task"
 local rspamd_logger = require "rspamd_logger"
+local lua_meta = require "lua_meta"
 
 -- Define command line options
 local parser = argparse()
@@ -27,7 +28,7 @@ local parser = argparse()
     :command_target("command")
     :require_command(true)
 
--- Generate subcommand
+-- Extract subcommand
 local extract = parser:command "extract ex e"
                       :description "Extracts data from MIME messages"
 extract:argument "file"
@@ -53,6 +54,21 @@ extract:option "-o --output"
        }
        :default "content"
 
+local stat = parser:command "stat st s"
+                      :description "Extracts statistical data from MIME messages"
+stat:argument "file"
+       :description "File to process"
+       :argname "<file>"
+       :args "1"
+stat:mutex(
+    stat:flag "-m --meta"
+        :description "Lua metatokens",
+    stat:flag "-b --bayes"
+        :description "Bayes tokens",
+    stat:flag "-F --fuzzy"
+        :description "Fuzzy hashes"
+)
+
 local function extract_handler(opts)
   if not opts.file then
     parser:error('no file specified')
@@ -88,6 +104,33 @@ local function extract_handler(opts)
   task:destroy() -- No automatic dtor
 end
 
+local function stat_handler(opts)
+  if not opts.file then
+    parser:error('no file specified')
+  end
+
+  local res,task = rspamd_task.load_from_file(opts.file)
+
+  if not res then
+    parser:error(string.format('cannot read message from %s: %s', opts.file,
+        task))
+  end
+
+  if not task:process_message() then
+    parser:error(string.format('cannot read message from %s: %s', opts.file,
+        'failed to parse'))
+  end
+
+  if opts.meta then
+    local mt = lua_meta.gen_metatokens_table(task)
+    for k,v in pairs(mt) do
+      rspamd_logger.messagex('%s = %s', k, v)
+    end
+  end
+
+  task:destroy() -- No automatic dtor
+end
+
 local function handler(args)
   local opts = parser:parse(args)
 
@@ -95,6 +138,8 @@ local function handler(args)
 
   if command == 'extract' then
     extract_handler(opts)
+  elseif command == 'stat' then
+    stat_handler(opts)
   else
     parser:error('command %s is not implemented', command)
   end