summaryrefslogtreecommitdiffstats
path: root/lualib/rspamadm
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-16 13:52:19 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-16 13:52:19 +0100
commit5dcb1d023ab0076baf936b868c41adb1543d01d3 (patch)
treefbad5731a807e6c78cc632cb9dc9eb639dc4fe06 /lualib/rspamadm
parent2f2d74470169bf74771ed7f896ea2683e2aa8dc6 (diff)
downloadrspamd-5dcb1d023ab0076baf936b868c41adb1543d01d3.tar.gz
rspamd-5dcb1d023ab0076baf936b868c41adb1543d01d3.zip
[Feature] Add rspamadm mime tool
Diffstat (limited to 'lualib/rspamadm')
-rw-r--r--lualib/rspamadm/mime.lua108
1 files changed, 108 insertions, 0 deletions
diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua
new file mode 100644
index 000000000..cf9276e81
--- /dev/null
+++ b/lualib/rspamadm/mime.lua
@@ -0,0 +1,108 @@
+--[[
+Copyright (c) 2018, Vsevolod Stakhov <vsevolod@highsecure.ru>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+]]--
+
+local argparse = require "argparse"
+local rspamd_util = require "rspamd_util"
+local rspamd_task = require "rspamd_task"
+local rspamd_logger = require "rspamd_logger"
+
+-- Define command line options
+local parser = argparse()
+ :name "rspamadm mime"
+ :description "Mime manipulations provided by Rspamd"
+ :help_description_margin(30)
+ :command_target("command")
+ :require_command(true)
+
+-- Generate subcommand
+local extract = parser:command "extract ex e"
+ :description "Extracts data from MIME messages"
+extract:argument "file"
+ :description "File to process"
+ :argname "<file>"
+ :args "1"
+
+extract:mutex(
+ extract:flag "-t --text"
+ :description "Extracts plain text data from a message",
+ extract:flag "-H --html"
+ :description "Extracts htm data from a message"
+)
+extract:option "-o --output"
+ :description "Output format ('raw', 'content', 'oneline', 'decoded', 'decoded_utf')"
+ :argname("<type>")
+ :convert {
+ raw = "raw",
+ content = "content",
+ oneline = "content_oneline",
+ decoded = "raw_parsed",
+ decoded_utf = "raw_utf"
+ }
+ :default "content"
+
+local function extract_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.text or opts.html then
+ local tp = task:get_text_parts() or {}
+
+ for _,part in ipairs(tp) do
+ local how = opts.output
+ if opts.text and not part:is_html() then
+ part:get_content(how):write()
+ io.write('\n')
+ elseif opts.html and part:is_html() then
+ part:get_content(how):write()
+ io.write('\n')
+ end
+ end
+ end
+
+ task:destroy() -- No automatic dtor
+end
+
+local function handler(args)
+ local opts = parser:parse(args)
+
+ local command = opts.command
+
+ if command == 'extract' then
+ extract_handler(opts)
+ else
+ parser:error('command %s is not implemented', command)
+ end
+end
+
+return {
+ name = 'mime',
+ aliases = {'mime_tool'},
+ handler = handler,
+ description = parser._description
+} \ No newline at end of file