Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

Včasih morate hitro uvesti spremljanje nove storitve, vendar nimate potrebne infrastrukture ali strokovnega znanja. V tem priročniku bomo v pol ure implementirali orodje za spremljanje katere koli spletne storitve, pri čemer bomo uporabili le vgrajena orodja. ubuntu: bash, cron in curl. Za pošiljanje obvestil bomo uporabili Telegram.

»Češnja na torti« bo čustvena vključenost uporabnikov. Preizkušeno na ljudeh - deluje.

Ko smo v telemedicinski storitvi Doctor Nearby ustvarili chatbota za ugotavljanje stopnje stresa uporabnikov, smo potrebovali spremljanje. V nekaj urah je nastal mini projekt, ki ne samo da odlično deluje, ampak s svojimi sporočili dodaja tudi pozitivnost.

Najprej dobimo repozitorij s skripti:

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

Pojdite v mapo msms in nato delajte v njej.

Če je telegram blokiran, uporabite proxy. Najenostavnejša in najbolj zanesljiva možnost so trupi:

sudo apt install tor
sudo apt install torsocks

Za primer nastavimo spremljanje začetne strani google.com v treh korakih.

KORAK 1. Ustvarite bota v telegramu in pridobite ID uporabnika

  • V iskalni vrstici za stike v telegramu iščemo @botfather:

    Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

  • Zaženemo ga z gumbom Start, vnesemo ukaz /newbot in odgovorimo na vprašanja. Upoštevati morate, da je ime ime bota, ki bo prikazano uporabnikom, uporabniško ime pa je edinstveno in se mora končati z "bot":

    Bot za spremljanje spletnih storitev v pol ure: 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 vtipkamo ime našega bota in ga zaženemo.
  • Za zaključek se dodamo na seznam prejemnikov nadzornih opozoril:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skript bo prikazal seznam nedavnih klicev botu; v telegramu mora biti ena vrstica z našim ID-jem in imenom. Ta ID vzamemo in ga shranimo v datoteko services/google-recipients.txt. Format datoteke: vsaka vrstica je en ID. primer:

    123456789
    987654321

Če želite dodati novega prejemnika, ga morate prositi, da zažene bota v telegramu, zažene recipients-setup.sh in doda ID v datoteko.

KORAK 2. Nastavite spremljanje

Storitev je opisana tako, da ustvarite ini datoteko v mapi storitev. Nastaviti morate pet parametrov:

  1. MSMS_SERVICE_NAME: ime storitve - uporabljeno bo v opozorilih in dnevniku spremljanja.
  2. MSMS_SERVICE_ENDPOINT: končna točka storitve, s katero bomo vzpostavili stik s curlom.
  3. MSMS_CURL_PARAMS: dodatne možnosti kodrov, glejte spodnji primer.
  4. MSMS_EXPECTED: pričakovan odziv servisa. Uporablja se, če je odgovor kratek.
  5. MSMS_EXPECTED_FILE: ime datoteke s pričakovanim odgovorom storitve. Če je navedeno, prepiše MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: datoteka s seznamom prejemnikov obvestil.

Zahteva za google.com vrne fiksni html s preusmeritvijo, uporabili ga bomo kot pričakovan odgovor strežnika:

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

Ustvarimo datoteko 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 nastavite lahko vse, kar zmore curl, vključno z:

  1. Onemogočite curl sporočila, da preprečite nered na konzoli in dnevniku: -s
  2. Nastavite časovno omejitev povezave s storitvijo, ki se preverja (v sekundah): --connect-timeout 3
  3. Nastavite časovno omejitev odziva: -m 7
  4. Onemogočite preverjanje potrdila za SSL (na primer, če uporabljate samopodpisano potrdilo): --insecure
  5. Določite vrsto zahteve http: -X POST
  6. Določite naslove: -H "Content-Type: application/json"
  7. Podajte telo zahteve kot niz ali datoteko. Primer za datoteko: -d @request.json

Onemogočili smo obvestila in nastavili časovne omejitve na 3 sekunde. za povezavo in 7 sek. da prejmete servisni odgovor.

Pozornost: Določite vrednosti parametrov v enojnih narekovajih, kot v primeru. Na žalost je bash v tem smislu precej krhek in naključni metulj z napačnim narekovajem lahko privede do smrti vesolja s težko diagnosticiranimi napakami.

Vzpostavili smo monitoring. Preverimo, ali je vse v redu:

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

Skript bi moral prikazati sporočilo, kot je:

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

KORAK 3. Nastavitev urnika

Nastavimo urnik spremljanja v cron:

sudo crontab -e

Dodajmo vrstico za preverjanje google.com vsako minuto:

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

Vsak dan ob 11.00 bomo dodali opozorilo, ki bo potrdilo funkcionalnost samega spremljanja. Da bi to naredili, bomo skriptu posredovali parameter DAILY:

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

2>&1 - standardna tehnika, ki preusmerja napake v glavni izhodni tok. Posledično bodo končali tudi v dnevniku spremljanja.

Shranimo spremembe in jih poberemo z ukazom:

 sudo service cron reload

Več o nastavitvi cron lahko na primer preberete tukaj.

Tako se bo vsako minuto zagnal nadzorni skript, ki bo povezal google.com preko curla. Če se prejeti odgovor razlikuje od pričakovanega, bo skript poslal obvestilo telegram na seznam prejemnikov. Revizijski dnevnik se hrani v datoteki monitoring.log

Če moramo dodati še eno storitev, preprosto ustvarimo novo ini datoteko zanjo v mapi storitev in po potrebi ustvarimo ločen seznam prejemnikov. Vse ostalo bo delovalo samodejno.

Če storitev, ki se preverja, ni več na voljo, bo vsako minuto poslano opozorilo. Če storitve ne morete hitro obnoviti, lahko začasno onemogočite obvestila v lastnostih telegrama bota.

Zdaj pa si podrobneje oglejmo dodatne funkcije in izvedbo skriptov.

Vzorci sporočil in čustvena angažiranost

Da bi bila komunikacija z botom bolj živahna, smo ga poimenovali Manechka, dodali ustrezno sliko avatarja in najeli profesionalne PR strokovnjake za ustvarjanje besedil sporočil. Lahko uporabite naše izkušnje ali pa jih spremenite po svojem okusu.

Na primer takole:

Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron
ali celo takole:

Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron
Zakaj ne?

Ime bota in avatar sta nastavljena prek @botfather.
Predloge sporočil so v mapi predloge:

  • curl-fail.txt: sporočilo, poslano, ko curl vrne kodo napake, ki ni nič. Običajno govori o nezmožnosti doseganja storitve.
  • daily.txt: dnevno sporočilo, ki potrjuje, da nadzor storitev deluje.
  • service-fail.txt: Sporočilo, poslano, ko je odziv storitve drugačen od pričakovanega.

Oglejmo si možnosti prilagajanja na primeru vgrajenih predlog sporočil.
Predloge uporabljajo emoji. Na žalost jih habr ne prikaže.
Če želite izbrati emoji, je priročno uporabiti iskanje na emojipedia.org:

Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

Preprosto kopirate in prilepite ustrezen simbol v besedilo predloge (to je običajni unicode).

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

    Uporabili smo ime storitve, ki smo ga določili (spremenljivka MSMS_SERVICE_NAME) in interno skriptno spremenljivko z izhodno kodo curl (EXIT_CODE). Sporočilo smo tudi oblikovali z oznako telegram markdown: znaki "`" obkrožajo besedilo s fiksno širino. Ker so narekovaji in apostrofi bash simboli, jim ubežimo z "". Pred imeni spremenljivk je znak "$".

    Rezultat:

    Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

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

    Rezultat:

    Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

    Tukaj uporabljamo drugo spremenljivko skripta: RESPONSE. Vsebuje odgovor storitve.

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

    Rezultat:

    Bot za spremljanje spletnih storitev v pol ure: telegram + bash + cron

Preidimo na izvajanje skriptov.

Skript za spremljanje

spremljanje.sh naredi preprosto samodejno odkrivanje - vzame vse datoteke ini iz mape storitev in za vsako izvede glavni skript z logiko za preverjanje in pošiljanje opozoril:

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

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

Če želite ustvariti dnevno sporočilo o statusu spremljanja, lahko skriptu posredujete parameter DAILY.

Upoštevajte, da se ob zagonu skripta trenutna mapa spremeni v storitve. To vam omogoča, da določite poti datotek glede na storitve v datotekah ini.

Skripta za preverjanje in pošiljanje obvestil

msms.sh vsebuje glavno logiko za preverjanje storitve in pošiljanje opozoril.

Delo s 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
}

Ustvarimo URL za dostop do API-ja REST telegrama s pomočjo tajnega ključa, shranjenega v datoteki.

Funkcija send_message uporablja curl za pošiljanje sporočil temu API-ju REST, pri čemer vzame ID-je prejemnikov iz datoteke, ki smo jo podali v ini. V podatkih, ki jih pošljemo, navedemo, da uporabljamo označevanje sporočil: parse_mode="Markdown".

Prikažimo trenutni datum in čas ter naložimo datoteko ini.

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

# load variables from .ini file:
. $2

Čarobna vrvica . $2 izvede datoteko ini, ki je bila posredovana vhodu kot drugi parameter kot običajni skript, pri čemer v spremenljivke okolja vnese vrednosti, ki so v njej podane.

Naloži pričakovan odgovor iz datoteke, če je parameter podan MSMS_EXPECTED_FILE:

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

Storitev bomo preverili in po potrebi poslali opozorila:

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

Najprej priredimo spremenljivki RESPONSE rezultat izvajanja ukaza curl za to storitev.

Izraz EXIT_CODE=$? postavi rezultat zadnjega ukaza v spremenljivko, tj. curl. Če je treba poslati opozorilo, se predloga prebere iz ustrezne datoteke in pošlje prejemnikom z uporabo send_message.

Zadnji blok obdela parameter 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

Pošlje sporočilo, ki potrjuje funkcionalnost samega spremljanja.

Pridobivanje seznama ID-jev uporabnikov

recipients-setup.sh pokliče telegram API, da dobi najnovejša sporočila, naslovljena na bot:

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

To uporablja python magic za čudovit prikaz seznama. To ni potrebno, lahko preprosto vzamete želeni ID iz json, ki ga bo ukaz izpisal:

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

Zaključek

Tako lahko uporabite že pripravljene skripte in predloge sporočil, nastavite samo nadzorovane storitve in sezname za opozorila; ustvarite lahko novo »osebnost« za bota; lahko pa se sami odločite glede na predlagano.

Možnosti za nadaljnji razvoj predlagajo konfiguracijo in upravljanje nadzora v samem botu, vendar tukaj ne morete storiti brez pythona. Če ga kdo dobi pred mano, veste, kam oddati zahtevo za vlečenje :)

Vir: www.habr.com

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