Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

Ndonjëherë është e nevojshme të bëni një monitorim të shpejtë për një shërbim të ri, dhe s’ka infrastrukturë/gjykim të gatshëm. Në këtë udhëzues, do të implementojmë një mjet për monitorimin e çdo shërbimi web brenda gjysmë ore, duke përdorur vetëm mjete të ndërtuara në ubuntu: bash, cron dhe curl. Për dërgimin e njoftimeve do të përdorim telegramin.

«Kule mbi tortë» do të jetë angazhimi emocional i përdoruesve. E testuar mbi njerëz - funksionon.

Kur ne në shërbimin telemedicinal Doktor Rruga krijuam një chatbot për të përcaktuar nivelin e stresit të përdoruesve, na duhej monitorimi. Brenda disa orëve u realizua një mini-projekt që jo vetëm funksionon shkëlqyeshëm, por shton edhe pozitivitet me mesazhet e tij.

Për të filluar, le të marrim depozitën me skriptet:

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

Kalo në dosjen msms dhe vazhdo punën aty.

Nëse telegrami është i bllokuar, përdorni proxy. Mënyra më e thjeshtë dhe e besueshme është torsocks:

sudo apt install tor
sudo apt install torsocks

Si një shembull, do të konfigurojmë monitorimin e faqes fillestare google.com në tre hapa.

HAPI 1. Krijoni një bot në telegram dhe merrni id-në e përdoruesit.

  • Në ngushticën e kërkimeve për kontakte në telegram kërkoni @botfather:

    Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

  • Niseni atë duke e shtypur butonin Start, shkruani komandën /newbot dhe përgjigjuni pyetjeve. Duhet të kemi parasysh se emri - është emri i botit që do të shfaqet për përdoruesit, ndërsa emri përdorues - është unik dhe duhet të përfundojë me «bot»:

    Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

    Përveç të tjerëve, boti do të japë një token sekret për HTTP API, të cilin duhet ta kopjoni dhe ta ruani në skedarin telegram-api-key.txt në dosjen msms.

  • Kërkojmë në linjën e kërkimit të telegramit emrin e botit tonë dhe e nisëm atë.
  • Si një përfundim, le të shtojmë veten në listën e marrësve të njoftimeve të monitorimit:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skripti do të nxjerrë një listë të kërkesave të fundit për botin, aty duhet të ketë një rresht me id-në dhe emrin tonë në telegram. Marrim këtë id dhe e ruajmë në skedarin services/google-recipients.txt. Formati i skedarit: çdo rresht - një id. Shembuj:

    123456789
    987654321

Për të shtuar një marrës të ri, duhet ta kërkoni që ai të nisë botin në telegram, të nisë recipients-setup.sh dhe të shtojë id-në në skedar.

HAPI 2. Konfigurojmë monitorimin.

Përshkrimi i shërbimit bëhet përmes krijimit të një skedari ini në dosjen services. Duhet të caktosh pesë parametra:

  1. MSMS_SERVICE_NAME: emri i shërbimit - do të përdoret në njoftime dhe regjistrin e monitorimit.
  2. MSMS_SERVICE_ENDPOINT: endpoint i shërbimit, të cilit do t’i drejtohemi me curl.
  3. MSMS_CURL_PARAMS: parameteret e tjera curl, shihni shembullin më poshtë.
  4. MSMS_EXPECTED: përgjigja e pritur nga shërbimi. Përdoret kur përgjigja është e shkurtër.
  5. MSMS_EXPECTED_FILE: emri i skedarit me përgjigjen e pritur nga shërbimi. Nëse është e specifikuar, tejkalon MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: skedari me listën e marrësve të njoftimeve.

Kërkesa për google.com kthen HTML të fikosur me ridrejtim, do ta përdorim atë si përgjigje të pritur nga serveri:

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

Do të krijojmë skedarin services/google.ini:

MSMS_SERVICE_NAME='faqja kryesore google'

# pika e fundit të shërbimit
MSMS_SERVICE_ENDPOINT='google.com'

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

# përgjigja e pritur e shërbimit
MSMS_EXPECTED_FILE='google-response.html'

# skedari i listës së marrësve
MSMS_RECIPIENTS='google-recipients.txt'

Në MSMS_CURL_PARAMS mund të specifikoni gjithçka që do curl, përfshirë:

  1. Çaktivizoni mesazhet curl, për të mos mbushur konsolën dhe logun: -s
  2. Specifikoni kohën e lidhjes me shërbimin që po kontrolloni (në sekonda): --connect-timeout 3
  3. Specifikoni kohën për marrjen e përgjigjes: -m 7
  4. Çaktivizoni verifikimin e certifikatës për SSL (për shembull, nëse përdoret një certifikatë e vetë-nënshkruar): --insecure
  5. Specifikoni llojin e kërkesës http: -X POST
  6. Specifikoni titujt: -H "Content-Type: application/json"
  7. Specifikoni trupin e kërkesës si një string ose skedar. Shembuj për skedarin: -d @request.json

Ne çaktivizuam njoftimet dhe specifikuam kohët 3 sek. për lidhjen dhe 7 sek. për marrjen e përgjigjes nga shërbimi.

Kujdes: përcaktoni vlerat e parametrave në thonjëza të vetme, si në shembull. Fatkeqësisht, bash është mjaft i brishtë në këtë aspekt, dhe një flutur e rastësishme e vendosur gabimisht mund të çojë në shkatërrimin e universit me gabime të vështira për tu diagnostikuar.

Ne konfiguruam monitorimin. Do të kontrollojmë që gjithçka është OК:

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

Skripta duhet të japë një mesazh të këtij tipi:

2020-01-10 12:14:31
health-check "faqja kryesore google": OK

HAPI 3. Konfigurojmë orarin

Konfigurojmë orarin e monitorimit në cron:

sudo crontab -e

Shtojmë një rresht për kontrollin çdo minutë të google.com:

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

Shtojmë çdo ditë në 11:00 një njoftim për të konfirmuar funksionalitetin e vetë monitorimit. Për këtë do të kalojmë në skript parameterin DAILY:

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

2>&1 — një metodë standarde që ridrejton gabimet në rrjedhën kryesore të output-it. Në këtë mënyrë, ato gjithashtu do të shkojnë në regjistrin e monitorimit.

Ruajmë ndryshimet dhe i aplikojmë ata me komandën:

 sudo service cron reload

Më shumë për konfigurimin e cron mund të lexoni, për shembull, këtu.

Kështu, çdo minutë do të nisë një skript monitorimi, i cili do ta thërrasë google.com me curl. Nëse përgjigjja e marrë është ndryshe nga ajo e pritur, skripti do të dërgojë një njoftim në listën e marrësve në telegram. Dita e kontrolleve mbahet në skedarin monitoring.log

Nëse nevojitet të shtoni një shërbim tjetër, thjesht krijoni një skedar të ri ini për të në dosjen services dhe, nëse është e nevojshme, formoni një listë të veçantë marrësish. E gjithë pjesa tjetër do të funksionojë automatikisht.

Nëse shërbimi i kontrolluar bëhet i paaksesueshëm, njoftimi do të vijë çdo minutë. Nëse nuk arrini ta riktheni shërbimin shpejt, mund të çaktivizoni përkohësisht njoftimet në pronësitë e botos në telegram.

Tani le të shqyrtojmë në detaje mundësitë shtesë dhe realizimin e skripteve.

Shabllonat e mesazheve dhe angazhimi emocional

Për ta bërë komunikimin me botin më të gjallë, e emruam atë Manekë, shtuam një foto-avataar përkatëse dhe angazhuam profesionistë të PR për të krijuar tekstet e mesazheve. Mund të përdorni zhvillimet tona ose t’i ndryshoni sipas dëshirës tuaj.

Për shembull kështu:

Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron
ose madje kështu:

Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron
Pse jo?

Emri i botit dhe avatarja përcaktohen përmes @botfather.
Shabllonat e mesazheve ndodhen në dosjen templates:

  • curl-fail.txt: mesazhi që dërgohet në rast se curl kthen një kod gabimi të ndryshëm nga zero. Zakonisht tregon për pamundësinë e arritjes në shërbim.
  • daily.txt: mesazhi që konfirmon se monitorimi i shërbimit po funksionon çdo ditë.
  • service-fail.txt: mesazhi që dërgohet në rast se përgjigjja e shërbimit është ndryshe nga ajo e pritur.

Le të shqyrtojmë mundësitë e personalizimit përmes shembujve të shablloneve të integruara.
Në shabllone përdoren emoji. Fatkeqësisht, habr nuk i shfaq ato.
Për të gjetur emoji të përshtatshme, është e dobishme të përdorni kërkimin në emojipedia.org:

Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

Thjesht kopjoni simbolin e përshtatshëm dhe ngjitni atë në tekstin e shabllonit (kjo është Unicode e zakonshme).

  1. curl-fail.txt:
    Kati, më ndihmo... 
    Nuk mund të arrij shërbimin "$MSMS_SERVICE_NAME" 
    `KODI I DËRGESËS: $EXIT_CODE`

    Ne e përdorim emrin e shërbimit të caktuar nga ne (variabla MSMS_SERVICE_NAME) dhe një variabël të brendshme të skriptit me kodin e daljes së curl (EXIT_CODE). Për më tepër, ne e formatuam mesazhin duke përdorur shënjimin telegram markdown: simbolet "`" përfshijnë tekstin me gjerësi fikse. Duke qenë se citatet dhe apostrofët janë simbole të rezervuara të bash, ne i escapojmë ato me simbolin "". Emrat e variablave paraqiten me shenjën "$".

    Rezultati:

    Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

  2. service-fail.txt:
    Mace, më ndihmo... 
    Shërbimi "$MSMS_SERVICE_NAME" më ka mërzitur
    Ai nuk punon siç duhet, kjo është ajo që më kthen:
    `$RESPONSE`

    Rezultati:

    Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

    Këtu po përdorim një variabël tjetër të skriptit: RESPONSE. Ai përmban përgjigjen e shërbimit.

  3. daily.txt:
    Bebe, përshëndetje!
    Unë jam mirë, po mbaj nën vëzhgim shërbimin:
    "$MSMS_SERVICE_NAME" çdo minutë...
    Si është puna te ti?
    

    Rezultati:

    Bot për monitorimin e shërbimeve web për gjysmë ore: telegram + bash + cron

Të kalojmë në implementimin e skripteve.

Skripti i monitorimit

monitoring.sh bën një auto-discovery të thjeshtë — merr të gjitha skedarët ini nga dosja services dhe për secilin ekzekuton skriptin kryesor me logjikën e kontrollit dhe dërgimin e njoftimeve:

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

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

Për të formuar një mesazh të përditshëm mbi statusin e monitorimit, skripti mund të marrë parametrin DAILY.

Kujdes, kur niset skripti, dosja aktuale ndryshohet në services. Kjo lejon që në skedarët ini të indicohen rrugët e skedarëve në lidhje me services.

Skripti i kontrollit dhe dërgimit të njoftimeve

msms.sh përmban logjikën kryesore të kontrollit të shërbimit dhe dërgimit të njoftimeve.

Puna me telegram:

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

Formojmë URL për qasje në REST API të telegramit, duke përdorur çelësin sekret të ruajtur në skedarin.

Funksioni send_message përdor curl për të dërguar mesazhe në këtë REST API, duke marrë id-të e marrësve nga skedari që kemi treguar në ini. Në të dhënat e dërguara, ne tregojmë se po përdorim formate mesazhesh: parse_mode="Markdown".

Do të printojmë datën dhe orën aktuale dhe do të ngarkojmë skedarin ini.

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

# ngarko variablat nga skedari .ini:
. $2

Vija magjike . $2 ekzekuton skedarin ini të kaluar si parametri i dytë si një skript të zakonshëm, duke vendosur vlerat e caktuara në të në variablat e mjedisit.

Do të ngarkojmë përgjigjen e pritur nga skedari, nëse është caktuar parametri MSMS_EXPECTED_FILE:

nëse [ -n "$MSMS_EXPECTED_FILE" ]; atëherë
 MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi

Do të kryejmë kontrollin e shërbimit me dërgimin e njoftimeve, nëse është e nevojshme:

RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; atëherë
    echo kontrolli i shëndetit "$MSMS_SERVICE_NAME" DËSHTOI: CURL EXIT ME $EXIT_CODE
    MESSAGE="$(cat ..\/templates\/curl-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; atëherë
    echo kontrolli i shëndetit "$MSMS_SERVICE_NAME" DËSHTOI: "$RESPONSE"
    MESSAGE="$(cat ..\/templates\/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo kontrolli i shëndetit "$MSMS_SERVICE_NAME": OK
fi

Së pari, i caktojmë variablës RESPONSE rezultatin e ekzekutimit të komandës curl për këtë shërbim.

Shprehja EXIT_CODE=$? ajo në variabël rezultatet e ekzekutimit të komandës së fundit, dmth, curl. Nëse është e nevojshme të dërgoni një njoftim, modeli lexon nga skedari përkatës dhe realizon shpërndarjen te marrësit përmes send_message.

Blloku i fundit trajton parametrin DAILY:

nëse test "$1" = "DAILY"; atëherë
    echo health-check "$MSMS_SERVICE_NAME" DAILY
    MESAZHI="$(cat ..\/templates\/daily.txt)"
    MESAZHI=$(eval echo $MESAZHI)
    send_message "$MESAZHI"
fi

Ai dërgon një mesazh që konfirmon funksionalitetin e vetë monitorimit.

Marrja e listës së ID-ve të përdoruesve

recipients-setup.sh i drejtohet API-së së telegramit për të marrë mesazhet e fundit të dërguara në bot:

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

Këtu përdoret magia e python-it për të nxjerrë listën në një format të bukur. Kjo nuk është e nevojshme, mund thjesht të merrni ID-në e nevojshme nga json-i që do të nxjerrë komanda:

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

Përfundim

Kështu mund të përdorni skenarët dhe modelet e mesazheve të gatshme, duke konfigurur vetëm shërbimet e monitorimit dhe listat për njoftime; mund të krijoni një "identitet" të ri për botin; ose mund të bëni zgjidhjen tuaj mbi atë të propozuar.

Si mundësi për zhvillimin e mëtejshëm sugjerohet konfigurimi dhe menaxhimi i monitorimit në vetë bot, por këtu pa python nuk keni për të kaluar. Nëse ndokush arrin ta bëjë më parë se unë — e dini se ku ta dërgoni pull request 🙂

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster