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 morate brzo obaviti monitoring za novu uslugu, ali nema gotove infrastrukture/stručnosti pri ruci. U ovom vodiču ćemo za pola sata implementirati alat za praćenje bilo kojeg web servisa, koristeći samo ugrađene alate ubuntua: bash, cron i curl. Koristit ćemo telegram za isporuku upozorenja.

“Trešnja na torti” će biti emocionalna uključenost korisnika. Testirano na ljudima - djeluje.

Kada smo u telemedicinskom servisu Doctor Nearby kreirali chatbot za određivanje nivoa stresa korisnika, trebalo nam je praćenje. Za par sati nastao je mini-projekat koji ne samo da odlično funkcionira, već svojim porukama unosi i pozitivnost.

Prvo, nabavimo spremište sa skriptama:

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

Idite u msms folder i radite u njemu.

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

sudo apt install tor
sudo apt install torsocks

Kao primjer, postavimo praćenje početne stranice google.com u tri koraka.

KORAK 1. Kreirajte bota u telegramu i uzmite korisnički ID

  • U traci za pretragu za kontakte u telegramu tražimo @botfather:

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

  • Pokrećemo ga tipkom Start, upisujemo naredbu /newbot i odgovaramo na pitanja. Morate imati na umu da je ime ime bota koji će biti prikazan korisnicima, a korisničko ime je jedinstveno i mora se završavati sa "bot":

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

    Između ostalog, bot će izdati tajni token za HTTP API, koji se mora kopirati i sačuvati u telegram-api-key.txt datoteku u msms folderu.

  • Ukucamo ime našeg bota u traku za pretragu telegrama i pokrenemo ga.
  • Kao završni dodir, dodajmo sebe na listu primatelja upozorenja za praćenje:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skripta će prikazati listu nedavnih poziva botu; u telegramu bi trebao biti jedan red s našim ID-om i imenom. Uzimamo ovaj ID i spremamo ga u fajl services/google-recipients.txt. Format datoteke: svaki red je jedan id. primjer:

    123456789
    987654321

Da biste dodali novog primaoca, morate ga zamoliti da pokrene bot u telegramu, pokrene recipients-setup.sh i doda id u datoteku.

KORAK 2. Postavite nadzor

Usluga je opisana kreiranjem ini datoteke u folderu usluge. Potrebno je podesiti pet parametara:

  1. MSMS_SERVICE_NAME: naziv usluge - koristit će se u upozorenjima i dnevniku praćenja.
  2. MSMS_SERVICE_ENDPOINT: krajnja tačka usluge na koju ćemo kontaktirati sa curl.
  3. MSMS_CURL_PARAMS: dodatne opcije uvijanja, pogledajte primjer ispod.
  4. MSMS_EXPECTED: očekivani odgovor servisa. Koristi se ako je odgovor kratak.
  5. MSMS_EXPECTED_FILE: naziv datoteke sa očekivanim odgovorom usluge. Ako je navedeno, prepisuje MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: datoteka sa listom primatelja obavještenja.

Zahtjev na google.com vraća fiksni html s preusmjeravanjem, mi ćemo ga koristiti kao očekivani odgovor servera:

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

Kreirajmo fajl services/google.ini:

MSMS_SERVICE_NAME='google front page'

# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'

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

# expected service response
MSMS_EXPECTED_FILE='google-response.html'

# recipients list file
MSMS_RECIPIENTS='google-recipients.txt'

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

  1. Onemogućite curl poruke kako biste izbjegli zatrpavanje konzole i dnevnika: -s
  2. Postavite vremensko ograničenje veze sa uslugom koja se provjerava (u sekundama): --connect-timeout 3
  3. Postavite vremensko ograničenje odgovora: -m 7
  4. Onemogućite verifikaciju certifikata za SSL (na primjer, ako koristite samopotpisani certifikat): --insecure
  5. Odredite vrstu http zahtjeva: -X POST
  6. Navedite naslove: -H "Content-Type: application/json"
  7. Navedite tijelo zahtjeva kao string ili datoteku. Primjer za fajl: -d @request.json

Onemogućili smo obavještenja i postavili vremensko ograničenje na 3 sekunde. za povezivanje i 7 sek. da dobijete servisni odgovor.

Oprez: Navedite vrijednosti parametara u jednostrukim navodnicima, kao u primjeru. Nažalost, bash je u tom smislu prilično krhak, a slučajni leptir s pogrešnim navodnikom može dovesti do smrti svemira uz greške koje je teško dijagnosticirati.

Postavili smo monitoring. Hajde da proverimo da li je sve u redu:

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

Skripta bi trebala prikazati poruku poput:

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

KORAK 3. Postavljanje rasporeda

Postavimo raspored nadgledanja u cron-u:

sudo crontab -e

Dodajmo red za provjeru google.com svake minute:

*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

Svakog dana u 11.00:XNUMX dodavaćemo upozorenje, potvrđujući funkcionalnost samog monitoringa. Da bismo to učinili, skriptu ćemo proslijediti parametar DAILY:

0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

2>&1 - standardna tehnika koja preusmjerava greške na glavni izlazni tok. Kao rezultat toga, oni će također završiti u evidenciji praćenja.

Sačuvajmo promjene i pokupimo ih naredbom:

 sudo service cron reload

Možete pročitati više o postavljanju cron-a, na primjer, ovdje.

Tako će svake minute biti pokrenuta skripta za praćenje koja će kontaktirati google.com preko curl-a. Ako se primljeni odgovor razlikuje od očekivanog, skripta će poslati telegramsko obavještenje na listu primalaca. Dnevnik revizije se čuva u datoteci monitoring.log

Ako treba da dodamo još jednu uslugu, jednostavno kreiramo novu ini datoteku za nju u folderu usluge i, ako je potrebno, kreiramo zasebnu listu primalaca. Sve ostalo će raditi automatski.

Ako je usluga koja se provjerava postala nedostupna, upozorenje će biti poslano svake minute. Ako ne možete brzo vratiti uslugu, možete privremeno onemogućiti obavijesti u svojstvima telegrama bota.

Sada pogledajmo bliže dodatne funkcije i implementaciju skripti.

Obrasci poruka i emocionalni angažman

Kako bismo komunikaciju s botom učinili živahnijom, nazvali smo ga Manechka, dodali odgovarajuću sliku avatara i angažirali profesionalne PR stručnjake da kreiraju tekstove poruka. Možete iskoristiti naše iskustvo ili ga promijeniti po svom ukusu.

Na primjer ovako:

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

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

Ime bota i avatar se postavljaju putem @botfather.
Šabloni poruka su u folderu predlošci:

  • curl-fail.txt: poruka se šalje kada curl vrati kod greške koji nije nula. Obično se govori o nemogućnosti dolaska do servisa.
  • daily.txt: Dnevna poruka koja potvrđuje da nadzor servisa radi.
  • service-fail.txt: Poruka se šalje kada se odgovor usluge razlikuje od očekivanog.

Pogledajmo opcije prilagođavanja koristeći ugrađene šablone poruka kao primjer.
Šabloni koriste emotikone. Nažalost, habr ih ne prikazuje.
Za odabir emotikona zgodno je koristiti pretragu na emojipedia.org:

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

Jednostavno kopirate i zalijepite odgovarajući simbol u tekst predloška (ovo je običan unikod).

  1. curl-fail.txt:
    Котёнок,  помоги мне... 
    Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Koristili smo naziv usluge koji smo naveli (varijable MSMS_SERVICE_NAME) i internu varijablu skripte sa izlaznim kodom curl (EXIT_CODE). Takođe smo formatirali poruku koristeći markup telegram mardown: znakovi "`" okružuju tekst fiksne širine. Budući da su navodnici i apostrofi bash simboli, izbjegavamo ih sa "". Imenima varijabli prethodi znak "$".

    Rezultat:

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

  2. service-fail.txt:
    Котёнок, помоги мне... 
    Сервис "$MSMS_SERVICE_NAME" меня расстроил
    Он работает неправильно, вот что он мне отвечает:
    `$RESPONSE`

    Rezultat:

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

    Ovdje koristimo drugu varijablu skripte: RESPONSE. Sadrži odgovor usluge.

  3. daily.txt:
    Малыш, привет!
    У меня всё хорошо, cлежу за сервисом:
    "$MSMS_SERVICE_NAME" каждую минутку...
    А как у тебя дела?
    

    Rezultat:

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

Pređimo na implementaciju skripti.

Skripta za praćenje

monitoring.sh radi jednostavno automatsko otkrivanje - uzima sve ini datoteke iz foldera sa uslugama i za svaku izvršava glavnu skriptu s logikom za provjeru i slanje upozorenja:

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

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

Da biste generirali dnevnu poruku o statusu nadzora, možete proslijediti parametar DAILY skripti.

Imajte na umu da kada se skripta pokrene, trenutni folder se mijenja u usluge. Ovo vam omogućava da odredite putanje datoteka u odnosu na usluge u ini datotekama.

Skripta za provjeru i slanje obavještenja

msms.sh sadrži glavnu logiku za provjeru usluge i slanje upozorenja.

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
}

Generišemo URL za pristup REST API-ju telegrama koristeći tajni ključ sačuvan u datoteci.

Funkcija send_message koristi curl za slanje poruka ovom REST API-ju, uzimajući ID-ove primatelja iz datoteke koju smo naveli u ini. U podacima koje šaljemo označavamo da koristimo označavanje poruka: parse_mode="Markdown".

Hajde da prikažemo trenutni datum i vreme i učitamo ini fajl.

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

# load variables from .ini file:
. $2

Magic string . $2 izvršava ini datoteku koja je proslijeđena na ulaz kao drugi parametar kao obična skripta, unoseći vrijednosti navedene u njoj u varijable okruženja.

Učitajte očekivani odgovor iz datoteke ako je parametar specificiran MSMS_EXPECTED_FILE:

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

Provjerit ćemo uslugu i poslati upozorenja 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 dodjeljujemo varijablu RESPONSE rezultat izvršavanja naredbe curl za ovu uslugu.

Izraz EXIT_CODE=$? stavlja rezultat zadnje naredbe u varijablu, tj. curl. Ako je potrebno poslati upozorenje, predložak se čita iz odgovarajuće datoteke i šalje primaocima koristeći send_message.

Posljednji blok obrađuje DAILY parametar:

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

Šalje poruku koja potvrđuje funkcionalnost samog nadzora.

Dobivanje liste korisničkih ID-ova

recipients-setup.sh poziva API telegrama da dobije najnovije poruke upućene botu:

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

Ovo koristi python magiju da lijepo prikaže listu. Ovo nije neophodno, možete jednostavno uzeti željeni id iz json-a, koji će naredba izbaciti:

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

zaključak

Dakle, možete koristiti gotove skripte i šablone poruka, postavljajući samo nadgledane servise i liste za upozorenja; možete kreirati novu "ličnost" za bota; ili možete donijeti vlastitu odluku na osnovu onoga što je predloženo.

Opcije za dalji razvoj predlažu konfigurisanje i upravljanje nadzorom u samom botu, ali ovdje ne možete bez pythona. Ako ga neko dobije prije mene, znate gdje da predate zahtjev za povlačenje :)

izvor: www.habr.com

Dodajte komentar