opened image

Як створити телеграм бота для моніторингу віддалених хостів

Для моніторингу серверів або мережевих пристроїв існує безліч програмних рішень, багато з яких вимагають ресурсів сервера для розгортання та знань з налаштування. Але якщо у Вас один або кілька серверів або маршрутизатор з білим* IP, то немає потреби розгортати складну структуру моніторингу тільки для того, щоб перевіряти, доступний чи сервер або маршрутизатор. Достатньо створити простого телеграм бота, який буде надсилати Вам повідомлення в телеграм, якщо перевіряємий IP недоступний (down) і коли знову доступний (up). Сам бот буде працювати 24/7 на віртуальному сервері під управлінням операційної системи Linux, з мінімальним навантаженням на ресурси.
* білий IP адрес  - це унікальний IP адрес, виданий на пристрій або сервер і доступний з інтернету. Такий IP є публічним.

Що необхідно зробити:
1. У Telegram створити бота і приватний канал, в який додати бота. У канал Ви можете запрошувати тих, хто теж може спостерігати за моніторингом 
2. Встановити на сервері python3. У цій статті ми розглянемо розміщення бота на віртуальному сервері з ОС Ubuntu 20.04 (можна розмістити на будь-якій ОС, на якій можна встановити пакет python3)
3. Створити скрипт-файл, прописати в ньому IP хостів (серверів або маршрутизаторів), встановити період моніторингу і запустити скрипт в режимі роботи 24/7.

Приступимо до виконання.

1. Для реєстрації нового телеграм бота, необхідно в додатку Telegram знайти бот-сервіс @BotFather і надіслати йому команду реєстрації нового бота
/newbot
Далі @BotFather запитає назву для нашого бота. Обмежень у назві немає, введемо, наприклад:
IP monitoring

Тепер необхідно ввести унікальне ім'я бота в системі Telegram. Назва бота повинна закінчуватися на _bot. Назвемо, для прикладу
ip_monitoring_super_bot

Після цього, @BotFather надасть нам TOKEN, за допомогою якого можна керувати ботом. TOKEN необхідно зберегти, так як він знадобиться нам пізніше.

Телеграм бот зареєстрований.

Тепер створимо приватний канал, в який наш новий бот з ім'ям @ip_monitoring_super_bot буде надсилати повідомлення.

Для цього в вікні чатів програми Telegram натискаємо на іконку створення нового повідомлення і вибираємо New chanel - Create chanel - придумуємо назву каналу (наприклад, IP monitoring chanel) - вибираємо тип каналу Private і додаємо бота @ip_monitoring_super_bot.


В результаті ми отримуємо приватний канал, в який бот @ip_monitoring_super_bot буде надсилати повідомлення про стан обладнання, яке ми моніторимо. Також в цей канал можна запросити за спеціальним посиланням будь-якого користувача телеграм.
Слід звернути увагу і перевірити в властивостях каналу IP monitoring chanel, додано чи бота @ip_monitoring_super_bot в якості адміністратора каналу. Щоб перейти в властивості каналу, достатньо натиснути на назві каналу.

Також нам знадобиться значення chat_id. Для цього необхідно:
 - перейти в чат бота @ip_monitoring_super_bot і надіслати повідомлення /start (це запустить бота в роботу)
 - зробити тестове повідомлення (будь-яке) в каналі IP monitoring chanel
 - перейти в браузері за посиланням https://api.telegram.org/botTOKEN/getUpdates
В нашому прикладі посилання буде в такому вигляді:
https://api.telegram.org/bot5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX/getUpdates
Результат на екрані буде таким:
Отже, запам'ятаємо 2 важливих значення для управління ботом:
token= 5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX
chat_id = -100185915XXX

2. Підключимося до сервера по SSH (як це зробити)

Перевіримо, чи встановлений python3:
python3 --version

Якщо python3 не встановлений (помилка: -bash: python3: command not found), необхідно встановити командою
- для Ubuntu:
apt install python3 -y
- для CentOS
yum install python3 -y
Додатково встановимо модуль requests:
pip3 install requests

Після установки можна перевірити ще раз версію. Може бути приблизно так:

Більш детально про установку python3: Як встановити Python 3.10 на Ubuntu 20.04

3. Створимо папку, в якій буде розміщено скрипт моніторингу. Для цього виконаємо команду:
cd && mkdir pingmonitor && cd pingmonitor

Створимо і відкриємо файл
vim main.py

і розмістимо в ньому скрипт:

#----------------------------------------------------
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)
#------------------------------------------------

- в скрипті слід замінити TOKEN і CHAT_ID на збережені раніше значення token і chat_id.
- в рядку hostname = ['8.8.8.8','1.1.1.1'], замість IP 8.8.8.8 і 1.1.1.1 вкажіть IP (або hostname) Вашого сервера або маршрутизатора, які необхідно моніторити*. IP адреси пристроїв слід вказувати в одинарних лапках і через кому (якщо IP більше ніж один)
- значення змінної time_pause = 30, вказує період перевірки (в секундах). Не рекомендується встановлювати менше 10-15 секунд, особливо, якщо список перевіряємих IP великий.
- не видаляйте відступи рядків у скрипті. Це може призвести до синтаксичної помилки.

(*)скрипт використовує метод перевірки через відправку icmp пакетів (ping), з цієї причини, слід впевнитися, що на сервері або маршрутизаторі (які моніторяться) не блокуються ping-запити.

Тепер все готово для запуску скрипта.
Оскільки скрипт повинен працювати 24/7, щоб його робота не відображалася на основному екрані консолі, запустимо його в окремому "вікні" за допомогою утиліти screen (якщо не встановлена, встановіть її. Більш детально: Основи роботи з утилітою screen).
Для цього виконаємо команду:
screen -S pingmonitor

і перейдемо до папки з файлом скрипта:
cd && cd pingmonitor

Запустимо скрипт в роботу командою:
python3 main.py

Щоб вийти з сеансу і залишити працюючим наш скрипт, натисніть Ctrl+a+d. Тепер SSH консоль можна закривати.
Щоб підключитися до сеансу з працюючим скриптом, підключіться до сервера по SSH і виконайте команду:
screen -r pingmonitor

У разі, якщо сервер або маршрутизатор стане недоступним і після того, як стане доступним, Ви отримаєте повідомлення в каналі IP monitoring chanel.