Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

Včasih je treba hitro izvesti nadzor za novo storitev, vendar nimamo pripravljene infrastrukture ali strokovnega znanja. V tem priročniku bomo v pol ure vzpostavili orodje za spremljanje kakršnih koli spletnih storitev, uporabimo samo vgrajena sredstva ubuntu: bash, cron in curl. Za dostavo obvestil bomo uporabili telegram.

»Češnja na torti« bo čustveno vključevanje uporabnikov. Preverjeno pri ljudeh - deluje.

Ko smo v telemedicinski storitvi Doktor Rядом ustvarili klepetalnega robota za določanje ravni stresa uporabnikov, smo potrebovali nadzor. V nekaj urah je bil izdelan mini projekt, ki ne le odlično deluje, ampak tudi prinaša pozitivnost s svojimi sporočili.

Za začetek pridobimo repozitorij s skripti:

git clone https://github.com/rshekhovtsov/msms.git

Preidemo v mapo msms in tam nadaljujemo z delom.

Če je telegram blokiran, uporabite proxy. Najbolj preprost in zanesljiv način je torsocks:

sudo apt install tor
sudo apt install torsocks

Kot primer nastavimo nadzor začetne strani google.com v treh korakih.

KORAK 1. Ustvarimo bota v telegramu in pridobimo id uporabnika.

  • V iskalno vrstico stikov v telegramu iščemo @botfather:

    Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

  • Z njim začnemo s tipko Start, vpišemo ukaz /newbot in odgovorimo na vprašanja. Treba je imeti v mislih, da je name - ime bota, ki se bo prikazovalo uporabnikom, username pa je edinstven in se mora končati z „bot“:

    Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

    Med drugim bo bot izdal skrivni žeton za HTTP API, ki ga je treba kopirati in shraniti v datoteko telegram-api-key.txt v mapi msms.

  • V iskalno vrstico telegrama vpišemo ime našega bota ter ga zaženemo.
  • Kot zaključni dodatek se dodamo na seznam prejemnikov obvestil nadzora:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skripta bo izpisala seznam zadnjih poizvedb k botu, tam bi morala biti ena vrstica z našim id-jem in imenom v telegramu. Vzamemo ta id in ga shranimo v datoteko services/google-recipients.txt. Format datoteke: vsaka vrstica - en id. Primer:

    123456789
    987654321

Da dodate novega prejemnika, ga morate prositi, da zažene bota v telegramu, zažene recipients-setup.sh in doda id v datoteko.

KORAK 2. Nastavimo nadzor.

Opis storitve poteka z ustvarjanjem ini-datoteke v mapi services. Treba je nastaviti pet parametrov:

  1. MSMS_SERVICE_NAME: ime storitve - bo uporabljeno v obvestilih in dnevniku nadzora.
  2. MSMS_SERVICE_ENDPOINT: endpoint storitve, na katerega se bomo obrnili s curl.
  3. MSMS_CURL_PARAMS: dodatni parametri curl, pogledajte primjer u nastavku.
  4. MSMS_EXPECTED: očekivani odgovor usluge. Koristi se ako je odgovor kratak.
  5. MSMS_EXPECTED_FILE: ime datoteke s očekivanim odgovorom usluge. Ako je navedeno, prepisuje MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: datoteka sa spiskom primalaca obaveštenja.

Upit na google.com vraća fiksni html s preusmeravanjem, koristićemo ga kao očekivani odgovor servera:

curl google.com > services/google-response.html

Kreirajmo datoteku services/google.ini:

MSMS_SERVICE_NAME='google front page'

# krajnja tačka usluge
MSMS_SERVICE_ENDPOINT='google.com'

# curl parametri
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'

# očekivani odgovor usluge
MSMS_EXPECTED_FILE='google-response.html'

# datoteka sa spiskom primalaca
MSMS_RECIPIENTS='google-recipients.txt'

V MSMS_CURL_PARAMS možete postaviti sve što curl može, uključujući:

  1. Isključite curl poruke kako ne biste zagušili konzolu i log: -s
  2. Postavite vreme čekanja za povezivanje sa proveravanom uslugom (u sekundama): --connect-timeout 3
  3. Postavite vreme čekanja za primanje odgovora: -m 7
  4. Isključite proveru sertifikata za SSL (na primjer, ako se koristi samo-potpisani sertifikat): --insecure
  5. Odredite tip http zahteva: -X POST
  6. Odredite zaglavlja: -H "Content-Type: application/json"
  7. Odredite telo zahteva kao string ili datoteku. Primer za datoteku: -d @request.json

Isključili smo obaveštenja i postavili vreme čekanja na 3 sekunde za povezivanje i 7 sekundi za primanje odgovora usluge.

Opozorilo: navedite vrednosti parametara u jednostrukim navodnicima, kao u primeru. Nažalost, bash je u ovom smislu prilično osetljiv, i slučajno postavljena neodgovarajuća navodnica može dovesti do teško dijagnostikovanih grešaka.

Podesili smo monitoring. Proverimo da li je sve u redu:

sudo chmod +x ./monitoring.sh
torsocks ./monitoring.sh

Skripta bi trebala da prikaže poruku u obliku:

2020-01-10 12:14:31
health-check "google front page": OK

KORAK 3. Podešavanje rasporeda

Podesimo raspored monitoringa u cron:

sudo crontab -e

Dodajmo red za proveru google.com svake minute:

*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1

Dodajmo svake nedelje u 11:00 obaveštenje koje potvrđuje ispravnost samog monitoringa. U tu svrhu, prosledićemo parametar DAILY skripti:

0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1

2>&1 — standardna procedura koja preusmerava greške u glavni izlaz. Kao rezultat, one će takođe biti zabeležene u logu monitoringa.

Sačuvajmo izmene i primenimo ih komandom:

 sudo service cron reload

Več o nastavitvi cron lahko preberete, na primer, ovde.

Tako bo vsakih pet minut zagnan skript za spremljanje, ki bo prek curl pošiljal zahtevo na google.com. Če se pridobljen odgovor razlikuje od pričakovanega, bo skript poslal obvestilo na seznam prejemnikov v telegramu. Dnevnik preverjanj se shrani v datoteki monitoring.log.

Če želite dodati še eno storitev, preprosto ustvarite novo ini-datoteko v mapi services in, po potrebi, oblikujete poseben seznam prejemnikov. Vse ostale naloge bodo delovale avtomatsko.

Če storitev ni več dostopna, bo obvestilo prihajalo na vsake minute. Če se storitev ne obnese hitro obnoviti, lahko začasno onemogočite obvestila v nastavitvah robota v telegramu.

Sedaj si poglejmo podrobneje dodatne možnosti in implementacijo skriptov.

Predloge sporočil in čustvena angažiranost

Da bi bilo komuniciranje z robotom bolj živo, smo ga poimenovali Manja, dodali ustrezno sliko avatarja in angažirali strokovnjake za odnose z javnostmi za ustvarjanje besedil sporočil. Uporabite lahko naše konstrukcije ali jih spremenite po svojem okusu.

Na primer tako:

Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron
ali celo tako:

Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron
Zakaj pa ne?

Ime robota in avatar sta določena prek @botfather.
Predloge sporočil se nahajajo v mapi templates:

  • curl-fail.txt: sporočilo, poslano v primeru, ko je curl vrnil ne-nulti kodo napake. Običajno pomeni, da storitve ni mogoče doseči.
  • daily.txt: dnevno sporočilo, ki potrjuje, da spremljanje storitve deluje.
  • service-fail.txt: sporočilo, poslano v primeru, ko se odgovor storitve razlikuje od pričakovanega.

Poglejmo možnosti prilagajanja na primeru vgrajenih predlog sporočil.
V predlogah se uporabljajo emojiji. Na žalost, habr jih ne prikazuje.
Za iskanje emojijev je priročno uporabiti iskalnik na emojipedia.org:

Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

Ustrezni simbol preprosto kopirate in prilepite v besedilo predloge (to je običajen unicode).

  1. curl-fail.txt:
    Maček, pomagaj mi... 
    Ne morem doseči storitve "$MSMS_SERVICE_NAME" 
    `KODA IZHODA CURL: $EXIT_CODE`

    Uporabili smo ime storitve, ki smo ga določili (spremenljivka MSMS_SERVICE_NAME) in notranjo spremenljivko skripta s kodo končanja curl (EXIT_CODE). Prav tako smo oblikovali sporočilo z uporabo oznak telegram markdown: znakovi "`" okružuju tekst fiksne širine. Budući da su navodnici i apostrofi službeni znakovi bash-a, mi ih escapingujemo znakom "". Imena promenljivih prethodimo znakom "$".

    Rezultat:

    Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

  2. service-fail.txt:
    Mače, pomozi mi... 
    Servis "$MSMS_SERVICE_NAME" me razočarao
    Ne radi kako treba, evo šta mi odgovara:
    `$RESPONSE`

    Rezultat:

    Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

    Ovde koristimo još jednu promenljivu skripta: RESPONSE. Ona sadrži odgovor servisa.

  3. daily.txt:
    Hej, beba!
    Sve je u redu, pratim servis:
    "$MSMS_SERVICE_NAME" svake minute...
    A kako si ti?
    

    Rezultat:

    Бот за мониторинг веб сервиса за пола сата: telegram + bash + cron

Pređimo na implementaciju skripti.

Skripta za monitoring

monitoring.sh vrši jednostavno auto-discovery — uzima sve ini fajlove iz foldera services i za svaki izvršava osnovnu skriptu sa logikom provere i slanja obaveštenja:

#!/bin/bash
cd $(dirname "$0")/services

for service_ini  in $(ls *.ini); do
    bash ../msms.sh "$1" "$service_ini"
done

Za formiranje dnevne poruke o statusu monitoringa, skripti se može proslediti parametar DAILY.

Obratite pažnju da se pri pokretanju skripte trenutni folder menja na services. Ovo omogućava da se u ini fajlovima navode putevi do fajlova u odnosu na services.

Skripta za proveru i slanje obaveštenja

msms.sh sadrži osnovnu logiku provere servisa i slanja obaveštenja.

Rad sa telegramom:

# telegram endpoint
TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage"

#################################################################
# send message to telegram
# parameter: message text
#################################################################
function send_message {
    for chat_id  in $(cat ../$MSMS_RECIPIENTS); do
	curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1"
	echo
    done
}

Formiramo URL za pristup REST API telegram-a, koristeći sačuvani u fajlu tajni ključ.

Funkcija send_message koristi curl za slanje poruka na ovaj REST API, uzimajući id primaoca iz fajla koji smo naveli u ini. U prosleđenim podacima navodimo da koristimo formatiranje poruka: parse_mode="Markdown".

Prikažimo trenutno datum-vreme i učitajmo ini fajl.

echo $(date '+%Y-%m-%d %H:%M:%S')

# učitaj promenljive iz .ini fajla:
. $2

Magijska linija . $2 izvršava prosleđeni drugi parametar ini-fajl kao običan skript, unoseći zadate vrednosti u promenljive okruženja.

Učitajmo očekivani odgovor iz fajla, ako je podesen parametar MSMS_EXPECTED_FILE:

if [ -n "$MSMS_EXPECTED_FILE" ]; then
 MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi

Izvršićemo proveru servisa sa slanjem obaveštenja, ako je potrebno:

RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
    echo health-check "$MSMS_SERVICE_NAME" FAILED: CURL EXIT WITH $EXIT_CODE
    MESSAGE="$(cat ..\/templates\/curl-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then
    echo health-check "$MSMS_SERVICE_NAME" FAILED: "$RESPONSE"
    MESSAGE="$(cat ..\/templates\/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo health-check "$MSMS_SERVICE_NAME": OK
fi

Prvo dodeljujemo promenljivoj RESPONSE rezultat izvršavanja komande curl za ovaj servis.

Izraz EXIT_CODE=$? записывает результат выполнения последней команды, т.е. curl. Если требуется отправка уведомления, шаблон считывается из соответствующего файла и осуществляется рассылка получателям при помощи send_message.

Последний блок обрабатывает параметр DAILY:

если тест "$1" = "DAILY"; тогда
    echo health-check "$MSMS_SERVICE_NAME" DAILY
    MESSAGE="$(cat ..\/templates\/daily.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
fi

Он отправляет сообщение, подтверждающее работоспособность самого мониторинга.

Получение списка id пользователей

recipients-setup.sh обращается к API Telegram для получения последних сообщений, адресованных боту:

curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates 
| python recipients-setup.py

Здесь используется магия Python для красивого вывода списка. Это необязательно, можно просто взять нужный id из json, который выведет команда:

torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates

Zaključek

Таким образом, вы можете использовать готовые скрипты и шаблоны сообщений, настраивая лишь наблюдаемые сервисы и списки для уведомлений; можете создать новую «личность» для бота; а можете сделать свое решение на основе предложенного.

Как варианты дальнейшего развития, напрашивается конфигурирование и управление мониторингом в самом боте, но без Python тут уже не обойтись. Если у кого-то дойдут руки раньше меня — вы знаете, куда заливать pull request 🙂

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster