Das Munin-Plugin-Repository MuninExchange bietet eine große Auswahl an Plugins für verschiedene Bereiche.
Munin-Plugins sind kleine Programme, meist Shell- oder Perlskripte, die Logdateienen verabeiten oder Hardware abfragen und die Daten dann an Munin weiter geben.
Wie zähle ich die Anzahl der Mails?
Mein Anwendungsbereich war folgender: Munin sollte die eingehenden SMTP-Verbindungen (angenommene und zurückgewiesene) am Mailserver QMail stündlich zählen.
Verwendung könnte da das Plugin qmailconn finden. Leider nicht ohne Änderung oder Einschränkungen.
Das mitgelieferte qmailconn holt leider die Daten nicht von den richtigen Pfaden der Logdateien, zudem verwendet Plesk ganz andere Logdateien. Und Berechnen tut es auch nicht so wie ich es brauche.
Hindernisse und Probleme
Bei Verwendung von Plesk befindet sich die tägliche Mail-Logdatei nämlich unter /usr/local/psa/var/log/maillog. Und bei Verwendung von rblsmtpd wird leider nur das Annehmen von Mail über SMTP geloggt, jedoch nicht das Zurückweisen. Und diese Meldungen sind dann aber in /var/log/messages zu finden, nicht im Maillog von Plesk.
Somit müssen aus zwei Logdateien die entsprechenden Daten herausgezogen werden.
Damit das Maillog einfacher zu erreichen ist, habe ich einen symblischen Link gesetzt, sodass es jetzt auch unter /var/log/mail/maillog zu finden ist.
Mit ln kein Problem und so in bash ausgeführt:
cd /var/log/mail
ln -s /usr/local/psa/var/log/maillog
Ein weiteres Problem besteht, weil das messages-Log über mehrere Tage läuft und somit eine viel zu hohe Anzahl von Mails pro Stunde herauskommt, würde das Plugin ungefixt verwendet.
Um die Anzahl der eingehenden Mails zu bekommen, muss im messages-Log sowohl nach der Zeichenkette START: smtp als auch dem Zeitstempel für die aktuelle Stunde gesucht werden. Mit den Shellbefehlen grep und date eigentlich kein Problem.
Das Logfile messages hat zum Beispiel folgenden Inhalt bei einer eingehenden SMTP-Verbindung:
Dec 1 13:15:39 s12345678 xinetd[12345]: START: smtp pid=1933 from=190.179.207.243
Um die Zeichenkette START: smtp zu finden, lässt sich greppen:
grep "START: smtp " /var/log/messages
Das findet dann aber alle SMTP-Verbindungen, die in messages stehen, denn das Log kann ja über mehrere Tage laufen je nachdem wie messages aktualisiert und rotiert wird.
Wenn nur die SMTP-Verbindungen der aktuellen Stunde des Tages gefunden werden sollen, muss also Monat, Tag und Stunde in das Suchmuster einfließen.
Kein Problem!, denkt da die geneigte Admina,
da nehme ich date und einen Formatstring und speicher’ das in eine Shellvariable.
Nun ja, geht üblicherweise so, wenn eine man date studiert:
now=`date +"%b %d %H"`
Dummerweise kommt dann aber unglücklicherweise folgendes dabei raus: Dec 01 11 und das nur, weil es bei date keine Ausgabe des Tages ohne führende Null gibt.
Was also tun? Na, ganz einfach, das Ganze aus Teilen zusammensetzen und beim Tag die Null entfernen. Die einzelnen Zeichenketten lassen sich mit date erzeugen und in einzelne Variablen speichern, die führende Null mit sed durch ein Leerzeichen ersetzen:
day=`date +"%d" | sed -e 's/^0/ /'`
month=`date +"%b"`
hour=`date +"%H"`
now="$month $day $hour:"
Damit wäre das Problem des Suchmusters für die aktuelle Stunde des Tages gelöst.
Anzahl der ankommenden Mails
Ein grep mit diesem Muster sollte dann auch die Anzahl der eingehenden Verbindungen zählen:
### get smtp over xinetd from /var/log/messages
#Nov 29 15:52:05 s10007822 xinetd[13417]: START: smtp pid=26007 from=92.10.91.10
total=`grep 'xinetd' /var/log/messages | grep "$now" | grep -c ': START: smtp '`
Die Variable total enthält also jetzt die korrekte Anzahl der SMTP-Verbindungen in der aktuellen Stunde des Tages.
Nun muss die Anzahl der angenommenen Mails in QMail ermittelt werden.
Anzahl der angenommenen Mails
Der Ablauf ist ja folgender: nachdem rblsmtpd das Mail angenommen hat, wird es an relaylock und weitere QMail-Programme weitergrereicht.
Ein Log einer durch relaylock angenommene Mail sieht dann so aus:
Dec 1 10:19:42 s10007822 /var/qmail/bin/relaylock[32571]: /var/qmail/bin relaylock: mail from 58.9.203.121:20653 (ppp-58-9-203-121.revip2.asianet.co.th)
Damit sollte folgender grep die Anzahl der verarbeiteten Mails ermitteln:
### get accepted mails from /var/log/mail/maillog
#Dec 1 10:19:42 s10007822 /var/qmail/bin/relaylock[32571]: /var/qmail/bin relaylock: mail from 58.9.203.121:20653 (ppp-58-9-203-121.revip2.asianet.co.th)
accepted=`grep 'relaylock: mail from' /var/log/mail/maillog | grep -c "$now"`
Die Anzahl der deuch QMail verarbeiteten Mails steckt jetzt in der Variable accepted.
Anzahl der abgelehnten Mails
Wie schon gesagt, ist es mit rblsmtpd (jedenfalls ohne Patch und Neukompilierung) unmöglich, die zurückgewiesenen Verbindungen zu loggen. Also muss ein Trick angewandt werden. Es muss die Anzahl der eingehenden SMTP-Verbindungen sowie der verabeiteten Mails in QMail gezählt und dann voneinander subtrahiert werden, dann ergibt das die Anzahl der zurück gewiesenen Mails.
Also ganz einfach:
rbl=$[$total - $accepted];
Weitergabe an Munin
Die Werte werden wie üblich per Standardausgabe an Munin weiter gereicht:
echo -n "accepted.value " && ( echo $accepted || echo U )
echo -n "rbl.value " && ( echo $[$total - $accepted] || echo U )
echo -n "total.value " && ( echo $total || echo U )
Download des Plugins
Das erweiterte Plugin ist in meinem Repo unter qmailconn zu finden. Vielleicht hilft manchen als Anregung oder einfach als Spickzettel für Munin-Admins.
Sicherlich lässt sich das Plugin auch mit Perl programmieren anstatt mit bash aber ich war einfach zu bequem.

Kommentar für Blogeintrag
Vorschau des Kommentars
TrackBack-URL:
http://www.gwendragon.de/blog/Web/Server/munin-plugin-qmail-connections.html/trackback↑Blogeintrag