Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

Kadangkala anda perlu melaksanakan pemantauan dengan cepat untuk perkhidmatan baharu, tetapi anda tidak mempunyai infrastruktur atau kepakaran yang diperlukan. Dalam panduan ini, kami akan melaksanakan alat untuk memantau sebarang perkhidmatan web dalam masa setengah jam, hanya menggunakan alat terbina dalam. ubuntu: bash, cron и curl. Для доставки оповещений будем использовать telegram.

"Ceri pada kek" akan menjadi penglibatan emosi pengguna. Diuji pada orang - ia berfungsi.

Apabila kami di perkhidmatan teleperubatan Doctor Nearby mencipta chatbot untuk menentukan tahap tekanan pengguna, kami memerlukan pemantauan. Dalam beberapa jam, projek mini telah dicipta yang bukan sahaja berfungsi dengan baik, tetapi juga menambah positif dengan mesejnya.

Pertama, mari dapatkan repositori dengan skrip:

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

Pergi ke folder msms dan kemudian kerjakan di dalamnya.

Jika telegram disekat, gunakan proksi. Pilihan yang paling mudah dan paling boleh dipercayai ialah torsocks:

sudo apt install tor
sudo apt install torsocks

Sebagai contoh, mari kita sediakan pemantauan halaman permulaan google.com dalam tiga langkah.

LANGKAH 1. Buat bot dalam telegram dan dapatkan id pengguna

  • Dalam bar carian untuk kenalan dalam telegram yang kami cari @botfather:

    Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

  • Kami melancarkannya dengan butang Mula, masukkan arahan /newbot dan jawab soalan. Anda perlu ingat bahawa nama ialah nama bot yang akan dipaparkan kepada pengguna, dan nama pengguna adalah unik dan mesti berakhir dengan "bot":

    Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

    Antara lain, bot akan mengeluarkan token rahsia untuk API HTTP, yang mesti disalin dan disimpan ke fail telegram-api-key.txt dalam folder msms.

  • Kami menaip nama bot kami dalam bar carian telegram dan melancarkannya.
  • Sebagai sentuhan akhir, mari kita tambahkan diri kita pada senarai penerima amaran pemantauan:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Skrip akan memaparkan senarai panggilan terbaru ke bot; harus ada satu baris dengan id dan nama kami dalam telegram. Kami mengambil id ini dan menyimpannya dalam perkhidmatan fail/google-recipients.txt. Format fail: setiap baris ialah satu id. Contoh:

    123456789
    987654321

Untuk menambah penerima baharu, anda perlu memintanya memulakan bot dalam telegram, jalankan recipients-setup.sh dan tambah id pada fail.

LANGKAH 2. Sediakan pemantauan

Perkhidmatan ini diterangkan dengan mencipta fail ini dalam folder perkhidmatan. Anda perlu menetapkan lima parameter:

  1. MSMS_SERVICE_NAME: nama perkhidmatan - akan digunakan dalam makluman dan log pemantauan.
  2. MSMS_SERVICE_ENDPOINT: titik akhir perkhidmatan yang akan kami hubungi dengan curl.
  3. MSMS_CURL_PARAMS: pilihan curl tambahan, lihat contoh di bawah.
  4. MSMS_EXPECTED: tindak balas yang dijangka daripada perkhidmatan. Digunakan jika jawapannya pendek.
  5. MSMS_EXPECTED_FILE: nama fail dengan respons perkhidmatan yang dijangkakan. Jika dinyatakan, tulis ganti MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: fail dengan senarai penerima pemberitahuan.

Permintaan kepada google.com mengembalikan html tetap dengan ubah hala, kami akan menggunakannya sebagai respons pelayan yang dijangkakan:

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

Mari buat fail 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 anda boleh menetapkan semua yang curl boleh lakukan, termasuk:

  1. Lumpuhkan mesej curl untuk mengelakkan kekacauan konsol dan log: -s
  2. Tetapkan tamat masa sambungan dengan perkhidmatan sedang diperiksa (dalam beberapa saat): --connect-timeout 3
  3. Tetapkan tamat masa respons: -m 7
  4. Lumpuhkan pengesahan sijil untuk SSL (contohnya, jika anda menggunakan sijil yang ditandatangani sendiri): --insecure
  5. Nyatakan jenis permintaan http: -X POST
  6. Nyatakan tajuk: -H "Content-Type: application/json"
  7. Tentukan badan permintaan sebagai rentetan atau fail. Contoh untuk fail: -d @request.json

Kami melumpuhkan pemberitahuan dan menetapkan tamat masa kepada 3 saat. untuk menyambung dan 7 saat. untuk menerima maklum balas perkhidmatan.

Perhatian: Tentukan nilai parameter dalam petikan tunggal, seperti dalam contoh. Malangnya, bash agak rapuh dalam pengertian ini, dan rama-rama yang tidak disengajakan dengan tanda petikan yang salah boleh menyebabkan kematian alam semesta dengan ralat yang sukar untuk didiagnosis.

Kami telah menyediakan pemantauan. Mari periksa sama ada semuanya OK:

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

Skrip harus memaparkan mesej seperti:

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

LANGKAH 3. Menyediakan jadual

Mari sediakan jadual pemantauan dalam cron:

sudo crontab -e

Mari tambahkan baris untuk menyemak google.com setiap minit:

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

Kami akan menambah makluman setiap hari pada 11.00:XNUMX pagi, mengesahkan kefungsian pemantauan itu sendiri. Untuk melakukan ini, kami akan menghantar parameter DAILY ke skrip:

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

2>&1 - teknik standard yang mengubah hala ralat ke aliran keluaran utama. Akibatnya, mereka juga akan dimasukkan ke dalam log pemantauan.

Mari simpan perubahan dan ambilnya dengan arahan:

 sudo service cron reload

Anda boleh membaca lebih lanjut tentang menyediakan cron, contohnya, di sini.

Oleh itu, setiap minit skrip pemantauan akan dilancarkan, yang akan menghubungi google.com melalui curl. Jika respons yang diterima berbeza daripada yang dijangkakan, skrip akan menghantar pemberitahuan telegram kepada senarai penerima. Log audit disimpan dalam fail monitoring.log

Jika kami perlu menambah perkhidmatan lain, kami hanya mencipta fail ini baharu untuknya dalam folder perkhidmatan dan, jika perlu, buat senarai penerima yang berasingan. Semua yang lain akan berfungsi secara automatik.

Jika perkhidmatan yang diperiksa telah menjadi tidak tersedia, makluman akan dihantar setiap minit. Jika anda tidak dapat memulihkan perkhidmatan dengan cepat, anda boleh melumpuhkan pemberitahuan dalam sifat telegram bot buat sementara waktu.

Sekarang mari kita lihat dengan lebih dekat ciri tambahan dan pelaksanaan skrip.

Corak Mesej dan Penglibatan Emosi

Untuk menjadikan komunikasi dengan bot lebih rancak, kami menamakannya Manechka, menambah imej avatar yang sesuai dan mengupah pakar PR profesional untuk mencipta mesej teks. Anda boleh menggunakan pengalaman kami atau mengubahnya mengikut citarasa anda.

Contohnya seperti ini:

Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron
atau pun seperti ini:

Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron
Kenapa tidak?

Nama bot dan avatar ditetapkan melalui @botfather.
Templat mesej ada dalam folder template:

  • curl-fail.txt: mesej dihantar apabila curl mengembalikan kod ralat bukan sifar. Biasanya ia bercakap tentang kemustahilan untuk mencapai perkhidmatan.
  • daily.txt: Mesej harian yang mengesahkan bahawa pemantauan perkhidmatan berfungsi.
  • service-fail.txt: Mesej yang dihantar apabila respons perkhidmatan berbeza daripada yang dijangkakan.

Mari lihat pilihan penyesuaian menggunakan templat mesej terbina dalam sebagai contoh.
Templat menggunakan emoji. Malangnya, habr tidak memaparkannya.
Untuk memilih emoji, adalah mudah untuk menggunakan carian pada emojipedia.org:

Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

Anda hanya menyalin dan menampal simbol yang sesuai ke dalam teks templat (ini adalah unikod biasa).

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

    Kami menggunakan nama perkhidmatan yang kami tentukan (variable MSMS_SERVICE_NAME) dan pembolehubah skrip dalaman dengan kod keluar curl (EXIT_CODE). Kami juga memformatkan mesej menggunakan markup penurunan harga telegram: aksara "`" mengelilingi teks lebar tetap. Memandangkan petikan dan apostrof ialah simbol bash, kami melepaskannya dengan "". Nama pembolehubah didahului dengan tanda "$".

    Keputusan:

    Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

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

    Keputusan:

    Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

    Di sini kita menggunakan pembolehubah skrip lain: RESPONSE. Ia mengandungi respons perkhidmatan.

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

    Keputusan:

    Bot untuk memantau perkhidmatan web dalam setengah jam: telegram + bash + cron

Mari kita beralih kepada pelaksanaan skrip.

Skrip pemantauan

pemantauan.sh melakukan penemuan automatik yang mudah - ia mengambil semua fail ini dari folder perkhidmatan dan untuk setiap satu melaksanakan skrip utama dengan logik untuk menyemak dan menghantar makluman:

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

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

Untuk menjana mesej harian tentang status pemantauan, anda boleh menghantar parameter DAILY ke skrip.

Sila ambil perhatian bahawa apabila skrip bermula, folder semasa bertukar kepada perkhidmatan. Ini membolehkan anda menentukan laluan fail berbanding perkhidmatan dalam fail ini.

Skrip untuk menyemak dan menghantar pemberitahuan

msms.sh mengandungi logik utama untuk menyemak perkhidmatan dan menghantar makluman.

Bekerja dengan 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
}

Kami menjana URL untuk mengakses telegram REST API menggunakan kunci rahsia yang disimpan dalam fail.

Fungsi send_message menggunakan curl untuk menghantar mesej ke REST API ini, mengambil id penerima daripada fail yang kami tentukan dalam ini. Dalam data yang kami hantar, kami menunjukkan bahawa kami menggunakan penanda mesej: parse_mode="Markdown".

Mari paparkan tarikh dan masa semasa dan muatkan fail ini.

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

# load variables from .ini file:
. $2

Rentetan ajaib . $2 melaksanakan fail ini yang dihantar ke input sebagai parameter kedua sebagai skrip biasa, memasukkan nilai yang ditentukan di dalamnya ke dalam pembolehubah persekitaran.

Muatkan respons yang dijangkakan daripada fail jika parameter ditentukan MSMS_EXPECTED_FILE:

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

Kami akan menyemak perkhidmatan dan menghantar makluman jika perlu:

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

Mula-mula kita berikan kepada pembolehubah RESPONSE hasil daripada melaksanakan perintah curl untuk perkhidmatan ini.

Ungkapan EXIT_CODE=$? meletakkan hasil arahan terakhir ke dalam pembolehubah, i.e. keriting. Jika perlu menghantar makluman, templat dibaca daripada fail yang sepadan dan dihantar kepada penerima menggunakan send_message.

Blok terakhir memproses 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

Ia menghantar mesej yang mengesahkan kefungsian pemantauan itu sendiri.

Mendapatkan senarai id pengguna

recipients-setup.sh memanggil API telegram untuk mendapatkan mesej terkini yang dialamatkan kepada bot:

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

Ini menggunakan sihir python untuk memaparkan senarai dengan cantik. Ini tidak perlu, anda hanya boleh mengambil id yang dikehendaki dari json, yang akan dikeluarkan oleh arahan:

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

Kesimpulan

Oleh itu, anda boleh menggunakan skrip dan templat mesej siap sedia, menyediakan perkhidmatan dan senarai yang dipantau sahaja untuk makluman; anda boleh mencipta "personaliti" baharu untuk bot; atau anda boleh membuat keputusan sendiri berdasarkan apa yang dicadangkan.

Pilihan untuk pembangunan lanjut mencadangkan mengkonfigurasi dan mengurus pemantauan dalam bot itu sendiri, tetapi di sini anda tidak boleh melakukannya tanpa python. Jika seseorang mendapatkannya sebelum saya, anda tahu di mana untuk menyerahkan permintaan tarik :)

Sumber: www.habr.com

Beli pengehosan yang boleh dipercayai untuk tapak dengan perlindungan DDoS, pelayan VPS VDS 🔥 Beli pengehosan laman web yang boleh dipercayai dengan perlindungan DDoS, pelayan VPS VDS | ProHoster