Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

Ndonjëherë, është e nevojshme të bëjmë një monitorim të shpejtë për një shërbim të ri, pa pasur infrastrukturë ose ekspertizë në dorë. Në këtë udhëzues, ne do të realizojmë një mjet për monitorimin e çdo shërbimi web, duke përdorur vetëm mjete të integruara në ubuntu: bash, cron dhe curl. Për dërgimin e njoftimeve do të përdorim telegramin.

«Kisha mbi tortë» do të jetë përfshirja emocionale e përdoruesve. E verifikuar tek njerëzit — funksionon.

Kur krijuam një chatbot për të përcaktuar nivelin e stresit të përdoruesve në shërbimin tonë të telemjekësisë Doktor Rruga, na nevojitej monitorimi. Pas disa orësh, realizuam një mini-projekt që jo vetëm funksionon shkëlqyeshëm, por edhe sjell ëndje me mesazhet e tij.

Për t'u nisur, marrim repozitorin me skriptet:

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

Kalojmë në dosjen msms dhe vazhdojmë të punojmë në të.

Nëse telegrami është bllokuar, përdorni një proxy. Mënyra më e thjeshtë dhe më e qëndrueshme është torsocks:

sudo apt install tor
sudo apt install torsocks

Si shembull, do të konfiguroni monitorimin e faqes kryesore google.com në tri hapa.

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

  • Në shiritin e kërkimit të kontakteve në telegram kërkoni @botfather:

    Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

  • Për ta nisur, klikoni butonin Start, shkruani komandën /newbot dhe përgjigjeni pyetjeve. Duhet të mbani parasysh se emri — është emri i botit, i cili do të shfaqet për përdoruesit, ndërsa username është unik dhe duhet të përfundojë me «bot»:

    Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

    Ndër të tjera, boti do të japë një token sekret për HTTP API, i cili duhet të kopjohet dhe ruhet në skedarin telegram-api-key.txt në dosjen msms.

  • Shkruani në shiritin e kërkimit telegram emrin e botit tonë dhe nisin atë.
  • Si një hap përfundimtar, do 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ë listën e të fundit të kërkesave për botin, atje duhet të ketë një rresht me id-në dhe emrin tonë në telegram. Merrni këtë id dhe ruani atë 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, ai duhet ta nisë botin në telegram, të nisë recipients-setup.sh dhe të shtojë id në skedar.

HAPI 2. Konfiguroni monitorimin.

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

  1. MSMS_SERVICE_NAME: emri i shërbimit — do të përdoret në njoftime dhe në ditarin e monitorimit.
  2. MSMS_SERVICE_ENDPOINT: endpoint i shërbimit, në të cilin do të kontaktojmë duke përdorur curl.
  3. MSMS_CURL_PARAMS: parametra shtesë për curl, shihni shembullin më poshtë.
  4. MSMS_EXPECTED: përgjigjja e pritur nga shërbimi. Përdoret, nëse përgjigjja është e shkurtër.
  5. MSMS_EXPECTED_FILE: emri i skedarit me përgjigjen e pritur nga shërbimi. Nëse citohet, tejkalon MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: skedari me listën e marrësve të njoftimeve.

Kërkesa për google.com kthehet një html të fiksuar me redirect, do ta përdorim atë si përgjigjjen e pritur nga serveri:

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

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

MSMS_SERVICE_NAME='faqja kryesore google'

# endpoint i shërbimit
MSMS_SERVICE_ENDPOINT='google.com'

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

# përgjigjja e pritur nga shërbimi
MSMS_EXPECTED_FILE='google-response.html'

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

MSMS_CURL_PARAMS mund të vendosni gjithçka që di curl, përfshirë:

  1. Ndërprerja e mesazheve curl, për të mos mbushur konsolën dhe logun: -s
  2. Vendosni timeoutin e lidhjes me shërbimin e kontrolluar (në sekonda): --connect-timeout 3
  3. Vendosni timeoutin 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 kokat: -H "Content-Type: application/json"
  7. Specifikoni trupin e kërkesës si një string ose skedar. Shembull për skedarin: -d @request.json

Ne e çaktivizuam njoftimet dhe vendosëm timeoutet 3 sek. për lidhjen dhe 7 sek. për marrjen e përgjigjes nga shërbimi.

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

Ne kemi konfiguruar monitorimin. Le t'i kontrollojmë që gjithçka është në rregull:

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

Skripti duhet të nxjerrë një mesazh të tillë:

2020-01-10 12:14:31
kontrolli i shëndetit "faqja kryesore google": OK

HAPI 3. Konfiguroni orarin.

Do të konfiguroni orarin e monitorimit në cron:

sudo crontab -e

Shtoni një rresht për kontrollimin çdo minutë të google.com:

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

Shtoni çdo ditë në orën 11:00 një njoftim që konfirmon funksionimin e monitorimit vetë. Për këtë, do të kaloni parametren DAILY në skript:

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

2>&1 — një teknik standard, që ridrejton gabimet në grumbullin kryesor të daljes. Në përfundim, ato gjithashtu do të përfshihen në regjistrin e monitorimit.

Ruani ndryshimet dhe rini me komandën:

 sudo service cron reload

Më shumë informacion rreth konfigurimit të cron mund të lexoni, për shembull, këtu.

Kështu, çdo minutë do të aktivizohet një skript monitorimi që do të bëjë një kërkesë përmes curl në google.com. Nëse përgjigja e marrë është e ndryshme nga ajo që pritej, skripti do të dërgojë një njoftim në listën e marrësve në telegram. Dita e kontrolleve regjistrohet në skedarin monitoring.log

Nëse duhet 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ë arrijë çdo minutë. Nëse nuk arrini ta riktheni shërbimin shpejt, mund të çaktivizoni përkohësisht njoftimet në pronatat e botit në telegram.

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

Shabllonet e mesazheve dhe angazhimi emocional

Për ta bërë komunikimin me botin më të gjallë, e kemi quajtur atë Maneçkë, i kemi shtuar një imazh avatar përkatës dhe kemi angazhuar profesionistë të PR për të krijuar tekstet e mesazheve. Ju mund të përdorni zhvillimet tona ose t'i zëvendësoni sipas shijes tuaj.

Për shembull kështu:

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

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

Emri i botit dhe avatare caktohen përmes @botfather.
Shabllonet e mesazheve gjenden në dosjen templates:

  • curl-fail.txt: mesazhi i dërguar kur curl kthen një kod gabimi ndryshe nga zero. Zakonisht tregon për pamundësinë e lidhjes me shërbimin.
  • daily.txt: mesazhi ditor që konfirmon se monitorimi i shërbimit është duke funksionuar.
  • service-fail.txt: mesazhi që dërgohet kur përgjigja e shërbimit ndryshon nga ajo që pritej.

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

Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

Simbole të përshtatshme thjesht kopjoni dhe ngjitni në tekstin e shabllonit (kjo është Unicode i zakonshëm).

  1. curl-fail.txt:
    Mace, më ndihmo... 
    Nuk mund të lidhem me shërbimin "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Këtu kemi përdorur emrin e shërbimit të vendosur nga ne (variabla MSMS_SERVICE_NAME) dhe variablën e brendshme të skriptit me kodin e daljes curl (EXIT_CODE). Po ashtu, kemi formatuar mesazhin duke përdorur markup-un telegram markdown: simbolet "`" rrethojnë tekstin me gjerësi të caktuar. Të gjitha thonjëzat dhe apostrofët janë simbole shërbyese të bash-it, prandaj i shënojmë me simbolet "". Emrat e variablave paraqiten me shenjën "$".

    Rezultati:

    Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

  2. service-fail.txt:
    Mace, më ndihmo... 
    Shërbimi "$MSMS_SERVICE_NAME" më shqetëson
    Ai nuk punon siç duhet, ky është përgjigja që më jep:
    `$RESPONSE`

    Rezultati:

    Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

    Këtu përdorim një tjetër variablë të skriptit: RESPONSE. Ajo përmban përgjigjen e shërbimit.

  3. daily.txt:
    Bebe, përshëndetje!
    Unë jam mirë, po monitoroj shërbimin:
    "$MSMS_SERVICE_NAME" çdo minutë...
    E si je ti?
    

    Rezultati:

    Robot për monitorimin e shërbimeve në web brenda gjysmë ore: telegram + bash + cron

Të kalojmë në realizimin e skriptovima.

Skripti i monitorimit

monitoring.sh bën 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ërgimit të 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 mesazhin e statusit ditor të monitorimit, skriptit mund t'i caktohet parametri DAILY.

Kujdes, kur skripti fillon, dosja aktuale ndryshon në services. Kjo lejon që në skedarët ini të specifikohet rrugët për skedarët në lidhje me services.

Skripti i kontrollit dhe dërgimi i njoftimeve

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

Për të punuar 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
}

Ne formojmë URL për qasje në REST API të telegram, duke përdorur çelësin sekret të ruajtur në skedarin.

Funksioni send_message përdor curl për dërgimin e mesazheve në këtë REST API, merr id e marrësve nga skedari që kemi specifikuar në ini. Në të dhënat e dërguara ne tregojmë se po përdorim markup për mesazhe: parse_mode="Markdown".

Të nxjerrim datën dhe orën aktuale dhe të ngarkojmë skedarin ini.

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

# ngarko variablat nga skedari .ini:
. $2

Stringa magjike . $2 ekzekuton skedarin ini të kaluar si parametri i dytë si një skript të zakonshëm, duke ruajtur vlerat e përcaktuara në variablat e ambientit.

Ngarko përgjigjen e pritur nga skedari, nëse është caktuar parametri MSMS_EXPECTED_FILE:

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

Ekzekuto 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 ]]; then
    echo health-check "$MSMS_SERVICE_NAME" DËSHMIA: CURL NK KTHEN ME $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" DËSHMIA: "$RESPONSE"
    MESSAGE="$(cat ../templates/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo health-check "$MSMS_SERVICE_NAME": OK
fi

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

Shprehja EXIT_CODE=$? ruan rezultatin e ekzekutimit të komandës së fundit, dmth. curl. Nëse është e nevojshme të dërgoni një njoftim, lexoni template nga skedari përkatës dhe dërgoni atë te marrësit me anë të send_message.

Blloku i fundit trajton parametrin 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

Ajo dërgon një mesazh që konfirmon funksionalitetin e monitoring-ut të vet.

Marrja e listës së id përdoruesve

recipients-setup.sh i drejtohet API-t të telegram për të marrë mesazhet e fundit të dërguara për botin:

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

Këtu përdoret magia e python për të shfaqur bukur listën. Kjo nuk është e detyrueshme, mund të marrësh thjesht id-në e nevojshme nga json, i cili do të dalë nga komanda:

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

Përfundimi

Në këtë mënyrë, mund të përdorni skriptet dhe template-t e gatshme të mesazheve, duke konfiguruar vetëm shërbimet që do të monitoroni dhe listat për njoftime; mund të krijoni një "identitet" të ri për botin; ose mund të bëni një zgjidhje tuajin mbi atë të propozuar.

Si mundësi për zhvillim të mëtejshëm sugjerohet konfigurimi dhe menaxhimi i monitoring-ut brenda botit, por këtu nuk shpëtojmë pa python. Nëse ndokush e bën këtë para meje - e dini se ku të ngarkoni kërkesën për pull 🙂

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster