Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
centos:mail_c6:mta_11 [13.05.2014 08:22. ] – [Webaufruf] djangocentos:mail_c6:mta_11 [22.07.2019 15:07. ] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 3: Zeile 3:
  
 Im Detail wollen wir uns nun drei der Varianten genauer ansehen. Im Detail wollen wir uns nun drei der Varianten genauer ansehen.
-  - **pflogsumm** Logfilezusammenfassung generieren und via eMail dem postmaster zur Verfügung stellen.+  - **[[centos:mail_c6:mta_11#pflogsumm|pflogsumm]]** Logfilezusammenfassung generieren und via eMail dem postmaster zur Verfügung stellen.
   - WEB-GUIs Graphisch sehr ansprechende Logfilezusammenfassung generieren und zum Abrufen via Browser anbieten   - WEB-GUIs Graphisch sehr ansprechende Logfilezusammenfassung generieren und zum Abrufen via Browser anbieten
-    - **mailgraph**  +    - **[[centos:mail_c6:mta_11#mailgraph|mailgraph]]**  
-    - **queuegraph**  +    - **[[centos:mail_c6:mta_11#queuegraph|queuegraph]]**  
-    - **greygraph**  +    - **[[centos:mail_c6:mta_11#greygraph|greygraph]]**  
-    - **mxgraphs**  +    - **[[centos:mail_c6:mta_11#mxgraphs|mxgraphs]]**  
-  - **AWStats** Logfilezusammenfassung generieren und zum Abrufen via Browser anbieten+    - **[[centos:mail_c6:mta_11#mxgraphs_und_dmarc_co|mxpraphs (DMARC & Co)]]** 
 +  - **[[centos:mail_c6:mta_11#awstats|AWStats]]** Logfilezusammenfassung generieren und zum Abrufen via Browser anbieten
  
 ===== pflogsumm ===== ===== pflogsumm =====
Zeile 851: Zeile 852:
 Möchte man einen graphischen Überblick über die Queues haben, so greifen wir auf das Programm [[http://www.arschkrebs.de/postfix/queuegraph/|Queuegraph]] von [[http://www.arschkrebs.de/|Ralf Hildebrandt]] zurück. Möchte man einen graphischen Überblick über die Queues haben, so greifen wir auf das Programm [[http://www.arschkrebs.de/postfix/queuegraph/|Queuegraph]] von [[http://www.arschkrebs.de/|Ralf Hildebrandt]] zurück.
  
-Das aktuelle Programmpaket**queuegraph** installieren am einfachsten aus dem  [[centos:epel6|Repository epel]].+Das aktuelle Programmpaket **queuegraph** installieren am einfachsten aus dem  [[centos:epel6|Repository epel]].
  
 ==== Installation ==== ==== Installation ====
Zeile 1923: Zeile 1924:
  
 ===== mxgraphs und DMARC & Co ===== ===== mxgraphs und DMARC & Co =====
 +Hat man bei seinem Mailserver [[centos:mail_c6:mta_13|DMARC]] im Einsatz, möchte man in aller Regel auch eine graphisch aufbereitete Übersicht über die **Milter**((**M**ailf**ilter**)) [[centos:mail_c6:mta_10#spf-bewertung_bei_der_mailannahme|SMF-SPF]], [[centos:mail_c6:mta_9#installation_von_opendkim|OpenDKIM]] und [[centos:mail_c6:mta_13|OpenDMARC]] haben. Angelehnt auf den [[https://www.kernel-error.de/postfix/mailgraph-aufgebohrt|Mailgraph Patch]] von [[kernel-error@kernel-error.com|Sebastian van de Meer]] erweitern wir nun unsere [[centos:mail_c6:mta_11?&#mxgraphs|mxgraphs-Installation]].
  
-{{ :centos:mail_c6:mxgraphs_testmx.dmz.nausch.org.png?direct&600 |Bildschirmhardcopy: mxgraphs}}+==== Installation ==== 
 +Für die Einbindung der Übersichtsgraphiken für SPF, DKIM und DMARC benötigen wir das Paket **mailgraph**, dass wir aus dem [[centos:epel6|EPEL-Repository]] bereits installiert haben. Eine ausführliche Installationsanleitung hierzu findet sich [[centos:mail_c6:mta_11?&#mailgraph|hier]]. 
 + 
 +<WRAP round important>**WICHTIG**: 
 + 
 +Durch die Erweiterung, oder besser gesagt die Änderung des Daemons, wir eine neue RRD-Datei //**/var/lib/mailgraph/mailgraph.rrd**// angelegt. 
 +\\ 
 +\\ 
 +Das hat zur Folge, dass ggf. vorhandenen Statistikdaten der **Letzten 31 Tage** und **Letzten 12 Monate** verloren gehen und die Daten vom Start des geänderten Daemon neu angelegt und angezeigt werden! 
 +</WRAP> 
 + 
 +Bevor wir jedoch die Änderungen an unserer Konfiguration durchführen, stoppen wir den ev. bereits laufenden Daemon **mailgraph**. 
 +   # service mailgraph stop 
 + 
 +   Stopping mailgraph:                                        [  OK  ] 
 + 
 +==== Patchen von mailgraph ==== 
 +Zum Anlegen der Statistikdaten müssen wir nun das Perl-Script aus dem Paket **mailgraph** erweitern. Hierzu verwenden wir den folgenden Patch **mailgraph-1.14-8_mxgraphs_patch**.  
 + 
 +<file perl mailgraph-1.14-8_mxgraphs_patch>-- 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 <david@schweikert.ch> 
 + # released under the GNU General Public License 
 ++# with dkim-, dmarc, spf-patch Sebastian van de Meer <kernel-error@kernel-error.de> 
 +  
 + ######## 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; 
 +</file> 
 + 
 +Zunächst kopieren wir die vorhandene Datei **mailgraph** nach //**/tmp**//, um sie dort zu patchen. 
 +   # cp /usr/sbin/mailgraph /tmp 
 + 
 +Dann wechseln wir in das Zielverzeichnis. 
 +   # cd /tmp 
 + 
 +Und laden uns den oben aufgeführten Patch zum Ändern der vorhandenen Datei auf unseren Rechner. 
 + 
 +Anschließend wenden wir den Patch mit nachfolgendem Aufruf an. 
 +   # patch -p0 < mailgraph-1.14-8_mxgraphs_patch 
 + 
 +   patching file mailgraph 
 + 
 +Zu guter letzt kopieren wir nun noch das geänderte perl-Script zurück an Ort und Stelle. 
 +   # mv mailgraph /usr/sbin/ -f 
 + 
 +Nun können wir den Daemon **mailgraph** wieder starten. 
 +   # service mailgraph start 
 + 
 +Starting mailgraph:                                        [  OK  ] 
 + 
 +==== Patchen von mxgraphs.cgi ==== 
 +Damit die zusätzlichen Statistikdaten für die drei Milter **SPF**, **DKIM** und **DMARC** graphisch aufbereitet werden können, müssen wir unser vorhandenes //**cgi-Script**// **mxgraphs.cgi** aus der bereits [[centos:mail_c6:mta_11?&#mxgraphs|erfolgreichen Installation]] von **mxgraphs** austauschen.  
 +Zum Anlegen der Statistikdaten müssen wir nun das Perl-Script aus dem Paket **mailgraph** erweitern.  
 + 
 +Hierzu verwenden wir den folgenden Patch **mxgraphs_spf_dkim_dmarc.patch**.  
 + 
 +<file perl mxgraphs_spf_dkim_dmarc.patch>--- mxgraphs.cgi        2014-05-15 15:48:24.628000137 +0200 
 ++++ mxgraphs.cgi   2014-05-15 15:31:10.293000217 +0200 
 +@@ -5,12 +5,14 @@ 
 + # copyright (c) 2000-2007 David Schweikert <david@schweikert.ch> 
 + # modifed 2011 for grey Markus Neubauer <neubauer@std-service.com> 
 + # modified 2013 for mxgraphs by Django <django@it-ignorant.de> 
 ++# modified 2014 for mxgraphs (v2) by Django <django@it-ignorant.de> based on  
 ++# patches from  Sebastian van de Meer <kernel-error@kernel-error.de> 
 + # released under the GNU General Public License 
 +  
 + use RRDs; 
 + use POSIX qw(uname); 
 +  
 +-my $VERSION = "0.02"; 
 ++my $VERSION = "0.03"; 
 +  
 + my $host = (POSIX::uname())[1]; 
 + my $scriptname = 'mxgraphs.cgi'; 
 +@@ -21,6 +23,9 @@ 
 + my $ypoints_grey = 160; 
 + my $ypoints_greydetail = 160; 
 + my $ypoints_queue = 160; 
 ++my $ypoints_spf = 160; 
 ++my $ypoints_dkim = 160; 
 ++my $ypoints_dmarc = 160; 
 + my $rrd = '/var/lib/mailgraph/mailgraph.rrd';                          # path to where the Mailgraph RRD database is 
 + my $rrd_virus = '/var/lib/mailgraph/mailgraph_virus.rrd';              # path to where the Virus     RRD database is 
 + my $rrd_queue = '/var/lib/queuegraph/mailqueues.rrd';                  # path to where the Mailqueue RRD database is 
 +@@ -39,17 +44,26 @@ 
 +        sent        => '000099',                                        # rrggbb in hex 
 +        received    => '009900', 
 +        whitelist   => '999999', 
 +-       new         => 'C1C1C1', 
 ++       new         => 'FF77EE', 
 +        early       => 'AA0000',  
 +        qspam       => '000000', 
 +        awl         => 'DDBB00', 
 +-       reconnectok => '88FF00', 
 ++       reconnectok => '7700DD', 
 +        rejected    => 'AA0000',  
 +        bounced     => '000000', 
 +        virus       => 'DDBB00', 
 +        spam        => '999999', 
 +        active      => 'EFEF00', 
 +        deferred    => 'DD8800', 
 ++       spfnone     => '12FF0A', 
 ++       spffail     => 'f80b6f', 
 ++       spfpass     => '2E5fEC', 
 ++        dkimnone    => 'E6E27A', 
 ++        dkimfail    => 'FF6600', 
 ++       dkimpass    => '3013EC', 
 ++       dmarcnone   => 'F0B166', 
 ++       dmarcfail   => 'f11717', 
 ++       dmarcpass   => '00FFD5', 
 + ); 
 +  
 + sub rrd_graph(@) 
 +@@ -276,6 +290,128 @@ 
 + } 
 +  
 +  
 ++sub graph_spf($$) 
 ++{ 
 ++       my ($range, $file) = @_; 
 ++       my $step = $range*$points_per_sample/$xpoints; 
 ++       rrd_graph($range, $file, $ypoints_spf, 
 ++               "DEF:spfpass=$rrd:spfpass:AVERAGE", 
 ++               "DEF:mspfpass=$rrd:spfpass:MAX", 
 ++               "CDEF:rspfpass=spfpass,60,*", 
 ++               "CDEF:dspfpass=spfpass,UN,0,spfpass,IF,$step,*", 
 ++               "CDEF:sspfpass=PREV,UN,dspfpass,PREV,IF,dspfpass,+", 
 ++               "CDEF:rmspfpass=mspfpass,60,*", 
 ++               "AREA:rspfpass#$color{spfpass}:SPF pass", 
 ++               'GPRINT:sspfpass:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rspfpass:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmspfpass:MAX:max\: %4.0lf msgs/min\l', 
 ++  
 ++               "DEF:spfnone=$rrd:spfnone:AVERAGE", 
 ++               "DEF:mspfnone=$rrd:spfnone:MAX", 
 ++               "CDEF:rspfnone=spfnone,60,*", 
 ++               "CDEF:dspfnone=spfnone,UN,0,spfnone,IF,$step,*", 
 ++               "CDEF:sspfnone=PREV,UN,dspfnone,PREV,IF,dspfnone,+", 
 ++               "CDEF:rmspfnone=mspfnone,60,*", 
 ++               "LINE2:rspfnone#$color{spfnone}:SPF none", 
 ++               'GPRINT:sspfnone:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rspfnone:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmspfnone:MAX:max\: %4.0lf msgs/min\l', 
 ++  
 ++               "DEF:spffail=$rrd:spffail:AVERAGE", 
 ++               "DEF:mspffail=$rrd:spffail:MAX", 
 ++               "CDEF:rspffail=spffail,60,*", 
 ++               "CDEF:dspffail=spffail,UN,0,spffail,IF,$step,*", 
 ++               "CDEF:sspffail=PREV,UN,dspffail,PREV,IF,dspffail,+", 
 ++               "CDEF:rmspffail=mspffail,60,*", 
 ++               "LINE2:rspffail#$color{spffail}:SPF fail", 
 ++               'GPRINT:sspffail:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rspffail:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmspffail:MAX:max\: %4.0lf msgs/min\l', 
 ++       ); 
 ++} 
 +
 +
 ++sub graph_dkim($$) 
 ++{ 
 ++       my ($range, $file) = @_; 
 ++       my $step = $range*$points_per_sample/$xpoints; 
 ++       rrd_graph($range, $file, $ypoints_dkim, 
 ++               "DEF:dkimpass=$rrd:dkimpass:AVERAGE", 
 ++               "DEF:mdkimpass=$rrd:dkimpass:MAX", 
 ++               "CDEF:rdkimpass=dkimpass,60,*", 
 ++               "CDEF:ddkimpass=dkimpass,UN,0,dkimpass,IF,$step,*", 
 ++               "CDEF:sdkimpass=PREV,UN,ddkimpass,PREV,IF,ddkimpass,+", 
 ++               "CDEF:rmdkimpass=mdkimpass,60,*", 
 ++               "AREA:rdkimpass#$color{dkimpass}:DKIM pass", 
 ++               'GPRINT:sdkimpass:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdkimpass:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdkimpass:MAX:max\: %4.0lf msgs/min\l', 
 +
 ++               "DEF:dkimnone=$rrd:dkimnone:AVERAGE", 
 ++               "DEF:mdkimnone=$rrd:dkimnone:MAX", 
 ++               "CDEF:rdkimnone=dkimnone,60,*", 
 ++               "CDEF:ddkimnone=dkimnone,UN,0,dkimnone,IF,$step,*", 
 ++               "CDEF:sdkimnone=PREV,UN,ddkimnone,PREV,IF,ddkimnone,+", 
 ++               "CDEF:rmdkimnone=mdkimnone,60,*", 
 ++               "LINE2:rdkimnone#$color{dkimnone}:DKIM none", 
 ++               'GPRINT:sdkimnone:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdkimnone:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdkimnone:MAX:max\: %4.0lf msgs/min\l', 
 +
 ++               "DEF:dkimfail=$rrd:dkimfail:AVERAGE", 
 ++               "DEF:mdkimfail=$rrd:dkimfail:MAX", 
 ++               "CDEF:rdkimfail=dkimfail,60,*", 
 ++               "CDEF:ddkimfail=dkimfail,UN,0,dkimfail,IF,$step,*", 
 ++               "CDEF:sdkimfail=PREV,UN,ddkimfail,PREV,IF,ddkimfail,+", 
 ++               "CDEF:rmdkimfail=mdkimfail,60,*", 
 ++               "LINE2:rdkimfail#$color{dkimfail}:DKIM fail", 
 ++               'GPRINT:sdkimfail:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdkimfail:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdkimfail:MAX:max\: %4.0lf msgs/min\l', 
 ++       ); 
 ++} 
 +
 +
 ++sub graph_dmarc($$) 
 ++{ 
 ++       my ($range, $file) = @_; 
 ++       my $step = $range*$points_per_sample/$xpoints; 
 ++       rrd_graph($range, $file, $ypoints_dmarc, 
 ++               "DEF:dmarcpass=$rrd:dmarcpass:AVERAGE", 
 ++               "DEF:mdmarcpass=$rrd:dmarcpass:MAX", 
 ++               "CDEF:rdmarcpass=dmarcpass,60,*", 
 ++               "CDEF:ddmarcpass=dmarcpass,UN,0,dmarcpass,IF,$step,*", 
 ++               "CDEF:sdmarcpass=PREV,UN,ddmarcpass,PREV,IF,ddmarcpass,+", 
 ++               "CDEF:rmdmarcpass=mdmarcpass,60,*", 
 ++               "AREA:rdmarcpass#$color{dmarcpass}:DMARC pass", 
 ++               'GPRINT:sdmarcpass:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdmarcpass:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdmarcpass:MAX:max\: %4.0lf msgs/min\l', 
 +
 ++               "DEF:dmarcnone=$rrd:dmarcnone:AVERAGE", 
 ++               "DEF:mdmarcnone=$rrd:dmarcnone:MAX", 
 ++               "CDEF:rdmarcnone=dmarcnone,60,*", 
 ++               "CDEF:ddmarcnone=dmarcnone,UN,0,dmarcnone,IF,$step,*", 
 ++               "CDEF:sdmarcnone=PREV,UN,ddmarcnone,PREV,IF,ddmarcnone,+", 
 ++               "CDEF:rmdmarcnone=mdmarcnone,60,*", 
 ++               "LINE2:rdmarcnone#$color{dmarcnone}:DMARC none", 
 ++               'GPRINT:sdmarcnone:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdmarcnone:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdmarcnone:MAX:max\: %4.0lf msgs/min\l', 
 +
 ++               "DEF:dmarcfail=$rrd:dmarcfail:AVERAGE", 
 ++               "DEF:mdmarcfail=$rrd:dmarcfail:MAX", 
 ++               "CDEF:rdmarcfail=dmarcfail,60,*", 
 ++               "CDEF:ddmarcfail=dmarcfail,UN,0,dmarcfail,IF,$step,*", 
 ++               "CDEF:sdmarcfail=PREV,UN,ddmarcfail,PREV,IF,ddmarcfail,+", 
 ++               "CDEF:rmdmarcfail=mdmarcfail,60,*", 
 ++               "LINE2:rdmarcfail#$color{dmarcfail}:DMARC fail", 
 ++               'GPRINT:sdmarcfail:MAX:total\: %8.0lf msgs', 
 ++               'GPRINT:rdmarcfail:AVERAGE:avg\: %5.2lf msgs/min', 
 ++               'GPRINT:rmdmarcfail:MAX:max\: %4.0lf msgs/min\l', 
 ++       ); 
 ++} 
 +
 + sub print_html() 
 + { 
 +        print "Content-Type: text/html\n\n"; 
 +@@ -293,7 +429,7 @@ 
 +  <body> 
 + HEADER 
 +  
 +-       print "<h1>Mailserver Statistiken f&uuml;r<br>$host</h1>\n"; 
 ++       print "<h1>Mailserver Statistiken f&uuml;r mx01.nausch.org</h1>\n"; 
 +  
 +        print "<ul id=\"jump\">\n"; 
 +        for my $n (0..$#graphs) { 
 +@@ -308,6 +444,9 @@ 
 +                 print "<p><img src=\"$scriptname?${n}-g\" alt=\"mxgraphs - greylisted\"/></p>\n"; 
 +                 print "<p><img src=\"$scriptname?${n}-d\" alt=\"mxgraphs - greylisted (detailed)\"/></p>\n"; 
 +                 print "<p><img src=\"$scriptname?${n}-q\" alt=\"mxgraphs - mailqueues\"/></p>\n"; 
 ++               print "<p><img src=\"$scriptname?${n}-f\" alt=\"mxgraphs - spf checked\"/></p>\n"; 
 ++               print "<p><img src=\"$scriptname?${n}-m\" alt=\"mxgraphs - dkim checked\"/></p>\n"; 
 ++               print "<p><img src=\"$scriptname?${n}-c\" alt=\"mxgraphs - dmarc checked\"/></p>\n"; 
 +        } 
 +  
 +        print <<FOOTER; 
 +@@ -321,10 +460,12 @@ 
 +    <tr class="row0"> 
 +     <td class="col0 leftalign"> 
 +      <a href="http://dokuwiki.nausch.org/doku.php/centos:mail_c6:mta_11#mxgraphs">MX-Graphs </a>$VERSION by  
 +-     <a href="mailto:django@it-ignorant.org?subject=MX-Graphs%20for%20my%20Mailserver">Django</a> based on 
 ++     <a href="mailto:django@mailserver.guru?subject=MX-Graphs%20for%20my%20Mailserver">Django</a> based on 
 +     </td> 
 +     <td> 
 +      <a href="http://david.schweikert.ch/">David Schweikert's</a> <a href="http://mailgraph.schweikert.ch/">Mailgraph</a>,  
 ++     <a href="http://www.gichenbacher.de/kontakt">Markus Neubauer's </a>  
 ++     <a href="http://www.std-soft.com/bfaq/46-k-faq-server/117-greygraph-mail-statistik.html">Greygraph</a>, 
 +     </td> 
 +     <td class="col2 rightalign" rowspan="3">  
 +      <a href="http://oss.oetiker.ch/rrdtool/"><img src="rrdtool-3dlogo.png" alt="" width="135" height="50" align="right" align="middle"/></a> 
 +@@ -334,15 +475,9 @@ 
 +     <td class="col0 leftalign">           
 +     </td> 
 +     <td class="col1 leftalign"> 
 +-     <a href="http://www.gichenbacher.de/kontakt">Markus Neubauer's </a>  
 +-     <a href="http://www.std-soft.com/bfaq/46-k-faq-server/117-greygraph-mail-statistik.html">Greygraph</a> and 
 +-    </td> 
 +-   </tr> 
 +-   <tr class="row2"> 
 +-    <td class="col0 leftalign">           
 +-    </td> 
 +-    <td class="col1 leftalign">  
 +-     <a href="http://www.arschkrebs.de/">Ralf Hildebrandt's </a><a href="http://www.arschkrebs.de/postfix/queuegraph">Queuegraph</a>  
 ++     <a href="http://www.arschkrebs.de/">Ralf Hildebrandt's </a><a href="http://www.arschkrebs.de/postfix/queuegraph">Queuegraph</a> and  
 ++     <a href="https://www.kernel-error.de/">Sebastian van de Meer's </a> 
 ++     <a href="https://www.kernel-error.de/postfix/mailgraph-aufgebohrt">mailgraphpatches</a>
 +     </td> 
 +    </tr> 
 +   </table> 
 +@@ -404,6 +539,21 @@ 
 +                         graph_queue($graphs[$1]{seconds}, $file); 
 +                         send_image($file); 
 +                 } 
 ++               elsif($img =~ /^(\d+)-f$/) { 
 ++                       my $file = "$tmp_dir/$uri/mailgraph_$1_spf.png"; 
 ++                       graph_spf($graphs[$1]{seconds}, $file); 
 ++                       send_image($file); 
 ++               } 
 ++                elsif($img =~ /^(\d+)-m$/) { 
 ++                        my $file = "$tmp_dir/$uri/mailgraph_$1_dkim.png"; 
 ++                        graph_dkim($graphs[$1]{seconds}, $file); 
 ++                        send_image($file); 
 ++                } 
 ++               elsif($img =~ /^(\d+)-c$/) { 
 ++                       my $file = "$tmp_dir/$uri/mailgraph_$1_dmarc.png"; 
 ++                       graph_dmarc($graphs[$1]{seconds}, $file); 
 ++                       send_image($file); 
 ++               } 
 +                else { 
 +                        die "ERROR: invalid argument\n"; 
 +                } 
 +</file> 
 + 
 +Wie auch schon zuvor bei unserem Daemon, kopieren wir zum Patchen das Perl-Script nach //**/tmp/**//
 +   # cp /usr/share/mxgraphs/mxgraphs.cgi /tmp/ 
 + 
 +Dann laden wir den obigen Patch auf unseren Rechner und legen diesen im Verzeichnis //**/tmp**// unter dem Dateinamen **mxgraphs_spf_dkim_dmarc.patch** ab. 
 + 
 +Anschließend wenden wir den Patch an. 
 +   # patch -p0 < mxgraphs_spf_dkim_dmarc.patch 
 + 
 +Und kopieren zu guter Letzt das geänderte Script an Ort und Stelle. 
 +   # mv /tmp/mxgraphs.cgi /usr/share/mxgraphs/ -f 
 + 
 +Alternativ können wir auch nachfolgendes CGI-sript, bei dem der Patch schon angewandt wurde, auf unseren Rechner laden und ins Verzeichnis //**/usr/share/mxgraphs/**// kopieren. 
 + 
 +<file perl /usr/share/mxgraphs/mxgraphs.cgi>#!/usr/bin/perl -w 
 + 
 +# mxgraphs -- detailed postfix mail traffic statistics 
 +# copyright (c) 2000-2007 ETH Zurich 
 +# copyright (c) 2000-2007 David Schweikert <david@schweikert.ch> 
 +# modifed 2011 for grey Markus Neubauer <neubauer@std-service.com> 
 +# modified 2013 for mxgraphs by Django <django@it-ignorant.de> 
 +# released under the GNU General Public License 
 + 
 +use RRDs; 
 +use POSIX qw(uname); 
 + 
 +my $VERSION = "0.02"; 
 + 
 +my $host = (POSIX::uname())[1]; 
 +my $scriptname = 'mxgraphs.cgi'; 
 +my $xpoints = 800; 
 +my $points_per_sample = 3; 
 +my $ypoints = 160; 
 +my $ypoints_err = 160; 
 +my $ypoints_grey = 160; 
 +my $ypoints_greydetail = 160; 
 +my $ypoints_queue = 160; 
 +my $rrd = '/var/lib/mailgraph/mailgraph.rrd';                           # path to where the Mailgraph RRD database is 
 +my $rrd_virus = '/var/lib/mailgraph/mailgraph_virus.rrd';               # path to where the Virus     RRD database is 
 +my $rrd_queue = '/var/lib/queuegraph/mailqueues.rrd';                   # path to where the Mailqueue RRD database is 
 +my $rrd_grey = '/var/lib/greygraph/greygraph.rrd';                      # path to where the Greygraph RRD database is 
 +my $rrd_spam = '/var/lib/greygraph/greygraph_spam.rrd';                 # path to where the Spam      RRD database is 
 +my $tmp_dir = '/var/cache/mxgraphs';                                    # temporary directory where to store the images 
 + 
 +my @graphs = ( 
 +        { title => 'Letzten 24 Stunden', seconds => 3600*24,     }, 
 +        { title => 'Letzten 7 Tage',     seconds => 3600*24*7,   }, 
 +        { title => 'Letzten 31 Tage',    seconds => 3600*24*31,  }, 
 +        { title => 'Letzten 12 Monate',  seconds => 3600*24*365, }, 
 +); 
 + 
 +my %color = ( 
 +        sent        => '000099',                                        # rrggbb in hex 
 +        received    => '009900', 
 +        whitelist   => '999999', 
 +        new         => 'C1C1C1', 
 +        early       => 'AA0000',  
 +        qspam       => '000000', 
 +        awl         => 'DDBB00', 
 +        reconnectok => '88FF00', 
 +        rejected    => 'AA0000',  
 +        bounced     => '000000', 
 +        virus       => 'DDBB00', 
 +        spam        => '999999', 
 +        active      => 'EFEF00', 
 +        deferred    => 'DD8800', 
 +); 
 + 
 +sub rrd_graph(@) 
 +        { 
 +        my ($range, $file, $ypoints, @rrdargs) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        my $end  = time; $end -= $end % $step; 
 +        my $date = localtime(time); 
 +        $date =~ s|:|\\:|g unless $RRDs::VERSION < 1.199908; 
 + 
 +        my ($graphret,$xs,$ys) = RRDs::graph($file, 
 +                '--imgformat', 'PNG', 
 +                '--width', $xpoints, 
 +                '--height', $ypoints, 
 +                '--start', "-$range", 
 +                '--end', $end, 
 +                '--vertical-label', 'msgs/min', 
 +                '--lower-limit', 0, 
 +                '--units-exponent', 0,                                  # don't show milli-messages/
 +                '--lazy', 
 +                '--color', 'SHADEA#ffffff', 
 +                '--color', 'SHADEB#ffffff', 
 +                '--color', 'BACK#ffffff', 
 + 
 +                $RRDs::VERSION < 1.2002 ? () : ( '--slope-mode'), 
 + 
 +                @rrdargs, 
 + 
 +                'COMMENT:['.$date.']\r', 
 +        ); 
 +        my $ERR=RRDs::error; 
 +        die "ERROR: $ERR\n" if $ERR; 
 +
 + 
 + 
 +sub graph($$) 
 +        { 
 +        my ($range, $file) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        rrd_graph($range, $file, $ypoints, 
 + 
 +                "DEF:sent=$rrd:sent:AVERAGE", 
 +                "DEF:msent=$rrd:sent:MAX", 
 +                "CDEF:rsent=sent,60,*", 
 +                "CDEF:rmsent=msent,60,*", 
 +                "CDEF:dsent=sent,UN,0,sent,IF,$step,*", 
 +                "CDEF:ssent=PREV,UN,dsent,PREV,IF,dsent,+", 
 +                "AREA:rsent#$color{sent}:Sent                    ", 
 +                'GPRINT:ssent:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rsent:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmsent:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:recv=$rrd:recv:AVERAGE", 
 +                "DEF:mrecv=$rrd:recv:MAX", 
 +                "CDEF:rrecv=recv,60,*", 
 +                "CDEF:rmrecv=mrecv,60,*", 
 +                "CDEF:drecv=recv,UN,0,recv,IF,$step,*", 
 +                "CDEF:srecv=PREV,UN,drecv,PREV,IF,drecv,+", 
 +                "LINE2:rrecv#$color{received}:Received                ", 
 +                'GPRINT:srecv:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rrecv:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmrecv:MAX:max\: %11.0lf msgs/min\l', 
 +        ); 
 +
 + 
 + 
 +sub graph_err($$) 
 +        { 
 +        my ($range, $file) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        rrd_graph($range, $file, $ypoints_err, 
 + 
 +                "DEF:bounced=$rrd:bounced:AVERAGE", 
 +                "DEF:mbounced=$rrd:bounced:MAX", 
 +                "CDEF:rbounced=bounced,60,*", 
 +                "CDEF:dbounced=bounced,UN,0,bounced,IF,$step,*", 
 +                "CDEF:sbounced=PREV,UN,dbounced,PREV,IF,dbounced,+", 
 +                "CDEF:rmbounced=mbounced,60,*", 
 +                "AREA:rbounced#$color{bounced}:Bounced                 ", 
 +                'GPRINT:sbounced:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rbounced:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmbounced:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:virus=$rrd_virus:virus:AVERAGE", 
 +                "DEF:mvirus=$rrd_virus:virus:MAX", 
 +                "CDEF:rvirus=virus,60,*", 
 +                "CDEF:dvirus=virus,UN,0,virus,IF,$step,*", 
 +                "CDEF:svirus=PREV,UN,dvirus,PREV,IF,dvirus,+", 
 +                "CDEF:rmvirus=mvirus,60,*", 
 +                "STACK:rvirus#$color{virus}:Viruses                 ", 
 +                'GPRINT:svirus:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rvirus:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmvirus:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:spam=$rrd_virus:spam:AVERAGE", 
 +                "DEF:mspam=$rrd_virus:spam:MAX", 
 +                "CDEF:rspam=spam,60,*", 
 +                "CDEF:dspam=spam,UN,0,spam,IF,$step,*", 
 +                "CDEF:sspam=PREV,UN,dspam,PREV,IF,dspam,+", 
 +                "CDEF:rmspam=mspam,60,*", 
 +                "STACK:rspam#$color{spam}:Spam                    ", 
 +                'GPRINT:sspam:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rspam:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmspam:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:rejected=$rrd:rejected:AVERAGE", 
 +                "DEF:mrejected=$rrd:rejected:MAX", 
 +                "CDEF:rrejected=rejected,60,*", 
 +                "CDEF:drejected=rejected,UN,0,rejected,IF,$step,*", 
 +                "CDEF:srejected=PREV,UN,drejected,PREV,IF,drejected,+", 
 +                "CDEF:rmrejected=mrejected,60,*", 
 +                "LINE2:rrejected#$color{rejected}:Rejected                ", 
 +                'GPRINT:srejected:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rrejected:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmrejected:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +        ); 
 +
 + 
 + 
 +sub graph_queue($$) 
 +        { 
 +        my ($range, $file) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        rrd_graph($range, $file, $ypoints_queue, 
 +                "DEF:deferred=$rrd_queue:deferred:AVERAGE", 
 +                "AREA:deferred#$color{deferred}:Deferred                ", 
 +                'GPRINT:deferred:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:deferred:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:deferred:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:active=$rrd_queue:active:AVERAGE", 
 +                "LINE2:active#$color{active}:Active+Incoming+Maildrop", 
 +                'GPRINT:active:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:active:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:active:MAX:max\: %11.0lf msgs/min\l', 
 +        ); 
 +
 + 
 + 
 +sub graph_grey($$) 
 +        { 
 +        my ($range, $file) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        rrd_graph($range, $file, $ypoints_grey, 
 + 
 +                "DEF:new=$rrd_grey:new:AVERAGE", 
 +                "DEF:mnew=$rrd_grey:new:MAX", 
 +                "CDEF:rnew=new,60,*", 
 +                "CDEF:rmnew=mnew,60,*", 
 +                "CDEF:dnew=new,UN,0,new,IF,$step,*", 
 +                "CDEF:snew=PREV,UN,dnew,PREV,IF,dnew,+", 
 +                "LINE2:rnew#$color{new}:New                     ", 
 +                'GPRINT:snew:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rnew:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmnew:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:reconnectok=$rrd_spam:reconnectok:AVERAGE", 
 +                "DEF:mreconnectok=$rrd_spam:reconnectok:MAX", 
 +                "CDEF:rreconnectok=reconnectok,60,*", 
 +                "CDEF:dreconnectok=reconnectok,UN,0,reconnectok,IF,$step,*", 
 +                "CDEF:sreconnectok=PREV,UN,dreconnectok,PREV,IF,dreconnectok,+", 
 +                "CDEF:rmreconnectok=mreconnectok,60,*", 
 +                "LINE2:rreconnectok#$color{reconnectok}:Reconnect O.K.          ", 
 +                'GPRINT:sreconnectok:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rreconnectok:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmreconnectok:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +        ); 
 +
 + 
 + 
 +sub graph_greydetail($$) 
 +
 +        my ($range, $file) = @_; 
 +        my $step = $range*$points_per_sample/$xpoints; 
 +        rrd_graph($range, $file, $ypoints_greydetail, 
 + 
 +                "DEF:whitelist=$rrd_grey:whitelist:AVERAGE", 
 +                "DEF:mwhitelist=$rrd_grey:whitelist:MAX", 
 +                "CDEF:rwhitelist=whitelist,60,*", 
 +                "CDEF:rmwhitelist=mwhitelist,60,*", 
 +                "CDEF:dwhitelist=whitelist,UN,0,whitelist,IF,$step,*", 
 +                "CDEF:swhitelist=PREV,UN,dwhitelist,PREV,IF,dwhitelist,+", 
 +                "LINE2:rwhitelist#$color{whitelist}:Whitelist               ", 
 +                'GPRINT:swhitelist:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rwhitelist:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmwhitelist:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:awl=$rrd_grey:awl:AVERAGE", 
 +                "DEF:mawl=$rrd_grey:awl:MAX", 
 +                "CDEF:rawl=awl,60,*", 
 +                "CDEF:dawl=awl,UN,0,awl,IF,$step,*", 
 +                "CDEF:sawl=PREV,UN,dawl,PREV,IF,dawl,+", 
 +                "CDEF:rmawl=mawl,60,*", 
 +                "LINE2:rawl#$color{awl}:Auto whitelist          ", 
 +                'GPRINT:sawl:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rawl:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmawl:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:spam=$rrd_spam:spam:AVERAGE", 
 +                "DEF:mspam=$rrd_spam:spam:MAX", 
 +                "CDEF:rspam=spam,60,*", 
 +                "CDEF:dspam=spam,UN,0,spam,IF,$step,*", 
 +                "CDEF:sspam=PREV,UN,dspam,PREV,IF,dspam,+", 
 +                "CDEF:rmspam=mspam,60,*", 
 +                "LINE2:rspam#$color{qspam}:Spam                    ", 
 +                'GPRINT:sspam:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rspam:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmspam:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +                "DEF:early=$rrd_grey:early:AVERAGE", 
 +                "DEF:mearly=$rrd_grey:early:MAX", 
 +                "CDEF:rearly=early,60,*", 
 +                "CDEF:dearly=early,UN,0,early,IF,$step,*", 
 +                "CDEF:searly=PREV,UN,dearly,PREV,IF,dearly,+", 
 +                "CDEF:rmearly=mearly,60,*", 
 +                "STACK:rearly#$color{early}:Early connect           ", 
 +                'GPRINT:searly:MAX:total\: %15.0lf msgs', 
 +                'GPRINT:rearly:AVERAGE:avg\: %12.2lf msgs/min', 
 +                'GPRINT:rmearly:MAX:max\: %11.0lf msgs/min\l', 
 + 
 +        ); 
 +
 + 
 + 
 +sub print_html() 
 +
 +        print "Content-Type: text/html\n\n"; 
 + 
 +        print <<HEADER; 
 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 +<html> 
 + <head> 
 +  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 +  <title>Mailserver Statistiken auf $host</title> 
 +  <meta http-equiv="Refresh" content="300" /> 
 +  <meta http-equiv="Pragma" content="no-cache" /> 
 +  <link rel="stylesheet" href="mxgraphs.css" type="text/css" /> 
 + </head> 
 + <body> 
 +HEADER 
 + 
 +        print "<h1>Mailserver Statistiken f&uuml;r<br>$host</h1>\n"; 
 + 
 +        print "<ul id=\"jump\">\n"; 
 +        for my $n (0..$#graphs) { 
 +                print "  <li><a href=\"#G$n\">$graphs[$n]{title}</a>&nbsp;</li>\n"; 
 +        } 
 +        print "</ul>\n"; 
 + 
 +        for my $n (0..$#graphs) { 
 +                print "<h2 id=\"G$n\">$graphs[$n]{title}</h2>\n"; 
 +                print "<p><img src=\"$scriptname?${n}-n\" alt=\"mxgraphs - received and sent\"/></p>\n"; 
 +                print "<p><img src=\"$scriptname?${n}-e\" alt=\"mxgraphs - blocked\"/></p>\n"; 
 +                print "<p><img src=\"$scriptname?${n}-g\" alt=\"mxgraphs - greylisted\"/></p>\n"; 
 +                print "<p><img src=\"$scriptname?${n}-d\" alt=\"mxgraphs - greylisted (detailed)\"/></p>\n"; 
 +                print "<p><img src=\"$scriptname?${n}-q\" alt=\"mxgraphs - mailqueues\"/></p>\n"; 
 +        } 
 + 
 +        print <<FOOTER; 
 + <hr/> 
 +  <table border="0" style="font-size:12px" width="900"> 
 +   <colgroup> 
 +    <col width="200"> 
 +    <col width="425"> 
 +    <col width="123"> 
 +   </colgroup> 
 +   <tr class="row0"> 
 +    <td class="col0 leftalign"> 
 +     <a href="http://dokuwiki.nausch.org/doku.php/centos:mail_c6:mta_11#mxgraphs">MX-Graphs </a>$VERSION by  
 +     <a href="mailto:django@it-ignorant.org?subject=MX-Graphs%20for%20my%20Mailserver">Django</a> based on 
 +    </td> 
 +    <td> 
 +     <a href="http://david.schweikert.ch/">David Schweikert's</a> <a href="http://mailgraph.schweikert.ch/">Mailgraph</a>,  
 +    </td> 
 +    <td class="col2 rightalign" rowspan="3">  
 +     <a href="http://oss.oetiker.ch/rrdtool/"><img src="rrdtool-3dlogo.png" alt="" width="135" height="50" align="right" align="middle"/></a> 
 +    </td> 
 +   </tr> 
 +   <tr class="row1"> 
 +    <td class="col0 leftalign">           
 +    </td> 
 +    <td class="col1 leftalign"> 
 +     <a href="http://www.gichenbacher.de/kontakt">Markus Neubauer's </a>  
 +     <a href="http://www.std-soft.com/bfaq/46-k-faq-server/117-greygraph-mail-statistik.html">Greygraph</a> and 
 +    </td> 
 +   </tr> 
 +   <tr class="row2"> 
 +    <td class="col0 leftalign">           
 +    </td> 
 +    <td class="col1 leftalign">  
 +     <a href="http://www.arschkrebs.de/">Ralf Hildebrandt's </a><a href="http://www.arschkrebs.de/postfix/queuegraph">Queuegraph</a>  
 +    </td> 
 +   </tr> 
 +  </table> 
 + </body> 
 +</html> 
 +FOOTER 
 +
 + 
 +sub send_image($) 
 +
 +        my ($file)= @_; 
 + 
 +        -r $file or do { 
 +                print "Content-type: text/plain\n\nERROR: can't find $file\n"; 
 +                exit 1; 
 +        }; 
 + 
 +        print "Content-type: image/png\n"; 
 +        print "Content-length: ".((stat($file))[7])."\n"; 
 +        print "\n"; 
 +        open(IMG, $file) or die; 
 +        my $data; 
 +        print $data while read(IMG, $data, 16384)>0; 
 +
 + 
 +sub main() 
 +
 +        my $uri = $ENV{REQUEST_URI} || ''; 
 +        $uri =~ s/\/[^\/]+$//; 
 +        $uri =~ s/\//,/g; 
 +        $uri =~ s/(\~|\%7E)/tilde,/g; 
 +        mkdir $tmp_dir, 0777 unless -d $tmp_dir; 
 +        mkdir "$tmp_dir/$uri", 0777 unless -d "$tmp_dir/$uri"; 
 + 
 +        my $img = $ENV{QUERY_STRING}; 
 +        if(defined $img and $img =~ /\S/) { 
 +                if($img =~ /^(\d+)-n$/) { 
 +                        my $file = "$tmp_dir/$uri/mxgraph_$1.png"; 
 +                        graph($graphs[$1]{seconds}, $file); 
 +                        send_image($file); 
 +                } 
 +                elsif($img =~ /^(\d+)-e$/) { 
 +                        my $file = "$tmp_dir/$uri/mxgraph_$1_err.png"; 
 +                        graph_err($graphs[$1]{seconds}, $file); 
 +                        send_image($file); 
 +                } 
 +                elsif($img =~ /^(\d+)-g$/) { 
 +                        my $file = "$tmp_dir/$uri/mxgraph_$1_grey.png"; 
 +                        graph_grey($graphs[$1]{seconds}, $file); 
 +                        send_image($file); 
 +                } 
 +                elsif($img =~ /^(\d+)-d$/) { 
 +                        my $file = "$tmp_dir/$uri/mxgraph_$1_greydetail.png"; 
 +                        graph_greydetail($graphs[$1]{seconds}, $file); 
 +                        send_image($file); 
 +                } 
 +                elsif($img =~ /^(\d+)-q$/) { 
 +                        my $file = "$tmp_dir/$uri/mxgraph_$1_queue.png"; 
 +                        graph_queue($graphs[$1]{seconds}, $file); 
 +                        send_image($file); 
 +                } 
 +                else { 
 +                        die "ERROR: invalid argument\n"; 
 +                } 
 +        } 
 +        else { 
 +                print_html; 
 +        } 
 +
 + 
 +main; 
 +</file> 
 + 
 +==== Webaufruf ==== 
 +Über unseren [[https://mxgraphs.nausch.org|Vhost]] erhalten wir nun optisch schön ansprechende Übersichten über den Mailverkehr unseres MX. 
 + 
 +{{ :centos:mail_c6:mxgraphs_testmx.dmz.nausch.org.png?direct&601 |Bildschirmhardcopy: mxgraphs}}
 ===== AWStats ===== ===== AWStats =====
 Mit Hilfe zweier Perlscripte erstellen wir nun täglich einen Statusbericht über das was unserem MX widerfahren ist, und rufen später diese Information via Firefox/Konqueror ab. :) Mit Hilfe zweier Perlscripte erstellen wir nun täglich einen Statusbericht über das was unserem MX widerfahren ist, und rufen später diese Information via Firefox/Konqueror ab. :)
Zeile 3782: Zeile 4663:
   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  
-~~DISCUSSION~~+ 
 + 
  • centos/mail_c6/mta_11.1399969367.txt.gz
  • Zuletzt geändert: 13.05.2014 08:22.
  • von django