diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-16 13:52:19 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-16 13:52:19 +0100 |
commit | 5dcb1d023ab0076baf936b868c41adb1543d01d3 (patch) | |
tree | fbad5731a807e6c78cc632cb9dc9eb639dc4fe06 /lualib/rspamadm | |
parent | 2f2d74470169bf74771ed7f896ea2683e2aa8dc6 (diff) | |
download | rspamd-5dcb1d023ab0076baf936b868c41adb1543d01d3.tar.gz rspamd-5dcb1d023ab0076baf936b868c41adb1543d01d3.zip |
[Feature] Add rspamadm mime tool
Diffstat (limited to 'lualib/rspamadm')
-rw-r--r-- | lualib/rspamadm/mime.lua | 108 |
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 |