Am 24.10.2008 22:45 Uhr, Felix Buenemann schrieb:
>> Here's what I'd prefer to see as output 
>> > format:
>> > 
>> > spamdyke-stats.pl v???
>> > Total  :  122154
>> > Allowed:   19514  15.97%
>> > Timeout:     141   0.12%
>> > Denied :  102499  83.91%
>> > ____Denied Breakdown____
>> > RDNS_MISSING         34229  33.39%
>> > IP_IN_CC_RDNS        26702  26.05%
>> > RBL_MATCH            21848  21.32%
>> > RDNS_RESOLVE         14910  14.55%
>> > SENDER_NO_MX          2684   2.62%
>> > OTHER                 2123   2.07%
>> > TOO_MANY_RECIPIENTS      3   0.00%
>> > 
>> > Or something along those lines. ;) Note the Denied percentages are 
>> > percents of Denied, not percents of Total.
> It's certainly possible to add this kind of output. I'll look into it,
> but I have some commercial projects coming up, so it'll have to be
> postponed for a while, unless you wanna add it yourself.
> 

Attached is a new versionl, that does approcimately what you want
(percentages are total no relative to DENIED or whatever):

spamdyke-stats build 2008102607

  173123   41.20%  DENIED_RDNS_MISSING
  130998   31.18%  DENIED_IP_IN_CC_RDNS
   37253    8.86%  DENIED_IP_IN_RDNS
--------------- Breakdown ---------------
   25200   81.68%  .net
    5533   17.93%  .com
      87    0.28%  .in-addr.arpa
      13    0.04%  host
      13    0.04%  pool
       5    0.01%  dial
       1    0.00%  dhcp
-----------------------------------------
   35246    8.38%  DENIED_RBL_MATCH
--------------- Breakdown ---------------
   24814   88.72%  zen.spamhaus.org
    1778    6.35%  ix.dnsbl.manitu.net
    1374    4.91%  bl.spamcop.net
-----------------------------------------
   34045    8.10%  DENIED_RDNS_RESOLVE
    5731    1.36%  ALLOWED
    2316    0.55%  TIMEOUT
     831    0.19%  DENIED_OTHER
     474    0.11%  ERROR
     114    0.02%  DENIED_SENDER_NO_MX

---------------- Summary ----------------
Allowed:     5731    1.36%
Timeout:     2316    0.55%
Errors :      474    0.11%
Denied :   411610   97.97%
Total  :   420131  100.00%


-- Felix

#!/usr/bin/perl -w
my $build = "2008102607";
use diagnostics;
use strict;
use Getopt::Long;
my $tldtop = 0;
my $detailed = 1;
my $syslog = 1;
GetOptions (
        "tld=i"   => \$tldtop,
        "detail!" => \$detailed
) or exit 1;

# Usage:  # cat /var/log/qmail/smtpd/current | ./this_file

my %status = ();        # hash of status connections
my %origin = ();        # hash of tld per status code
my %originsum = ();     # hash of tld per status code sums
my %rblstat = ();       # hash of DNSBL lists matched
my %rhsblstat = ();     # hash of RHSBL lists matched
my %rdnsblstat = ();    # hash of patterns in IP_IN_RDNS_BLACKLIST  matched
my ($allow, $deny, $timeout, $error, $allowpercentage, $timeoutpercentage, 
$errorpercentage, $spampercentage, $sum, $rblsum, $rhsblsum, $rdnsblsum);

sub percentage {
        my $num = pop;
        my $sum = pop;
        return "  0.00%" unless $sum;
        $num = $num/$sum*100.0;
        return sprintf("%3d.%02d%%", $num, ($num - int($num))*100);
}

print "spamdyke-stats build $build\n\n";

while(<>){
# Oct 21 05:11:11 h1423590 spamdyke[12904]: DENIED_SENDER_NO_MX
# @4000000048fa5dfc34b1ebec DENIED_SENDER_NO_MX
        if( substr($_,0,1) eq '@' ) {
                $_ = substr $_,26;
        } else {
                my ($month,$day,$time,$hostname,$id,$line) = split / /, $_, 6;
                next unless substr($id,0,9) eq 'spamdyke[';
                $_ = $line;
        }
                if( m/^(ALLOWED|ERROR|TIMEOUT|((DENIED|FILTER)_[^ ]+))/ ) {
                        my $line = substr $_,length $1;
                        #my $sdstatus = $1;
                        $_ = $1;
                        if( $detailed ) {
                                if( m/FILTER_RBL_MATCH/ ){
                                        $line =~ m/rbl: (\S+)/;
                                        $rblstat{$1}++;
                                        $rblsum++;
                                }
                                elsif( m/FILTER_RHSBL_MATCH/ ){
                                        $line =~ m/rhsbl: (\S+)/;
                                        $rhsblstat{$1}++;
                                        $rhsblsum++;
                                }
                                elsif( m/FILTER_IP_IN_RDNS_BLACKLIST/ ){
                                        $line =~ m/keyword: (\S+)/;
                                        $rdnsblstat{$1}++;
                                        $rdnsblsum++;
                                }
                        }
                        next if m/^FILTER_/;
                        $status{$_}++;
                        if($tldtop and $line =~ m/ origin_rdns: ([^ ]+)/) {
                                my $rdns = $1;
                                $originsum{$_}++;
                                if($rdns =~ m/^\(unknown\)$/){
                                        #$origin{$_}{'unknown'}++;
                                        next;
                                } elsif($rdns =~ m/\.(com|net)$/){
                                        $origin{$_}{$1}++;
                                } elsif($rdns =~ 
m/\.([a-z]{2,2}\.[a-z]{2,2})$/){ # co.uk
                                        $origin{$_}{$1}++;
                                } elsif($rdns =~ m/\.([a-z]{2,})$/){ # de, ru, 
...
                                        $origin{$_}{$1}++
                                } else {
                                        #$origin{$_}{'unknown'}++;
                                        next;
                                }
                        }
                }
                

}

$allow = 0;
$deny = 0;
$error = 0;
$timeout = 0;

foreach my $stat (sort keys %status){
        if( $stat =~ m/ALLOWED/ ){
                $allow = $status{$stat};
        }
        elsif( $stat =~ m/TIMEOUT/ ){
                $timeout += $status{$stat};
        }
        elsif( $stat =~ m/ERROR/ ){
                $error += $status{$stat};
        }
        else{
                $deny += $status{$stat};
        }
}
$sum = ($deny + $error + $timeout + $allow);

foreach my $key (sort { $status{$b} <=> $status{$a} || $a cmp $b; } keys 
%status){
        printf "%8d  %s  $key\n", $status{$key}, percentage($sum, 
$status{$key});
        if(length %rblstat and $key eq "DENIED_RBL_MATCH" ){
                print "--------------- Breakdown ---------------\n";
                foreach my $key (sort { $rblstat{$b} <=> $rblstat{$a} || $a cmp 
$b; } keys %rblstat){
                        printf "%8d  %s  $key\n", $rblstat{$key}, 
percentage($rblsum,$rblstat{$key});
                        #printf "          %s  $key\n", 
percentage($rblsum,$rblstat{$key});
                }
                print "-----------------------------------------\n";
        }
        elsif(length %rhsblstat and $key eq "DENIED_RHSBL_MATCH" ){
                print "--------------- Breakdown ---------------\n";
                foreach my $key (sort { $rhsblstat{$b} <=> $rblstat{$a} || $a 
cmp $b; } keys %rhsblstat){
                        printf "%8d  %s  $key\n", $rhsblstat{$key}, 
percentage($rhsblsum,$rhsblstat{$key});
                        #printf "          %s  $key\n", 
percentage($rhsblsum,$rhsblstat{$key});
                }
                print "-----------------------------------------\n";
        }
        elsif(length %rdnsblstat and $key eq "DENIED_IP_IN_RDNS" ){
                print "--------------- Breakdown ---------------\n";
                foreach my $key (sort { $rdnsblstat{$b} <=> $rdnsblstat{$a} || 
$a cmp $b; } keys %rdnsblstat){
                        printf "%8d  %s  $key\n", $rdnsblstat{$key}, 
percentage($rdnsblsum,$rdnsblstat{$key});
                        #printf "          %s  $key\n", 
percentage($rdnsblsum,$rdnsblstat{$key});
                }
                print "-----------------------------------------\n";
        }
        if($tldtop && $origin{$key}) {
                my $top = $tldtop;
                print "--------------- Top $top TLD ---------------\n";
                my $tldsum = 0;
                my $lastsum = 0;
                my @tldgroup = ();
                my %neworigin = ();
                foreach my $tld (sort { $origin{$key}{$a} <=> $origin{$key}{$b} 
} keys %{$origin{$key}}){
                        if(($origin{$key}{$tld}/$originsum{$key}*100) == 
$lastsum) {
                                #print "push tldgroup, $tld 
($origin{$key}{$tld})\n";
                                push(@tldgroup, $tld);
                        } else {
                                if(scalar @tldgroup) {
                                        $neworigin{join(', ', @tldgroup)} = 
$lastsum;
                                        #print "tldgroup=". join(', ', 
@tldgroup) ." ($lastsum)\n";
                                        @tldgroup = ();
                                }
                                #print "push tldgroup, $tld 
($origin{$key}{$tld})\n";
                                push(@tldgroup, $tld);
                        }
                        $lastsum = $origin{$key}{$tld}/$originsum{$key}*100;
                        $tldsum += $origin{$key}{$tld};
                }
                if(scalar @tldgroup) {
                        $neworigin{join(', ', @tldgroup)} = $lastsum * length 
@tldgroup;
                        #print "tldgroup=". join(', ', @tldgroup) ." 
($lastsum)\n";
                }
                foreach my $tld (sort { $neworigin{$b} <=> $neworigin{$a} } 
keys %neworigin){
                        printf "%s\t$tld\n", percentage($originsum{$key}, 
$neworigin{$tld}/100.0*$originsum{$key});
                        last unless --$top;
                }
                #printf "%2.2f%%\t(unknown/illegal)\n", 
(($originsum{$key}-$tldsum)/$originsum{$key}*100) if $tldsum && 
($originsum{$key}-$tldsum);
                print "-----------------------------------------\n";
        }
        
}
my $format_summary = "%8d  %s";
print "\n";
print "---------------- Summary ----------------\n";
printf "Allowed: $format_summary\n", $allow, percentage($sum, $allow);
printf "Timeout: $format_summary\n", $timeout, percentage($sum, $timeout);
printf "Errors : $format_summary\n", $error, percentage($sum, $error);
printf "Denied : $format_summary\n", $deny, percentage($sum, $deny);
printf "Total  : $format_summary\n", $sum, percentage($sum, $sum);

_______________________________________________
spamdyke-users mailing list
[email protected]
http://www.spamdyke.org/mailman/listinfo/spamdyke-users

Reply via email to