-- mailgraph.orig 2007-08-29 11:06:01.000000000 +0200 +++ mailgraph 2014-05-13 19:18:24.892999883 +0200 @@ -4,6 +4,7 @@ # copyright (c) 2000-2007 ETH Zurich # copyright (c) 2000-2007 David Schweikert # released under the GNU General Public License +# with dkim-, dmarc, spf-patch Sebastian van de Meer ######## Parse::Syslog 1.09 (automatically embedded) ######## package Parse::Syslog; @@ -381,7 +382,7 @@ my $rrd_virus = "mailgraph_virus.rrd"; my $year; my $this_minute; -my %sum = ( sent => 0, received => 0, bounced => 0, rejected => 0, virus => 0, spam => 0 ); +my %sum = ( sent => 0, received => 0, bounced => 0, rejected => 0, spfnone => 0, spffail => 0, spfpass => 0, dmarcnone => 0, dmarcfail => 0, dmarcpass => 0, dkimnone => 0, dkimfail => 0, dkimpass => 0, virus => 0, spam => 0, greylisted => 0, delayed => 0); my $rrd_inited=0; my %opt = (); @@ -395,6 +396,15 @@ sub event_rejected($); sub event_virus($); sub event_spam($); +sub event_spfnone($); +sub event_spffail($); +sub event_spfpass($); +sub event_dmarcnone($); +sub event_dmarcfail($); +sub event_dmarcpass($); +sub event_dkimnone($); +sub event_dkimfail($); +sub event_dkimpass($); sub init_rrd($); sub update($); @@ -528,6 +538,15 @@ 'DS:recv:ABSOLUTE:'.($rrdstep*2).':0:U', 'DS:bounced:ABSOLUTE:'.($rrdstep*2).':0:U', 'DS:rejected:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:spfnone:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:spffail:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:spfpass:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dmarcnone:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dmarcfail:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dmarcpass:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dkimnone:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dkimfail:ABSOLUTE:'.($rrdstep*2).':0:U', + 'DS:dkimpass:ABSOLUTE:'.($rrdstep*2).':0:U', "RRA:AVERAGE:0.5:$day_steps:$realrows", # day "RRA:AVERAGE:0.5:$week_steps:$realrows", # week "RRA:AVERAGE:0.5:$month_steps:$realrows", # month @@ -853,6 +872,45 @@ event($time, 'virus'); } } + elsif ($prog eq 'smf-spf') { + if ($text =~ /SPF pass:/) { + event($time, 'spfpass'); + } + elsif($text =~ /SPF none:/) { + event($time, 'spfnone'); + } + elsif($text =~ /fail:/) { + event($time, 'spffail'); + } +# elsif($text =~ /SPF fail:\b/) { +# event($time, 'spffail'); +# } +# elsif($text =~ /SPF softfail:\b/) { +# event($time, 'spffail'); +# } + } + elsif ($prog eq 'opendkim') { + if ($text =~ /DKIM verification successful/) { + event($time, 'dkimpass'); + } + elsif($text =~ /no signature data/) { + event($time, 'dkimnone'); + } + elsif($text =~ /bad signature data/) { + event($time, 'dkimfail'); + } + } + elsif ($prog eq 'opendmarc') { + if ($text =~ /pass/) { + event($time, 'dmarcpass'); + } + elsif($text =~ /none/) { + event($time, 'dmarcnone'); + } + elsif($text =~ /fail/) { + event($time, 'dmarcfail'); + } + } } sub event($$) @@ -870,13 +928,17 @@ return 1 if $m == $this_minute; return 0 if $m < $this_minute; - print "update $this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{virus}:$sum{spam}\n" if $opt{verbose}; - RRDs::update $rrd, "$this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}" unless $opt{'only-virus-rrd'}; +# print "update $this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{virus}:$sum{spam}\n" if $opt{verbose}; + print "update $this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{spfnone}:$sum{spffail}:$sum{spfpass}:$sum{dmarcnone}:$sum{dmarcfail}:$sum{dmarcpass}:$sum{dkimnone}:$sum{dkimfail}:$sum{dkimpass}:$sum{virus}:$sum{spam}\n" if $opt{verbose}; +# RRDs::update $rrd, "$this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}" unless $opt{'only-virus-rrd'}; + RRDs::update $rrd, "$this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{spfnone}:$sum{spffail}:$sum{spfpass}:$sum{dmarcnone}:$sum{dmarcfail}:$sum{dmarcpass}:$sum{dkimnone}:$sum{dkimfail}:$sum{dkimpass}" unless $opt{'no-mail-rrd'}; RRDs::update $rrd_virus, "$this_minute:$sum{virus}:$sum{spam}" unless $opt{'only-mail-rrd'}; if($m > $this_minute+$rrdstep) { for(my $sm=$this_minute+$rrdstep;$sm<$m;$sm+=$rrdstep) { - print "update $sm:0:0:0:0:0:0 (SKIP)\n" if $opt{verbose}; - RRDs::update $rrd, "$sm:0:0:0:0" unless $opt{'only-virus-rrd'}; +# print "update $sm:0:0:0:0:0:0 (SKIP)\n" if $opt{verbose}; + print "update $sm:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 (SKIP)\n" if $opt{verbose}; +# RRDs::update $rrd, "$sm:0:0:0:0" unless $opt{'only-virus-rrd'}; + RRDs::update $rrd, "$sm:0:0:0:0:0:0:0:0:0:0:0:0:0" unless $opt{'only-virus-rrd'}; RRDs::update $rrd_virus, "$sm:0:0" unless $opt{'only-mail-rrd'}; } } @@ -885,6 +947,15 @@ $sum{received}=0; $sum{bounced}=0; $sum{rejected}=0; + $sum{spfnone}=0; + $sum{spffail}=0; + $sum{spfpass}=0; + $sum{dmarcnone}=0; + $sum{dmarcfail}=0; + $sum{dmarcpass}=0; + $sum{dkimnone}=0; + $sum{dkimfail}=0; + $sum{dkimpass}=0; $sum{virus}=0; $sum{spam}=0; return 1;