nagios2jabber.py : enrichissement des messages Jabber de Nagios
authorProgfou <jean-christophe.andre@auf.org>
Fri, 23 Oct 2015 15:10:09 +0000 (11:10 -0400)
committerProgfou <jean-christophe.andre@auf.org>
Fri, 23 Oct 2015 15:10:09 +0000 (11:10 -0400)
nagios/nagios2jabber.py [new file with mode: 0755]

diff --git a/nagios/nagios2jabber.py b/nagios/nagios2jabber.py
new file mode 100755 (executable)
index 0000000..f920395
--- /dev/null
@@ -0,0 +1,144 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*
+# Copyright: Agence universitaire de la Francophonie -- www.auf.org
+# Licence: GPL-3
+# Author: Jean Christophe André
+# Created: 2015-10-23
+#
+# Debian-Depends: python-xmpp
+#
+#
+# Exploite la norme XEP-0071 pour enrichir le message d'alerte envoyé par Nagios.
+#
+# Paramètres d'appel du script :
+# - destination JID
+#
+# Informations transmises via l'entrée standard (stdin):
+# - dans le cas d'une annonce concernant un hôte :
+#     Host: $HOSTALIAS$
+#     State: $HOSTSTATE$
+#     Info: $HOSTOUTPUT$
+#     Date: $LONGDATETIME$
+# - dans le cas d'une annonce concernant un service :
+#     Service: $SERVICEDESC$
+#     Host: $HOSTNAME$
+#     Address: $HOSTADDRESS$
+#     State: $SERVICESTATE$
+#     Info: $SERVICEOUTPUT$
+#     Date: $LONGDATETIME$
+#
+# Mise en place :
+# - installation de ce script dans /usr/local/lib/nagios2jabber.py
+# - configuration de l'appel au script dans /etc/nagios3/commands.cfg :
+#     define command {
+#       command_name    notify-host-by-jabber
+#       command_line    /usr/bin/printf "%b" "Host: $HOSTALIAS$\nState: $HOSTSTATE$\nInfo: $HOSTOUTPUT$\nDate: $LONGDATETIME$" | /usr/local/lib/nagios2jabber.py $CONTACTPAGER$
+#     }
+#     define command {
+#       command_name    notify-service-by-jabber-jc
+#       command_line    /usr/bin/printf "%b" "Service: $SERVICEDESC$\nHost: $HOSTNAME$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nInfo: $SERVICEOUTPUT$\nDate: $LONGDATETIME$" | /usr/local/lib/nagios2jabber.py $CONTACTPAGER$
+#     }
+# - configuration des envois de messages jabber dans /etc/nagios3/conf.d/contacts.cfg
+#     define contact {
+#       contact_name                    jc
+#       ...
+#       host_notification_commands      notify-host-by-jabber,notify-host-by-email
+#       service_notification_commands   notify-service-by-jabber,notify-service-by-email
+#       ...
+#     }
+
+from __future__ import print_function
+import sys # argv, stdin
+import time # strptime, strftime
+import xmpp
+
+_CONFIG = {
+  "jid": "nagios.announce@auf.org",
+  "password": "super-secret",
+}
+
+if len(sys.argv) != 2 or sys.argv[1] == "-h" or sys.argv[1] == "--help":
+   print("Usage: echo message | {} user@server".format(sys.argv[0]))
+   sys.exit(1)
+
+dest = sys.argv[1]
+text = sys.stdin.read()
+
+# construit un dictionnaire d'informations
+items = [l.split(":", 1) for l in text.splitlines()]
+data = {k.strip().lower():v.strip() for k,v in items}
+#print("data={}".format(data))
+
+# remanie la date (si possible)
+if "date" in data:
+  try:
+    dt = time.strptime(data["date"], "%a %b %d %H:%M:%S %Z %Y")
+    data["date"] = time.strftime("%Y-%m-%d %H:%M:%S", dt)
+  except:
+    pass
+
+# fonction qui renvoie la couleur prévue pour un statut donné
+def state_color(state):
+  color = "blue"
+  if state == "OK" or state == "UP":
+    color = "green"
+  elif state == "WARNING" or state == "UNKNOWN":
+    color = "orange"
+  elif state == "CRITICAL" or state == "DOWN":
+    color = "red"
+  return color
+
+# fonction qui renvoie un texte enrichi pour le statut
+def state_enriched(state):
+  return "<strong>[<span style='color: {0};'>{1}</span>]</strong>"\
+           .format(state_color(state), state)
+
+# ajout du statut enrichi
+if "state" in data:
+  data["rich_state"] = state_enriched(data["state"])
+
+# remaniement des infos (suppression des redondances, gestion des lignes)
+if "info" in data:
+  if "service" in data and data["info"].startswith(data["service"]):
+    data["info"] = data["info"][len(data["service"]):].strip(" :-")
+  if "state" in data and data["info"].startswith(data["state"]):
+    data["info"] = data["info"][len(data["state"]):].strip(" :-")
+  data["info"] = data["info"].replace("\\n", "\n").strip("\n")
+  # prepare enriched info
+  data["rich_info"] = data["info"].replace("\n", "<br/>")
+  data["rich_info"] = data["rich_info"].replace("WARNING", state_enriched("WARNING"))
+  data["escaped_info"] = data["info"].replace("'", "&#39;").replace("<", "&lt;")
+
+#print("data={}".format(data))
+
+# construction des textes
+if "service" in data:
+  text = "{date}\t{state}\t{service} @{host}[{address}]\n{info}".format(**data)
+  enriched_text = "<span style='color: black;'><span>{date}</span> "\
+    "<a href='void();' title='{escaped_info}'>{rich_state}</a> "\
+    "<span style='color: blue;'>{service}</span> "\
+    "@<span style='color: blue;'>{host}</span>"\
+    "[<span style='color: blue;'>{address}</span>]"\
+    "</span>".format(**data)
+    #"<br/><em>{rich_info}</em></span>".format(**data)
+else:
+  text = "{date}\t{state}\t{host}\n{info}".format(**data)
+  enriched_text = "<span style='color: black;'><span>{date}</span> "\
+    "<a href='void();' title='{escaped_info}'>{rich_state}</a> "\
+    "<span style='color: blue;'>{host}</span>"\
+    "</span>".format(**data)
+    #"<br/><em>{rich_info}</em></span>".format(**data)
+
+# construction du message
+html = xmpp.Node("html", {"xmlns": "http://jabber.org/protocol/xhtml-im"})
+html.addChild(node=xmpp.simplexml.XML2Node(
+  "<body xmlns='http://www.w3.org/1999/xhtml'>{}</body>".format(enriched_text)))
+message = xmpp.protocol.Message(to=dest, body=text, typ="chat")
+message.addChild(node=html)
+
+# envoi du message
+jid = xmpp.protocol.JID(_CONFIG["jid"])
+client = xmpp.Client(jid.getDomain(), debug=[])
+client.connect()
+client.auth(jid.getNode(), _CONFIG["password"], "server")
+client.send(message)