最初に述べておきますが、clamd は正しく応答することが証明されています。
$ echo PING | nc -U /var/run/clamav/clamd.sock
PONG
スキャナーは次のようにセットアップされました。
#set up a Clamav scanner
use File::VirusScan;
use File::VirusScan::ResultSet;
my $scanner = File::VirusScan->new({
engines => {
'-Daemon::ClamAV::Clamd' => {
socket_name => '/var/run/clamav/clamd.sock',
},
},
});
スクリプト全体が Solaris 11 ボックスで正常に動作します。Linux CentOS 5.3 (Final) でこれを実行しています。CPAN から File::VirusScan をインストールする際に問題がありました。最新バージョン 0.102 はコンパイルされず、CPAN テスターは 435 が 437 から失敗したため、これを確認しているようです。 CPANから以前の0.101バージョンをダウンロードしました.Solarisでも実行しているバージョンで、手動でインストールしたようです.
perl -v
This is perl, v5.8.8 built for x86_64-linux-thread-multi
sub scanner {
$|++; # buffer disabled
(my $path, my $logClean) = @_;
my $recurse = 5;
print color "yellow";
print "[i] Building file scan queue - recurse deepth $recurse \n";
print color "green";
print "SCAN QUEUE:0";
#Get list of files
if( $rootPath){
use File::Find::Rule;
my $finder = File::Find::Rule->maxdepth($recurse)->file->relative->start("$$path");
while( my $file = $finder->match() ){
$|++;
#$file = substr($file,length($rootPath)); #remove path bloat
push(@scanList,"/$file");
print "\rSCAN QUEUE:" .scalar(@scanList); #update screen
}
}else{
push(@scanList,"$$path");
}
print "\rSCANING:0";
#set up a Clamav scanner
use File::VirusScan;
use File::VirusScan::ResultSet;
my $scanner = File::VirusScan->new({
engines => {
'-Daemon::ClamAV::Clamd' => {
socket_name => '/var/run/clamav/clamd.sock',
},
},
});
#scan each file
my $scanning = 0;
my $complete = -1;
foreach $scanFile (@scanList){
$scanning++;
##################################################
#scan this file
$results = $scanner->scan($rootPath.$scanFile);
##################################################
#array of hashes
my $centDone = int(($scanning/scalar(@scanList))*100);
if($centDone > $complete){
$complete = $centDone;
}
if($centDone < 100){
#\r to clear/update line
$format = "%-9s %-60s %-15s %-5s";
printf $format, ("\rSCANING:", substr($scanFile,-50), "$scanning/".scalar(@scanList), "$centDone%");
}else{
print "\rSCAN COMPLETE ";
}
# array ref
foreach $result (@$results) {
#array of pointers to hashes
#print 'data:'
#print 'state:'
if($$result{state} ne "clean"){
if($$result{data} =~ /^Clamd returned error: 2/){
$$result{data} = "File too big to scan";
}
push(@scanResults,[$scanFile,$$result{state},$$result{data}]); # results
}elsif($$logClean){
push(@scanResults,[$scanFile,$$result{state},$$result{data}]);
}
unless($$result{state} eq "clean"){
print color "red";
print "\r$scanFile,$$result{state},$$result{data}\n";
print color "green";
print "\rSCANING: $scanning/".scalar(@scanList)." : $centDone%";
if($$result{state} eq "virus"){
push(@scanVirus,scalar(@scanResults)-1); #scanResuts index of virus
}elsif($$result{state} eq "error"){
push(@scanError,scalar(@scanResults)-1); #scanResuts index of Error
}
}
}
} print "\n";
}