mirror of
https://github.com/MailScanner/v5.git
synced 2024-11-10 17:35:06 +08:00
Adds DrWeb virus scanner to MailScanner (#228)
This commit is contained in:
parent
5083b4e0f0
commit
4367b27ff7
4 changed files with 86 additions and 0 deletions
|
@ -684,6 +684,7 @@ Virus Scanning = yes
|
||||||
# avg from www.grisoft.com
|
# avg from www.grisoft.com
|
||||||
# generic Other virus scanner: edit the generic-wrapper and generic-autoupdate
|
# generic Other virus scanner: edit the generic-wrapper and generic-autoupdate
|
||||||
# to fit your own needs. The output spec is in generic-wrapper, or
|
# to fit your own needs. The output spec is in generic-wrapper, or
|
||||||
|
# drweb from www.drweb.com (note: this is a commercial scanner)
|
||||||
# none No virus scanning at all.
|
# none No virus scanning at all.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
|
@ -28,3 +28,4 @@ generic /usr/lib/MailScanner/wrapper/generic-wrapper /dev/null
|
||||||
sophos /usr/lib/MailScanner/wrapper/sophos-wrapper /opt/sophos-av
|
sophos /usr/lib/MailScanner/wrapper/sophos-wrapper /opt/sophos-av
|
||||||
sophossavi /bin/false /tmp
|
sophossavi /bin/false /tmp
|
||||||
none /bin/false /dev/null
|
none /bin/false /dev/null
|
||||||
|
drweb /usr/lib/MailScanner/wrapper/drweb-wrapper /usr/bin
|
35
common/usr/lib/MailScanner/wrapper/drweb-wrapper
Normal file
35
common/usr/lib/MailScanner/wrapper/drweb-wrapper
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# DrWeb wrapper
|
||||||
|
# 2003-11-13 Konrad Madej <kmadej@nask.pl>
|
||||||
|
# 2018-09-28 Alan Urquhart <alan@asuweb.co.uk> - Modified for MailScanner v5
|
||||||
|
#
|
||||||
|
|
||||||
|
PackageDir=$1
|
||||||
|
shift
|
||||||
|
prog=drweb-ctl
|
||||||
|
|
||||||
|
if [ "x$1" = "x-IsItInstalled" ]; then
|
||||||
|
[ -x ${PackageDir}/$prog ] && exit 0
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove last arg (subdir) from options
|
||||||
|
for i in $@
|
||||||
|
do
|
||||||
|
if [ -n "$last" ]
|
||||||
|
then
|
||||||
|
if [ -n "$opts" ]
|
||||||
|
then
|
||||||
|
opts="$opts $last"
|
||||||
|
else
|
||||||
|
opts="$last"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
last=$i
|
||||||
|
done
|
||||||
|
subdir=$last
|
||||||
|
|
||||||
|
echo exec $PackageDir/$prog $opts scan "$subdir"
|
||||||
|
exec $PackageDir/$prog $opts scan "$subdir"
|
|
@ -206,6 +206,17 @@ my %Scanners = (
|
||||||
SupportScanning => $S_SUPPORTED,
|
SupportScanning => $S_SUPPORTED,
|
||||||
SupportDisinfect => $S_SUPPORTED,
|
SupportDisinfect => $S_SUPPORTED,
|
||||||
},
|
},
|
||||||
|
"drweb" => {
|
||||||
|
Name => 'DrWeb',
|
||||||
|
Lock => 'drwebBusy.lock',
|
||||||
|
CommonOptions => '',
|
||||||
|
DisinfectOptions => '-cu',
|
||||||
|
ScanOptions => '',
|
||||||
|
InitParser => \&InitDrwebParser,
|
||||||
|
ProcessOutput => \&ProcessDrwebOutput,
|
||||||
|
SupportScanning => $S_SUPPORTED,
|
||||||
|
SupportDisinfect => $S_NONE,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
# Initialise the Sophos SAVI library if we are using it.
|
# Initialise the Sophos SAVI library if we are using it.
|
||||||
|
@ -1161,6 +1172,11 @@ sub InitEsetsParser {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Initialise any state variables the DrWeb output parser uses
|
||||||
|
sub InitDrwebParser {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
# These functions must be called with, in order:
|
# These functions must be called with, in order:
|
||||||
# * The line of output from the scanner
|
# * The line of output from the scanner
|
||||||
# * The MessageBatch object the reports are written to
|
# * The MessageBatch object the reports are written to
|
||||||
|
@ -1882,6 +1898,39 @@ sub ProcessEsetsOutput {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Parse the output of the DrWeb output.
|
||||||
|
# Konrad Madej <kmadej@nask.pl>
|
||||||
|
# Modified 2018-09-28 - Alan Urquhart <alan@asuweb.co.uk>
|
||||||
|
sub ProcessDrwebOutput {
|
||||||
|
my($line, $infections, $types, $BaseDir, $Name) = @_;
|
||||||
|
my $report;
|
||||||
|
chomp $line;
|
||||||
|
return 0 unless $line =~ /^(.+)\s+infected\s+with\s+(.*)$/i;
|
||||||
|
my ($file, $virus) = ($1, $2);
|
||||||
|
my $logout = $line;
|
||||||
|
$logout =~ s/\s{20,}/ /g;
|
||||||
|
# Sample output:
|
||||||
|
#
|
||||||
|
# /var/spool/MailScanner/incoming/19551/1/neicar.com - infected with EICAR Test File (NOT a Virus!)
|
||||||
|
# Remove path elements before /./, // if any and
|
||||||
|
# , >, $BaseDir leaving just id/part/rest
|
||||||
|
$file =~ s/\/\.\//\//g;
|
||||||
|
$file =~ s/\/\//\//g;
|
||||||
|
$file =~ s/^>+//g;
|
||||||
|
$file =~ s/^$BaseDir//;
|
||||||
|
$file =~ s/^\///g;
|
||||||
|
my($id, $part, @rest) = split(/\//, $file);
|
||||||
|
#Removed trailing "-" which causes MailScanner to print empty string
|
||||||
|
$part = substr $part,0,-2;
|
||||||
|
my $notype = substr($part,1);
|
||||||
|
$logout =~ s/\Q$part\E/$notype/;
|
||||||
|
$report = $Name . ': ' if $Name;
|
||||||
|
$infections->{"$id"}{"$part"} .= "$report$notype was infected by $virus" . "\n";
|
||||||
|
$types->{"$id"}{"$part"} .= "v"; # it's a real virus
|
||||||
|
MailScanner::Log::InfoLog("DrWeb::INFECTED::$virus");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
# Generate a list of all the virus scanners that are installed. It may
|
# Generate a list of all the virus scanners that are installed. It may
|
||||||
# include extras that are not installed in the case where there are
|
# include extras that are not installed in the case where there are
|
||||||
# scanners whose name includes a version number and we could not tell
|
# scanners whose name includes a version number and we could not tell
|
||||||
|
|
Loading…
Reference in a new issue