信頼、ただし検証:管理者への通知によるBitrixでの未送信メッセージの制御

バックグラウンド



「1C-Bitrix:Site Management」(以下、Bitrix)で未送信のメッセージの存在を確認し、それに関する通知を受け取る必要がありました。メール送信の問題は非常にまれでしたが、不愉快な出来事でした。これらは通常、注文書、登録確認書、その他の重要な手紙でした。



問題は、Bitrixが使用するメールの送信方法が機能しなくなった場合(おそらくその理由)、同じ方法を使用して通知を送信することが信頼できないことでした。



グーグル、私は無料で既製のものを見つけませんでしたが、Bitrixからの未送信メッセージに関する多くの質問/回答に遭遇しました-それらを見つける方法、それらの外観の理由は何かなど。したがって、私は自分の解決策を共有する必要があると考えました。



仕事



  1. Bitrixサイト構成からデータベースへの接続の詳細を取得する
  2. DBに接続
  3. 未送信メールの数を確認する
  4. 数量と制限を比較します
  5. 通知の送信を決定する




実装



シェルスクリプトは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を発行します。2番目に、データベースの値が指定された値を超えると、スクリプトはエラーコードで終了します。



モニターの構成



この記事では、メッセージを電子メールに送信するためのモニター構成の例を示します。

monitはすでにマシンにインストールおよび設定されていると想定されています。



信頼性を高めるには、monitrc設定で、Bitrixが文字を送信するために使用するものとは異なるメールサーバーのアカウントを指定する必要がありますさらに、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/.



デモを簡略化するために、この例には2サイクルが設定されています(ここでは1サイクル= 30秒)。

monitが誤ったアラートを送信しないように、実際の状況では、文字が離れる時間があるように非常に多くのサイクルを設定する必要があります。これは経験的に選択されています。ここでは、サイトで生成されるメッセージの平均数と、メールサーバーによるメッセージの処理速度(時間)を考慮する必要があります。



端末での設定作業を確認するには、次のコマンドを実行します。

# systemctl restart monit
# monit status


我々が得る:

未送信のメッセージはありません




未送信メッセージあり




モニター通知は次のようになります。

未送信メッセージが登場!




すべてのメッセージが送信されました(現在はすべて正常です)。




monitからの通知の送信は正しく機能します。



結論



ソリューションが非常に用途が広く、他のタスクに適していることがわかりました。



それで全部です!記事のソースはここからダウンロードできます



PSコメントで共有するのは難しいことではありません-同様のタスクはありますか?

もしそうなら、彼らはどのように解決されますか?



All Articles