opened image

Kā izveidot Telegram botu attālo hostu uzraudzībai

Lai uzraudzītu serverus vai tīkla ierīces, pastāv daudzas programmatūras risinājumi, no kuriem daudzi prasa servera resursus izvietošanai un zināšanas par iestatīšanu. Bet, ja jums ir viens vai vairāki serveri vai maršrutētājs ar balto* IP, tad nav nepieciešams izvietot sarežģītu uzraudzības struktūru tikai, lai pārbaudītu, vai serveris vai maršrutētājs ir pieejams. Pietiek izveidot vienkāršu Telegram botu, kas nosūtīs jums paziņojumu Telegram, ja pārbaudītais IP nav pieejams (down) un kad tas atkal ir pieejams (up). Pats bots darbosies 24/7 uz virtuālā servera, kas darbojas ar Linux operētājsistēmu, ar minimālu slodzi uz resursiem.
* baltais IP adrese  - tas ir unikāls IP adrese, kas piešķirta ierīcei vai serverim un ir pieejama no interneta. Šāds IP ir publisks.

Kas jādara:
1. Telegram izveidojiet botu un privātu kanālu, kurā pievienojiet botu. Kanālā jūs varat aicināt tos, kuri arī var uzraudzīt uzraudzību 
2. Instalējiet serverī python3. Šajā rakstā mēs apskatīsim bota izvietošanu uz virtuālā servera ar Ubuntu 20.04 (to var izvietot uz jebkuras operētājsistēmas, kurā var instalēt python3 pakotni)
3. Izveidojiet skriptu-failu, norādiet tajā hostu (serveru vai maršrutētāju) IP adreses, iestatiet uzraudzības periodu un palaidiet skriptu 24/7 režīmā.

Sāksim izpildi.

1. Lai reģistrētu jaunu Telegram botu, nepieciešams Telegram lietotnē atrast botu pakalpojumu @BotFather un nosūtīt tam komandu jauna bota reģistrēšanai
/newbot
Tālāk @BotFather pieprasīs nosaukumu mūsu botam. Nosaukumam nav ierobežojumu, ievadīsim, piemēram:
IP monitoring

Tagad nepieciešams ievadīt unikālu bota nosaukumu Telegram sistēmā. Bota nosaukumam jābeidzas ar _bot. Nosauksim, piemēram
ip_monitoring_super_bot

Pēc tam, @BotFather sniegs mums TOKEN, ar kuru varam pārvaldīt botu. TOKEN jāglabā, jo tas būs nepieciešams vēlāk.

Telegram bots ir reģistrēts.

Tagad izveidosim privātu kanālu, kurā mūsu jaunais bots ar nosaukumu @ip_monitoring_super_bot nosūtīs ziņojumus.

Tādēļ čatu logā Telegram programmā nospiežam uz jauna ziņojuma izveides ikonas un izvēlamies New channel - Create channel - izdomājam kanāla nosaukumu (piemēram, IP monitoring channel) - izvēlamies kanāla veidu Private un pievienojam botu @ip_monitoring_super_bot.


Rezultātā mēs iegūstam privātu kanālu, kurā bots @ip_monitoring_super_bot nosūtīs ziņojumus par uzraudzīto iekārtu stāvokli. Šajā kanālā var aicināt jebkuru Telegram lietotāju, izmantojot īpašu saiti.
Jāņem vērā un jāpārbauda kanāla IP monitoring channel īpašībās, vai bots @ip_monitoring_super_bot ir pievienots kā kanāla administrators. Lai pārietu uz kanāla īpašībām, pietiek nospiest uz kanāla nosaukuma.

Mums arī būs nepieciešama vērtība chat_id. Tādēļ nepieciešams:
 - pāriet uz bota @ip_monitoring_super_bot čatu un nosūtīt ziņojumu /start (tas palaidīs botu darbībā)
 - izdarīt testējošu ziņojumu (jebkuru) kanālā IP monitoring channel
 - pāriet pārlūkā uz saiti https://api.telegram.org/botTOKEN/getUpdates
Mūsu piemērā saite būs šādā formā:
https://api.telegram.org/bot5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX/getUpdates
Rezultāts ekrānā būs šāds:
Un tā, atcerēsimies 2 svarīgas vērtības bota pārvaldīšanai:
token= 5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX
chat_id = -100185915XXX

2. Pieslēgsimies serverim pa SSH (kā to izdarīt)

Pārbaudīsim, vai python3 ir instalēts:
python3 --version

Ja python3 nav instalēts (kļūda: -bash: python3: command not found), nepieciešams instalēt ar komandu
- Ubuntu:
apt install python3 -y
- CentOS
yum install python3 -y
Papildus instalēsim requests moduli:
pip3 install requests

Pēc instalēšanas varam vēlreiz pārbaudīt versiju. Var būt aptuveni tā:

Sīkāk par python3 instalēšanu: Kā instalēt Python 3.10 uz Ubuntu 20.04

3. Izveidosim mapi, kurā tiks izvietots uzraudzības skripts. Tādēļ izpildīsim komandu:
cd && mkdir pingmonitor && cd pingmonitor

Izveidosim un atvērsim failu
vim main.py

un ievietosim tajā skriptu:

#----------------------------------------------------
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] + ' ir pieejams')
               #print(hostname + ' ir pieejams!')
        else:
            if not os.path.isfile(file_signal):
                open(file_signal,'tw').close()
                SendMsgToTelegramChanel(hostname[i] + ' nav pieejams')
                #print(hostname + ' nav pieejams!')
    time.sleep(time_pause)
#------------------------------------------------

- skriptā jāaizvieto TOKEN un CHAT_ID ar iepriekš saglabātajām vērtībām token un chat_id.
- rindā hostname = ['8.8.8.8','1.1.1.1'], vietā IP 8.8.8.8 un 1.1.1.1 norādiet IP (vai hostname) jūsu servera vai maršrutētāja, kurus nepieciešams uzraudzīt*. Ierīču IP adreses jānorāda vienkāršās pēdiņās un atdalītas ar komatu (ja IP ir vairāk nekā viens)
- mainīgā time_pause = 30 vērtība norāda pārbaudes periodu (sekundēs). Nav ieteicams iestatīt mazāk par 10-15 sekundēm, īpaši, ja pārbaudāmo IP saraksts ir liels.
- neizdzēsiet rindu atkāpes skriptā. Tas var izraisīt sintaktisku kļūdu.

(*) skripts izmanto metodi, pārbaudot, nosūtot icmp paketes (ping), tāpēc jānodrošina, ka serverī vai maršrutētājā (kuri tiek uzraudzīti) ping pieprasījumi netiek bloķēti.

Tagad viss ir gatavs skripta palaišanai.
Tā kā skripts jādarbojas 24/7, lai tā darbība netiktu parādīta galvenajā konsoles ekrānā, palaidīsim to atsevišķā "logā" ar utilītu screen (ja tā nav instalēta, instalējiet to. Sīkāk: Darba pamati ar utilītu screen).
Tādēļ izpildīsim komandu:
screen -S pingmonitor

un pāriesim uz mapi ar skripta failu:
cd && cd pingmonitor

Palaidīsim skriptu darbībā ar komandu:
python3 main.py

Lai izietu no sesijas un atstātu mūsu skriptu darbināmu, nospiediet Ctrl+a+d. Tagad SSH konsoli var slēgt.
Lai pieslēgtos sesijai ar darbojošo skriptu, pieslēdzieties serverim pa SSH un izpildiet komandu:
screen -r pingmonitor

Ja serveris vai maršrutētājs kļūst nepieejams un pēc tam atkal kļūst pieejams, jūs saņemsiet ziņojumu kanālā IP monitoring channel.