Percaya, tapi verifikasi: kontrol pesan yang tidak terkirim di Bitrix dengan pemberitahuan ke admin

Latar Belakang



Pernah saya perlu memeriksa pesan yang belum terkirim di "1C-Bitrix: Site Management" (selanjutnya Bitrix) dan menerima pemberitahuan tentang hal itu. Masalah dengan pengiriman surat sangat jarang, tetapi peristiwa yang agak tidak menyenangkan. ini biasanya pesanan, konfirmasi pendaftaran, dan surat-surat penting lainnya.



Kesulitannya adalah jika metode pengiriman email yang digunakan oleh Bitrix berhenti berfungsi (kemungkinan besar alasannya), maka mengirim pemberitahuan menggunakan metode yang sama tidak dapat diandalkan .



Googling , saya tidak menemukan sesuatu yang gratis dan siap pakai, tetapi saya menemukan banyak pertanyaan / jawaban tentang pesan yang belum terkirim dari Bitrix - bagaimana menemukan mereka, apa yang mungkin menjadi alasan penampilan mereka, dll. Karena itu, saya menganggap perlu untuk membagikan solusi saya.



Sebuah tugas



  1. Dapatkan detail untuk menghubungkan ke database dari konfigurasi situs Bitrix
  2. Terhubung ke DB
  3. Periksa jumlah email yang belum terkirim
  4. Bandingkan kuantitas dengan batas
  5. Buat keputusan untuk mengirim pemberitahuan




Penerapan



Script shell akan menerima 3 parameter:



  1. Jalur ke konfigurasi situs Bitrix (path_to_bxdb_config)
  2. Teks kueri basis data (single_num_value_query)
  3. Nilai maksimum yang diijinkan (max_num_value)


Untuk operasi yang benar, permintaan basis data harus mengembalikan nilai numerik tunggal.



Kode skrip 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




Contoh memanggil skrip 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






Memeriksa hasil eksekusi dengan kode penyelesaian skrip
:



$ ./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




Semuanya berfungsi sebagaimana mestinya! Dalam kasus pertama, nilai dalam database tidak melebihi yang ditentukan, skrip mengeluarkan kode 0 setelah selesai. Dalam yang kedua, nilai dalam database melebihi yang ditentukan, skrip berakhir dengan kode kesalahan.



Mengkonfigurasi monit



Pada artikel ini, saya akan memberikan contoh konfigurasi monit untuk mengirim pesan ke email.

Diasumsikan bahwa monit sudah diinstal dan dikonfigurasi pada mesin.



Untuk meningkatkan keandalan, dalam konfigurasi monitrc Anda harus menentukan akun pada server email yang berbeda dari yang digunakan oleh Bitrix untuk mengirim surat . Selain itu, dengan mengkonfigurasi dan menjalankan skrip tambahan dalam konfigurasi monit, Anda dapat mengirim pesan ke instant messenger dan jejaring sosial .



Contoh konfigurasi 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/.



Untuk menyederhanakan demonstrasi, contoh ini memiliki 2 siklus yang ditetapkan (di sini 1 siklus = 30 detik).

Agar monit tidak mengirimkan peringatan palsu, dalam kondisi nyata, Anda harus mengatur begitu banyak siklus sehingga surat-surat punya waktu untuk pergi - itu dipilih secara empiris. Di sini Anda harus mempertimbangkan jumlah rata-rata pesan yang dihasilkan oleh situs, dan kecepatan (waktu) pemrosesan mereka oleh server mail.



Untuk memeriksa pekerjaan konfigurasi di terminal, jalankan:

# systemctl restart monit
# monit status


kita mendapatkan:

Tidak ada pesan yang belum terkirim




Dengan pesan yang belum terkirim




Seperti inilah tampilan notifikasi monit:

Pesan yang tidak terkirim muncul!




Semua pesan sudah terkirim (sekarang semuanya baik-baik saja).




Mengirim pemberitahuan dari monit berfungsi dengan benar.



Kesimpulan



Saya harap solusinya ternyata sangat fleksibel dan cocok untuk tugas-tugas lain.



Itu saja! Sumber untuk artikel dapat diunduh di sini .



PS Siapa yang tidak sulit untuk berbagi dalam komentar - apakah Anda memiliki tugas serupa?

Jika demikian, bagaimana mereka diselesaikan?



All Articles