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.
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
Hallo Ralf,
die collect callbacks Funktionen wurden in tg_callback ausgelagert. Das Skript wird auch im Cronjob aufgerufen.
Gruß
Max
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.
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
Moin XSmeagolX,
bist du da irgendwie weitergekommen?
Ich hänge derzeit an der gleichen Stelle fest.
Gruß,
Mark
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.
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
Hi Max,
man könnte versuchen, nach dem Empfangen eines Callbacks das Inline Keyboard wieder auszublenden.
Das geht wohl indem man die Orginale Nachricht bearbeitet und ein leeres „InlineKeyboardMarkup“ mit schick -> https://core.telegram.org/bots/api#editmessagereplymarkup
Dazu müsste man aber die message_id der Originalen Nachricht mit in die SQLite DB speichern.
Gruß Matthias
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?
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?
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!
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.
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.
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?
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);
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
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
Hallo,
die Meldung sagt es bereits 🙂
IOError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)
Das Zertifikat kann nicht validiert werden, da der CheckMK URL wohl via HTTPS erreichbar ist.
Es gibt 2 Möglichkeiten:
1. Wenn das Zertifikat von einer internen CA ausgestellt ist dann das Root CA der internen PKI in den Certificate Store der Linux Maschine importieren.
2. Die SSL Prüfung im Script deaktivieren, wie das geht für urllib => https://stackoverflow.com/questions/27835619/urllib-and-ssl-certificate-verify-failed-error/42334357
Grüße
Maximilian
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