Traffic Report via Mail als Anhang

Traffic Report via Mail als Anhang

Changelog

  • 14.01.2014 – Script fixes for more than one interface, sorry.
  • 14.01.2014 – „mutt“-Script added

Mail mit "vnstati"
Mail mit „vnstati“
In diesem Artikel möchte ich beschreiben, wie ein Traffic Report via Mail mit Bild von einer oder mehreren Interfaces als Collage an einen Empfänger versendet wird.
Die Collage enthält neben täglicher und monatlicher Daten auch eine Zusammenfassung sowie eine „Top 10“.
Für jedes Interface wird eine eigene E-Mail mit dem Betreff „Traffic Report, Interface X – Datum“ versendet.
Hierbei gehe ich von einem bereits konfigurierten Mail-System aus.
Getestet habe ich auf einem Ubuntu Server LTS sowie Debian Stable.

Abhängigkeiten und Vorbereitung

Folgende Abhängigkeiten sind notwendig.

sudo apt-get install vnstati sharutils mailutils imagemagick

„vnstati“ erzeugt für „vnstat“ die Grafiken. Auch in der Command-Line ist „vnstat“ ein nützliches Tool, um Datenverbrauch zu analysieren: „man vnstat“.
„imagemagick“ beeinhaltet das Paket „montage“ für die spätere Zusammenfassung der von „vnstati“ erzeugten Bilder.
„mailutils“ und „sharutils“ werden für den Versand der Übersicht als Anhang benötigt.

Zuerst das Standard-Interface und die Bandbreite in der Konfiguration von „vnstat“ festlegen:

sudo nano /etc/vnstat.conf

„MaxBandwidth“ darf auch auskommentiert werden, um diese Funktion zu deaktivieren, falls erwünscht:

Interface "eth0"
MaxBandwidth 100

Nun für jedes Interface, für das eine Übersicht zur Verfügung stehen soll, eine Datenbank anlegen. Beispiel:

sudo vnstat -u -i eth0
sudo vnstat -u -i eth1

Das Script und Benutzung

Wie im Script zu sehen, werden vorab zwei Variablen angepasst:

INTERFACES=(interface1 interface2 interface3)
MAILTO=empfaenger@domain.tld

Für jedes Interface muss wie oben beschrieben die Datenbank existieren!

#!/bin/bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MONTAGE=`which montage`
VNSTATI=`which vnstati`
UUENCODE=`which uuencode`
MAIL=`which mail`
DATE=`date +%d.%m.%Y`

### CONFIG START ###
INTERFACES=(eth0 eth1)
MAILTO=empfaenger@domain.tld
#### CONFIG END ####

for i in "${INTERFACES[@]}"
do
    rm  ~/out-vnstati_*.png > /dev/null 2>&1
    $VNSTATI -i $i -d -o ~/out-vnstati_d_$i.png
    $VNSTATI -i $i -m -o ~/out-vnstati_m_$i.png
    $VNSTATI -i $i -s -o ~/out-vnstati_s_$i.png
    $VNSTATI -i $i -t -o ~/out-vnstati_t_$i.png
    $MONTAGE -mode concatenate -tile 2x2 ~/out-vnstati_*.png ~/out-vnstati_collage.png
    $UUENCODE ~/out-vnstati_collage.png TRAFFIC_$DATE.png | $MAIL -s "Traffic Report, Interface $i - $DATE" $MAILTO
done
rm  ~/out-vnstati_*.png > /dev/null 2>&1

Usage: ./script.sh
Vorab als ausführbar markieren: chmod +x script.sh

Das Script ist leise, erzeugt also keine Ausgabe, außer es treten Fehler auf.

Optional: Cronjob

Eine Ausführung als Cronjob jeden Tag um 00:00 Uhr würde so funktionieren:

crontab -e

Mit Inhalt:

0 0 * * * /path/to/script.sh

Optional (bei Fehlern): Alternatives Script mit „mutt“

Da es zu Problemen mit der Dekodierung des Anhangs kommen kann, habe ich ein alternatives Script geschrieben, welches „mutt“ anstatt „mail“ und „uuencode“ verwendet. Falls noch nicht geschehen, „mutt“ jetzt installieren:

sudo apt-get install mutt

Das Script unterscheidet sich lediglich in der Art des Versands:

#!/bin/bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MONTAGE=`which montage`
VNSTATI=`which vnstati`
MUTT=`which mutt`
DATE=`date +%d.%m.%Y`

### CONFIG START ###
INTERFACES=(eth0 eth1)
MAILTO=empfaenger@domain.tld
#### CONFIG END ####

for i in "${INTERFACES[@]}"
do
    rm  ~/out-vnstati_*.png > /dev/null 2>&1
    $VNSTATI -i $i -d -o ~/out-vnstati_d_$i.png
    $VNSTATI -i $i -m -o ~/out-vnstati_m_$i.png
    $VNSTATI -i $i -s -o ~/out-vnstati_s_$i.png
    $VNSTATI -i $i -t -o ~/out-vnstati_t_$i.png
    $MONTAGE -mode concatenate -tile 2x2 ~/out-vnstati_*.png ~/out-vnstati_collage.png
    echo | $MUTT -s "Traffic Report, Interface $i - $DATE" $MAILTO -a ~/out-vnstati_collage.png
done
rm  ~/out-vnstati_*.png > /dev/null 2>&1

9 Antworten auf “Traffic Report via Mail als Anhang

  1. Marcus

    So sieht das ganze jetzt bei mir aus. Das mit dem which kannst du dir eigentlich sparen. PATH gebe ich im Cron mit an.

    0 0 * * * PATH=/usr/bin:/bin:/sbin:/usr/sbin /root/bin/traffic_monitor.sh

    #!/bin/bash

    ### CONFIG START ###
    INTERFACES=(eth0)
    MAILTO=your@email.address
    #### CONFIG END ####

    for i in „${INTERFACES[@]}“
    do
    rm /tmp/out-vnstati_*.png > /dev/null 2>&1
    vnstati -i $i -d -o /tmp/out-vnstati_d_$i.png
    vnstati -i $i -m -o /tmp/out-vnstati_m_$i.png
    vnstati -i $i -s -o /tmp/out-vnstati_s_$i.png
    vnstati -i $i -t -o /tmp/out-vnstati_t_$i.png
    montage -mode concatenate -tile 2×2 /tmp/out-vnstati_*.png /tmp/out-vnstati_collage.png
    uuenview -b -s „Traffic Report, Interface $i – $(date +%d.%m.%Y)“ -m $MAILTO /tmp/out-vnstati_collage.png
    done
    rm /tmp/out-vnstati_*.png > /dev/null 2>&1

    1. André P. Autor

      Super, freut mich, dass es jetzt geht. Es kommt eben auch darauf an, wie die Mail nachher dekodiert wird. Habe erwartet, dass mit „uuencode“ kodierte Daten sehr kompatibel sind. „uuenview“ arbeitet übrigens wie „mutt“ MIME-konform. Vielleicht sollte ich mich mal umgewöhnen… ;)
      Ich habe mir mit dem PATH schon Gedanken gemacht. Natürlich ist der in dem Script as-it-is nicht notwendig. Ich dachte dabei aber vor allem an die Leute mit weniger Erfahrung, die die Scripts erweitern möchten und sich nachher wundern, dass es nicht funktioniert. Lieber eine einfache/blöde/lästige Fehlerquelle von vornherein ausschließen.
      Du kannst den PATH übrigens auch für alle Jobs in der Kopfzeile der Cronfile ablegen.

  2. Marcus

    Bei mir wird zwar eine Mail verschickt, die enthält aber nur Datenmüll:

    begin 644 TRAFFIC_14.01.2014.png
    MB5!.1PT*&@H„„-24A$4@„`^@„`$V!`,„„`)J6A„„’E!,5$6NKJ[_
    M__]@8&“PL+„„“2SP!@G0`N+B[-KMGY+QKCS!2I%’Z)QQ4K4[XWTF>^R9IQGF;8_6T@4!$@8L$$+K[RZ;BXSY^;2$
    M+(3XZ2=6??I95*HO]3IGZ/5)0;_H1AZA1I#
    M%]XKI;@,)G“5N-R*UPAZU/GP@[2\X$/0AXYVR/2ULR3\E79![‚B4I![T2>>^
    MA#5?\“&(0!>=XQ’TXSN^W*ZTDS@5G8U`#SGW=6SHAIG#]U42ZE^9@NEZ)UX5\J+F+Q4DK[&P‘?=JY^KS0:2Z8QDX<\A#,=FZ@
    M7R_&@KBX2?T!^XXK<+8$Z%?,WM?;Y8+9^W(U^5T?$S/KH#]QKA!?:5`Q[(,PQ*]TGF:K-_<K(/^U+G0L:Y7^;@/=PAF
    M.[?0=4;E<;D%6O*BLN]#GW
    MDTV4_%/UYI_3)YUWYW0#772X“ST$?NW]0I74+IQO_N\2K+U?D;LNXH6ISQ<L
    MK_8^Y9R@Z]H[_0M+O]Q#L+X9]GK0GZH+K+_:#%OJ(7BA[9U"OF`E:'LO]!#P
    M!9H1AZA6+H%8JA5RB&7J$8>H5B
    MZ!6*H5H1AZA4H,_6N.9&NMU^L\`AV26)<SDDG_

    Was könnte da falsch laufen? Ich nutze Ubuntu 12.04.

    1. André P. Autor

      So, habe es jetzt mal für „mutt“ umgeschrieben, siehe Artikel.
      Damit sollte es dann auf jeden Fall funktionieren.
      Und sorry, es hatte sich ein blöder Fehler eingeschlichen, der so 10 Minuten online war.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.