local rspamd_logger = require "rspamd_logger"
local common = require "lua_scanners/common"
-local N = "clamav"
+local module_name = "clamav"
local default_message = '${SCANNER}: virus found: "${VIRUS}"'
local function clamav_config(opts)
local clamav_conf = {
- scan_mime_parts = true;
- scan_text_mime = false;
- scan_image_mime = false;
+ module_name = module_name,
+ scan_mime_parts = true,
+ scan_text_mime = false,
+ scan_image_mime = false,
default_port = 3310,
log_clean = false,
timeout = 5.0, -- FIXME: this will break task_timeout!
clamav_conf.prefix = 'rs_cl'
end
+ if not clamav_conf.log_prefix then
+ if clamav_conf.name:lower() == clamav_conf.type:lower() then
+ clamav_conf.log_prefix = clamav_conf.name
+ else
+ clamav_conf.log_prefix = clamav_conf.name .. ' (' .. clamav_conf.type .. ')'
+ end
+ end
+
if not clamav_conf['servers'] then
rspamd_logger.errx(rspamd_config, 'no servers defined')
clamav_conf.default_port)
if clamav_conf['upstreams'] then
- lua_util.add_debug_alias('antivirus', N)
+ lua_util.add_debug_alias('antivirus', clamav_conf.module_name)
return clamav_conf
end
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
+ lua_util.debugm(rule.module_name, task, '%s: retry IP: %s', rule.log_prefix, addr)
tcp.request({
task = task,
stop_pattern = '\0'
})
else
- rspamd_logger.errx(task, '%s [%s]: failed to scan, maximum retransmits exceed', rule['symbol'], rule['type'])
+ rspamd_logger.errx(task, '%s: failed to scan, maximum retransmits exceed', rule.log_prefix)
task:insert_result(rule['symbol_fail'], 0.0, 'failed to scan and retransmits exceed')
end
upstream:ok()
data = tostring(data)
local cached
- lua_util.debugm(N, task, '%s [%s]: got reply: %s', rule['symbol'], rule['type'], data)
+ lua_util.debugm(rule.module_name, task, '%s: got reply: %s', rule.log_prefix, data)
if data == 'stream: OK' then
cached = 'OK'
if rule['log_clean'] then
- rspamd_logger.infox(task, '%s [%s]: message or mime_part is clean', rule['symbol'], rule['type'])
+ rspamd_logger.infox(task, '%s: message or mime_part is clean', rule.log_prefix)
else
- lua_util.debugm(N, task, '%s [%s]: message or mime_part is clean', rule['symbol'], rule['type'])
+ lua_util.debugm(rule.module_name, task, '%s: message or mime_part is clean', rule.log_prefix)
end
else
local vname = string.match(data, 'stream: (.+) FOUND')
if vname then
- common.yield_result(task, rule, vname, N)
+ common.yield_result(task, rule, vname)
cached = vname
else
- rspamd_logger.errx(task, 'unhandled response: %s', data)
+ rspamd_logger.errx(task, '%s: unhandled response: %s', rule.log_prefix, data)
task:insert_result(rule['symbol_fail'], 0.0, 'unhandled response')
end
end
if cached then
- common.save_av_cache(task, digest, rule, cached, N)
+ common.save_av_cache(task, digest, rule, cached)
end
end
end
})
end
- if common.need_av_check(task, content, rule, N) then
- if common.check_av_cache(task, digest, rule, clamav_check_uncached, N) then
+ if common.need_av_check(task, content, rule) then
+ if common.check_av_cache(task, digest, rule, clamav_check_uncached) then
return
else
clamav_check_uncached()
description = 'clamav antivirus',
configure = clamav_config,
check = clamav_check,
- name = 'clamav'
-}
\ No newline at end of file
+ name = module_name
+}
local common = require "lua_scanners/common"
local fun = require "fun"
-local N = 'dcc'
+local module_name = 'dcc'
local function dcc_check(task, content, _, rule)
local function dcc_check_uncached ()
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task, '%s: retry IP: %s', rule.log_prefix, addr)
+ lua_util.debugm(rule.module_name, task, '%s: retry IP: %s', rule.log_prefix, addr)
tcp.request({
task = task,
-- Parse the response
if upstream then upstream:ok() end
local _,_,result,disposition,header = tostring(data):find("(.-)\n(.-)\n(.-)\n")
- lua_util.debugm(N, task, 'DCC result=%1 disposition=%2 header="%3"',
+ lua_util.debugm(rule.module_name, task, 'DCC result=%1 disposition=%2 header="%3"',
result, disposition, header)
if header then
rspamd_logger.infox(task, '%s: clean, returned result A - info: %s',
rule.log_prefix, info)
else
- lua_util.debugm(N, task, '%s: returned result A - info: %s',
+ lua_util.debugm(rule.module_name, task, '%s: returned result A - info: %s',
rule.log_prefix, info)
local opts = {}
if rule.log_clean then
rspamd_logger.infox(task, '%s: clean, returned result S - info: %s', rule.log_prefix, info)
else
- lua_util.debugm(N, task, '%s: returned result S - info: %s', rule.log_prefix, info)
+ lua_util.debugm(rule.module_name, task, '%s: returned result S - info: %s', rule.log_prefix, info)
end
else
-- Unknown result
- rspamd_logger.warnx(task, 'DCC result error: %1', result);
+ rspamd_logger.warnx(task, '%s: result error: %1', rule.log_prefix, result);
task:insert_result(rule.symbol_fail,
0.0,
'error: ' .. result)
callback = dcc_callback
})
end
- if common.need_av_check(task, content, rule, N) then
+ if common.need_av_check(task, content, rule) then
dcc_check_uncached()
end
end
local function dcc_config(opts)
local dcc_conf = {
+ module_name = module_name,
default_port = 10045,
timeout = 5.0,
log_clean = false,
dcc_conf = lua_util.override_defaults(dcc_conf, opts)
if not dcc_conf.log_prefix then
- dcc_conf.log_prefix = N
+ if dcc_conf.name:lower() == dcc_conf.type:lower() then
+ dcc_conf.log_prefix = dcc_conf.name
+ else
+ dcc_conf.log_prefix = dcc_conf.name .. ' (' .. dcc_conf.type .. ')'
+ end
end
if not dcc_conf.servers and dcc_conf.socket then
dcc_conf.default_port)
if dcc_conf.upstreams then
- lua_util.add_debug_alias('external_services', N)
+ lua_util.add_debug_alias('external_services', dcc_conf.module_name)
return dcc_conf
end
description = 'dcc bulk scanner',
configure = dcc_config,
check = dcc_check,
- name = 'dcc'
-}
\ No newline at end of file
+ name = module_name
+}
local rspamd_logger = require "rspamd_logger"
local common = require "lua_scanners/common"
-local N = "fprot"
+local module_name = "fprot"
local default_message = '${SCANNER}: virus found: "${VIRUS}"'
local function fprot_config(opts)
local fprot_conf = {
- scan_mime_parts = true;
- scan_text_mime = false;
- scan_image_mime = false;
+ module_name = module_name,
+ scan_mime_parts = true,
+ scan_text_mime = false,
+ scan_image_mime = false,
default_port = 10200,
timeout = 5.0, -- FIXME: this will break task_timeout!
log_clean = false,
fprot_conf.prefix = 'rs_fp'
end
+ if not fprot_conf.log_prefix then
+ if fprot_conf.name:lower() == fprot_conf.type:lower() then
+ fprot_conf.log_prefix = fprot_conf.name
+ else
+ fprot_conf.log_prefix = fprot_conf.name .. ' (' .. fprot_conf.type .. ')'
+ end
+ end
+
if not fprot_conf['servers'] then
rspamd_logger.errx(rspamd_config, 'no servers defined')
fprot_conf.default_port)
if fprot_conf['upstreams'] then
- lua_util.add_debug_alias('antivirus', N)
+ lua_util.add_debug_alias('antivirus', fprot_conf.module_name)
return fprot_conf
end
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
+ lua_util.debugm(rule.module_name, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
tcp.request({
task = task,
if not vname then
rspamd_logger.errx(task, 'Unhandled response: %s', data)
else
- common.yield_result(task, rule, vname, N)
+ common.yield_result(task, rule, vname)
cached = vname
end
end
if cached then
- common.save_av_cache(task, digest, rule, cached, N)
+ common.save_av_cache(task, digest, rule, cached)
end
end
end
})
end
- if common.need_av_check(task, content, rule, N) then
- if common.check_av_cache(task, digest, rule, fprot_check_uncached, N) then
+ if common.need_av_check(task, content, rule) then
+ if common.check_av_cache(task, digest, rule, fprot_check_uncached) then
return
else
fprot_check_uncached()
description = 'fprot antivirus',
configure = fprot_config,
check = fprot_check,
- name = 'fprot'
-}
\ No newline at end of file
+ name = module_name
+}
local rspamd_logger = require "rspamd_logger"
local common = require "lua_scanners/common"
-local N = "kaspersky"
+local module_name = "kaspersky"
local default_message = '${SCANNER}: virus found: "${VIRUS}"'
local function kaspersky_config(opts)
local kaspersky_conf = {
- scan_mime_parts = true;
- scan_text_mime = false;
- scan_image_mime = false;
+ module_name = module_name,
+ scan_mime_parts = true,
+ scan_text_mime = false,
+ scan_image_mime = false,
product_id = 0,
log_clean = false,
timeout = 5.0,
kaspersky_conf = lua_util.override_defaults(kaspersky_conf, opts)
+ if not kaspersky_conf.log_prefix then
+ if kaspersky_conf.name:lower() == kaspersky_conf.type:lower() then
+ kaspersky_conf.log_prefix = kaspersky_conf.name
+ else
+ kaspersky_conf.log_prefix = kaspersky_conf.name .. ' (' .. kaspersky_conf.type .. ')'
+ end
+ end
+
if not kaspersky_conf['servers'] then
rspamd_logger.errx(rspamd_config, 'no servers defined')
kaspersky_conf['servers'], 0)
if kaspersky_conf['upstreams'] then
- lua_util.add_debug_alias('antivirus', N)
+ lua_util.add_debug_alias('antivirus', kaspersky_conf.module_name)
return kaspersky_conf
end
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task,
+ lua_util.debugm(rule.module_name, task,
'%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
tcp.request({
upstream:ok()
data = tostring(data)
local cached
- lua_util.debugm(N, task, '%s [%s]: got reply: %s',
+ lua_util.debugm(rule.module_name, task, '%s [%s]: got reply: %s',
rule['symbol'], rule['type'], data)
if data == 'stream: OK' then
cached = 'OK'
rspamd_logger.infox(task, '%s [%s]: message or mime_part is clean',
rule['symbol'], rule['type'])
else
- lua_util.debugm(N, task, '%s [%s]: message or mime_part is clean',
+ lua_util.debugm(rule.module_name, task, '%s [%s]: message or mime_part is clean',
rule['symbol'], rule['type'])
end
else
local vname = string.match(data, ': (.+) FOUND')
if vname then
- common.yield_result(task, rule, vname, N)
+ common.yield_result(task, rule, vname)
cached = vname
else
rspamd_logger.errx(task, 'unhandled response: %s', data)
end
end
if cached then
- common.save_av_cache(task, digest, rule, cached, N)
+ common.save_av_cache(task, digest, rule, cached)
end
end
end
})
end
- if common.need_av_check(task, content, rule, N) then
- if common.check_av_cache(task, digest, rule, kaspersky_check_uncached, N) then
+ if common.need_av_check(task, content, rule) then
+ if common.check_av_cache(task, digest, rule, kaspersky_check_uncached) then
return
else
kaspersky_check_uncached()
description = 'kaspersky antivirus',
configure = kaspersky_config,
check = kaspersky_check,
- name = 'kaspersky'
-}
\ No newline at end of file
+ name = module_name
+}
local rspamd_logger = require "rspamd_logger"
local common = require "lua_scanners/common"
-local N = "savapi"
+local module_name = "savapi"
local default_message = '${SCANNER}: virus found: "${VIRUS}"'
local function savapi_config(opts)
local savapi_conf = {
- scan_mime_parts = true;
- scan_text_mime = false;
- scan_image_mime = false;
+ module_name = module_name,
+ scan_mime_parts = true,
+ scan_text_mime = false,
+ scan_image_mime = false,
default_port = 4444, -- note: You must set ListenAddress in savapi.conf
product_id = 0,
log_clean = false,
savapi_conf.prefix = 'rs_ap'
end
+ if not savapi_conf.log_prefix then
+ if savapi_conf.name:lower() == savapi_conf.type:lower() then
+ savapi_conf.log_prefix = savapi_conf.name
+ else
+ savapi_conf.log_prefix = savapi_conf.name .. ' (' .. savapi_conf.type .. ')'
+ end
+ end
+
if not savapi_conf['servers'] then
rspamd_logger.errx(rspamd_config, 'no servers defined')
savapi_conf.default_port)
if savapi_conf['upstreams'] then
- lua_util.add_debug_alias('antivirus', N)
+ lua_util.add_debug_alias('antivirus', savapi_conf.module_name)
return savapi_conf
end
for virus,_ in pairs(vnames) do
table.insert(vnames_reordered, virus)
end
- lua_util.debugm(N, task, "%s: number of virus names found %s", rule['type'], #vnames_reordered)
+ lua_util.debugm(rule.module_name, task, "%s: number of virus names found %s", rule['type'], #vnames_reordered)
if #vnames_reordered > 0 then
local vname = {}
for _,virus in ipairs(vnames_reordered) do
table.insert(vname, virus)
end
- common.yield_result(task, rule, vname, N)
- common.save_av_cache(task, digest, rule, vname, N)
+ common.yield_result(task, rule, vname)
+ common.save_av_cache(task, digest, rule, vname)
end
if conn then
conn:close()
local function savapi_scan2_cb(err, data, conn)
local result = tostring(data)
- lua_util.debugm(N, task, "%s: got reply: %s",
+ lua_util.debugm(rule.module_name, task, "%s: got reply: %s",
rule['type'], result)
-- Terminal response - clean
if rule['log_clean'] then
rspamd_logger.infox(task, '%s: message or mime_part is clean', rule['type'])
end
- common.save_av_cache(task, digest, rule, 'OK', N)
+ common.save_av_cache(task, digest, rule, 'OK')
conn:add_write(savapi_fin_cb, 'QUIT\n')
-- Terminal response - infected
local function savapi_greet2_cb(err, data, conn)
local result = tostring(data)
if string.find(result, '100 PRODUCT') then
- lua_util.debugm(N, task, "%s: scanning file: %s",
+ lua_util.debugm(rule.module_name, task, "%s: scanning file: %s",
rule['type'], fname)
conn:add_write(savapi_scan1_cb, {string.format('SCAN %s\n',
fname)})
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
+ lua_util.debugm(rule.module_name, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
tcp.request({
task = task,
})
end
- if common.need_av_check(task, content, rule, N) then
- if common.check_av_cache(task, digest, rule, savapi_check_uncached, N) then
+ if common.need_av_check(task, content, rule) then
+ if common.check_av_cache(task, digest, rule, savapi_check_uncached) then
return
else
savapi_check_uncached()
description = 'savapi avira antivirus',
configure = savapi_config,
check = savapi_check,
- name = 'savapi'
-}
\ No newline at end of file
+ name = module_name
+}
local rspamd_logger = require "rspamd_logger"
local common = require "lua_scanners/common"
-local N = "sophos"
+local module_name = "sophos"
local default_message = '${SCANNER}: virus found: "${VIRUS}"'
local function sophos_config(opts)
local sophos_conf = {
- scan_mime_parts = true;
- scan_text_mime = false;
- scan_image_mime = false;
+ module_name = module_name,
+ scan_mime_parts = true,
+ scan_text_mime = false,
+ scan_image_mime = false,
default_port = 4010,
timeout = 15.0,
log_clean = false,
sophos_conf.prefix = 'rs_sp'
end
+ if not sophos_conf.log_prefix then
+ if sophos_conf.name:lower() == sophos_conf.type:lower() then
+ sophos_conf.log_prefix = sophos_conf.name
+ else
+ sophos_conf.log_prefix = sophos_conf.name .. ' (' .. sophos_conf.type .. ')'
+ end
+ end
+
if not sophos_conf['servers'] then
rspamd_logger.errx(rspamd_config, 'no servers defined')
sophos_conf.default_port)
if sophos_conf['upstreams'] then
- lua_util.add_debug_alias('antivirus', N)
+ lua_util.add_debug_alias('antivirus', sophos_conf.module_name)
return sophos_conf
end
upstream = rule.upstreams:get_upstream_round_robin()
addr = upstream:get_addr()
- lua_util.debugm(N, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
+ lua_util.debugm(rule.module_name, task, '%s [%s]: retry IP: %s', rule['symbol'], rule['type'], addr)
tcp.request({
task = task,
else
upstream:ok()
data = tostring(data)
- lua_util.debugm(N, task, '%s [%s]: got reply: %s', rule['symbol'], rule['type'], data)
+ lua_util.debugm(rule.module_name, task, '%s [%s]: got reply: %s', rule['symbol'], rule['type'], data)
local vname = string.match(data, 'VIRUS (%S+) ')
if vname then
- common.yield_result(task, rule, vname, N)
- common.save_av_cache(task, digest, rule, vname, N)
+ common.yield_result(task, rule, vname)
+ common.save_av_cache(task, digest, rule, vname)
else
if string.find(data, 'DONE OK') then
if rule['log_clean'] then
rspamd_logger.infox(task, '%s [%s]: message or mime_part is clean', rule['symbol'], rule['type'])
else
- lua_util.debugm(N, task, '%s [%s]: message or mime_part is clean', rule['symbol'], rule['type'])
+ lua_util.debugm(rule.module_name, task, '%s [%s]: message or mime_part is clean', rule['symbol'], rule['type'])
end
- common.save_av_cache(task, digest, rule, 'OK', N)
+ common.save_av_cache(task, digest, rule, 'OK')
-- not finished - continue
elseif string.find(data, 'ACC') or string.find(data, 'OK SSSP') then
conn:add_read(sophos_callback)
elseif string.find(data, 'FAIL 0212') then
rspamd_logger.infox(task, 'Message is ENCRYPTED (0212 SOPHOS_SAVI_ERROR_FILE_ENCRYPTED): %s', data)
if rule['savdi_report_encrypted'] then
- common.yield_result(task, rule, "SAVDI_FILE_ENCRYPTED", N)
- common.save_av_cache(task, digest, rule, "SAVDI_FILE_ENCRYPTED", N)
+ common.yield_result(task, rule, "SAVDI_FILE_ENCRYPTED")
+ common.save_av_cache(task, digest, rule, "SAVDI_FILE_ENCRYPTED")
end
-- set pseudo virus if configured, else set fail since part was not scanned
elseif string.find(data, 'REJ 4') then
if rule['savdi_report_oversize'] then
rspamd_logger.infox(task, 'SAVDI: Message is OVERSIZED (SSSP reject code 4): %s', data)
- common.yield_result(task, rule, "SAVDI_FILE_OVERSIZED", N)
- common.save_av_cache(task, digest, rule, "SAVDI_FILE_OVERSIZED", N)
+ common.yield_result(task, rule, "SAVDI_FILE_OVERSIZED")
+ common.save_av_cache(task, digest, rule, "SAVDI_FILE_OVERSIZED")
else
rspamd_logger.errx(task, 'SAVDI: Message is OVERSIZED (SSSP reject code 4): %s', data)
task:insert_result(rule['symbol_fail'], 0.0, 'Message is OVERSIZED (SSSP reject code 4):' .. data)
})
end
- if common.need_av_check(task, content, rule, N) then
- if common.check_av_cache(task, digest, rule, sophos_check_uncached, N) then
+ if common.need_av_check(task, content, rule) then
+ if common.check_av_cache(task, digest, rule, sophos_check_uncached) then
return
else
sophos_check_uncached()
description = 'sophos antivirus',
configure = sophos_config,
check = sophos_check,
- name = 'sophos'
-}
\ No newline at end of file
+ name = module_name
+}
for k, m in pairs(opts) do
if type(m) == 'table' and m.servers then
if not m.type then m.type = k end
+ if not m.name then m.name = k end
local cb = add_antivirus_rule(k, m)
if not cb then
for k, m in pairs(opts) do
if type(m) == 'table' and m.servers then
if not m.type then m.type = k end
+ if not m.name then m.name = k end
local cb = add_scanner_rule(k, m)
if not cb then