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



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

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

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

للبدء ، احصل على مستودع به نصوص:

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

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

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

 sudo apt install tor sudo apt install torsocks 

على سبيل المثال ، سنقوم بتهيئة google.com لمراقبة صفحة البدء من خلال ثلاث خطوات.

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


  • في سلسلة بحث جهات الاتصال في telegram ، ابحث عن botfather :


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



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

     sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.sh 

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

     123456789 987654321 

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

الخطوة 2. تكوين الرصد


يحدث وصف الخدمة عن طريق إنشاء ملف ini في مجلد servies. تحتاج المعلمات الخمسة إلى ضبط:

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

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

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

قم بإنشاء ملف الخدمات / 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 يمكنك تحديد كل ما يمكن أن تفعله الضفيرة ، بما في ذلك:

  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 ، لتأكيد المراقبة نفسها. للقيام بذلك ، قم بتمرير المعلمة DAILY إلى البرنامج النصي:

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

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

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

  sudo service cron reload 

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

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

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

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

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

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


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

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


أو حتى مع ذلك:


لم لا؟

يتم تعيين اسم الروبوت و avatar عبر botfather .
توجد قوالب الرسائل في مجلد القوالب :

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

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



يمكنك ببساطة نسخ ولصق الحرف المناسب في نص القالب (هذا هو الرمز الموحد المعتاد).
  1. حليقة-fail.txt:

     ,  ...      \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\` 

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

    النتيجة:


  2. خدمة fail.txt:

     ,  ...  \"$MSMS_SERVICE_NAME\"     ,     : \`$RESPONSE\` 

    النتيجة:



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

     , !    , c  : \"$MSMS_SERVICE_NAME\"  ...     ? 

    النتيجة:



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

رصد النصي


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

 #!/bin/bash cd $(dirname "$0")/services for service_ini in $(ls *.ini); do bash ../msms.sh "$1" "$service_ini" done 

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

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

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


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

العمل مع برقية:

 # 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 API باستخدام المفتاح الخاص المخزن في الملف.

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

قم بطباعة الوقت والتاريخ الحالي وتحميل ملف ini.

 echo $(date '+%Y-%m-%d %H:%M:%S') # load variables from .ini file: . $2 

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

قم بتنزيل الاستجابة المتوقعة من الملف إذا تم MSMS_EXPECTED_FILE المعلمة 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 قراءة القالب من الملف المقابل ويتم إرسال البريد إلى المستلمين باستخدام send_message .

يعالج الكتلة الأخيرة المعلمة 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 

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

الحصول على قائمة معرف المستخدم


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

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

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

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

استنتاج


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

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

Source: https://habr.com/ru/post/ar483318/


All Articles