Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

Czasami trzeba szybko wdrożyć monitorowanie nowej usługi, ale nie dysponuje się niezbędną infrastrukturą ani wiedzą specjalistyczną. W tym poradniku wdrożymy narzędzie do monitorowania dowolnej usługi sieciowej w pół godziny, wykorzystując wyłącznie wbudowane narzędzia. ubuntu: bash, cron i curl. Do wysyłania powiadomień użyjemy Telegrama.

„Wisienką na torcie” będzie emocjonalne zaangażowanie użytkowników. Testowane na ludziach - działa.

Kiedy w serwisie telemedycznym Doctor Nearby stworzyliśmy chatbota, aby określić poziom stresu użytkowników, potrzebowaliśmy monitorowania. W ciągu kilku godzin powstał miniprojekt, który nie tylko działa świetnie, ale także dodaje pozytywnego przekazu.

Najpierw zdobądźmy repozytorium ze skryptami:

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

Przejdź do folderu msms i pracuj w nim.

Jeśli telegram jest zablokowany, użyj serwera proxy. Najprostszą i najbardziej niezawodną opcją są torsy:

sudo apt install tor
sudo apt install torsocks

Przykładowo skonfigurujmy monitorowanie strony startowej google.com w trzech krokach.

KROK 1. Utwórz bota w telegramie i uzyskaj identyfikator użytkownika

  • W pasku wyszukiwania kontaktów w telegramie szukamy @ojciec:

    Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

  • Uruchamiamy go przyciskiem Start, wpisujemy komendę /newbot i odpowiadamy na pytania. Należy pamiętać, że nazwa to nazwa bota, która będzie wyświetlana użytkownikom, a nazwa użytkownika jest unikalna i musi kończyć się na „bot”:

    Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

    Bot między innymi wystawi tajny token dla API HTTP, który należy skopiować i zapisać w pliku telegram-api-key.txt w folderze msms.

  • W pasku wyszukiwania telegramu wpisujemy nazwę naszego bota i uruchamiamy go.
  • Na koniec dodajmy się do listy odbiorców alertów monitorujących:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skrypt wyświetli listę ostatnich połączeń z botem, w telegramie powinna znajdować się jedna linijka z naszym identyfikatorem i nazwą. Bierzemy ten identyfikator i zapisujemy go w pliku Services/google-recipients.txt. Format pliku: każda linia to jeden identyfikator. Przykład:

    123456789
    987654321

Aby dodać nowego odbiorcę, należy poprosić go o uruchomienie bota w telegramie, uruchomienie requires-setup.sh i dodanie identyfikatora do pliku.

KROK 2. Skonfiguruj monitorowanie

Usługę opisujemy tworząc plik ini w folderze Services. Musisz ustawić pięć parametrów:

  1. MSMS_SERVICE_NAME: nazwa usługi - będzie używana w alertach i dzienniku monitorowania.
  2. MSMS_SERVICE_ENDPOINT: punkt końcowy usługi, z którą będziemy się kontaktować za pomocą curl.
  3. MSMS_CURL_PARAMS: dodatkowe opcje zwijania, patrz przykład poniżej.
  4. MSMS_EXPECTED: oczekiwana odpowiedź serwisu. Używane, jeśli odpowiedź jest krótka.
  5. MSMS_EXPECTED_FILE: nazwa pliku z oczekiwaną odpowiedzią usługi. Jeśli określono, zastępuje MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: plik z listą odbiorców powiadomień.

Żądanie do google.com zwraca poprawiony kod HTML z przekierowaniem, użyjemy go jako oczekiwanej odpowiedzi serwera:

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

Utwórzmy plik 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 możesz ustawić wszystko, co potrafi curl, w tym:

  1. Wyłącz zwijanie komunikatów, aby uniknąć zaśmiecania konsoli i dziennika: -s
  2. Ustaw limit czasu połączenia ze sprawdzaną usługą (w sekundach): --connect-timeout 3
  3. Ustaw limit czasu odpowiedzi: -m 7
  4. Wyłącz weryfikację certyfikatu dla SSL (na przykład, jeśli używasz certyfikatu z podpisem własnym): --insecure
  5. Określ typ żądania http: -X POST
  6. Określ nagłówki: -H "Content-Type: application/json"
  7. Określ treść żądania jako ciąg lub plik. Przykład dla pliku: -d @request.json

Wyłączyliśmy powiadomienia i ustawiliśmy limity czasu na 3 sekundy. do podłączenia i 7 sek. aby otrzymać odpowiedź serwisu.

Uwaga: Określ wartości parametrów w apostrofach, jak w przykładzie. Niestety bash jest pod tym względem dość kruchy i przypadkowy motyl z błędnym cudzysłowem może doprowadzić do śmierci wszechświata z trudnymi do zdiagnozowania błędami.

Uruchomiliśmy monitoring. Sprawdźmy, czy wszystko jest w porządku:

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

Skrypt powinien wyświetlić komunikat typu:

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

KROK 3. Ustalenie harmonogramu

Ustawmy harmonogram monitorowania w cron:

sudo crontab -e

Dodajmy linię, aby co minutę sprawdzać google.com:

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

Codziennie o godzinie 11.00:XNUMX dodamy alert potwierdzający funkcjonalność samego monitoringu. W tym celu przekażemy do skryptu parametr DAILY:

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

2>&1 - standardowa technika przekierowująca błędy do głównego strumienia wyjściowego. Dzięki temu również znajdą się w dzienniku monitorowania.

Zapiszmy zmiany i odbierzmy je za pomocą polecenia:

 sudo service cron reload

Możesz przeczytać więcej o konfigurowaniu crona, na przykład: tutaj.

Tym samym co minutę uruchamiany będzie skrypt monitorujący, który będzie kontaktował się z google.com poprzez curl. Jeżeli otrzymana odpowiedź różni się od oczekiwanej, skrypt wyśle ​​powiadomienie telegramem do listy odbiorców. Dziennik audytu przechowywany jest w pliku monitoring.log

Jeśli potrzebujemy dodać kolejną usługę, po prostu tworzymy dla niej nowy plik ini w folderze usług i w razie potrzeby tworzymy osobną listę odbiorców. Wszystko inne będzie działać automatycznie.

Jeśli sprawdzana usługa stanie się niedostępna, co minutę będzie wysyłane powiadomienie. Jeśli nie możesz szybko przywrócić usługi, możesz tymczasowo wyłączyć powiadomienia we właściwościach telegramu bota.

Przyjrzyjmy się teraz bliżej dodatkowym funkcjom i implementacji skryptów.

Wzorce wiadomości i zaangażowanie emocjonalne

Aby komunikacja z botem była bardziej ożywiona, nazwaliśmy go Manechka, dodaliśmy odpowiednie zdjęcie awatara i zatrudniliśmy profesjonalnych specjalistów PR do stworzenia tekstów wiadomości. Możesz skorzystać z naszego doświadczenia lub zmienić je według własnego gustu.

Na przykład:

Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron
lub nawet tak:

Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron
Dlaczego nie?

Nazwę bota i awatar ustawia się poprzez @ojciec.
Szablony wiadomości znajdują się w folderze Szablony:

  • curl-fail.txt: wiadomość wysyłana, gdy curl zwróci niezerowy kod błędu. Zwykle mówi się o niemożności dotarcia do usługi.
  • codziennie.txt: Codzienny komunikat potwierdzający, że monitorowanie usługi działa.
  • service-fail.txt: Wiadomość wysyłana, gdy odpowiedź serwisu różni się od oczekiwanej.

Przyjrzyjmy się opcjom dostosowywania na przykładzie wbudowanych szablonów wiadomości.
Szablony wykorzystują emoji. Niestety habr ich nie wyświetla.
Aby wybrać emoji, wygodnie jest skorzystać z wyszukiwania emojipedia.org:

Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

Po prostu kopiujesz i wklejasz odpowiedni symbol do tekstu szablonu (jest to zwykły Unicode).

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

    Użyliśmy określonej przez nas nazwy usługi (zmienna MSMS_SERVICE_NAME) i wewnętrzną zmienną skryptu z kodem zakończenia curl (EXIT_CODE). Sformatowaliśmy także wiadomość za pomocą znaczników przecena telegramu: Znaki „`” otaczają tekst o stałej szerokości. Ponieważ cudzysłowy i apostrofy są symbolami bash, uciekamy od nich za pomocą „”. Nazwy zmiennych są poprzedzone znakiem „$”.

    Wynik:

    Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

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

    Wynik:

    Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

    Tutaj używamy innej zmiennej skryptu: RESPONSE. Zawiera odpowiedź serwisu.

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

    Wynik:

    Bot do monitorowania usług internetowych w pół godziny: telegram + bash + cron

Przejdźmy do implementacji skryptów.

Skrypt monitorujący

monitorowanie.sh dokonuje prostego automatycznego wykrywania - pobiera wszystkie pliki ini z folderu Services i dla każdego z nich wykonuje główny skrypt z logiką sprawdzania i wysyłania alertów:

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

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

Aby generować codzienny komunikat o stanie monitorowania można przekazać do skryptu parametr DAILY.

Należy pamiętać, że po uruchomieniu skryptu bieżący folder zmienia się na usługi. Umożliwia to określenie ścieżek plików względem usług w plikach ini.

Skrypt do sprawdzania i wysyłania powiadomień

msms.sh zawiera główną logikę sprawdzania usługi i wysyłania alertów.

Praca z 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
}

Generujemy adres URL umożliwiający dostęp do API REST telegramu przy użyciu tajnego klucza zapisanego w pliku.

Funkcja send_message używa curl do wysyłania wiadomości do tego interfejsu API REST, pobierając identyfikatory odbiorców z pliku określonego w pliku ini. W przesyłanych przez nas danych wskazujemy, że używamy znaczników wiadomości: parse_mode="Markdown".

Wyświetlmy aktualną datę i godzinę oraz załadujmy plik ini.

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

# load variables from .ini file:
. $2

Magiczny sznurek . $2 wykonuje plik ini przekazany na wejście jako drugi parametr jako zwykły skrypt, wpisując określone w nim wartości do zmiennych środowiskowych.

Załaduj oczekiwaną odpowiedź z pliku, jeśli określono parametr MSMS_EXPECTED_FILE:

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

Sprawdzimy usługę i w razie potrzeby wyślemy alerty:

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

Najpierw przypisujemy do zmiennej RESPONSE wynik wykonania polecenia curl dla tej usługi.

Wyrażenie EXIT_CODE=$? umieszcza wynik ostatniego polecenia w zmiennej, tj. kędzior. W przypadku konieczności wysłania alertu szablon jest odczytywany z odpowiedniego pliku i wysyłany do odbiorców za pomocą send_message.

Ostatni blok przetwarza 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

Wysyła komunikat potwierdzający funkcjonalność samego monitoringu.

Pobieranie listy identyfikatorów użytkowników

odbiorcy-setup.sh wywołuje API telegramu, aby uzyskać najnowsze wiadomości adresowane do bota:

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

Używa magii Pythona do pięknego wyświetlania listy. Nie jest to konieczne, możesz po prostu pobrać żądany identyfikator z json, który wyświetli polecenie:

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

wniosek

Dzięki temu możesz skorzystać z gotowych skryptów i szablonów wiadomości, konfigurując tylko monitorowane usługi i listy dla alertów; możesz stworzyć nową „osobowość” dla bota; lub możesz podjąć własną decyzję na podstawie propozycji.

Opcje dalszego rozwoju sugerują konfigurację i zarządzanie monitorowaniem w samym bocie, ale tutaj nie można obejść się bez Pythona. Jeśli ktoś dostanie to przede mną, wiecie gdzie złożyć prośbę o ściągnięcie :)

Źródło: www.habr.com

Kup niezawodny hosting dla stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron internetowych z ochroną DDoS, serwery VPS VDS | ProHoster