Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
centos:mail_c6:mta_11 [15.05.2014 13:28. ] – [Installation] django | centos:mail_c6:mta_11 [18.11.2024 19:12. ] (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: |
- 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: |
- | - **queuegraph** | + | - **[[centos: |
- | - **greygraph** | + | - **[[centos: |
- | - **mxgraphs** | + | - **[[centos: |
- | - **AWStats** Logfilezusammenfassung generieren und zum Abrufen via Browser anbieten | + | - **[[centos: |
+ | - **[[centos: | ||
===== pflogsumm ===== | ===== pflogsumm ===== | ||
Zeile 851: | Zeile 852: | ||
Möchte man einen graphischen Überblick über die Queues haben, so greifen wir auf das Programm [[http:// | Möchte man einen graphischen Überblick über die Queues haben, so greifen wir auf das Programm [[http:// | ||
- | Das aktuelle Programmpaket**queuegraph** installieren am einfachsten aus dem [[centos: | + | Das aktuelle Programmpaket **queuegraph** installieren am einfachsten aus dem [[centos: |
==== Installation ==== | ==== Installation ==== | ||
Zeile 1941: | Zeile 1942: | ||
| | ||
+ | ==== 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 2086: | Zeile 2088: | ||
# cd /tmp | # cd /tmp | ||
- | Und laden uns den Patch zum Ändern der vorhandenen Datei auf unseren Rechner. | + | Und laden uns den oben aufgeführten |
- | # wget --output-document=mailgraph-1.14-8_mxgraphs_patch https:// | + | |
Anschließend wenden wir den Patch mit nachfolgendem Aufruf an. | Anschließend wenden wir den Patch mit nachfolgendem Aufruf an. | ||
Zeile 2102: | Zeile 2103: | ||
Starting mailgraph: | Starting mailgraph: | ||
+ | ==== 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 // | ||
+ | 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 | ||
+ | @@ -5,12 +5,14 @@ | ||
+ | # copyright (c) 2000-2007 David Schweikert < | ||
+ | # modifed 2011 for grey Markus Neubauer < | ||
+ | # modified 2013 for mxgraphs by Django < | ||
+ | +# modified 2014 for mxgraphs (v2) by Django < | ||
+ | +# patches from Sebastian van de Meer < | ||
+ | # released under the GNU General Public License | ||
+ | |||
+ | use RRDs; | ||
+ | use POSIX qw(uname); | ||
+ | |||
+ | -my $VERSION = " | ||
+ | +my $VERSION = " | ||
+ | |||
+ | my $host = (POSIX:: | ||
+ | my $scriptname = ' | ||
+ | @@ -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 = '/ | ||
+ | my $rrd_virus = '/ | ||
+ | my $rrd_queue = '/ | ||
+ | @@ -39,17 +44,26 @@ | ||
+ | sent => ' | ||
+ | received | ||
+ | whitelist | ||
+ | - | ||
+ | + | ||
+ | early => ' | ||
+ | qspam => ' | ||
+ | awl => ' | ||
+ | - | ||
+ | + | ||
+ | rejected | ||
+ | bounced | ||
+ | virus => ' | ||
+ | spam => ' | ||
+ | active | ||
+ | deferred | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + dkimnone | ||
+ | + dkimfail | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | ); | ||
+ | |||
+ | sub rrd_graph(@) | ||
+ | @@ -276,6 +290,128 @@ | ||
+ | } | ||
+ | |||
+ | |||
+ | +sub graph_spf($$) | ||
+ | +{ | ||
+ | + my ($range, $file) = @_; | ||
+ | + my $step = $range*$points_per_sample/ | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ); | ||
+ | +} | ||
+ | + | ||
+ | + | ||
+ | +sub graph_dkim($$) | ||
+ | +{ | ||
+ | + my ($range, $file) = @_; | ||
+ | + my $step = $range*$points_per_sample/ | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ); | ||
+ | +} | ||
+ | + | ||
+ | + | ||
+ | +sub graph_dmarc($$) | ||
+ | +{ | ||
+ | + my ($range, $file) = @_; | ||
+ | + my $step = $range*$points_per_sample/ | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + " | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ); | ||
+ | +} | ||
+ | + | ||
+ | sub print_html() | ||
+ | { | ||
+ | print " | ||
+ | @@ -293,7 +429,7 @@ | ||
+ | < | ||
+ | | ||
+ | |||
+ | - print "< | ||
+ | + print "< | ||
+ | |||
+ | print "< | ||
+ | for my $n (0..$# | ||
+ | @@ -308,6 +444,9 @@ | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | + print "< | ||
+ | + print "< | ||
+ | + print "< | ||
+ | } | ||
+ | |||
+ | print << | ||
+ | @@ -321,10 +460,12 @@ | ||
+ | <tr class=" | ||
+ | < | ||
+ | <a href=" | ||
+ | - <a href=" | ||
+ | + <a href=" | ||
+ | </ | ||
+ | < | ||
+ | <a href=" | ||
+ | + <a href=" | ||
+ | + <a href=" | ||
+ | </ | ||
+ | < | ||
+ | <a href=" | ||
+ | @@ -334,15 +475,9 @@ | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | - <a href=" | ||
+ | - <a href=" | ||
+ | - </ | ||
+ | - </ | ||
+ | - < | ||
+ | - <td class=" | ||
+ | - </ | ||
+ | - <td class=" | ||
+ | - <a href=" | ||
+ | + <a href=" | ||
+ | + <a href=" | ||
+ | + <a href=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | @@ -404,6 +539,21 @@ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | + | ||
+ | + my $file = " | ||
+ | + | ||
+ | + | ||
+ | + } | ||
+ | + elsif($img =~ / | ||
+ | + my $file = " | ||
+ | + graph_dkim($graphs[$1]{seconds}, | ||
+ | + send_image($file); | ||
+ | + } | ||
+ | + | ||
+ | + my $file = " | ||
+ | + | ||
+ | + | ||
+ | + } | ||
+ | else { | ||
+ | die " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Wie auch schon zuvor bei unserem Daemon, kopieren wir zum Patchen das Perl-Script nach // | ||
+ | # cp / | ||
+ | |||
+ | Dann laden wir den obigen Patch auf unseren Rechner und legen diesen im Verzeichnis // | ||
+ | |||
+ | 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 / | ||
+ | |||
+ | Alternativ können wir auch nachfolgendes CGI-sript, bei dem der Patch schon angewandt wurde, auf unseren Rechner laden und ins Verzeichnis // | ||
+ | |||
+ | <file perl / | ||
+ | |||
+ | # mxgraphs -- detailed postfix mail traffic statistics | ||
+ | # copyright (c) 2000-2007 ETH Zurich | ||
+ | # copyright (c) 2000-2007 David Schweikert < | ||
+ | # modifed 2011 for grey Markus Neubauer < | ||
+ | # modified 2013 for mxgraphs by Django < | ||
+ | # released under the GNU General Public License | ||
+ | |||
+ | use RRDs; | ||
+ | use POSIX qw(uname); | ||
+ | |||
+ | my $VERSION = " | ||
+ | |||
+ | my $host = (POSIX:: | ||
+ | my $scriptname = ' | ||
+ | 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 = '/ | ||
+ | my $rrd_virus = '/ | ||
+ | my $rrd_queue = '/ | ||
+ | my $rrd_grey = '/ | ||
+ | my $rrd_spam = '/ | ||
+ | my $tmp_dir = '/ | ||
+ | |||
+ | my @graphs = ( | ||
+ | { title => ' | ||
+ | { title => ' | ||
+ | { title => ' | ||
+ | { title => ' | ||
+ | ); | ||
+ | |||
+ | my %color = ( | ||
+ | sent => ' | ||
+ | received | ||
+ | whitelist | ||
+ | new => ' | ||
+ | early => ' | ||
+ | qspam => ' | ||
+ | awl => ' | ||
+ | reconnectok => ' | ||
+ | rejected | ||
+ | bounced | ||
+ | virus => ' | ||
+ | spam => ' | ||
+ | active | ||
+ | deferred | ||
+ | ); | ||
+ | |||
+ | sub rrd_graph(@) | ||
+ | { | ||
+ | my ($range, $file, $ypoints, @rrdargs) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | my $end = time; $end -= $end % $step; | ||
+ | my $date = localtime(time); | ||
+ | $date =~ s|:|\\:|g unless $RRDs:: | ||
+ | |||
+ | my ($graphret, | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | $RRDs:: | ||
+ | |||
+ | @rrdargs, | ||
+ | |||
+ | ' | ||
+ | ); | ||
+ | my $ERR=RRDs:: | ||
+ | die " | ||
+ | } | ||
+ | |||
+ | |||
+ | sub graph($$) | ||
+ | { | ||
+ | my ($range, $file) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | rrd_graph($range, | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | |||
+ | sub graph_err($$) | ||
+ | { | ||
+ | my ($range, $file) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | rrd_graph($range, | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | ); | ||
+ | } | ||
+ | |||
+ | |||
+ | sub graph_queue($$) | ||
+ | { | ||
+ | my ($range, $file) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | rrd_graph($range, | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | |||
+ | sub graph_grey($$) | ||
+ | { | ||
+ | my ($range, $file) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | rrd_graph($range, | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | ); | ||
+ | } | ||
+ | |||
+ | |||
+ | sub graph_greydetail($$) | ||
+ | { | ||
+ | my ($range, $file) = @_; | ||
+ | my $step = $range*$points_per_sample/ | ||
+ | rrd_graph($range, | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | ); | ||
+ | } | ||
+ | |||
+ | |||
+ | sub print_html() | ||
+ | { | ||
+ | print " | ||
+ | |||
+ | print << | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <meta http-equiv=" | ||
+ | < | ||
+ | <meta http-equiv=" | ||
+ | <meta http-equiv=" | ||
+ | <link rel=" | ||
+ | </ | ||
+ | < | ||
+ | HEADER | ||
+ | |||
+ | print "< | ||
+ | |||
+ | print "< | ||
+ | for my $n (0..$# | ||
+ | print " | ||
+ | } | ||
+ | print "</ | ||
+ | |||
+ | for my $n (0..$# | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | } | ||
+ | |||
+ | print << | ||
+ | < | ||
+ | <table border=" | ||
+ | < | ||
+ | <col width=" | ||
+ | <col width=" | ||
+ | <col width=" | ||
+ | </ | ||
+ | < | ||
+ | <td class=" | ||
+ | <a href=" | ||
+ | <a href=" | ||
+ | </ | ||
+ | < | ||
+ | <a href=" | ||
+ | </ | ||
+ | <td class=" | ||
+ | <a href=" | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | <td class=" | ||
+ | </ | ||
+ | <td class=" | ||
+ | <a href=" | ||
+ | <a href=" | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | <td class=" | ||
+ | </ | ||
+ | <td class=" | ||
+ | <a href=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | FOOTER | ||
+ | } | ||
+ | |||
+ | sub send_image($) | ||
+ | { | ||
+ | my ($file)= @_; | ||
+ | |||
+ | -r $file or do { | ||
+ | print " | ||
+ | exit 1; | ||
+ | }; | ||
+ | |||
+ | print " | ||
+ | print " | ||
+ | print " | ||
+ | open(IMG, $file) or die; | ||
+ | my $data; | ||
+ | print $data while read(IMG, $data, 16384)> | ||
+ | } | ||
+ | |||
+ | sub main() | ||
+ | { | ||
+ | my $uri = $ENV{REQUEST_URI} || ''; | ||
+ | $uri =~ s/ | ||
+ | $uri =~ s/\//,/g; | ||
+ | $uri =~ s/ | ||
+ | mkdir $tmp_dir, 0777 unless -d $tmp_dir; | ||
+ | mkdir " | ||
+ | |||
+ | my $img = $ENV{QUERY_STRING}; | ||
+ | if(defined $img and $img =~ /\S/) { | ||
+ | if($img =~ / | ||
+ | my $file = " | ||
+ | graph($graphs[$1]{seconds}, | ||
+ | send_image($file); | ||
+ | } | ||
+ | elsif($img =~ / | ||
+ | my $file = " | ||
+ | graph_err($graphs[$1]{seconds}, | ||
+ | send_image($file); | ||
+ | } | ||
+ | elsif($img =~ / | ||
+ | my $file = " | ||
+ | graph_grey($graphs[$1]{seconds}, | ||
+ | send_image($file); | ||
+ | } | ||
+ | elsif($img =~ / | ||
+ | my $file = " | ||
+ | graph_greydetail($graphs[$1]{seconds}, | ||
+ | send_image($file); | ||
+ | } | ||
+ | elsif($img =~ / | ||
+ | my $file = " | ||
+ | graph_queue($graphs[$1]{seconds}, | ||
+ | send_image($file); | ||
+ | } | ||
+ | else { | ||
+ | die " | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | print_html; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | main; | ||
+ | </ | ||
+ | |||
+ | ==== Webaufruf ==== | ||
+ | Über unseren [[https:// | ||
+ | |||
+ | {{ : | ||
===== 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/ | 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/ | ||
Zeile 3961: | Zeile 4663: | ||
* **[[http:// | * **[[http:// | ||
- | ~~DISCUSSION~~ | + | |
+ |