信任,但要验证:控制Bitrix中未发送的消息并通知管理员

背景



一旦我需要检查“ 1C-Bitrix:站点管理”(以下称Bitrix)中是否存在未发送的消息,并接收有关它的通知。发送邮件的问题极为少见,但令人不愉快的事件。这些通常是订单,注册确认书和其他重要信件。



困难在于,如果Bitrix使用的发送邮件的方法停止工作(很可能是这种原因),那么使用相同的方法发送通知将是不可靠的



谷歌搜索,我没有找到免费的现成的东西,但是我遇到了许多有关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已在计算机上安装和配置。



为了提高可靠性,在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