بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

قد تحتاج أحيانًا إلى تطبيق نظام مراقبة سريع لخدمة جديدة، ولكنك تفتقر إلى البنية التحتية أو الخبرة اللازمة. في هذا الدليل، سنشرح كيفية تطبيق أداة لمراقبة أي خدمة ويب في غضون نصف ساعة، باستخدام الأدوات المدمجة فقط. ubuntuسنستخدم bash و cron و curl. وسنستخدم Telegram لإرسال الإشعارات.

سيكون أهم ما يميز الكعكة هو المشاركة العاطفية للمستخدمين. تم اختباره على الأشخاص - إنه يعمل.

عندما أنشأنا روبوت محادثة في خدمة التطبيب عن بعد Doctor Nearby لتحديد مستوى ضغط المستخدمين ، احتجنا إلى المراقبة. في غضون ساعتين ، تم إنشاء مشروع صغير ، والذي لا يعمل بشكل رائع فحسب ، بل يضيف أيضًا إيجابية مع رسائله.

أولاً ، دعنا نحصل على مستودع يحتوي على نصوص برمجية:

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

انتقل إلى مجلد msms ثم اعمل فيه.

إذا تم حظر التلغرام ، فاستخدم الوكيل. الخيار الأبسط والأكثر موثوقية هو torsocks:

sudo apt install tor
sudo apt install torsocks

كمثال ، لنقم بإعداد مراقبة صفحة البداية google.com في ثلاث خطوات

الخطوة 1. قم بإنشاء روبوت في Telegram واحصل على معرف المستخدم

  • في شريط البحث عن جهات الاتصال في Telegram ، نبحث عن تضمين التغريدة:

    بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

  • نقوم بتشغيله بالزر "ابدأ" ، وأدخل الأمر / newbot وأجب عن الأسئلة. ضع في اعتبارك أن الاسم هو اسم الروبوت الذي سيتم عرضه للمستخدمين ، بينما اسم المستخدم فريد ويجب أن ينتهي بـ "الروبوت":

    بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

    من بين أشياء أخرى ، سيصدر الروبوت رمزًا مميزًا سريًا لواجهة برمجة تطبيقات HTTP ، والتي تحتاج إلى نسخها وحفظها في ملف telegram-api-key.txt في مجلد msms.

  • نكتب اسم الروبوت الخاص بنا في شريط بحث التلغرام ، ونشغّله.
  • كلمسة أخيرة ، دعنا نضيف أنفسنا إلى قائمة مستلمي إشعارات المراقبة:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    سيعرض البرنامج النصي قائمة بالمكالمات الأخيرة إلى الروبوت ، يجب أن يكون هناك سطر واحد مع معرفنا واسمنا في برقية. نأخذ هذا المعرّف ونحفظه في ملف services / google-Receients.txt. تنسيق الملف: كل سطر هو معرف واحد. مثال:

    123456789
    987654321

لإضافة مستلم جديد ، عليك أن تطلب منه بدء تشغيل الروبوت في telegram وتشغيل المستلمين setup.sh وإضافة المعرف إلى الملف.

الخطوة 2. إعداد المراقبة

يتم وصف الخدمة من خلال إنشاء ملف ini في مجلد الخدمات. تحتاج إلى تعيين خمس معلمات:

  1. MSMS_SERVICE_NAME: اسم الخدمة - سيتم استخدامه في التنبيهات وسجل المراقبة.
  2. MSMS_SERVICE_ENDPOINT: نقطة نهاية الخدمة التي سنتصل بها مع curl.
  3. MSMS_CURL_PARAMS: خيارات إضافية لـ curl ، انظر المثال أدناه.
  4. MSMS_EXPECTED: استجابة الخدمة المتوقعة. تستخدم عندما تكون الإجابة قصيرة.
  5. MSMS_EXPECTED_FILE: اسم الملف مع استجابة الخدمة المتوقعة. إذا تم تحديده ، فسيتم الكتابة فوق MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: ملف بقائمة مستلمي الإخطار.

يُرجع الطلب إلى google.com ملف html ثابتًا مع إعادة توجيه ، وسنستخدمه كاستجابة الخادم المتوقعة:

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

لنقم بإنشاء ملف 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 يمكنك ضبط كل ما يمكن أن يفعله curl ، بما في ذلك:

  1. تعطيل رسائل curl حتى لا تتناثر في وحدة التحكم والسجل: -s
  2. اضبط مهلة الاتصال بالخدمة المحددة (بالثواني): --connect-timeout 3
  3. ضبط مهلة الاستجابة: -m 7
  4. تعطيل التحقق من الشهادة لـ SSL (على سبيل المثال ، إذا تم استخدام شهادة موقعة ذاتيًا): --insecure
  5. حدد نوع طلب http: -X POST
  6. حدد الرؤوس: -H "Content-Type: application/json"
  7. حدد نص الطلب كسلسلة أو ملف. مثال لملف: -d @request.json

قمنا بتعطيل التنبيهات وضبطنا المهلات على 3 ثوانٍ. لكل اتصال و 7 ثوان. لتلقي رد من الخدمة.

اهتمام: تحديد قيم المعلمات في علامات الاقتباس الفردية ، كما في المثال. لسوء الحظ ، فإن bash هشة إلى حد ما بهذا المعنى ، ويمكن أن تؤدي فراشة بطريق الخطأ في الاقتباس الخاطئ إلى موت الكون بأخطاء يصعب تشخيصها.

قمنا بإعداد المراقبة. دعنا نتحقق من أن كل شيء على ما يرام:

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

يجب أن يعرض البرنامج النصي رسالة مثل:

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

الخطوة 3. قم بإعداد الجدول

قم بإعداد جدول مراقبة في cron:

sudo crontab -e

دعنا نضيف سطرًا للتحقق من google.com كل دقيقة:

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

دعنا نضيف إشعارًا كل يوم عند الساعة 11.00 ، يؤكد أداء المراقبة نفسها. للقيام بذلك ، قم بتمرير المعلمة اليومية إلى البرنامج النصي:

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

2>&1 هي خدعة قياسية تعيد توجيه الأخطاء إلى تدفق الإخراج الرئيسي. نتيجة لذلك ، سيتم تضمينهم أيضًا في سجل المراقبة.

احفظ التغييرات واخترها بالأمر:

 sudo service cron reload

يمكنك قراءة المزيد حول إعداد cron ، على سبيل المثال ، هنا.

وبالتالي ، سيتم إطلاق برنامج نصي للمراقبة كل دقيقة ، والذي سيتصل بـ google.com عبر curl. إذا كانت الاستجابة المستلمة تختلف عن الاستجابة المتوقعة ، فسيرسل البرنامج النصي إشعارًا إلى قائمة المستلمين في برقية. يتم الاحتفاظ بسجل الشيكات في ملف Monitoring.log

إذا احتجنا إلى إضافة خدمة أخرى ، فنحن ببساطة ننشئ ملف ini جديدًا لها في مجلد الخدمات ، وإذا لزم الأمر ، نشكل قائمة منفصلة بالمستلمين. كل شيء آخر سيعمل تلقائيًا.

إذا أصبحت الخدمة التي يتم فحصها غير متاحة ، فسيتم إرسال إشعار كل دقيقة. إذا لم تتمكن من استعادة الخدمة بسرعة ، فيمكنك تعطيل الإشعارات مؤقتًا في خصائص الروبوت في Telegram.

الآن دعونا نلقي نظرة فاحصة على الميزات الإضافية وتنفيذ البرنامج النصي.

قوالب الرسائل والمشاركة العاطفية

لجعل التواصل مع الروبوت أكثر حيوية ، أطلقنا عليه اسم Manechka ، وأضفنا صورة رمزية مناسبة ، وقمنا بإشراك أشخاص محترفين في العلاقات العامة لإنشاء نصوص رسائل. يمكنك استخدام تطوراتنا أو التغيير حسب ذوقك.

على سبيل المثال مثل هذا:

بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron
أو حتى مثل هذا:

بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron
ولماذا لا؟

يتم تعيين اسم الروبوت والصورة الرمزية عبر تضمين التغريدة.
توجد قوالب الرسائل في المجلد النماذج:

  • حليقة Fail.txt: يتم إرسال الرسالة عندما يقوم curl بإرجاع رمز خطأ غير صفري. عادة ما يشير إلى استحالة الوصول إلى الخدمة.
  • daily.txt: رسالة يومية تؤكد عمل مراقبة الخدمة.
  • فشل الخدمة.txt: الرسالة المرسلة عندما تكون استجابة الخدمة مختلفة عما هو متوقع.

دعنا نحلل إمكانيات التخصيص باستخدام قوالب الرسائل المدمجة كمثال.
تستخدم القوالب الرموز التعبيرية. لسوء الحظ ، لا يعرضها habr.
لتحديد الرموز التعبيرية ، من الملائم استخدام البحث emojipedia.org:

بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

يمكنك ببساطة نسخ ولصق الحرف المناسب في نص القالب (هذا هو يونيكود عادي).

  1. حليقة Fail.txt:
    Котёнок,  помоги мне... 
    Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    استخدمنا اسم الخدمة الذي حددناه (متغير MSMS_SERVICE_NAME) ومتغير نصي داخلي برمز خروج curl (EXIT_CODE). قمنا أيضًا بتنسيق الرسالة باستخدام الترميز تخفيض البرقية: الأحرف "" تحيط بنص ذي عرض ثابت. نظرًا لأن علامات التنصيص والفاصلات العليا هي أحرف خاصة لـ bash ، فإننا نتخلص منها بـ "". أسماء المتغيرات مسبوقة بعلامة "$".

    النتيجة:

    بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

  2. فشل الخدمة.txt:
    Котёнок, помоги мне... 
    Сервис "$MSMS_SERVICE_NAME" меня расстроил
    Он работает неправильно, вот что он мне отвечает:
    `$RESPONSE`

    النتيجة:

    بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

    هنا نستخدم متغير نصي آخر: RESPONSE. يحتوي على استجابة الخدمة.

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

    النتيجة:

    بوت لمراقبة خدمات الويب في نصف ساعة: telegram + bash + cron

دعنا ننتقل إلى تنفيذ البرامج النصية.

نص المراقبة

المراقبة يقوم باكتشاف تلقائي بسيط - يأخذ جميع ملفات ini من مجلد الخدمات وينفذ البرنامج النصي الرئيسي لكل منها مع منطق للتحقق من التنبيهات وإرسالها:

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

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

لإنشاء رسالة يومية حول حالة المراقبة ، يمكن تمرير المعلمة اليومية إلى البرنامج النصي.

يرجى ملاحظة أنه عند بدء البرنامج النصي ، يتغير المجلد الحالي إلى الخدمات. يسمح هذا لملفات ini بتحديد مسارات الملفات المتعلقة بالخدمات.

البرنامج النصي للتحقق وإرسال التنبيهات

msms.sh يحتوي على المنطق الرئيسي للتحقق من الخدمة وإرسال التنبيهات.

العمل مع 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
}

نقوم بإنشاء عنوان URL للوصول إلى واجهة برمجة تطبيقات Telegram REST باستخدام المفتاح السري المخزن في الملف.

تستخدم وظيفة send_message curl لإرسال رسائل إلى واجهة برمجة تطبيقات REST هذه ، مع أخذ معرف المستلمين من الملف الذي حددناه في ملف ini. في البيانات المرسلة ، نشير إلى أننا نستخدم ترميز الرسائل: parse_mode="Markdown".

دعونا نعرض التاريخ والوقت الحالي ونقوم بتحميل ملف ini.

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

# load variables from .ini file:
. $2

سلسلة سحرية . $2 ينفذ ملف ini الذي تم تمريره كمعامل ثاني كبرنامج نصي عادي ، مضيفًا القيم المحددة فيه إلى متغيرات البيئة.

قم بتحميل الاستجابة المتوقعة من الملف إذا تم توفير المعلمة MSMS_EXPECTED_FILE:

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

دعنا نتحقق من الخدمة بإرسال الإشعارات ، إذا لزم الأمر:

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

أولا إسناد إلى متغير RESPONSE نتيجة تنفيذ الأمر curl للخدمة المقدمة.

التعبير EXIT_CODE=$? يضع نتيجة تنفيذ الأمر الأخير في متغير ، أي لفة. إذا كان من الضروري إرسال إشعار ، تتم قراءة النموذج من الملف المقابل وإرساله إلى المستلمين باستخدام send_message.

الكتلة الأخيرة تتعامل مع المعلمة اليومية:

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

يرسل رسالة تؤكد صحة المراقبة نفسها.

الحصول على قائمة بهويات المستخدمين

المستلمون-setup.sh يستدعي Telegram API للحصول على أحدث الرسائل الموجهة إلى الروبوت:

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

هذا هو المكان الذي يتم فيه استخدام سحر python لعمل إخراج قائمة جميل. هذا اختياري ، يمكنك فقط أخذ المعرف المطلوب من json الذي سيعرضه الأمر:

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

اختتام

وبالتالي ، يمكنك استخدام النصوص الجاهزة وقوالب الرسائل ، وإعداد الخدمات التي يمكن ملاحظتها وقوائم الإشعارات فقط ؛ يمكنك إنشاء "شخصية" جديدة للروبوت ؛ ويمكنك اتخاذ قرارك الخاص بناءً على المقترح.

كخيارات لمزيد من التطوير ، فإنه يقترح تكوين وإدارة المراقبة في الروبوت نفسه ، ولكن هنا لا يمكنك الاستغناء عن Python. إذا قام شخص ما بوضعه قبلي ، فأنت تعرف مكان تحميل طلب السحب

المصدر: www.habr.com

شراء استضافة موثوقة للمواقع مع حماية DDoS وخوادم VPS VDS 🔥 اشترِ استضافة مواقع ويب موثوقة مع حماية من هجمات DDoS، وخوادم VPS وVDS | ProHoster