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 19:52. ] – [mxgraphs und DMARC & Co] 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 1927: Zeile 1928:
 ==== Installation ==== ==== 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]]. 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**. Bevor wir jedoch die Änderungen an unserer Konfiguration durchführen, stoppen wir den ev. bereits laufenden Daemon **mailgraph**.
Zeile 1933: Zeile 1942:
    Stopping mailgraph:                                        [  OK  ]    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**.  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**. 
  
Zeile 2072: Zeile 2082:
 </file> </file>
  
-Nachdem wir den patch heruntergeladen habenwenden wir den Patch gegen das vorhanden script an.+Zunächst kopieren wir die vorhandene Datei **mailgraph** nach //**/tmp**//um sie dort zu patchen. 
 +   # cp /usr/sbin/mailgraph /tmp
  
-FIXME+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/s
 +                '--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&600 |Bildschirmhardcopy: mxgraphs}}+{{ :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 3935: 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.1400010756.txt.gz
  • Zuletzt geändert: 13.05.2014 19:52.
  • von django