Jabber / XMPP - einfaches Status-Monitoring

Der klassische (und wohl auch gängiste) Weg sich über Ereignisse wie gescheiterte Backups, mögliche Virenfunde oder Sonstiges informieren zu lassen ist sicherlich die gute E-Mail. Allerdings setzt dies natürlich auch einen funktionierenden und vor allem richtig konfigurierten Mail-Server voraus. Gerade der letzte Punkt ist meiner Meinung nach sehr kritisch, da ein falsch eingerichteter SMTP-Server schnell zur Spam-Schleuder mutiert oder aber man will erst gar keinen auf seiner Workstation installieren.

Daher habe ich mich mal etwas umgeschaut und dachte mir, dass es im Zeitalter der Smartphones und Instant Messenger (Whats-App, Threema und Co sind ja auch nichts Anderes) eine andere Möglichkeit geben müsste.

Jabber Monitoring Handy

Jabber als Alternative? Link to heading

Als mögliche Alternative sah ich Jabber. Mittlerweile wird Jabber/XMPP mit Cisco in Verbindung gebracht, was auch ok ist, da sie es  ja für ihre kommerziellen Produkte als Know-How eingekauft haben. Allerdings wird das Protokoll durch die XMPP Standards Foundation betreut und ist sogar vergleichsweise alt. Wichtigster Punkt ist natürlich, dass es frei ist und es ein recht großes Portfolio an Bibliotheken (in verschiedenen Programmier-/Skriptsprachen) geben sollte. Das ist bei XMPP gegeben. So gibt es Bibliotheken für Hochsprachen wie C/C++ aber auch Module für Python und Perl.

Anwendungsfälle für Jabber Link to heading

Wie oben genannt, lassen sich die Anwendungsszenarios beliebig wählen. Ich persönlich nutze es für meine privaten Backups mit rsnapshot. Sofern der Backupbefehl eine Ausgabe auf stderr zurückgibt, werde ich per Jabber benachrichtigt und kann dem Fehler auf die Spur gehen. Dabei nutze ich das folgende Python-Skript, welches ich einfach in meine Anacron-Tasks eingepflegt habe.

#!/usr/bin/python2
import sys
import xmpp
import ConfigParser

if ( len (sys.argv) < 3 ):
    print ("usage: sendxmpp.py resource text\n")
    print ("  resource:    jabber resource")
    print ("  text:        message to send\n")
else:
    snd = sys.argv[1]
    msg = sys.argv[2]

    config = ConfigParser.ConfigParser()

    # read ini file to ConfigParser
    data = config.read ( 'statxmpp.ini' )
    if ( len(data) == 0):
        print ("could not read >>statxmpp.ini<<" )
    else:
        # get values
        login = config.get( 'Connection', 'user' )
        pwd   = config.get( 'Connection', 'password' )
        srv   = config.get( 'Connection', 'server' )
        recv  = config.get( 'Connection', 'destination' )

        cnx = xmpp.Client( srv, debug=[] )
        cnx.connect( server=( srv ,5222) )
        cnx.auth(login, pwd, snd )
        cnx.send( xmpp.Message( recv , msg ) )

Das Skript erwartet eine Konfigurationsdatei mit den entsprechenden Einträgen für den erfolgreichen Verbindungsaufbau. Dazu zählen Benutzername, Passwort, der genutzte Server und natürlich die Empfängeradresse. Das Muster sieht wie folgt aus.

[Connection]
# username
user=
# password
password=
# receiver
destination=
# jabberserver to connect
server=

Abhängigkeiten des Skriptes sind die Pythonmodule pyxmpp (community) und ConfigParser (AUR), welche recht schnell installiert sind. Der rsnapshot wurde von mir dann noch wie folgt abgeändert

#!/bin/sh
## save stderr to var
ERR=$(/usr/bin/rsnapshot daily 3&gt;&1 1&gt;&2 2&gt;&3)
### if command fails report via xmpp
if [ $? -ne 0 ]; then
        sendxmpp.py backup_status "${ERR}"
fi

und benachrichtigt mich über Probleme beim Backup. Empfangen kann man das Ganze dann mit einem Jabber-Client seiner Wahl (bspw. Pidgin, Empathy usw.) oder lässt es sich gleich auf Telefon schicken mit IM+ oder so, je nach Plattform oder App. Einziges Manko ist natürlich, dass die Nachricht auf dem Client quittiert wird, von dem sie abgerufen wird.