546 lines
13 KiB
Perl
546 lines
13 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
# add this to your snmpd.conf file as below
|
|
# extend postfixdetailed /etc/snmp/postfixdetailed
|
|
|
|
# The cache file to use.
|
|
my $cache='/var/cache/postfixdetailed';
|
|
|
|
# the location of pflogsumm
|
|
my $pflogsumm='/usr/bin/env pflogsumm';
|
|
|
|
#totals
|
|
# 847 received = received
|
|
# 852 delivered = delivered
|
|
# 0 forwarded = forwarded
|
|
# 3 deferred (67 deferrals)= deferred
|
|
# 0 bounced = bounced
|
|
# 593 rejected (41%) = rejected
|
|
# 0 reject warnings = rejectw
|
|
# 0 held = held
|
|
# 0 discarded (0%) = discarded
|
|
|
|
# 16899k bytes received = bytesr
|
|
# 18009k bytes delivered = bytesd
|
|
# 415 senders = senders
|
|
# 266 sending hosts/domains = sendinghd
|
|
# 15 recipients = recipients
|
|
# 9 recipient hosts/domains = recipienthd
|
|
|
|
######message deferral detail
|
|
#Connection refused = deferralcr
|
|
#Host is down = deferralhid
|
|
|
|
########message reject detail
|
|
#Client host rejected = chr
|
|
#Helo command rejected: need fully-qualified hostname = hcrnfqh
|
|
#Sender address rejected: Domain not found = sardnf
|
|
#Sender address rejected: not owned by user = sarnobu
|
|
#blocked using = bu
|
|
#Recipient address rejected: User unknown = raruu
|
|
#Helo command rejected: Invalid name = hcrin
|
|
#Sender address rejected: need fully-qualified address = sarnfqa
|
|
#Recipient address rejected: Domain not found = rardnf
|
|
#Recipient address rejected: need fully-qualified address = rarnfqa
|
|
#Improper use of SMTP command pipelining = iuscp
|
|
#Message size exceeds fixed limit = msefl
|
|
#Server configuration error = sce
|
|
#Server configuration problem = scp
|
|
#unknown reject reason = urr
|
|
|
|
my $old='';
|
|
|
|
#reads in the old data if it exists
|
|
if ( -f $cache ){
|
|
open(my $fh, "<", $cache) or die "Can't open '".$cache."'";
|
|
# if this is over 2048, something is most likely wrong
|
|
read($fh , $old , 2048);
|
|
close($fh);
|
|
}
|
|
|
|
my ( $received,
|
|
$delivered,
|
|
$forwarded,
|
|
$deferred,
|
|
$bounced,
|
|
$rejected,
|
|
$rejectw,
|
|
$held,
|
|
$discarded,
|
|
$bytesr,
|
|
$bytesd,
|
|
$senders,
|
|
$sendinghd,
|
|
$recipients,
|
|
$recipienthd,
|
|
$deferralcr,
|
|
$deferralhid,
|
|
$chr,
|
|
$hcrnfqh,
|
|
$sardnf,
|
|
$sarnobu,
|
|
$bu,
|
|
$raruu,
|
|
$hcrin,
|
|
$sarnfqa,
|
|
$rardnf,
|
|
$rarnfqa,
|
|
$iuscp,
|
|
$msefl,
|
|
$sce,
|
|
$scp,
|
|
$urr) = split ( /\n/, $old );
|
|
|
|
if ( ! defined( $received ) ){ $received=0; }
|
|
if ( ! defined( $delivered ) ){ $delivered=0; }
|
|
if ( ! defined( $forwarded ) ){ $forwarded=0; }
|
|
if ( ! defined( $deferred ) ){ $deferred=0; }
|
|
if ( ! defined( $bounced ) ){ $bounced=0; }
|
|
if ( ! defined( $rejected ) ){ $rejected=0; }
|
|
if ( ! defined( $rejectw ) ){ $rejectw=0; }
|
|
if ( ! defined( $held ) ){ $held=0; }
|
|
if ( ! defined( $discarded ) ){ $discarded=0; }
|
|
if ( ! defined( $bytesr ) ){ $bytesr=0; }
|
|
if ( ! defined( $bytesd ) ){ $bytesd=0; }
|
|
if ( ! defined( $senders ) ){ $senders=0; }
|
|
if ( ! defined( $sendinghd ) ){ $sendinghd=0; }
|
|
if ( ! defined( $recipients ) ){ $recipients=0; }
|
|
if ( ! defined( $recipienthd ) ){ $recipienthd=0; }
|
|
if ( ! defined( $deferralcr ) ){ $deferralcr=0; }
|
|
if ( ! defined( $deferralhid ) ){ $deferralhid=0; }
|
|
if ( ! defined( $chr ) ){ $chr=0; }
|
|
if ( ! defined( $hcrnfqh ) ){ $hcrnfqh=0; }
|
|
if ( ! defined( $sardnf ) ){ $sardnf=0; }
|
|
if ( ! defined( $sarnobu ) ){ $sarnobu=0; }
|
|
if ( ! defined( $bu ) ){ $bu=0; }
|
|
if ( ! defined( $raruu ) ){ $raruu=0; }
|
|
if ( ! defined( $hcrin ) ){ $hcrin=0; }
|
|
if ( ! defined( $sarnfqa ) ){ $sarnfqa=0; }
|
|
if ( ! defined( $rardnf ) ){ $rardnf=0; }
|
|
if ( ! defined( $rarnfqa ) ){ $rarnfqa=0; }
|
|
if ( ! defined( $iuscp ) ){ $iuscp=0; }
|
|
if ( ! defined( $msefl ) ){ $msefl=0; }
|
|
if ( ! defined( $sce ) ){ $sce=0; }
|
|
if ( ! defined( $scp ) ){ $scp=0; }
|
|
if ( ! defined( $urr ) ){ $urr=0; }
|
|
|
|
#init current variables
|
|
my $receivedC=0;
|
|
my $deliveredC=0;
|
|
my $forwardedC=0;
|
|
my $deferredC=0;
|
|
my $bouncedC=0;
|
|
my $rejectedC=0;
|
|
my $rejectwC=0;
|
|
my $heldC=0;
|
|
my $discardedC=0;
|
|
my $bytesrC=0;
|
|
my $bytesdC=0;
|
|
my $sendersC=0;
|
|
my $sendinghdC=0;
|
|
my $recipientsC=0;
|
|
my $recipienthdC=0;
|
|
my $deferralcrC=0;
|
|
my $deferralhidC=0;
|
|
my $chrC=0;
|
|
my $hcrnfqhC=0;
|
|
my $sardnfC=0;
|
|
my $sarnobuC=0;
|
|
my $buC=0;
|
|
my $raruuC=0;
|
|
my $hcrinC=0;
|
|
my $sarnfqaC=0;
|
|
my $rardnfC=0;
|
|
my $rarnfqaC=0;
|
|
my $iuscpC=0;
|
|
my $mseflC=0;
|
|
my $sceC=0;
|
|
my $scpC=0;
|
|
my $urrC=0;
|
|
|
|
sub newValue{
|
|
my $old=$_[0];
|
|
my $new=$_[1];
|
|
|
|
#if new is undefined, just default to 0... this should never happen
|
|
if ( !defined( $new ) ){
|
|
warn('New not defined');
|
|
return 0;
|
|
}
|
|
|
|
#sets it to 0 if old is not defined
|
|
if ( !defined( $old ) ){
|
|
warn('Old not defined');
|
|
$old=0;
|
|
}
|
|
|
|
#make sure they are both numberic and if not set to zero
|
|
if( $old !~ /^[0123456789]*$/ ){
|
|
warn('Old not numeric');
|
|
$old=0;
|
|
}
|
|
if( $new !~ /^[0123456789]*$/ ){
|
|
warn('New not numeric');
|
|
$new=0;
|
|
}
|
|
|
|
#log rotation happened
|
|
if ( $old > $new ){
|
|
return $new;
|
|
};
|
|
|
|
return $new - $old;
|
|
}
|
|
|
|
|
|
my $output=`$pflogsumm /var/log/mail.log`;
|
|
|
|
#holds client host rejected values till the end when it is compared to the old one
|
|
my $chrNew=0;
|
|
|
|
#holds RBL values till the end when it is compared to the old one
|
|
my $buNew=0;
|
|
|
|
# holds recipient address rejected values till the end when it is compared to the old one
|
|
my $raruuNew=0;
|
|
|
|
#holds the current values for checking later
|
|
my $current='';
|
|
|
|
my @outputA=split( /\n/, $output );
|
|
my $int=0;
|
|
while ( defined( $outputA[$int] ) ){
|
|
my $line=$outputA[$int];
|
|
|
|
$line=~s/^ *//;
|
|
$line=~s/ +/ /g;
|
|
$line=~s/\)$//;
|
|
|
|
my $handled=0;
|
|
|
|
#received line
|
|
if ( ( $line =~ /[0123456789] received$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$receivedC=$line;
|
|
$received=newValue( $received, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#delivered line
|
|
if ( ( $line =~ /[0123456789] delivered$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$deliveredC=$line;
|
|
$delivered=newValue( $delivered, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#forward line
|
|
if ( ( $line =~ /[0123456789] forwarded$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$forwardedC=$line;
|
|
$forwarded=newValue( $forwarded, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#defereed line
|
|
if ( ( $line =~ /[0123456789] deferred \(/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$deferredC=$line;
|
|
$deferred=newValue( $deferred, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#bounced line
|
|
if ( ( $line =~ /[0123456789] bounced$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$bouncedC=$line;
|
|
$bounced=newValue( $bounced, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#rejected line
|
|
if ( ( $line =~ /[0123456789] rejected \(/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$rejectedC=$line;
|
|
$rejected=newValue( $rejected, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#reject warning line
|
|
if ( ( $line =~ /[0123456789] reject warnings/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$rejectwC=$line;
|
|
$rejectw=newValue( $rejectw, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#held line
|
|
if ( ( $line =~ /[0123456789] held$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$heldC=$line;
|
|
$held=newValue( $held, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#discarded line
|
|
if ( ( $line =~ /[0123456789] discarded \(/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$discardedC=$line;
|
|
$discarded=newValue( $discarded, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#bytes received line
|
|
if ( ( $line =~ /[0123456789kM] bytes received$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$line=~s/k/000/;
|
|
$line=~s/M/000000/;
|
|
$bytesrC=$line;
|
|
$bytesr=newValue( $bytesr, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#bytes delivered line
|
|
if ( ( $line =~ /[0123456789kM] bytes delivered$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$line=~s/k/000/;
|
|
$line=~s/M/000000/;
|
|
$bytesdC=$line;
|
|
$bytesd=newValue( $bytesd, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#senders line
|
|
if ( ( $line =~ /[0123456789] senders$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$sendersC=$line;
|
|
$senders=newValue( $senders, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#sendering hosts/domains line
|
|
if ( ( $line =~ /[0123456789] sending hosts\/domains$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$sendinghdC=$line;
|
|
$sendinghd=newValue( $sendinghd, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#recipients line
|
|
if ( ( $line =~ /[0123456789] recipients$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$recipientsC=$line;
|
|
$recipients=newValue( $recipients, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#recipients line
|
|
if ( ( $line =~ /[0123456789] recipient hosts\/domains$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$recipienthdC=$line;
|
|
$recipienthd=newValue( $recipienthd, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
# deferrals connectios refused
|
|
if ( ( $line =~ /[0123456789] 25\: Connection refused$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$deferralcrC=$line;
|
|
$deferralcr=newValue( $deferralcr, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
# deferrals Host is down
|
|
if ( ( $line =~ /Host is down$/ ) && ( ! $handled ) ){
|
|
$line=~s/ .*//;
|
|
$deferralhidC=$line;
|
|
$deferralhid=newValue( $deferralhid, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
# Client host rejected
|
|
if ( ( $line =~ /Client host rejected/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$chrNew=$chrNew + $line;
|
|
$handled=1;
|
|
}
|
|
|
|
#Helo command rejected: need fully-qualified hostname
|
|
if ( ( $line =~ /Helo command rejected\: need fully\-qualified hostname/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$hcrnfqhC=$line;
|
|
$hcrnfqh=newValue( $hcrnfqh, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#Sender address rejected: Domain not found
|
|
if ( ( $line =~ /Sender address rejected\: Domain not found/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$sardnfC=$line;
|
|
$sardnf=newValue( $sardnf, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#Sender address rejected: not owned by user
|
|
if ( ( $line =~ /Sender address rejected\: not owned by user/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$sarnobuC=$line;
|
|
$sarnobu=newValue( $sarnobu, $line );
|
|
$handled=1;
|
|
}
|
|
|
|
#blocked using
|
|
# These lines are RBLs so there will be more than one.
|
|
# Use $buNew to add them all up.
|
|
if ( ( $line =~ /blocked using/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$buNew=$buNew + $line;
|
|
$handled=1;
|
|
}
|
|
|
|
#Recipient address rejected: User unknown
|
|
if ( ( $line =~ /Recipient address rejected\: User unknown/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$raruuNew=$raruuNew + $line;
|
|
$handled=1;
|
|
}
|
|
|
|
#Helo command rejected: Invalid name
|
|
if ( ( $line =~ /Helo command rejected\: Invalid name/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$hcrinC=$line;
|
|
$hcrin=newValue( $hcrin, $line );
|
|
}
|
|
|
|
#Sender address rejected: need fully-qualified address
|
|
if ( ( $line =~ /Sender address rejected\: need fully-qualified address/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$sarnfqaC=$line;
|
|
$sarnfqa=newValue( $sarnfqa, $line );
|
|
}
|
|
|
|
#Recipient address rejected: Domain not found
|
|
if ( ( $line =~ /Recipient address rejected\: Domain not found/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$rardnfC=$line;
|
|
$rardnf=newValue( $rardnf, $line );
|
|
}
|
|
|
|
#Improper use of SMTP command pipelining
|
|
if ( ( $line =~ /Improper use of SMTP command pipelining/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$iuoscpC=$line;
|
|
$iuoscp=newValue( $iuoscp, $line );
|
|
}
|
|
|
|
#Message size exceeds fixed limit
|
|
if ( ( $line =~ /Message size exceeds fixed limit/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$mseflC=$line;
|
|
$msefl=newValue( $msefl, $line );
|
|
}
|
|
|
|
#Server configuration error
|
|
if ( ( $line =~ /Server configuration error/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$sceC=$line;
|
|
$sce=newValue( $sce, $line );
|
|
}
|
|
|
|
#Server configuration problem
|
|
if ( ( $line =~ /Server configuration problem/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$scpC=$line;
|
|
$scp=newValue( $scp, $line );
|
|
}
|
|
|
|
#unknown reject reason
|
|
if ( ( $line =~ /unknown reject reason/ ) && ( ! $handled ) ){
|
|
$line=~s/.*\: //g;
|
|
$urrC=$line;
|
|
$urr=newValue( $urr, $line );
|
|
}
|
|
$int++;
|
|
}
|
|
|
|
# final client host rejected total
|
|
$chr=newValue( $chr, $chrNew );
|
|
|
|
# final RBL total
|
|
$bu=newValue( $bu, $buNew );
|
|
|
|
# final recipient address rejected total
|
|
$raruu=newValue( $raruu, $raruuNew );
|
|
|
|
my $data=$received."\n".
|
|
$delivered."\n".
|
|
$forwarded."\n".
|
|
$deferred."\n".
|
|
$bounced."\n".
|
|
$rejected."\n".
|
|
$rejectw."\n".
|
|
$held."\n".
|
|
$discarded."\n".
|
|
$bytesr."\n".
|
|
$bytesd."\n".
|
|
$senders."\n".
|
|
$sendinghd."\n".
|
|
$recipients."\n".
|
|
$recipienthd."\n".
|
|
$deferralcr."\n".
|
|
$deferralhid."\n".
|
|
$chr."\n".
|
|
$hcrnfqh."\n".
|
|
$sardnf."\n".
|
|
$sarnobu."\n".
|
|
$bu."\n".
|
|
$raruu."\n".
|
|
$hcrin."\n".
|
|
$sarnfqa."\n".
|
|
$rardnf."\n".
|
|
$rarnfqa."\n".
|
|
$iuscp."\n".
|
|
$sce."\n".
|
|
$scp."\n".
|
|
$urr."\n";
|
|
$msefl."\n".
|
|
|
|
print $data;
|
|
|
|
my $current=$receivedC."\n".
|
|
$deliveredC."\n".
|
|
$forwardedC."\n".
|
|
$deferredC."\n".
|
|
$bouncedC."\n".
|
|
$rejectedC."\n".
|
|
$rejectwC."\n".
|
|
$heldC."\n".
|
|
$discardedC."\n".
|
|
$bytesrC."\n".
|
|
$bytesdC."\n".
|
|
$sendersC."\n".
|
|
$sendinghdC."\n".
|
|
$recipientsC."\n".
|
|
$recipienthdC."\n".
|
|
$deferralcrC."\n".
|
|
$deferralhidC."\n".
|
|
$chrNew."\n".
|
|
$hcrnfqhC."\n".
|
|
$sardnfC."\n".
|
|
$sarnobuC."\n".
|
|
$buNew."\n".
|
|
$raruuNew."\n".
|
|
$hcrinC."\n".
|
|
$sarnfqaC."\n".
|
|
$rardnfC."\n".
|
|
$rarnfqaC."\n".
|
|
$iuscpC."\n".
|
|
$mseflC."\n".
|
|
$sceC."\n".
|
|
$scpC."\n".
|
|
$urrC."\n";
|
|
|
|
open(my $fh, ">", $cache) or die "Can't open '".$cache."'";
|
|
print $fh $current;
|
|
close($fh);
|