Benachrichtigungen per XMPP/ Jabber und Check_MK Flexible Notifications [Update]

26. April 2013 | Von | Kategorie: Monitoring | Availability

Früher hatten wir bei unserem Nagios/ Icinga immer auch eine Benachrichtigung mittels Jabber und dem Nagibot eingerichtet. Da der Nagibot aber nicht so ohne weiteres über die Multisite und den Flexible Notifactions einzurichten ist, habe ich auf die Schnelle ein Python-Skript verfasst. Das Skript baut für die Benachrichtigung eine Verbindung zum Server auf, verschickt den Alert und beendet danach die Verbindung. Recht simple eigentlich.

Voraussetzung hier ist eine einigermassen aktuelle Check_MK_Version (> 1.2.1), die bereits die Flexible Notifications ermöglicht. Damit das folgende Benachrichtigungsskript funktioniert muss zunächst die sleekxmpp-Bibliothek für Python in einer aktuellen Version installiert werden.


pip install sleekxmpp

Danach musst du das folgende Skript unter /omd/sites/<sitename>/share/check_mk/notifcations/xmpp  bzw. ~/share/check_mk/notifications/xmpp ablegen und auch ausführbar machen. Wenn das Skript nicht ausfürhbar ist, wirst du völlig vergebens in der Multisite/ WATO nach der Benachrichtigungsform suchen.


#!/usr/bin/env python
# Send Notifications via XMPP

import sleekxmpp
import sys
import os
import logging
import time

class SendMsgBot(sleekxmpp.ClientXMPP):

def __init__(self, jid, password, recipient, msg):
 super(SendMsgBot, self).__init__(jid, password)
 self.recipient = recipient
 logging.debug("Recipient: %s" % recipient)
 self.msg = msg
 logging.debug("Message: %s" % msg)
 self.add_event_handler('session_start', self.start)
 self.connect()
 self.process(threaded=False)

def start(self, event):
 self.send_presence()
 self.get_roster()
 self.send_message(mto=self.recipient, mbody=self.msg)
 logging.debug("Message send")
 self.disconnect(wait=True)

if __name__ == '__main__':
 logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.ERROR)
 message = os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\n\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"]+"\nPlugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"]+"\n\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"]+"\n\n\n"
 logging.error("%s" % message)
 xmpp = SendMsgBot("nagios@jabber.example.com", "kennwort" , os.environ["NOTIFY_PARAMETER_1"], message)

Um die Benachrichtigung für einen Benutzer zu aktivieren wird WATO verwendet. WATO ist Bestandteil von Check_MK und dient der Konfiguration der Überwachung und der gesamten Monitoring-Infrastruktur. Im WATO-Webinterface suchst du dir den entsprechenden Benutzer raus und schaust im Abschnitt „Notification“ (siehe folgendes Bild).

WATO_Notifications  Dort klickst du auf den Button „Add Notification“. Es wird dann eine weitere Benachrichtungsform hinzugefügt, die per Voreinstellung auf Mail eingestellt ist. Generell kannst du auf diesem Wege verschiedene Benachrichtigungswege konfigurieren. Wenn du auf die Pfeilspitze  vor der neuen Benachrichtigung klickst, so werden dir die Einstellungsmöglichkeiten für die Benachrichtigungsform angezeigt. Auf dem nächsten Bild siehst du, welche Auswahl du anstelle der klassischen Mail du verwenden musst.

WATO_notifications2

Damit die Benachrichtigung auch beim richtigen Empfänger ankommt wird dieser als erstes „Plugin Argument“ angegeben. Das war es auch schon fast. Nach dem Speichern und der Aktivierung der Anpassungen kannst du mit einem Test der Benachrichtigung fortfahren.

Viel Spass mit der Jabber-Benachrichtigung.

[UPDATE]

Ich habe das Benachrichtigungsskript ein wenig angepasst, so das jetzt im Falle eines Hostproblems nicht mehr unsinnigerweise auch Service-Informationen ausgegeben werden.

</pre>
#!/usr/bin/env python
# Send Notifications via XMPP

import sleekxmpp
import sys
import os
import logging
import time

class SendMsgBot(sleekxmpp.ClientXMPP):

def __init__(self, jid, password, recipient, msg):
 super(SendMsgBot, self).__init__(jid, password)
 self.recipient = recipient
 logging.debug("Recipient: %s" % recipient)
 self.msg = msg
 logging.debug("Message: %s" % msg)
 self.add_event_handler('session_start', self.start)
 self.connect()
 self.process(threaded=False)

def start(self, event):
 self.send_presence()
 self.get_roster()
 self.send_message(mto=self.recipient, mbody=self.msg)
 logging.debug("Message send")
 self.disconnect(wait=True)

if __name__ == '__main__':
 logging.basicConfig(filename='/tmp/notifications.log', format='%(asctime)s %(levelname)s:%(message)s', level=logging.ERROR)
 logging.debug("Start")
 #message = os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"]+"\nHost-Plugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"]+"\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"]+"\n-------------------------\n\n"
 if os.environ["NOTIFY_SERVICEDESC"] != '$SERVICEDESC$':
 message = "SERVICE"
 else:
 message = "HOST"
 message = message+"-"+os.environ["NOTIFY_NOTIFICATIONTYPE"]+"\n"+os.environ["NOTIFY_SHORTDATETIME"]+"\nHost: "+os.environ["NOTIFY_HOSTNAME"]+" - "+os.environ["NOTIFY_HOSTSTATE"]
 if os.environ["NOTIFY_SERVICEDESC"] == '$SERVICEDESC$':
 message = message+"\nHost-Plugin-Output: "+os.environ["NOTIFY_HOSTOUTPUT"]
 else:
 message = message+"\nService: "+os.environ["NOTIFY_SERVICEDESC"]+" - "+os.environ["NOTIFY_SERVICESTATE"]+"\nService-Plugin-Output:"+os.environ["NOTIFY_SERVICEOUTPUT"]
 message = message+"\n-------------------------\n\n"
 logging.debug("%s" % message)
 xmpp = SendMsgBot("nagios@xmpp.example.om", "kennwort" , os.environ["NOTIFY_PARAMETER_1"], message)
<pre>

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Tags: | | | | | | |

Ein Kommentar
Hinterlasse einen Kommentar »

  1. Hi,

    habe versucht xmpp mit Deinem Script ein zu binden, aber es kommen keine Notifikationen an.
    Wie und wo kann ich Prüfen, was falsch läuft?

    Habe es mit beiden Versionen vom Script versucht.

    Ich habe in der letzten Zeile den Absender Account eingetragen, das ist doch richtig, oder? Bitte evtl. mit in Deinen Text aufnehmen das man das noch machen muss. Evtl. am Anfang des Scripts eine Variable einbinden, das man oben im Script die Account und das PW angibt und es dann im Script genutzt wird.

    Gruß,
    Oliver

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.