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 [13.05.2014 08:22. ] – [Webaufruf] 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 1923: | Zeile 1924: | ||
===== mxgraphs und DMARC & Co ===== | ===== mxgraphs und DMARC & Co ===== | ||
+ | Hat man bei seinem Mailserver [[centos: | ||
- | {{ : | + | ==== Installation ==== |
+ | Für die Einbindung der Übersichtsgraphiken für SPF, DKIM und DMARC benötigen wir das Paket **mailgraph**, | ||
+ | |||
+ | <WRAP round important> | ||
+ | |||
+ | Durch die Erweiterung, | ||
+ | \\ | ||
+ | \\ | ||
+ | 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! | ||
+ | </ | ||
+ | |||
+ | Bevor wir jedoch die Änderungen an unserer Konfiguration durchführen, | ||
+ | # service mailgraph stop | ||
+ | |||
+ | | ||
+ | |||
+ | ==== 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 | ||
+ | @@ -4,6 +4,7 @@ | ||
+ | # copyright (c) 2000-2007 ETH Zurich | ||
+ | # copyright (c) 2000-2007 David Schweikert < | ||
+ | # released under the GNU General Public License | ||
+ | +# with dkim-, dmarc, spf-patch Sebastian van de Meer < | ||
+ | |||
+ | ######## | ||
+ | | ||
+ | @@ -381,7 +382,7 @@ | ||
+ | my $rrd_virus = " | ||
+ | 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 @@ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | + ' | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | @@ -853,6 +872,45 @@ | ||
+ | event($time, | ||
+ | } | ||
+ | } | ||
+ | + elsif ($prog eq ' | ||
+ | + if ($text =~ /SPF pass:/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + elsif($text =~ /SPF none:/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + | ||
+ | + | ||
+ | + } | ||
+ | +# elsif($text =~ /SPF fail:\b/) { | ||
+ | +# event($time, | ||
+ | +# } | ||
+ | +# elsif($text =~ /SPF softfail: | ||
+ | +# event($time, | ||
+ | +# } | ||
+ | + } | ||
+ | + elsif ($prog eq ' | ||
+ | + if ($text =~ /DKIM verification successful/ | ||
+ | + event($time, | ||
+ | + } | ||
+ | + elsif($text =~ /no signature data/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + elsif($text =~ /bad signature data/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + } | ||
+ | + elsif ($prog eq ' | ||
+ | + if ($text =~ /pass/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + elsif($text =~ /none/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + elsif($text =~ /fail/) { | ||
+ | + event($time, | ||
+ | + } | ||
+ | + } | ||
+ | } | ||
+ | |||
+ | sub event($$) | ||
+ | @@ -870,13 +928,17 @@ | ||
+ | return 1 if $m == $this_minute; | ||
+ | return 0 if $m < $this_minute; | ||
+ | |||
+ | - print " | ||
+ | - | ||
+ | +# print " | ||
+ | + print " | ||
+ | +# RRDs:: | ||
+ | + | ||
+ | RRDs:: | ||
+ | if($m > $this_minute+$rrdstep) { | ||
+ | for(my $sm=$this_minute+$rrdstep; | ||
+ | - print " | ||
+ | - | ||
+ | +# print " | ||
+ | + print " | ||
+ | +# RRDs:: | ||
+ | + | ||
+ | RRDs:: | ||
+ | } | ||
+ | } | ||
+ | @@ -885,6 +947,15 @@ | ||
+ | $sum{received}=0; | ||
+ | $sum{bounced}=0; | ||
+ | $sum{rejected}=0; | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | $sum{virus}=0; | ||
+ | $sum{spam}=0; | ||
+ | return 1; | ||
+ | </ | ||
+ | |||
+ | Zunächst kopieren wir die vorhandene Datei **mailgraph** nach // | ||
+ | # cp / | ||
+ | |||
+ | 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 | ||
+ | |||
+ | | ||
+ | |||
+ | 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: | ||
+ | |||
+ | ==== 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 3782: | Zeile 4663: | ||
* **[[http:// | * **[[http:// | ||
- | ~~DISCUSSION~~ | + | |
+ |