Bot za praćenje web servisa za pola sata: telegram + bash + cron

Bot za praćenje web servisa za pola sata: telegram + bash + cron

Ponekad je potrebno brzo provesti monitoring za novu uslugu, a nemamo gotovu infrastrukturu/stručnost. U ovom vodiču za pola sata implementiramo alat za monitoring svih web usluga, koristeći samo ugrađena sredstva ubuntua: bash, cron i curl. Za isporuku obavijesti koristit ćemo telegram.

„Trešnja na torti“ bit će emocionalno angažiranje korisnika. Provjereno na ljudima — radi.

Kada smo u telemedicinskoj usluzi Doktor Rado stvorili chat-bota za određivanje razine stresa korisnika, potrebna nam je bila monitoring. Mini projekt napravljen je za nekoliko sati, a ne samo da odlično radi, već i donosi pozitivu svojim porukama.

Za početak, dobit ćemo repozitorij s skriptama:

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

Ulazimo u mapu msms i dalje radimo u njoj.

Ako je telegram blokiran, koristite proxy. Najjednostavnija i najpouzdanija opcija je torsocks:

sudo apt install tor
sudo apt install torsocks

Kao primjer, postavit ćemo monitoring startne stranice google.com

KORAK 1. Kreiramo bota u telegramu i dobivamo id korisnika

  • U pretraživaču kontakata u telegramu tražimo @botfather:

    Bot za praćenje web servisa za pola sata: telegram + bash + cron

  • Pokrećemo ga tipkom Start, unosimo naredbu /newbot i odgovaramo na pitanja. Treba imati na umu da je name ime bota koje će se prikazivati korisnicima, a username je jedinstven i mora završavati s „bot“:

    Bot za praćenje web servisa za pola sata: telegram + bash + cron

    Između ostalog, bot će dati tajni token za HTTP API, koji treba kopirati i pohraniti u datoteku telegram-api-key.txt u mapi msms.

  • Upisujemo u pretraživač telegrama ime našeg bota i pokrećemo ga.
  • Kao završni detalj, dodajmo se na popis primatelja obavijesti monitoring-a:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skript će ispisati popis posljednjih pristupa bota, trebao bi biti jedan redak s našim id i imenom u telegramu. Uzimamo taj id i pohranjujemo ga u datoteku services/google-recipients.txt. Format datoteke: svaki redak — jedan id. Primjer:

    123456789
    987654321

Da biste dodali novog primatelja, trebate ga zamoliti da pokrene bota u telegramu, pokrene recipients-setup.sh i doda id u datoteku.

KORAK 2. Postavljamo monitoring

Opis usluge se vrši kreiranjem ini-datoteke u mapi serviсes. Potrebno je definirati pet parametara:

  1. MSMS_SERVICE_NAME: naziv usluge — koristi se u obavijestima i dnevniku monitoringa.
  2. MSMS_SERVICE_ENDPOINT: endpoint usluge, na koji ćemo se obratiti curl-om.
  3. MSMS_CURL_PARAMS: dodatni parametri curl, pogledajte primjer u nastavku.
  4. MSMS_EXPECTED: očekivani odgovor servisa. Koristi se ako je odgovor kratak.
  5. MSMS_EXPECTED_FILE: ime datoteke s očekivanim odgovorom servisa. Ako je navedena, prepisuje MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: datoteka sa popisom primatelja obavijesti.

Zahjev za google.com vraća fiksni html s redirekcijom, koristit ćemo ga kao očekivani odgovor servera:

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

Stvaramo datoteku services/google.ini:

MSMS_SERVICE_NAME='google početna stranica'

# krajnja točka servisa
MSMS_SERVICE_ENDPOINT='google.com'

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

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

# datoteka s popisom primatelja
MSMS_RECIPIENTS='google-recipients.txt'

U MSMS_CURL_PARAMS možete postaviti sve što curl podržava, uključujući:

  1. Isključite curl poruke kako ne biste zagušivali konzolu i log: -s
  2. Postavite vrijeme isteka povezivanja s provjerenim servisom (u sekundama): --connect-timeout 3
  3. Postavite vrijeme isteka za dobivanje odgovora: -m 7
  4. Isključite provjeru certifikata za SSL (npr. ako se koristi samo-potpisani certifikat): --insecure
  5. Odredite tip http-zahtjeva: -X POST
  6. Odredite zaglavlja: -H "Content-Type: application/json"
  7. Odredite tijelo zahtjeva u obliku niza ili datoteke. Primjer za datoteku: -d @request.json

Isključili smo obavijesti i postavili timeout od 3 sekunde za povezivanje i 7 sekundi za dobivanje odgovora servisa.

Pažnja: navedite vrijednosti parametara u jednostrukim navodnicima, kao u primjeru. Nažalost, bash je u tom smislu prilično krhak, i slučajno dodana zarezna ili neodgovarajuća zagrada može dovesti do zbrke uz teško dijagnosticiranje grešaka.

Postavili smo praćenje. Provjerimo je li sve u redu:

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

Skripta bi trebala ispisati poruku u obliku:

2020-01-10 12:14:31
health-check "google početna stranica": OK

KORAK 3. Postavljamo raspored

Postavit ćemo raspored praćenja u cron:

sudo crontab -e

Dodajemo redak za provjeru google.com svake minute:

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

Svaki dan u 11:00 dodajemo obavijest koja potvrđuje funkcionalnost samog praćenja. Za to ćemo predati parametar DAILY skripti:

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

` označava preusmjeravanje — standardni postupak koji preusmjerava greške u glavni izlaz. Na kraju, i one će završiti u logu praćenja.

Spremite promjene i preuzmite ih komandom:

 sudo service cron reload

Više informacija o postavkama cron možete pročitati, na primjer, ovdje.

Tako će se svake minute pokretati skripta za nadgledanje koja će putem cURL-a slati zahtjev na google.com. Ako primljeni odgovor ne odgovara očekivanom, skripta će poslati obavijest na listu primatelja putem Telegrama. Zapisnik provjera se vodi u datoteci monitoring.log

Ako trebamo dodati još jednu uslugu, jednostavno kreiramo novu ini-datoteku za nju u mapi services i, po potrebi, formiramo poseban popis primatelja. Sve ostalo će funkcionisati automatski.

Ako usluga koja se provjerava postane nedostupna, obavijest će dolaziti svake minute. Ako ne uspijemo brzo obnoviti uslugu, obavijesti možemo privremeno onemogućiti u svojstvima bota u Telegramu.

Sada se detaljno pozabavimo dodatnim mogućnostima i implementacijom skripti.

Šabloni poruka i emocionalna angažiranost

Kako bismo komunikaciju s botom učinili živahnijom, nazvali smo ga Manekom, dodali odgovarajuću sliku avatare i angažirali profesionalne PR-ovce za izradu tekstova poruka. Možete koristiti naše materijale ili ih promijeniti prema vlastitom ukusu.

Na primjer ovako:

Bot za praćenje web servisa za pola sata: telegram + bash + cron
ili čak ovako:

Bot za praćenje web servisa za pola sata: telegram + bash + cron
Zašto ne?

Ime bota i avatar postavljaju se preko @botfather.
Šabloni poruka nalaze se u mapi templates:

  • curl-fail.txt: poruka koja se šalje kada cURL vrati nenulti kod greške. Obično označava nemogućnost pristupa usluzi.
  • daily.txt: dnevna poruka koja potvrđuje da monitoring usluge radi.
  • service-fail.txt: poruka koja se šalje kada odgovor usluge ne odgovara očekivanom.

Razmotrićemo mogućnosti prilagodbe na primjeru ugrađenih šablona poruka.
U šablonima se koriste emojiji. Nažalost, Habr ih ne prikazuje.
Za odabir emojija praktično je koristiti pretraživanje na emojipedia.org:

Bot za praćenje web servisa za pola sata: telegram + bash + cron

Odgovarajući simbol jednostavno kopirajte i zalijepite u tekst šablona (to je običan unicode).

  1. curl-fail.txt:
    Mačiću, pomozi mi... 
    Ne mogu doći do usluge "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Koristili smo ime usluge koje smo odredili (varijabla MSMS_SERVICE_NAME) i internu varijablu skripte s kodom završetka cURL-a (EXIT_CODE). Također smo formatirali poruku koristeći markup telegram markdown: simboli "`" okružuju tekst fiksne širine. Pošto su navodnici i apostrofi rezervisani simboli u bash-u, izlazimo iz njih pomoću "". Imena varijabli prethodimo znakom "$".

    Rezultat:

    Bot za praćenje web servisa za pola sata: telegram + bash + cron

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

    Rezultat:

    Bot za praćenje web servisa za pola sata: telegram + bash + cron

    Ovde koristimo još jednu skript varijablu: RESPONSE. Ona sadrži odgovor servisa.

  3. daily.txt:
    Bebe, zdravo!
    Sve je u redu sa mnom, pratim servis:
    "$MSMS_SERVICE_NAME" svake minute...
    Kako si ti?
    

    Rezultat:

    Bot za praćenje web servisa za pola sata: telegram + bash + cron

Pređimo na implementaciju skripti.

Skript za nadzor

monitoring.sh radi jednostavno auto-otkrivanje – uzima sve ini-fajlove iz foldera services i za svaki izvršava glavnu 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 nadzora, skriptu možete proslediti parametar DAILY.

Obratite pažnju da se pri pokretanju skripte trenutni folder menja na services. To omogućava u ini-fajlovima da se navedu putevi do fajlova relativno prema services.

Skript za proveru i slanje obaveštenja

msms.sh sadrži glavnu 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 telegrama, koristeći sačuvani tajni ključ iz fajla.

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

Izađimo trenutni datum-vreme i učitajmo ini-fajl.

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

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

Magična linija . $2 izvodi prosleđeni kao drugi parametar ini-fajl kao običan skript, smeštajući definisane vrednosti u varijable okruženja.

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

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

Izvršimo 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" NIJE PROŠAO: 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" NIJE PROŠAO: "$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šenja komande curl za ovaj servis.

Izraz EXIT_CODE=$? sjeća se rezultata posljednje izvedene komande, tj. curl. U slučaju da je potrebno poslati obavijest, uzima se predložak iz odgovarajuće datoteke i vrši se slanje na primatelje pomoću send_message.

Posljednji blok obrađuje parametar DAILY:

if test "$1" = "DAILY"; then
    echo health-check "$MSMS_SERVICE_NAME" DAILY
    MESSAGE="$(cat ..\/templates\/daily.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
fi

On šalje poruku koja potvrđuje funkcionalnost samog nadgledanja.

Dobivanje popisa id korisnika

recipients-setup.sh se obraća API-ju telegrama za dobivanje posljednjih poruka upućenih botu:

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

Ovdje se koristi čarolija Pythona za lijepo ispisivanje popisa. Ovo nije obavezno, možete jednostavno uzeti potrebni id iz json-a koji će ispisati komanda:

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

Zaključak

Na taj način možete koristiti gotove skripte i predloške poruka, postavljajući samo nadgledane usluge i liste za obavijesti; možete stvoriti novu 'ličnost' za bota; ili možete napraviti svoje rješenje na temelju predloženog.

Kao mogućnost daljnjeg razvoja nameće se konfiguracija i upravljanje nadgledanjem u samom botu, ali tu bez Pythona neće ići. Ako netko završi prije mene — znate gdje postaviti pull request 🙂

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster