Spamassin blew our server, we needed to try with dspam. Never did anything with qmail-scanner before, did this last night, YMMV.
-- Jose Celestino | http://xpto.org/~japc/files/japc-pgpkey.asc ---------------------------------------------------------------- "...the law, cold and aloof by its very nature, has no access to the passions that might justify the cruel act of murder." -- SADE
--- qmail-scanner-queue.pl.JAPC 2004-06-07 17:19:40.000000000 +0100 +++ qmail-scanner-queue.pl 2004-06-09 02:50:38.000000000 +0100 @@ -106,7 +106,7 @@ #Array of virus scanners used must point to subroutines -my @scanner_array=("clamscan_scanner"); +my @scanner_array=("clamscan_scanner","dspam"); #Addresses that should be alerted of any quarantined Email my $NOTIFY_ADDRS='none'; @@ -208,12 +208,11 @@ my $clamscan_options="-r -m --unzip --unrar --unzoo --lha --disable-summary --max-recursion=10 --max-space=100000"; my $clamdscan_binary=''; my $clamdscan_options="-r --disable-summary --max-recursion=10 --max-space=100000"; -my $spamc_binary=''; -my $spamc_options=''; -my $spamc_subject=''; -my $spamassassin_binary=''; -my ($sa_comment,$sa_level); -my $sa_symbol='+'; +my $dspam_options=" --mode=teft --feature=chained,noise --deliver=innocent,spam --classify "; +my $dspam_subject='*****SPAM*****'; +my $dspam_binary='/usr/local/bin/dspam'; +my ($dspam_comment,$dspam_level,$dspam_extra); +my $dspam_symbol='+'; my ($tag_score)=""; my $SNEAKY_WINDOWS_EXTENSIONS="exe|com|pps|w[pm][szd]|vcf|nws|cmd|bat|pif|sc[rt]|dll|ocx|do[ct]|xl[swt]|p[po]t|rtf|vb[se]?|hta|p[lm]|sh[bs]|hlp|chm|eml|ws[cfh]|ad[ep]|jse?|md[abew]|ms[ip]|reg|as[dfx]|cil"; my $VALID_WINDOWS_EXTENSIONS="sav|htm|html|pst|ost|txt|gif|jpeg|mpeg|jpg|png|mny|wav|tif|$SNEAKY_WINDOWS_EXTENSIONS"; @@ -1254,8 +1253,9 @@ print QMQ "Received: from $returnpath by $hostname by uid $uid with qmail-scanner-$VERSION \n"; print QMQ " ($SCANINFO Clear:$tag_score. \n"; print QMQ " Processed in $elapsed_time secs); $findate\n"; - print QMQ "X-Spam-Status: $sa_comment\n" if ($sa_comment ne ""); - print QMQ "X-Spam-Level: $sa_level\n" if ($sa_comment ne "" && $sa_level ne ""); + print QMQ "X-DSPAM-Result: $dspam_comment\n" if ($dspam_comment ne ""); + print QMQ "X-DSPAM-Probability: $dspam_level\n" if ($dspam_comment ne "" && $dspam_level ne ""); + # print QMQ "$dspam_extra\n" if ($dspam_extra ne ""); if ( $descriptive_hdrs ) { print QMQ "${V_HEADER}-Mail-From: $returnpath via $hostname\n"; print QMQ "${V_HEADER}-Rcpt-To: $recips\n" if ($descriptive_hdrs eq "2"); @@ -1272,7 +1272,7 @@ #next; #} #remove any X-Spam-Status/Level IFF we've set a SA value ourselves - if (($sa_comment ne "" && /^X-Spam-Status:/i) || ($sa_level ne "" && /^X-Spam-Level:/i) ) { + if (($dspam_comment ne "" && /^X-Spam-Status:/i) || ($dspam_level ne "" && /^X-Spam-Level:/i) ) { #Hmm, better get rid of any other continuation headers to this! while (<STDIN>) { $still_headers=0 if (/^(\r|\r\n|\n)$/); @@ -1284,9 +1284,9 @@ } } } - if ($sa_comment =~ /^yes/i && $spamc_subject ne "" && !/^Subject: \Q$spamc_subject\E/i && /^(Subject):(\s?)([^\n]+)\n/i ) { - $altered_subject="$1: $spamc_subject $3"; - if ($altered_subject !~ /^: \Q$spamc_subject\E/) { + if ($dspam_comment =~ /^Spam/i && $dspam_subject ne "" && !/^Subject: \Q$dspam_subject\E/i && /^(Subject):(\s?)([^\n]+)\n/i ) { + $altered_subject="$1: $dspam_subject $3"; + if ($altered_subject !~ /^: \Q$dspam_subject\E/) { &debug("altering subject line to $altered_subject"); print QMQ "$altered_subject\n"; next; @@ -1294,7 +1294,7 @@ } $still_headers=0 if (/^(\r|\r\n|\n)$/); #Insert Subject: line if e-mail dosn't contain one but must be tagged - print QMQ "Subject: $spamc_subject\n" if ((!$still_headers) && ($sa_comment =~ /^yes/i) && (!$altered_subject) && $spamc_subject ne "" ); + print QMQ "Subject: $dspam_subject\n" if ((!$still_headers) && ($dspam_comment =~ /^Spam/i) && (!$altered_subject) && $dspam_subject ne "" ); } print QMQ; @@ -1648,18 +1648,9 @@ } } close(CLAMS); - } elsif ($scanner eq "spamassassin") { + } elsif ($scanner eq "dspam") { #X-Spam-Checker-Version: SpamAssassin 2.01 - open(SPAS,"$spamassassin_binary -V |")||die "failed to call $spamassassin_binary -V - $!"; - $spamassassin_eng="2.x"; - while (<SPAS>) { - chomp; - if (/^SpamAssassin version (.*)$/i) { - $spamassassin_eng=$1; - } - } - close(SPAS); - $SCANINFO .= "spamassassin: $spamassassin_eng. "; + $SCANINFO .= "dspam: v666. "; } else { #Catch-all for other ones $SCANINFO .= "$scanner: ???. "; @@ -2138,6 +2129,99 @@ $clamscan_time = tv_interval ($start_clamscan_time, $stop_clamscan_time); &debug("clamscan: finished scan of dir \"$ENV{'TMPDIR'}\" in $clamscan_time secs"); } + +sub dspam { + #Only run dspam if mail is from a "remote" SMTP client, or QS_SPAMASSASSIN + #is defined via tcpserver... +# if (defined($ENV{'RELAYCLIENT'}) && !defined($ENV{'QS_SPAMASSASSIN'})) { +# &debug("dspam: don't scan as RELAYCLIENT implies this was sent by a local user"); +# return; +# } + #dspam client scanner + my ($dspam_found,$dspam_status); + my ($start_dspam_time)=[gettimeofday]; + my ($dspam_tag,$DD,$dspam_status,$stop_dspam_time,$cmdline_recip,$dspam_fast); + my ($dspam_status)=0; + my ($dspam_score)=0; my ($dspam_max)=0; + my $dspam_time; + + $dspam_extra=""; + + #Cleanup $one_recip so it's usable from the commandline... + #any char that isn't supported to changed into an '_' + ($cmdline_recip=$one_recip)=~s/[EMAIL PROTECTED]/_/gi; + $cmdline_recip=~/^([EMAIL PROTECTED])$/i; + $cmdline_recip=tolower($1); + + $cmdline_recip =~ s/[EMAIL PROTECTED]//; + if ($cmdline_recip eq "") { + $cmdline_recip = "global"; + } + + $dspam_fast=1 if ($dspam_options =~ /classify/); + $dspam_options=" --user $cmdline_recip $dspam_options"; + + &debug("DSPAM: run $dspam_binary $dspam_options < $scandir/$wmaildir/new/$file_id"); + open(DSPAM,"$dspam_binary $dspam_options < $scandir/$wmaildir/new/$file_id|")||&error_condition("cannot run $dspam_binary < $scandir/$wmaildir/new/$file_id - $!"); + open(SOUT,">$scandir/$wmaildir/new/$file_id.dspam")||&error_condition("cannot open for write $scandir/$wmaildir/new/$file_id.dspam - $!"); + open(MYDEBUG,">/tmp/dspam.debug"); + while (<DSPAM>) { + if ($dspam_fast) { +# X-DSPAM-Result: alias; result="Innocent"; probability=0.0000; confidence=1.00 + chomp; + /result="(\w+)";/; + if ($1 eq "Spam") { + $dspam_status=1; + $dspam_comment="Spam"; + /probability=(.*)\;/; + $dspam_level=$1; + } else { + $dspam_status=0; + $dspam_comment="Innocent"; + /probability=(.*)\;/; + $dspam_level=$1; + } + } else { + if (/^X-DSPAM-Result: Spam/) { + $dspam_status=1; + $dspam_comment="Spam"; + if (/^X-DSPAM-Probability: (.*)\n/) { + $dspam_level=$1; + } + } else { + $dspam_status=0; + $dspam_comment="Innocent"; + if (/^X-DSPAM-Probability: (.*)\n/) { + $dspam_level=$1; + } + } + if (/^X-DSPAM/) { + $dspam_extra .=$_; + } + } + print SOUT; + print MYDEBUG "[$_]\n"; + } + close DSPAM ; + $dspam_status=($? >> 8); + + close SOUT; + close MYDEBUG; + + + if (!$dspam_fast && -s "$scandir/$wmaildir/new/$file_id.dspam" && $dspam_status == 0) { + &debug("DSPAM: overwriting $scandir/$wmaildir/new/$file_id with $scandir/$wmaildir/new/$file_id.dspam"); + rename ("$scandir/$wmaildir/new/$file_id.dspam","$scandir/$wmaildir/new/$file_id"); + } else { + unlink("$scandir/$wmaildir/new/$file_id.dspam"); + } + $stop_dspam_time=[gettimeofday]; + $dspam_time = tv_interval ($start_dspam_time, $stop_dspam_time); + &debug("DSPAM: finished scan of dir \"$ENV{'TMPDIR'}\" in $dspam_time secs"); +} + + + ######################### ## END of scanner definitions ##