opened image

Kaip sukurti „Telegram“ botą nuotolinių hostų stebėjimui

Serverių ar tinklo įrenginių stebėjimui yra daugybė programinių sprendimų, iš kurių daugelis reikalauja serverio išteklių diegimui ir žinių apie nustatymus. Tačiau, jei turite vieną ar kelis serverius arba maršrutizatorių su viešuoju* IP, nėra būtinybės diegti sudėtingą stebėjimo struktūrą tik tam, kad patikrintumėte, ar serveris ar maršrutizatorius yra pasiekiamas. Pakanka sukurti paprastą Telegram botą, kuris siųs jums pranešimus Telegram, jei tikrinamas IP bus nepasiekiamas (down) ir kai vėl bus pasiekiamas (up). Pats botas veiks 24/7 virtualiame serveryje, valdomame Linux operacinės sistemos, su minimaliu išteklių apkrovimu.
* viešasis IP adresas  - tai unikalus IP adresas, priskirtas įrenginiui ar serveriui ir pasiekiamas iš interneto. Toks IP yra viešas.

Ką reikia padaryti:
1. Telegram sukurti botą ir privatų kanalą, į kurį pridėti botą. Į kanalą galite pakviesti tuos, kurie taip pat gali stebėti stebėjimą 
2. Serveriui įdiegti python3. Šiame straipsnyje mes nagrinėsime bota, talpinamą virtualiame serveryje su Ubuntu 20.04 OS (jį galima talpinti bet kurioje OS, kurioje galima įdiegti python3 paketą)
3. Sukurti skripto failą, jame nurodyti IP hostų (serverių ar maršrutizatorių), nustatyti stebėjimo periodą ir paleisti skriptą 24/7 režimu.

Pradėkime vykdyti.

1. Norint užregistruoti naują Telegram botą, reikia Telegram programoje rasti botų paslaugą @BotFather ir jam išsiųsti naujo boto registracijos komandą
/newbot
Tada @BotFather paprašys pavadinimo mūsų botui. Pavadinimui nėra jokių apribojimų, įveskime, pavyzdžiui:
IP monitoring

Dabar reikia įvesti unikalų boto pavadinimą Telegram sistemoje. Boto pavadinimas turi baigtis _bot. Pavadinkime, pavyzdžiui,
ip_monitoring_super_bot

Po to, @BotFather suteiks mums TOKEN, su kuriuo galime valdyti botą. TOKEN reikia išsaugoti, nes jis prireiks vėliau.

Telegram botas užregistruotas.

Dabar sukursime privatų kanalą, į kurį mūsų naujas botas su pavadinimu @ip_monitoring_super_bot siųs pranešimus.

Tam, Telegram programos pokalbių lange paspauskite naujo pranešimo kūrimo ikoną ir pasirinkite New channel - Create channel - sugalvokite kanalo pavadinimą (pavyzdžiui, IP monitoring channel) - pasirinkite kanalo tipą Private ir pridėkite botą @ip_monitoring_super_bot.


Rezultate gauname privatų kanalą, į kurį botas @ip_monitoring_super_bot siųs pranešimus apie stebimų įrenginių būseną. Taip pat į šį kanalą galima pakviesti bet kurį Telegram vartotoją per specialią nuorodą. 
Reikėtų atkreipti dėmesį ir patikrinti kanalo IP monitoring channel savybėse, ar botas @ip_monitoring_super_bot pridėtas kaip kanalo administratorius. Norėdami pereiti į kanalo savybes, pakanka paspausti ant kanalo pavadinimo.

Taip pat mums reikės chat_id reikšmės. Tam reikia:
 - pereiti į botos pokalbį @ip_monitoring_super_bot ir išsiųsti pranešimą /start (tai paleis botą)
 - padaryti testinį pranešimą (bet kokį) kanale IP monitoring channel
 - pereiti naršyklėje į nuorodą https://api.telegram.org/botTOKEN/getUpdates
Mūsų pavyzdyje nuoroda atrodys taip:
https://api.telegram.org/bot5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX/getUpdates
Rezultatas ekrane bus toks:
Taigi, prisiminkime 2 svarbias reikšmes botui valdyti:
token= 5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX
chat_id = -100185915XXX

2. Prisijungsime prie serverio per SSH (kaip tai padaryti)

Patikrinsime, ar python3 įdiegtas:
python3 --version

Jei python3 nėra įdiegtas (klaida: -bash: python3: command not found), reikia įdiegti komanda
- Ubuntu:
apt install python3 -y
- CentOS:
yum install python3 -y
Papildomai įdiegsime requests modulį:
pip3 install requests

Po įdiegimo dar kartą patikrinkime versiją. Gali būti maždaug taip:

Išsamesnė informacija apie python3 diegimą: Kaip įdiegti Python 3.10 Ubuntu 20.04

3. Sukursime aplanką, kuriame bus talpinamas stebėjimo skriptas. Tam vykdysime komandą:
cd && mkdir pingmonitor && cd pingmonitor

Sukursime ir atidarysime failą
vim main.py

ir įdėsime jame skriptą:

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

- skripte reikia pakeisti TOKEN ir CHAT_ID į anksčiau išsaugotas token ir chat_id reikšmes.
- eilutėje hostname = ['8.8.8.8','1.1.1.1'], vietoj IP 8.8.8.8 ir 1.1.1.1 nurodykite IP (arba hostname) jūsų serverio ar maršrutizatoriaus, kuriuos reikia stebėti*. IP adresai turi būti nurodyti viengubose kabutėse ir atskirti kableliais (jei IP yra daugiau nei vienas)
- kintamojo time_pause = 30 reikšmė nurodo tikrinimo periodą (sekundėmis). Nerekomenduojama nustatyti mažiau nei 10-15 sekundžių, ypač jei tikrinamų IP sąrašas didelis.
- nešalinkite eilučių atstumų skripte. Tai gali sukelti sintaksės klaidą.

(*) skriptas naudoja patikros metodą, siųsdamas icmp paketus (ping), todėl reikia įsitikinti, kad serveryje ar maršrutizatoriuje (kurie stebimi) ping užklausos nėra blokuojamos.

Dabar viskas paruošta skripto paleidimui.
Kadangi skriptas turi veikti 24/7, kad jo veikimas nebūtų rodomas pagrindiniame konsolės ekrane, paleisime jį atskirame "lange" naudodami screen utilitą (jei ji nėra įdiegta, įdiekite ją. Išsamesnė informacija: Pagrindai dirbant su screen utilita).
Tam vykdysime komandą:
screen -S pingmonitor

ir pereisime į aplanką su skripto failu:
cd && cd pingmonitor

Paleisime skriptą komanda:
python3 main.py

Norėdami išeiti iš sesijos ir palikti veikiantį mūsų skriptą, paspauskite Ctrl+a+d. Dabar SSH konsolę galima uždaryti.
Norėdami prisijungti prie sesijos su veikiančiu skriptu, prisijunkite prie serverio per SSH ir vykdykite komandą:
screen -r pingmonitor

Jei serveris ar maršrutizatorius taps nepasiekiamas ir vėl taps pasiekiamas, gausite pranešimą kanale IP monitoring channel.