Check_MK: TG-Notify – Telegram Notification Bot with Callback for ACK & Downtime

TG-Notify ist eine von mir geschriebene Erweiterung für Check_MK welche Notifications über Telegram ermöglicht und über Callback Acknowledge und Downtimes setzen kann für Hosts/Services.

Sourcecode: https://github.com/lanbugs/tg-notify

Status/ Version: 0.1 beta

Download als MKP: folgt

Lizenz: GPLv2

Vorteile:

  • Telegram ist kostenlos
  • Telegram ist für alle gänigen Mobile und PC OS verfügbar -> https://telegram.org/apps
  • Telegram arbeitet mit einer HTTP API, unabhänig von E-Mail
  • Direkte Callbacks möglich, implementiert sind Acknowledge und Downtime -> Super für Bereitschaft wenn es nichts dringendes ist um den Schlaf nicht lange zu unterbrechen 🙂
  • Für die Callbacks muss Check_MK nicht über das Internet direkt erreichbar sein
  • mehr als 160 Zeichen möglich (vgl. SMS)
  • uvm.

Geplant / Future:

  • Eigene Ack / Downtime Texte
  • Weitere Komandos (Ideen ??)

Installation TG-Notify

TG-Notify ist in Python geschrieben und kommt mit den Standard Libraries von Python 2.7 aus die von Check_MK in der OMD Umgebung bereitgestellt werden.

Verwendete Python Libraries:

  • argparse
  • ConfigParser
  • sqlite3
  • os
  • sys
  • urllib
  • json
  • datetime
  • time
  • random
  • string

Bestandteile von TG-Notify:

  • tg_admin – Admin Tool welches auch die Callbacks einsammelt
  • tg_callback – Callback Tool welches die Notifications und Downtimes setzt
  • tg_runner – Cronjob Script
  • tg_notification_with_callback – Notification Script welches die Notifications aus Check_MK versendet
  • tg.ini – Configdatei von TG-Notify
  • tg.db – SQLite3 Datenbank welche mit dem tg_admin Tool generiert werden kann
  •  tg_collect_and_callback_agent, tg_cleanup – Cronjobs die ebenfalls mit dem tg_admin Tool generiert werden

Verzeichnisse -> Dateien:

  • OMD_ROOT/local/bin -> tg_admin und tg_callback, tg_runner
  • OMD_ROOT/local/etc -> tg.ini
  • OMD_ROOT/local/lib/tg_notify -> tg.db
  • OMD_ROOT/local/share/check_mk/notifications -> tg_notification_with_callback
  • OMD_ROOT/etc/cron.d -> tg_collect_and_callback_agent, tg_cleanup

Schritt 1: Anlegen eines Telegram Bots beim BotFather

Message an BotFather schicken mit „/newbot“, anschließend Namen definieren für neuen Bot z.B. „TGnotifyDEMO_bot“. Der BotFather schickt anschlieend den Token für die HTTP API von Telegram.

Schritt 2: Anlegen eines Automation Users in Check_MK

Damit die Callbacks ACKs und Downtimes setzen können muss ein Automation User eingerichtet werden. Der User muss als Contact Group die gleichen hanben wie die User sonst kann er keine ACKs/Downtimes setzen. Alternativ muss das Userprofil angepasst werden. Für den Automation User sind die Notifications zu deaktivieren!

Schritt 3: tg.ini anpassen

Hier ist der Token vom BotFather einzugeben und der Automation User sowie die URL zum Check_MK System.

;
; Configuration for  TG-Notify
;

[Telegram]
; URL mit /
url = https://api.telegram.org/
; Token with bot at the beginning, without / at the end
token = bot123456789:AAAAAbBbbbCCcCccDDddDdDEeEeEEEEeE-FFF

[Database]
; Relative to OMD_ROOT without / at the beginning
path = local/lib/tg_notify/
file = tg.db

[Check_MK]
url = http://localhost/dev1/check_mk/
automation_user = a_test
automation_pass = ATPQTVBKJYGSDUAHYDQF

Schritt 4: Datenbank generieren

Die Funktion ist in tg_admin eingebaut, dazu einfach „tg_admin –initialize-database“ aufrufen.

OMD[dev1]:~$ tg_admin --initialize-database

Schritt 5: Crontab generieren

Die Funktion ist in tg_admin eingebaut, dazu einfach „tg_admin –generate-cronjobs“ aufrufen.

OMD[dev1]:~$ tg_admin --create-cronjobs

Schritt 6: Neuen User anlegen in TG-Notify

TG-Notify hat seine eigene Userdatenbank, es müssen die Check_MK User <-> Chat_ID von Telegram TG-Notify erst bekannt gemacht werden.

Dazu vom Handy ein „open“ an den Bot senden und das Kommando „tg_admin –show-agent“ aufrufen. Es wird die entsprechende Chat_ID angezeigt die der User hat. Anschließend den User mit „tg_admin -c -u hdampf -i 123456789“ anlegen. Aktuelle User können mit „tg_admin -s“ abgefragt werden.

OMD[dev1]:~/local/etc$ tg_admin --show-agent
----------------------------------------------------------------
First Name: Hans
Last Name: Dampf
CHAT ID: 123456789
----------------------------------------------------------------

OMD[dev1]:~/local/etc$ tg_admin -c -u hdampf -i 319651791

OMD[dev1]:~/local/etc$ tg_admin -s
Current User:

Username    Chat_ID     
------------------------
hdampf      123456789   

Schritt 7: Neue Notification Rule erzeugen für TG-Notify

Nach der Installation von TG-Notify umbedingt einen „omd restart“ durchführen damit das neue Notifications Script gefunden wird von Check_MK. Die Regel wie gewohnt erstellen, hier im Beispiel ist es eine sehr einfach gehaltene, es sind alle bekannten Optionen möglich.

Fertig! Erste Gehversuche …

Ich habe in meinem Testsystem Hosts (10.44.4.5, 10.44.4.6) angelegt welche es nicht gibt um Meldungen zu generieren. Mit „tg_admin –show-notify-history“ kann man sich die letzten Notifications ansehen. Für jede Notification wird eine Callback_ID generiert. Die ID dient dazu wenn vom Telegram Client ein Callback aufgeführt wird z.B. Acknowledge eines Services den Callback eindeutig zu identifizieren.

Im Callback wird dann z.B. $$$CB$$$WCA38KSKU9XTODCO:ack gesendet für den Acknowledge von Host 10.44.4.5 / Service PING.

OMD[dev1]:~$ tg_admin --show-notify-history
ID  Callback ID         Host                Service                                 Datum               Chat_ID   Username  
----------------------------------------------------------------------------------------------------------------------------------
232 WCA38KSKU9XTODCO    10.44.4.5           PING                                    2017-08-21 13:01:50 123456789 cmkadmin  
233 T46ETYJ1CH7MV2ZS    10.44.4.5           Check_MK Discovery                      2017-08-21 13:01:54 123456789 cmkadmin  
234 ADZJPKLMO0SV63WU    10.44.4.5           None                                    2017-08-21 13:02:02 123456789 cmkadmin  
235 4WLYX43CGRJJQNHX    10.44.4.4           None                                    2017-08-21 13:12:13 123456789 cmkadmin  
236 6OMRDN6DQ1KAIWY4    10.44.4.5           None                                    2017-08-21 13:12:16 123456789 cmkadmin  
237 BUQ0HEAKPTFMLPED    10.44.4.5           Check_MK Discovery                      2017-08-21 13:31:11 123456789 cmkadmin  
238 3QP6YL48RNWGJV4V    10.44.4.5           PING                                    2017-08-21 13:40:00 123456789 cmkadmin  
239 7BKRA2ATVRHESFWH    10.44.4.5           None                                    2017-08-21 13:46:14 123456789 cmkadmin  
240 1MZ2X50KJ55ZXA2W    10.44.4.4           None                                    2017-08-21 13:46:16 123456789 cmkadmin  
241 N3RUH9EGYGJ314UU    10.44.4.6           PING                                    2017-08-21 13:47:16 123456789 cmkadmin  
242 0273U5QDMDH2RFQA    10.44.4.6           Check_MK Discovery                      2017-08-21 13:47:18 123456789 cmkadmin  
243 JZFJEUYOZAJ7U0VF    10.44.4.6           None                                    2017-08-21 13:47:29 123456789 cmkadmin  
244 0YSN5ZG4DW80NGT1    10.44.4.6           PING                                    2017-08-21 13:48:13 123456789 cmkadmin  
245 D436YY9GE3MLH00W    10.44.4.6           Check_MK Discovery                      2017-08-21 13:48:14 123456789 cmkadmin  

Die empfangenen Callbacks werden in der SQL Datenbank gespeichert und werden hier von dem Programm tg_callback verarbeitet und die entsprechenden Aufrufe gegen Check_MK durchgeführt. Mit „tg_admin –show-callbacks“ lassen sich die angeforderten Callbacks und der Status anzeigen.

OMD[dev1]:~$ tg_admin --show-callbacks
Callback ID         Host                Service                                 Datum               Command   Executed
----------------------------------------------------------------------------------------------------------------------------------
OWQML2LFDZM8LIB3    localhost           Interface 1                             2017-08-18 23:58:49 ack       1 
C6V7O11LAF65F5Q5    localhost           Check_MK Discovery                      2017-08-20 12:23:13 ack       1 
P81F439ZX54ET4SG    10.44.4.4           None                                    2017-08-20 12:53:15 ack       1 
CQHDP8OJFE4VTNHE    10.44.4.4           None                                    2017-08-20 13:04:06 ack       1 
ZZ3OAVP41OPWE1PG    localhost           OMD dev1 Notification Spooler           2017-08-20 13:08:46 ack       1 
2XKFHEVFGLB389QX    10.44.4.4           None                                    2017-08-20 13:34:00 down24h   1 
916IUVV6O66GBDUA    10.44.4.4           None                                    2017-08-20 13:49:45 ack       1 
916IUVV6O66GBDUA    10.44.4.4           None                                    2017-08-20 13:49:46 down24h   1 
ZPAZ4OJ63CJ7IEM7    localhost           OMD dev1 Notification Spooler           2017-08-21 11:57:28 ack       1 
ZPAZ4OJ63CJ7IEM7    localhost           OMD dev1 Notification Spooler           2017-08-21 11:57:29 down24h   1 
ADZJPKLMO0SV63WU    10.44.4.5           None                                    2017-08-21 13:12:02 ack       1 
T46ETYJ1CH7MV2ZS    10.44.4.5           Check_MK Discovery                      2017-08-21 13:31:02 ack       1 
WCA38KSKU9XTODCO    10.44.4.5           PING                                    2017-08-21 13:39:49 down24h   1 
ADZJPKLMO0SV63WU    10.44.4.5           None                                    2017-08-21 13:46:04 down24h   1 
N3RUH9EGYGJ314UU    10.44.4.6           PING                                    2017-08-21 13:48:02 ack       1 
0273U5QDMDH2RFQA    10.44.4.6           Check_MK Discovery                      2017-08-21 13:48:03 down24h   1 

Die ersten Notifications sind am Client angekommen:

Jeder einzelne Service lässt sich ACKen oder für 24h auf Downtime setzen. Klickt man die Buttons an dauert es max. 1 Minute und TG-Notify anwortet das er den Callback empfangen hat.

 

 

 

 

19 Gedanken zu „Check_MK: TG-Notify – Telegram Notification Bot with Callback for ACK & Downtime“

  1. Hallo,
    in dem Github File tg_admin ist das Argument –collect-callbacks auskommentiert und es gibt auch
    keine Funktion –collect-callbacks.
    Ist das noch ein Fehler oder ist die Funktion noch in Entwicklung?
    LG,
    Ralf

    Antworten
  2. Sofern per Telegram kein vollständiger Name per „open“ übermittelt wird, kommt eine Fehlermeldung beim Ausführen von tg_admin –show-agent

    Traceback (most recent call last):
    File „/omd/sites/service/local/bin/tg_admin“, line 458, in
    main()
    File „/omd/sites/service/local/bin/tg_admin“, line 455, in main
    TGadmin()
    File „/omd/sites/service/local/bin/tg_admin“, line 104, in __init__
    self.show_agent()
    File „/omd/sites/service/local/bin/tg_admin“, line 238, in show_agent
    print „Last Name: %s“ % m[‚message‘][‚from‘][‚last_name‘]
    KeyError: ‚last_name‘

    Dadurch werden keine IDs angezeigt.

    Antworten
  3. im log erhalte ich die Meldung:

    19.08.2018 21:14:52 tg_notify WARNING Unable to locate Chat_ID in Database. No notification is sent for cmkadmin

    obwohl ich nach Auskommentierung des Nachnamens in der tg_admin den User mit der chat-ID hinzugefügt habe

    Antworten
      • Halo Mark,

        sorry.. habe lange nicht mehr hier reingeschaut.
        Wenn dein Problem bei dem ‚KeyError: ‚last_name‘‘ liegt, so hatte ich einfach in tg_admin Zeile 238 auskommentiert.

        Bezüglich meiner zweiten Meldung weiß ich nicht mehr, was da genau los war. Zumindest läuft bei mir die Telegram-Benachrichtigung.

        Antworten
      • Ich gehe mal davon aus, dass Du beim Zufügen des Users über tg_admin -c -u %cmkusername% -i 12345678 einfach noch nicht eingetragen hast oder die Chat-ID keinem existierenden User von check_MK zugewiesen hast

        Antworten
  4. Hallo,
    ich bekomme folgende Meldung:

    OMD[test]:~$ tg_admin –initialize-database
    Traceback (most recent call last):
    File „/omd/sites/test/bin/tg_admin“, line 458, in
    main()
    File „/omd/sites/test/bin/tg_admin“, line 455, in main
    TGadmin()
    File „/omd/sites/test/bin/tg_admin“, line 50, in __init__
    self.tg_url = config.get(‚Telegram‘, ‚url‘) + config.get(‚Telegram‘, ‚token‘) + „/“
    File „/omd/sites/test/lib/python2.7/ConfigParser.py“, line 607, in get
    raise NoSectionError(section)
    ConfigParser.NoSectionError: No section: ‚Telegram‘
    OMD[test]:~$ ConfigParser.NoSectionError: No section: ‚Telegram‘
    If ‚ConfigParser.NoSectionError:‘ is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf ConfigParser.NoSectionError:

    Kann mir jemand helfen?

    Antworten
  5. Hey,

    ich bekomme diese Fehlermeldung:

    OMD[test]:~$ tg_admin –initialize-database
    Traceback (most recent call last):
    File „/omd/sites/test/bin/tg_admin“, line 458, in
    main()
    File „/omd/sites/test/bin/tg_admin“, line 455, in main
    TGadmin()
    File „/omd/sites/test/bin/tg_admin“, line 50, in __init__
    self.tg_url = config.get(‚Telegram‘, ‚url‘) + config.get(‚Telegram‘, ‚token‘) + „/“
    File „/omd/sites/test/lib/python2.7/ConfigParser.py“, line 607, in get
    raise NoSectionError(section)
    ConfigParser.NoSectionError: No section: ‚Telegram‘

    Was mache ich falsch?

    Antworten
  6. Wer die Fehlermeldung „Traceback (most recent call last): File „/omd/sites/test/bin/tg_admin“, line 458, in…“ bekommt, der hat vermutlich die tg.ini nicht im local/etc Verzeichnis abgelegt! Bei mir fehlte das local/etc Verzeichnis daher hatte ich die tg.ini ins /etc abgelegt – dann kommt der Fehler. Nach dem erstellen des local/etc Verzeichnisses und dem hinein Kopieren der Datei lief es!

    Antworten
  7. Es könnte auch daran liegen, dass die Rechte der hochgeladenen Verzeichnisse und Dateien noch auf root:root liegen.
    Die sollten in xxx:xxx (wobei xxx der omd-user ist) gesetzt sein.

    Antworten
  8. Da jeder bei Telegram einen Username hat, aber nicht immer Vor- bzw. Nachname eingetragen hat, empfehle ich in Zeile 238 (oder war es 237… irgendwo da in der Nähe) folgende Änderung vorzunehmen:

    print „Username: %s“ % m[‚message‘][‚from‘][‚username‘]

    Damit erspart man sich ebenfalls Fehlermeldungen und bekommt auch entsprechende „Anfragen“ mit den Chat-IDs angezeigt.

    Antworten
  9. Hallo zusammen,

    nur zum Verständnis: „Callback“, meint wirklich nur das Zurückmelden bzw. Fehler bestätigen über den Telegram Client, richtg?
    sprich es wird kein wirklicher „Anruf“ an den Client getätigt ?

    ich habe das System größtenteils zum laufen gebracht und bekomme auch eine Benachrichtigung am Client und kann diese:
    – Achnowledge setzen
    – Downtime for 24 h setzen

    aber leider hat das drücken des Buttons keine Auswirkung.
    Über ./tg_admin –notify-history
    –> bekomme ich wie in der Anleitung beschrieben auch alle Vorgänge angezeigt,
    –> die Zuweisung zur der folgenden Datenbank funktioniert aber leider nicht

    Über /tg_admin –show-callbacks
    –> Nothing found in database…

    im Check_MK (WebOberfläche) sehe ich nur die folgende Meldung:
    – Unable to open database. No notification is sent. (Obwohl diese trozdem ankommt)

    tg-notify.log:
    10.09.2019 14:39:33 tg_notify INFO Message successful send to telegram.
    10.09.2019 14:41:23 tg_notify INFO Message: SERVERNAME is DOWN
    10.09.2019 14:41:23 tg_notify INFO Message successful send to telegram.

    das einzig Verdächtige:
    root@cma:/omd/sites/ELSEN/local/bin# ./tg_admin –show-agent
    —————————————————————-
    First Name: XXXX
    Last Name: XXX
    CHAT ID: 92XXXXX
    —————————————————————-
    Traceback (most recent call last):
    File „./tg_admin“, line 457, in
    main()
    File „./tg_admin“, line 454, in main
    TGadmin()
    File „./tg_admin“, line 104, in __init__
    self.show_agent()
    File „./tg_admin“, line 235, in show_agent
    if „open“ in m[‚message‘][‚text‘]:
    KeyError: ‚text‘

    –> das einzige was ich geändert hatte war der Pfad in der tg_admin Datei.
    –> self.path = ‚/omd/sites/FIRMENNAME‘
    –> (vorher: self.path = os.environ.pop(‚OMD_ROOT‘) –> damit ging die installation etc. nicht

    –> jemand eine Idee?

    Antworten
  10. Servus,

    ich habe dein Script mal getestet, funktioniert soweit – allerdings verschluckt sich das ganze wenn ein paar Sonderzeichen im Host oder Servicenamen auftauchen.
    Bzw. ist Telegram nicht im markup Modus damit kompatibel.

    Das führt im Beispiel zu dem Fehler: (unsupported format character)
    Found Chat_ID for cmkuser Traceback (most recent call last): — File „/omd/sites/demoSite/local/share/check_mk/notifications/tg_notification_with_callback.py“, line 217, in — main() — File „/omd/sites/demoSite/local/share/check_mk/notifications/tg_notification_with_callback.py“, line 214, in main — TGnotification() — File „/omd/sites/demoSite/local/share/check_mk/notifications/tg_notification_with_callback.py“, line 64, in __init__ — self.notify() — File „/omd/sites/demoSite/local/share/check_mk/notifications/tg_notification_with_callback.py“, line 207, in notify — sys.stdout.write(„Notification send to %s (Chat_ID: %S)“ % (username,chat_id)) — ValueError: unsupported format character ‚S‘ (0x53) at index 14

    Abhilfe würde schaffen, vorher die Eingabe zu filtern. Ich bin an anderer Stelle bisher damit ganz gut gefahren:
    $tmpText = str_replace(„_“, „-„, $tmpText);
    $tmpText = str_replace(„*“, „-„, $tmpText);
    $tmpText = str_replace(„[„, „(„, $tmpText);
    $tmpText = str_replace(„]“, „)“, $tmpText);

    Antworten
  11. Hallo Zusammen,

    ich habe das Gleiche Problem wie VDick,
    Das ganze läuft soweit aber leider kommen die callbacks nicht im Check MK an.
    Hat jemand noch eine Idee was das Problem sein kann ?

    Lieben Gruß
    Basti

    Antworten
  12. Hallo,

    habe ein Problem beim ausführen von tg_admin.

    OMD[hdh]:~$ tg_admin –show-agent
    generic exception: Traceback (most recent call last):
    File „/omd/sites/hdh/local/bin/tg_admin“, line 211, in tg_handler
    handle = urllib.urlopen(self.tg_url + command)
    File „/usr/lib/python2.7/urllib.py“, line 87, in urlopen
    return opener.open(url)
    File „/usr/lib/python2.7/urllib.py“, line 215, in open
    return getattr(self, name)(url)
    File „/usr/lib/python2.7/urllib.py“, line 445, in open_https
    h.endheaders(data)
    File „/usr/lib/python2.7/httplib.py“, line 1095, in endheaders
    self._send_output(message_body)
    File „/usr/lib/python2.7/httplib.py“, line 898, in _send_output
    self.send(msg)
    File „/usr/lib/python2.7/httplib.py“, line 860, in send
    self.connect()
    File „/usr/lib/python2.7/httplib.py“, line 1320, in connect
    server_hostname=server_hostname)
    File „/usr/lib/python2.7/ssl.py“, line 369, in wrap_socket
    _context=self)
    File „/usr/lib/python2.7/ssl.py“, line 599, in __init__
    self.do_handshake()
    File „/usr/lib/python2.7/ssl.py“, line 828, in do_handshake
    self._sslobj.do_handshake()
    IOError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)

    Woran könnte das liegen?

    Danke

    Antworten
  13. Moin,

    erstmal danke für deine Arbeit!
    Nutzt du das Projekt noch aktiv? Frage weil sich seit CheckMK 2.1 die API verändert hat und somit die Betätigung und Downtime aus dem telegram Bot nicht mehr funktioniert!

    Danke und Gruß
    Klaus

    Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.