opened image

Jak stworzyć bota Telegram do monitorowania zdalnych hostów

Dla monitorowania serwerów lub urządzeń sieciowych istnieje wiele rozwiązań programowych, z których wiele wymaga zasobów serwera do wdrożenia oraz wiedzy na temat konfiguracji. Jednak jeśli masz jeden lub kilka serwerów lub router z białym* IP, to nie ma potrzeby wdrażania skomplikowanej struktury monitorowania tylko po to, aby sprawdzić, czy serwer lub router jest dostępny. Wystarczy stworzyć prostego bota telegramowego, który będzie wysyłał Ci powiadomienia w telegramie, jeśli sprawdzany IP jest niedostępny (down) i kiedy znowu jest dostępny (up). Sam bot będzie działał 24/7 na wirtualnym serwerze pod zarządzaniem systemu operacyjnego Linux, z minimalnym obciążeniem zasobów.
* biały adres IP  - to unikalny adres IP, przydzielony do urządzenia lub serwera, dostępny z internetu. Taki IP jest publiczny.

Co należy zrobić:
1. W Telegramie utworzyć bota i prywatny kanał, do którego dodać bota. Na kanał możesz zapraszać tych, którzy również mogą obserwować monitorowanie 
2. Zainstalować na serwerze python3. W tym artykule omówimy umieszczenie bota na wirtualnym serwerze z systemem Ubuntu 20.04 (można umieścić na dowolnym systemie, na którym można zainstalować pakiet python3)
3. Stworzyć plik skryptu, wpisać w nim IP hostów (serwerów lub routerów), ustawić okres monitorowania i uruchomić skrypt w trybie pracy 24/7.

Przystąpmy do realizacji.

1. Aby zarejestrować nowego bota telegramowego, należy w aplikacji Telegram znaleźć bot-serwis @BotFather i wysłać mu polecenie rejestracji nowego bota
/newbot
Następnie @BotFather poprosi o nazwę dla naszego bota. Nie ma ograniczeń co do nazwy, wpiszmy na przykład:
IP monitoring

Teraz należy wpisać unikalną nazwę bota w systemie Telegram. Nazwa bota musi kończyć się na _bot. Nazwijmy, dla przykładu
ip_monitoring_super_bot

Po tym, @BotFather przekaże nam TOKEN, za pomocą którego można zarządzać botem. TOKEN należy zachować, ponieważ będzie potrzebny później.

Bot telegramowy został zarejestrowany.

Teraz stwórzmy prywatny kanał, do którego nasz nowy bot o nazwie @ip_monitoring_super_bot będzie wysyłał wiadomości.

W tym celu w oknie czatów programu Telegram klikamy na ikonę tworzenia nowej wiadomości i wybieramy Nowy kanał - Utwórz kanał - wymyślamy nazwę kanału (na przykład, IP monitoring chanel) - wybieramy typ kanału Prywatny i dodajemy bota @ip_monitoring_super_bot.


W rezultacie otrzymujemy prywatny kanał, do którego bot @ip_monitoring_super_bot będzie wysyłał wiadomości o stanie sprzętu, który monitorujemy. Również do tego kanału można zaprosić za pomocą specjalnego linku dowolnego użytkownika telegramu.
Należy zwrócić uwagę i sprawdzić w właściwościach kanału IP monitoring chanel, czy bot @ip_monitoring_super_bot został dodany jako administrator kanału. Aby przejść do właściwości kanału, wystarczy kliknąć na nazwę kanału.

Będzie nam również potrzebna wartość chat_id. W tym celu należy:
 - przejść do czatu bota @ip_monitoring_super_bot i wysłać wiadomość /start (to uruchomi bota w pracy)
 - zrobić testową wiadomość (dowolną) w kanale IP monitoring chanel
 - przejść w przeglądarce pod link https://api.telegram.org/botTOKEN/getUpdates
W naszym przykładzie link będzie wyglądał tak:
https://api.telegram.org/bot5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX/getUpdates
Wynik na ekranie będzie taki:
Zapamiętajmy 2 ważne wartości do zarządzania botem:
token= 5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX
chat_id = -100185915XXX

2. Połączymy się z serwerem przez SSH (jak to zrobić)

Sprawdzimy, czy python3 jest zainstalowany:
python3 --version

Jeśli python3 nie jest zainstalowany (błąd: -bash: python3: command not found), należy zainstalować poleceniem
- dla Ubuntu:
apt install python3 -y
- dla CentOS
yum install python3 -y
Dodatkowo zainstalujemy moduł requests:
pip3 install requests

Po instalacji można jeszcze raz sprawdzić wersję. Może być mniej więcej tak:

Szczegółowe informacje na temat instalacji python3: Jak zainstalować Python 3.10 na Ubuntu 20.04

3. Stworzymy folder, w którym będzie umieszczony skrypt monitorowania. W tym celu wykonamy polecenie:
cd && mkdir pingmonitor && cd pingmonitor

Stworzymy i otworzymy plik
vim main.py

i umieścimy w nim skrypt:

#----------------------------------------------------
import os
import requests
import time
#-------------------------
hostname = ['8.8.8.8','1.1.1.1']
time_pause = 30
#-------------------------
def SendMsgToTelegramChanel(msg):
    token="TOKEN"
    chat_id = 'CHAT_ID'
    params = {'chat_id': chat_id,'text': msg}
    response = requests.get('https://api.telegram.org/bot'+token+'/sendMessage', params=params)
def IsHostAlive(host):
    ret = os.system('ping -c 2 {} > /dev/null'.format(host))
    if ret == 0:
        return True
    return False
while True:
    for i in range(len(hostname)):
        file_signal = hostname[i] +'_down'
        if IsHostAlive(hostname[i]):
            if os.path.isfile(file_signal):
               os.remove(file_signal)
               SendMsgToTelegramChanel(hostname[i] + ' is up')
               #print(hostname + ' is up!')
        else:
            if not os.path.isfile(file_signal):
                open(file_signal,'tw').close()
                SendMsgToTelegramChanel(hostname[i] + ' is down')
                #print(hostname + ' is down!')
    time.sleep(time_pause)
#------------------------------------------------

- w skrypcie należy zastąpić TOKEN i CHAT_ID na zapisane wcześniej wartości token i chat_id.
- w linii hostname = ['8.8.8.8','1.1.1.1'], zamiast IP 8.8.8.8 i 1.1.1.1 podaj IP (lub hostname) Twojego serwera lub routera, które należy monitorować*. Adresy IP urządzeń należy podawać w pojedynczych cudzysłowach i oddzielać przecinkiem (jeśli IP jest więcej niż jeden)
- wartość zmiennej time_pause = 30, wskazuje okres sprawdzania (w sekundach). Nie zaleca się ustawiania mniej niż 10-15 sekund, szczególnie jeśli lista sprawdzanych IP jest duża.
- nie usuwaj wcięć w skrypcie. Może to prowadzić do błędów składniowych.

(*)skrypt używa metody sprawdzania przez wysyłanie pakietów icmp (ping), z tego powodu należy upewnić się, że na serwerze lub routerze (które są monitorowane) nie są blokowane zapytania ping.

Teraz wszystko jest gotowe do uruchomienia skryptu.
Ponieważ skrypt ma działać 24/7, aby jego działanie nie było wyświetlane na głównym ekranie konsoli, uruchomimy go w osobnym "oknie" za pomocą narzędzia screen (jeśli nie jest zainstalowane, zainstaluj je. Szczegóły: Podstawy pracy z narzędziem screen).
W tym celu wykonamy polecenie:
screen -S pingmonitor

i przejdziemy do folderu z plikiem skryptu:
cd && cd pingmonitor

Uruchomimy skrypt poleceniem:
python3 main.py

Aby wyjść z sesji i pozostawić działający nasz skrypt, naciśnij Ctrl+a+d. Teraz konsolę SSH można zamknąć.
Aby połączyć się z sesją z działającym skryptem, połącz się z serwerem przez SSH i wykonaj polecenie:
screen -r pingmonitor

W przypadku, gdy serwer lub router stanie się niedostępny, a następnie stanie się dostępny, otrzymasz wiadomość w kanale IP monitoring chanel.