Chris,

Very good your answer. Thank you very very much.

Do you use FreeBSD, too?

If so, did you upgrade Perl to 5.8?
Amavisd-new is still in version 20020517 in FreeBSD
ports tree.
I've tried to install Amavisd-20021116 but I didn't
get to make it work yet because the incompatibility
of some perl requiments.

Thank's once more
Ronan

On Fri, 29 Nov 2002 18:42:58 +0000
Chris Hastie <[EMAIL PROTECTED]> wrote:

> On Fri, 29 Nov 2002, Tomasz Kojm <[EMAIL PROTECTED]> wrote
> >On Thu, Nov 28, 2002 at 04:00:08PM -0500, Ed Phillips wrote:
> >>
> >> How would you make it better?  clamd seems to work pretty well for us
> >> scanning more than 100,000 messages per day.  It hasn't crashed or
> >> anything... been running perfectly for a couple of weeks under this load.
> >
> >
> >Currently clamd works like a champ under Linux and Solaris. Amavisd-new
> >installation process (with clamscan and clamd) has been described by
> >Chris Hastie few days ago:
> >
> >http://archive.elektrapro.com/clamav.elektrapro.com/users/2002/11/msg00105.html
> >
> 
> This refers to amavisd-new-20021116. I did post something to the amavis
> list about using clamd with 20020517, which you should be able to find
> on marc.
> 
> Basically, I had the code below in my virus_scan() routine. It was then
> necessary to set ONE of $clamd_sockname (set to path to unix socket),
> $clamd (set to anything you like - will use INET socket), OR $clamscan
> (path to clamscan - uses clamscan), depending on your preference. Only
> set a value for ONE of these!!!
> 
> You'll note that because of the experimental nature of clamd I've
> included a fallback here, so that if clamd fails, scanning falls back to
> clamscan. This works with the UNIX socket code - I seem to remember
> someone saying it didn't work with the INET stuff. I'm not sure I ever
> tested that!
> 
> This code is a hack of existing bits of code and I take no
> responsibility for it!! In particular, be aware that there is stuff in
> the UNIX socket code that I don't understand :) But it did work on my
> system until I moved to 20021116.
> 
> #
> # ClamAV Daemon - unix socket
> #
> my $clamscan_fallback;
> if ($clamd_sockname) {
>     do_log(2,"Using Clamd - unix socket");
>     if ($child_task_count == 1) {
>         unless (socket(\*clamd_sock, AF_UNIX, SOCK_STREAM, 0)) {
>             do_log(0, "Can't create socket for Clamd: $!");
>             do_log(0, "    -> try clamscan");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>             goto CLAMDEND;
>         }
>         unless (connect(\*clamd_sock, pack_sockaddr_un $clamd_sockname)) {
>             do_log (0, "Can't connect to Clamd: $!");
>             do_log(0, "    -> try clamscan");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>             goto CLAMDEND;
>         }
>     }
>     my($chkdir) = "SCAN $TEMPDIR/parts/\n";
> 
>     $SIG{PIPE} = 'IGNORE';  # 'send' to broken pipe throws a signal
>     my($retries) = 0;
>     for (;;) {  # gracefully handle cases when Sophie child times out
>         do_log(2, "Sending directory name to Clamd: $TEMPDIR/parts/");
>         while (!defined(syswrite(\*clamd_sock, $chkdir, length($chkdir)))) {
>             my($err) = "$!"; my($errn) = 0+$!;
>             $retries++;
>             if ($errn != EPIPE && $errn != ENOTCONN) {
>                 do_log(0, "syswrite to Clamd socket failed: $err");
>                 do_log(0, "    -> try clamscan");
>                 $clamscan_fallback = "/usr/local/bin/clamscan";
>                 goto CLAMDEND;
>             } else {
>                 if ($retries > 2) { die "Too many retries to talk to Clamd" }
>                 if ($err =~ /^Broken pipe/i) {  # slow down a runaway loop
>                     sleep(10 * ($retries-1))  if $retries > 1;
>                 }
>                 do_log( ($retries>1?0:1),
>                         "Re-connecting to Clamd, attempt #$retries");
>                 close(\*clamd_sock);  # and ignore status
>                 unless (socket(\*clamd_sock, AF_UNIX, SOCK_STREAM, 0)) {
>                     do_log(0, "Can't create socket for Clamd: $!");
>                     do_log(0, "    -> try clamscan");
>                     $clamscan_fallback = "/usr/local/bin/clamscan";
>                     goto CLAMDEND;
>                 }
>                 unless (connect(\*clamd_sock, pack_sockaddr_un $clamd_sockname)) {
>                     do_log (0, "Can't connect to Clamd: $!");
>                     do_log(0, "    -> try clamscan");
>                     $clamscan_fallback = "/usr/local/bin/clamscan";
>                     goto CLAMDEND;
>                 }
>             }
>         }
>         unless (defined(sysread(\*clamd_sock, $output, 256))){
>             do_log(0, "sysread from Clamd socket failed: $!");
>             do_log(0, "    -> try clamscan");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>             goto CLAMDEND;
>         }
>         last  if $output ne '';
>         do_log( ($retries>1?0:1),
>                "Failed to get response from Clamd, retrying ($retries)");
>         sleep 10;
>     }
> 
>         if ($output =~ /FOUND$/) {              # no errors, a virus was found
>             $scanner_errors = 0;
>             @virusname = ($output =~ /: (.+) FOUND/g);
>             return 1;  # 'true' indicates virus found and stops further checking
>         } elsif ($output =~ /OK$/) {            # no errors, no viruses
>             $scanner_errors = 0;
>         } elsif ($output =~ /ERROR$/) {
>             do_log(0,"Virus scanner failure: Clamd - UNKNOWN STATUS (error code: 
> $output)");
>             do_log(0, "    -> try clamscan");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>         } else {
>             do_log(0,"Virus scanner failure: Clamd - UNKNOWN STATUS (error code: 
> $output)");
>             do_log(0, "    -> try clamscan");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>         }
> 
> CLAMDEND:
> }
> 
> 
> 
> #
> # ClamAV Daemon
> #
> # use IO::Socket;
> 
> if ($clamd) {
>     do_log(2,"Using clamd");
>     my $sock = IO::Socket::INET->new('127.0.0.1:3310');
> #    my $sock = IO::Socket::UNIX->new('/var/clamav/clamd');
>     if (defined $sock) {
>         $sock->print("SCAN $TEMPDIR/parts\n");
>         $sock->flush;
>         chomp($output = $sock->getline);
>         $sock->close;
>         do_log(2,$output);
>         if ($output =~ /FOUND$/) {              # no errors, a virus was found
>             $scanner_errors = 0;
>             @virusname = ($output =~ /: (.+) FOUND/g);
>             return 1;  # 'true' indicates virus found and stops further checking
>         } elsif ($output =~ /OK$/) {            # no errors, no viruses
>             $scanner_errors = 0;
>         } elsif ($output =~ /ERROR$/) {
>             do_log(0,"Virus scanner failure: ScannerDaemon - UNKNOWN STATUS (error 
> code: $output)  ->Try clamav");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>         } else {
>             do_log(0,"Virus scanner failure: Clamd - unknown response '$output'  
> ->Try clamav");
>             $clamscan_fallback = "/usr/local/bin/clamscan";
>         }
>     } else {
>         do_log(0,"Virus scanner failure: Clamd - can't connect to daemon  ->Try 
> clamav");
>         $clamscan_fallback = "/usr/local/bin/clamscan";
>     }
> }
> 
> 
> #
> # clamAV
> #
> if ($clamscan){
>          do_log(2,"Using clamav");
>          $output = qx($clamscan --stdout --disable-summary -r $TEMPDIR/parts);
>          $errval = retcode($?);
>          do_log(2, "clamscan: ".$output);
>          if ($errval == 0) {         # no errors, no viruses found
>              $scanner_errors = 0;
>          } elsif ($errval == 1) {    # no errors, viruses discovered
>              $scanner_errors = 0;
>              @virusname = $output =~ /^.*?: (?!Infected Archive)(.*) FOUND$/mg;
>              @virusname = (undef)  if [EMAIL PROTECTED];  # just in case: make list 
> nonnil
>              return 1;
>          } else {    # interrupted or some error preventing further execution
>              do_log(0,"Virus scanner failure: clamav (error code: $errval)");
>          }
> }
> 
> #
> # clamAV - fallback. This is used if Clamd fails for some reason. A safety net
> # as clamd is not entirely stable.
> #
> if ($clamscan_fallback){
>          do_log(2,"Using clamav");
>          $output = qx($clamscan_fallback --stdout --disable-summary -r 
> $TEMPDIR/parts);
>          $errval = retcode($?);
>          do_log(2, "clamscan: ".$output);
>          if ($errval == 0) {         # no errors, no viruses found
>              $scanner_errors = 0;
>          } elsif ($errval == 1) {    # no errors, viruses discovered
>              $scanner_errors = 0;
>              @virusname = $output =~ /^.*?: (?!Infected Archive)(.*) FOUND$/mg;
>              @virusname = (undef)  if [EMAIL PROTECTED];  # just in case: make list 
> nonnil
>              return 1;
>          } else {    # interrupted or some error preventing further execution
>              do_log(0,"Virus scanner failure: clamav (error code: $errval)");
>          }
>          $clamscan_fallback = "";
> }
> 
> -- 
> Chris Hastie
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




Reply via email to