Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

Niekedy potrebujete rýchlo implementovať monitorovanie novej služby, ale nemáte k dispozícii potrebnú infraštruktúru ani odborné znalosti. V tejto príručke implementujeme nástroj na monitorovanie akejkoľvek webovej služby za pol hodiny, pričom použijeme iba vstavané nástroje. ubuntubash, cron a curl. Na doručovanie notifikácií použijeme Telegram.

„Čerešničkou na torte“ bude emocionálna angažovanosť používateľov. Testované na ľuďoch - funguje to.

Keď sme v telemedicínskej službe Doctor near vytvorili chatbota na určenie úrovne stresu používateľov, potrebovali sme monitorovanie. Za pár hodín vznikol miniprojekt, ktorý nielenže skvele funguje, ale svojimi posolstvami dodáva aj pozitivitu.

Najprv získajme úložisko so skriptmi:

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

Prejdite do priečinka msms a potom v ňom pracujte.

Ak je telegram zablokovaný, použite proxy. Najjednoduchšou a najspoľahlivejšou možnosťou sú torzo:

sudo apt install tor
sudo apt install torsocks

Ako príklad si nastavme sledovanie úvodnej stránky google.com v troch krokoch.

KROK 1. Vytvorte robota v telegrame a získajte ID používateľa

  • Vo vyhľadávacom paneli pre kontakty v telegrame hľadáme @bototec:

    Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

  • Spustíme ho tlačidlom Štart, zadáme príkaz /newbot a odpovieme na otázky. Musíte mať na pamäti, že meno je názov robota, ktorý sa zobrazí používateľom, a používateľské meno je jedinečné a musí končiť na „bot“:

    Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

    Okrem iného bot vydá tajný token pre HTTP API, ktorý je potrebné skopírovať a uložiť do súboru telegram-api-key.txt v priečinku msms.

  • Do vyhľadávacieho panela telegramu napíšeme meno nášho robota a spustíme ho.
  • Na záver sa pridajte do zoznamu príjemcov monitorovacích upozornení:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skript zobrazí zoznam posledných hovorov robotovi; v telegrame by mal byť jeden riadok s naším ID a menom. Vezmeme toto ID a uložíme ho do súboru services/google-recipients.txt. Formát súboru: každý riadok je jedno ID. Príklad:

    123456789
    987654321

Ak chcete pridať nového príjemcu, musíte ho požiadať, aby spustil robota v telegrame, spustil recipients-setup.sh a pridal id do súboru.

KROK 2. Nastavte monitorovanie

Služba je opísaná vytvorením ini súboru v priečinku services. Musíte nastaviť päť parametrov:

  1. MSMS_SERVICE_NAME: názov služby – použije sa v protokole výstrah a monitorovania.
  2. MSMS_SERVICE_ENDPOINT: koncový bod služby, s ktorou budeme kontaktovať curl.
  3. MSMS_CURL_PARAMS: ďalšie možnosti zvlnenia, pozri príklad nižšie.
  4. MSMS_EXPECTED: očakávaná odpoveď zo strany služby. Používa sa, ak je odpoveď krátka.
  5. MSMS_EXPECTED_FILE: názov súboru s očakávanou odpoveďou služby. Ak je zadaný, prepíše MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: súbor so zoznamom príjemcov upozornení.

Požiadavka na google.com vracia pevný html s presmerovaním, použijeme ho ako očakávanú odpoveď servera:

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

Vytvorme súbor 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 môžete nastaviť všetko, čo curl dokáže, vrátane:

  1. Zakážte správy curl, aby ste predišli preplneniu konzoly a denníka: -s
  2. Nastavte časový limit pripojenia s kontrolovanou službou (v sekundách): --connect-timeout 3
  3. Nastaviť časový limit odpovede: -m 7
  4. Zakázať overenie certifikátu pre SSL (ak napríklad používate certifikát s vlastným podpisom): --insecure
  5. Zadajte typ požiadavky http: -X POST
  6. Zadajte nadpisy: -H "Content-Type: application/json"
  7. Zadajte telo požiadavky ako reťazec alebo súbor. Príklad súboru: -d @request.json

Zakázali sme upozornenia a nastavili sme časové limity na 3 sekundy. na pripojenie a 7 sek. aby ste dostali servisnú odpoveď.

Pozor: Zadajte hodnoty parametrov v jednoduchých úvodzovkách, ako v príklade. Žiaľ, bash je v tomto zmysle dosť krehký a náhodný motýľ s nesprávnou úvodzovkou môže viesť k smrti vesmíru s ťažko diagnostikovateľnými chybami.

Nastavili sme monitoring. Skontrolujeme, či je všetko v poriadku:

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

Skript by mal zobraziť správu ako:

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

KROK 3. Nastavenie plánu

Nastavíme plán monitorovania v crone:

sudo crontab -e

Pridajme riadok na kontrolu google.com každú minútu:

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

Každý deň o 11.00:XNUMX pridáme upozornenie potvrdzujúce funkčnosť samotného monitoringu. Za týmto účelom odovzdáme skriptu parameter DAILY:

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

2>&1 - štandardná technika, ktorá presmeruje chyby do hlavného výstupného toku. V dôsledku toho skončia aj v denníku monitorovania.

Uložíme zmeny a vyberieme ich príkazom:

 sudo service cron reload

Viac o nastavení cronu si môžete prečítať napr. tu.

Každú minútu sa teda spustí monitorovací skript, ktorý bude kontaktovať google.com cez curl. Ak sa prijatá odpoveď líši od očakávanej, skript odošle telegramové upozornenie na zoznam príjemcov. Protokol auditu sa uchováva v súbore monitoring.log

Ak potrebujeme pridať ďalšiu službu, jednoducho pre ňu vytvoríme nový ini súbor v priečinku services a v prípade potreby vytvoríme samostatný zoznam príjemcov. Všetko ostatné bude fungovať automaticky.

Ak je kontrolovaná služba nedostupná, každú minútu sa odošle upozornenie. Ak nemôžete rýchlo obnoviť službu, môžete dočasne vypnúť upozornenia vo vlastnostiach telegramu robota.

Teraz sa pozrime bližšie na ďalšie funkcie a implementáciu skriptov.

Vzory správ a emocionálne zapojenie

Aby bola komunikácia s robotom živšia, nazvali sme ho Manechka, pridali vhodný obrázok avatara a najali sme profesionálnych PR špecialistov na vytvorenie textov správ. Naše skúsenosti môžete využiť alebo zmeniť podľa svojho vkusu.

Napríklad takto:

Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron
alebo aj takto:

Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron
Prečo nie?

Názov robota a avatar sa nastavujú pomocou @bototec.
Šablóny správ sú v priečinku šablóny:

  • curl-fail.txt: správa odoslaná, keď curl vráti nenulový kód chyby. Zvyčajne hovorí o nemožnosti dosiahnutia služby.
  • daily.txt: Denná správa potvrdzujúca, že monitorovanie služby funguje.
  • service-fail.txt: Správa odoslaná, keď sa odpoveď služby líši od očakávanej odpovede.

Pozrime sa ako príklad na možnosti prispôsobenia pomocou vstavaných šablón správ.
Šablóny používajú emotikony. Žiaľ, habr ich nezobrazuje.
Ak chcete vybrať emotikony, je vhodné použiť vyhľadávanie zapnuté emojipedia.org:

Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

Jednoducho skopírujete a vložíte príslušný symbol do textu šablóny (ide o bežný unicode).

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

    Použili sme názov služby, ktorý sme zadali (premenná MSMS_SERVICE_NAME) a interná premenná skriptu s ukončovacím kódom curl (EXIT_CODE). Správu sme tiež naformátovali pomocou značiek zníženie telegramu: Znaky "`" obklopujú text s pevnou šírkou. Keďže úvodzovky a apostrofy sú symboly bash, ukončíme ich znakom „“. Názvy premenných sú označené znakom „$“.

    Výsledok:

    Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

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

    Výsledok:

    Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

    Tu používame ďalšiu premennú skriptu: RESPONSE. Obsahuje odpoveď služby.

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

    Výsledok:

    Bot na monitorovanie webových služieb za pol hodiny: telegram + bash + cron

Prejdime k implementácii skriptov.

Monitorovací skript

monitoring.sh vykoná jednoduché automatické zisťovanie – vezme všetky ini súbory zo zložky služieb a pre každý z nich spustí hlavný skript s logikou na kontrolu a odosielanie upozornení:

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

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

Ak chcete generovať dennú správu o stave monitorovania, môžete skriptu odovzdať parameter DAILY.

Upozorňujeme, že pri spustení skriptu sa aktuálny priečinok zmení na služby. To vám umožňuje zadať cesty k súborom relatívne k službám v súboroch ini.

Skript na kontrolu a odosielanie upozornení

msms.sh obsahuje hlavnú logiku kontroly služby a odosielania upozornení.

Práca 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
}

Vygenerujeme URL na prístup k telegramovému REST API pomocou tajného kľúča uloženého v súbore.

Funkcia send_message používa curl na odosielanie správ do tohto REST API, pričom berie ID príjemcov zo súboru, ktorý sme zadali v ini. V údajoch, ktoré odosielame, uvádzame, že používame označenie správ: parse_mode="Markdown".

Zobrazme aktuálny dátum a čas a načítajme ini súbor.

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

# load variables from .ini file:
. $2

Magická šnúrka . $2 vykoná ini súbor odovzdaný na vstup ako druhý parameter ako bežný skript a zadá hodnoty v ňom špecifikované do premenných prostredia.

Načítajte očakávanú odpoveď zo súboru, ak je zadaný parameter MSMS_EXPECTED_FILE:

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

Službu skontrolujeme a v prípade potreby pošleme upozornenia:

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

Najprv priradíme premennej RESPONSE výsledok vykonania príkazu curl pre túto službu.

vyjadrenie EXIT_CODE=$? vloží výsledok posledného príkazu do premennej, t.j. zvlniť. Ak je potrebné odoslať upozornenie, šablóna sa načíta z príslušného súboru a odošle sa príjemcom pomocou send_message.

Posledný blok spracováva 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

Odošle správu potvrdzujúcu funkčnosť samotného monitorovania.

Získanie zoznamu ID používateľov

recipients-setup.sh volá telegramové API, aby získalo najnovšie správy adresované robotovi:

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

Toto používa mágiu pythonu na krásne vykreslenie zoznamu. Nie je to potrebné, môžete jednoducho prevziať požadované ID z json, ktoré príkaz vypíše:

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

Záver

Môžete teda použiť hotové skripty a šablóny správ, nastaviť iba monitorované služby a zoznamy pre upozornenia; môžete pre robota vytvoriť novú „osobnosť“; alebo sa môžete rozhodnúť sami na základe toho, čo bolo navrhnuté.

Možnosti ďalšieho vývoja naznačujú konfiguráciu a správu monitorovania v samotnom robote, ale tu sa bez pythonu nezaobídete. Ak to niekto dostane skôr ako ja, viete, kam podať žiadosť o stiahnutie :)

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster