Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

Někdy je nutné rychle provést monitorování nového servisu, a to bez dostupné infrastruktury nebo expertní podpory. V tomto průvodci vytvoříme za půl hodiny nástroj pro monitorování jakýchkoli webových služeb, přičemž použijeme pouze vestavěné prostředky Ubuntu: bash, cron a curl. Pro zasílání upozornění využijeme Telegram.

„Třešničkou na dortu“ bude emocionální zapojení uživatelů. Otestováno na lidech — funguje.

Když jsme v telemedicínském servisu Doktor Rvádem vytvořili chatbota pro určení úrovně stresu uživatelů, potřebovali jsme monitorování. Za pár hodin byl vytvořen mini-projekt, který nejen perfektně funguje, ale dodává i pozitivní zprávy.

Nejprve získáme repozitář se skripty:

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

Přejdeme do složky msms a dále budeme pracovat v ní.

Pokud je Telegram zablokovaný, použijte proxy. Nejjednodušší a nejspolehlivější možností je torsocks:

sudo apt install tor
sudo apt install torsocks

Jako příklad si nastavíme monitorování domovské stránky google.com ve třech krocích.

KROK 1. Vytvoříme bota v Telegramu a získáme ID uživatele.

  • V řádku pro hledání kontaktů v Telegramu hledáme @botfather:

    Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

  • Spustíme ho tlačítkem Start, zadáme příkaz /newbot a odpovíme na otázky. Je třeba mít na paměti, že name je jméno bota, které se bude zobrazovat uživatelům, a username je jedinečný a musí končit na „bot“:

    Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

    Mezi jinými věcmi bot vydá tajný token pro HTTP API, který je potřeba zkopírovat a uložit do souboru telegram-api-key.txt ve složce msms.

  • Zadáme do vyhledávacího řádku Telegramu jméno našeho bota a spustíme ho.
  • Jako poslední krok přidáme sebe do seznamu příjemců upozornění monitorování:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skript vypíše seznam posledních interakcí s botem, měl by obsahovat jeden řádek s naším ID a jménem v Telegramu. Vezmeme toto ID a uložíme ho do souboru services/google-recipients.txt. Formát souboru: každý řádek — jedno ID. Příklad:

    123456789
    987654321

Chcete-li přidat nového příjemce, požádejte ho, aby spustil bota v Telegramu, spustil recipients-setup.sh a přidal ID do souboru.

KROK 2. Nastavíme monitorování.

Popis služby se provádí vytvořením ini-souboru ve složce services. Je třeba zadat pět parametrů:

  1. MSMS_SERVICE_NAME: název služby — bude používán v upozorněních a protokolu monitorování.
  2. MSMS_SERVICE_ENDPOINT: endpoint služby, na který se budeme připojovat pomocí curl.
  3. MSMS_CURL_PARAMS: další parametry curl, viz příklad níže.
  4. MSMS_EXPECTED: očekávaná odpověď služby. Používá se, pokud je odpověď krátká.
  5. MSMS_EXPECTED_FILE: název souboru s očekávanou odpovědí služby. Pokud je uveden, přepíše MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: soubor se seznamem příjemců oznámení.

Dotaz na google.com vrací pevný html s přesměrováním, použijeme ho jako očekávanou odpověď serveru:

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

Vytvoříme soubor services/google.ini:

MSMS_SERVICE_NAME='google front page'

# koncový bod služby
MSMS_SERVICE_ENDPOINT='google.com'

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

# očekávaná odpověď služby
MSMS_EXPECTED_FILE='google-response.html'

# soubor se seznamem příjemců
MSMS_RECIPIENTS='google-recipients.txt'

V MSMS_CURL_PARAMS můžete nastavit vše, co curl umí, včetně:

  1. Vypnout zprávy curl, aby nezaplavovaly konzoli a log: -s
  2. Nastavit časový limit připojení k kontrolované službě (v sekundách): --connect-timeout 3
  3. Nastavit časový limit pro obdržení odpovědi: -m 7
  4. Vypnout kontrolu certifikátu pro SSL (například, pokud se používá samopodepsaný certifikát): --insecure
  5. Uvedení typu http-dotazu: -X POST
  6. Uvedení hlaviček: -H "Content-Type: application/json"
  7. Uvedení těla dotazu ve formě řetězce nebo souboru. Příklad pro soubor: -d @request.json

Vypnuli jsme oznámení a nastavili časové limity 3 sekundy na připojení a 7 sekund na obdržení odpovědi služby.

Pozor: uvádějte hodnoty parametrů v jednoduchých uvozovkách, jak je v příkladu. Bohužel, bash je v tomto ohledu docela křehký a náhodně umístěná chybná uvozovka může mít za následek složité diagnostikované chyby.

Nastavili jsme monitoring. Zkontrolujeme, že je vše v pořádku:

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

Skript by měl vypsat zprávu ve formátu:

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

KROK 3. Nastavení plánu

Nastavíme plánování monitorování v cron:

sudo crontab -e

Přidáme řádek pro každouminutovou kontrolu google.com:

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

Každý den v 11:00 přidáme oznámení potvrzující funkčnost monitorování. K tomu předáme skriptu parametr DAILY:

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

2>&1 — standardní postup, který přesměrovává chyby do hlavního výstupního proudu. Nakonec se také dostanou do záznamu monitorování.

Uložíme změny a spustíme je příkazem:

 sudo service cron reload

Další informace o nastavení cron můžete nalézt například zde.

Takže každý minutu se spustí monitorovací skript, který se pomocí curl spojí s google.com. Pokud je obdržená odpověď odlišná od očekávané, skript zašle upozornění na seznam příjemců v telegramu. Záznamy kontrol jsou vedeny v souboru monitoring.log

Pokud potřebujeme přidat další službu, jednoduše vytvoříme nový ini soubor pro ni ve složce services a v případě potřeby vytvoříme samostatný seznam příjemců. Všechno ostatní se automaticky zpracuje.

Pokud se kontrolovaná služba stane nedostupnou, upozornění bude přicházet každou minutu. Pokud se službu nedaří rychle obnovit, lze dočasně vypnout oznámení v nastavení bota v telegramu.

Nyní se podrobně podívejme na další možnosti a realizaci skriptů.

Šablony zpráv a emocionální zapojení

Abychom udělali komunikaci s botem živější, pojmenovali jsme ho Maněčka, přidali jsme odpovídající avatar a najali jsme profesionální PR pracovníky pro vytvoření textů zpráv. Můžete používat naše materiály nebo změnit podle svého vkusu.

Například takto:

Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron
nebo dokonce takto:

Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron
Proč ne?

Jméno bota a avatar se nastavují prostřednictvím @botfather.
Šablony zpráv se nacházejí ve složce templates:

  • curl-fail.txt: zpráva, která se odešle, pokud curl vrátil nenulový kód chyby. Obvykle označuje, že nebylo možné dosáhnout služby.
  • daily.txt: denní zpráva potvrzující, že monitoring služby funguje.
  • service-fail.txt: zpráva, která se odešle, pokud je odpověď služby odlišná od očekávané.

Prozkoumejme možnosti přizpůsobení na příkladu vestavěných šablon zpráv.
Ve šablonách se používají emoji. Bohužel, habr je nezobrazuje.
Pro vybírání emoji je vhodné použít vyhledávání na emojipedia.org:

Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

Potřebný symbol jednoduše zkopírujte a vložte do textu šablony (to je běžný unicode).

  1. curl-fail.txt:
    Koťátko, pomoz mi... 
    Nemohu se dostat k službě "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Použili jsme zvolené jméno služby (proměnná MSMS_SERVICE_NAME) a interní proměnnou skriptu s kódem ukončení curl (EXIT_CODE). Také jsme zprávu formátovali pomocí značkování telegram markdown: znaky "`" obklopují text s pevnou šířkou. Protože uvozovky a apostrofy jsou v bash speciální znaky, musíme je escapovat znakem "". Jména proměnných předchází znak "$".

    Result:

    Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

  2. service-fail.txt:
    Koťátko, pomož mi...
    Služba "$MSMS_SERVICE_NAME" mě zklamala
    Nefunguje správně, toto mi odpovídá:
    `$RESPONSE`

    Result:

    Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

    Zde používáme další proměnnou skriptu: RESPONSE. Obsahuje odpověď služby.

  3. daily.txt:
    Ahoj, malý!
    Mám se dobře, sleduji službu:
    "$MSMS_SERVICE_NAME" každou minutu...
    A jak se máš ty?
    

    Result:

    Bot pro monitorování webových služeb za půl hodiny: telegram + bash + cron

Přejdeme k implementaci skriptů.

Skript pro monitorování

monitoring.sh provádí jednoduché auto-objevování — vezme všechny ini-soubory z adresáře services a pro každý spustí hlavní skript s logikou pro kontrolu a zasílání upozornění:

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

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

Pro vytvoření denní zprávy o stavu monitorování lze skriptu předat parametr DAILY.

Všimněte si, že při spuštění skriptu se aktuální adresář změní na services. To umožňuje v ini-souborech uvádět cesty k souborům relativně k services.

Skript pro kontrolu a zasílání upozornění

msms.sh obsahuje hlavní logiku pro kontrolu služby a zasílání upozornění.

Práce s telegramem:

# 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
}

Tvoříme URL pro přístup k REST API telegramu, pomocí uloženého tajného klíče v souboru.

Funkce send_message používá curl k odeslání zpráv na toto REST API, přičemž bere ID příjemců ze souboru, který jsme určili v ini. V odesílaných datech uvádíme, že používáme formátování zpráv: parse_mode="Markdown".

Vytiskneme aktuální datum-čas a načteme ini-soubor.

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

# načíst proměnné z .ini souboru:
. $2

Magická řetězec . $2 provádí předaný jako druhý parametr ini-soubor jako běžný skript, ukládající v něm zadané hodnoty do proměnných prostředí.

Načteme očekávanou odpověď ze souboru, pokud je nastaven parametr MSMS_EXPECTED_FILE:

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

Provedeme kontrolu služby se zasíláním upozornění, pokud je to nutné:

RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
    echo health-check "$MSMS_SERVICE_NAME" SELHALO: CURL EXIT S $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" SELHALO: "$RESPONSE"
    MESSAGE="$(cat ..\/templates\/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo health-check "$MSMS_SERVICE_NAME": OK
fi

Nejprve přiřadíme proměnné RESPONSE výsledek vykonání příkazu curl pro tuto službu.

Výraz EXIT_CODE=$? ukládá do proměnné výsledek provedení posledního příkazu, t.j. curl. Při nutnosti odeslání upozornění se načítá šablona z odpovídajícího souboru a provádí se rozesílání na příjemce pomocí send_message.

Poslední blok zpracovává parametr 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

Odesílá zprávu potvrzující funkčnost samotného monitorování.

Získání seznamu id uživatelů

recipients-setup.sh ukládá se k API telegram pro získání posledních zpráv adresovaných botovi:

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

Zde se využívá magie python pro pěkné zobrazení seznamu. Není to nutné, lze jednoduše získat potřebné id z json, který vypíše příkaz:

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

Závěr

Tímto způsobem můžete používat hotové skripty a šablony zpráv, nastavující pouze sledované služby a seznamy pro upozornění; můžete vytvořit novou "osobnost" pro bota; nebo si můžete vytvořit vlastní řešení na základě navrhovaného.

Jako možnosti dalšího rozvoje se nabízí konfigurace a správa monitorování přímo v bottu, ale bez pythonu se tu neobejdete. Pokud to někdo stihne před mnou — víte, kam poslat pull request 🙂

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster