الثقة ، ولكن تحقق: التحكم في الرسائل غير المرسلة في Bitrix مع إعلام المشرف

خلفية



بمجرد أن كنت بحاجة إلى التحقق من وجود رسائل غير مرسلة في "1C-Bitrix: إدارة الموقع" (المشار إليها فيما يلي باسم Bitrix) وتلقي الإخطارات حول ذلك. كانت مشاكل إرسال البريد نادرة للغاية ، ولكنها كانت أحداثًا غير سارة. كانت هذه عادةً أوامر وتأكيدات تسجيل ورسائل مهمة أخرى.



كانت الصعوبة هي أنه إذا توقفت طريقة إرسال البريد الذي يستخدمه Bitrix عن العمل (على الأرجح السبب في ذلك) ، فإن إرسال إشعار باستخدام نفس الطريقة سيكون غير موثوق به .



Googling ، لم أجد شيئًا مجانيًا وجاهزًا ، ولكني صادفت الكثير من الأسئلة / الإجابات حول الرسائل غير المرسلة من Bitrix - كيفية العثور عليها ، وما هي أسباب ظهورها ، وما إلى ذلك. لذلك ، اعتبرت أنه من الضروري مشاركة الحل الخاص بي.



مهمة



  1. احصل على تفاصيل الاتصال بقاعدة البيانات من تكوين موقع Bitrix
  2. الاتصال بقاعدة البيانات
  3. تحقق من عدد رسائل البريد الإلكتروني غير المرسلة
  4. قارن الكمية مع الحد
  5. اتخذ قرارًا بإرسال إشعار




التنفيذ



سيتلقى البرنامج النصي shell 3 معلمات:



  1. المسار إلى تكوين موقع Bitrix (path_to_bxdb_config)
  2. نص استعلام قاعدة البيانات (single_num_value_query)
  3. القيمة القصوى المسموح بها (max_num_value)


للتشغيل الصحيح ، يجب أن يقوم استعلام قاعدة البيانات بإرجاع قيمة رقمية واحدة.



Check_bx_db_value.sh كود البرنامج النصي
#!/bin/bash
#
# Site: https://github.com/AlexeyGogolev/check-bx-db-value
#
mysql="$(which mysql)" #    mysql
php="$(which php)" #    php
declare -A CLParams #    
declare -a CLParams_keys #      
declare -A DBSettings #    
declare -a DBSettings_keys #       
DBSettings_keys=(DBLogin DBPassword DBName)
CLParams_keys=(path_to_bxdb_config single_num_value_query max_num_value)
param_num=0 #   
#   
for key in "${CLParams_keys[@]}" ; do 
    ((param_num++))                 
    CLParams[$key]=${!param_num}    # ${!param_num}  - $1 $2... 
done
#    ,  
if  [ -z "${CLParams[${CLParams_keys[$param_num-1]}]}" ] ; then
    printf "Script compares result returned by <${CLParams_keys[1]}> to given <${CLParams_keys[2]}>.\nIf the result more than the given value, then exit with code 1, else exit 0.\n"
    printf "Usage: \n\t$(basename ${BASH_SOURCE[0]}) " ; for key in "${CLParams_keys[@]}" ; do printf "<$key> "; done ; printf "\n"
    printf "Example: \n\t$(basename ${BASH_SOURCE[0]}) \"/www/ab.cd/bitrix/php_interface/dbconn.php\" \"select count(id) from b_event where SUCCESS_EXEC<>'Y'\" 5\n" 
    exit 10
fi
#        
if ! [ -s "${CLParams[path_to_bxdb_config]}" ] ; then 
    printf "File ${CLParams[path_to_bxdb_config]} doesn't exist or empty.\n"
    exit 20
fi
#          " "
echo ${CLParams[single_num_value_query]} | grep -i -q -E 'delete|update|insert|drop' && printf "query \n${CLParams[single_num_value_query]}\nisn't allowed\n" && exit 30
#     php-config -n --  php.ini , -r --     <?...?>
for key in "${DBSettings_keys[@]}" ; do 
    DBSettings[$key]="$($php -n -r 'include("'${CLParams[path_to_bxdb_config]}'"); print $'$key';')"
done
#   mysql    (  )
export MYSQL_PWD=${DBSettings[DBPassword]}
#     : -N --    ; -B - (batch) -   ""  ; -e  
num_value=`${mysql} -u ${DBSettings[DBLogin]} -N -B -e "use ${DBSettings[DBName]}; ${CLParams[single_num_value_query]}"`
#  
echo "Result of the query (from DB ${DBSettings[DBName]}): ${num_value}, ${CLParams_keys[2]}: ${CLParams[max_num_value]}"
#  
if [ $num_value -gt ${CLParams[max_num_value]} ]; then
    exit 1
fi




مثال على استدعاء البرنامج النصي ab_cd_unsent_check.sh
#!/bin/bash
check_bx_db_value.sh \
«/www/ab.cd/bitrix/php_interface/dbconn.php» \
«select count(id) from b_event where SUCCESS_EXEC<>'Y'» \
2






التحقق من نتائج التنفيذ باستخدام أكواد اكتمال البرنامج النصي
:



$ ./ab_cd_unsent_check.sh && echo "success" || echo "failure"


:



Result of the query (from DB ab_cd): 0, max_num_value: 2
success


.



$ ./ab_cd_unsent_check.sh && echo "success" || echo "failure"


:



Result of the query (from DB ab_cd): 4, max_num_value: 2
failure




كل شيء يعمل على مايرام! في الحالة الأولى ، لا تتجاوز القيمة في قاعدة البيانات القيمة المحددة ، ويصدر البرنامج النصي الرمز 0 عند الانتهاء. في الثانية ، تتجاوز القيمة في قاعدة البيانات القيمة المحددة ، وينتهي البرنامج النصي برمز خطأ.



تكوين مونيت



في هذه المقالة ، سأقدم مثالاً على تكوين monit لإرسال الرسائل إلى البريد الإلكتروني.

من المفترض أن monit تم تثبيته وتكوينه بالفعل على الجهاز.



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



مثال على تكوين monit
check program ab_cd_unsent_check with path /home/bitrix/scripts/ab_cd_unsent_check.sh
every 2 cycles
    group mail
if status != 0 then alert


/etc/monit.d/.



لتبسيط العرض التوضيحي ، يحتوي هذا المثال على دورتين تم تعيينهما (هنا دورة واحدة = 30 ثانية).

بحيث لا يرسل المونيت تنبيهات خاطئة ، في الظروف الحقيقية ، تحتاج إلى تعيين العديد من الدورات بحيث يكون للرسائل وقتًا للمغادرة - يتم اختيارها تجريبيا. هنا يجب أن تأخذ في الاعتبار متوسط ​​عدد الرسائل التي تم إنشاؤها بواسطة الموقع ، وسرعة (وقت) معالجتها بواسطة خادم البريد.



للتحقق من عمل التهيئة في الوحدة الطرفية ، قم بتشغيل:

# systemctl restart monit
# monit status


نحن نحصل:

لا رسائل غير مرسلة




مع الرسائل غير المرسلة




هكذا تبدو إشعارات monit:

ظهرت رسائل غير مرسلة!




تم إرسال جميع الرسائل (الآن كل شيء على ما يرام).




إرسال الإشعارات من monit يعمل بشكل صحيح.



خاتمة



آمل أن يكون الحل متعدد الاستخدامات ومناسبًا لمهام أخرى.



هذا كل شئ! يمكن تنزيل مصادر المقال هنا .



سكرتير خاص من ليس من الصعب المشاركة في التعليقات - هل لديك مهام مماثلة؟

إذا كان الأمر كذلك ، كيف يتم حلها؟



All Articles