Faites confiance, mais vérifiez: contrôle des messages non envoyés dans Bitrix avec notification à l'administrateur

Contexte



Une fois, j'ai eu besoin de vérifier la présence de messages non envoyés dans "1C-Bitrix: Site Management" (ci-après Bitrix) et de recevoir des notifications à ce sujet. Les problèmes d'envoi de courrier étaient extrêmement rares, mais plutôt désagréables. il s'agissait généralement de commandes, de confirmations d'enregistrement et d'autres lettres importantes.



La difficulté était que si la méthode d'envoi de courrier utilisée par Bitrix cessait de fonctionner (probablement la raison à cela), l' envoi d'une notification en utilisant la même méthode ne serait pas fiable .



En cherchant sur Google , je n'ai pas trouvé quelque chose de gratuit et prêt à l'emploi, mais je suis tombé sur beaucoup de questions / réponses sur les messages non envoyés de Bitrix - comment les trouver, quelles pourraient être les raisons de leur apparition, etc. Par conséquent, j'ai jugé nécessaire de partager ma solution.



Une tâche



  1. Obtenez des détails sur la connexion à la base de données à partir de la configuration du site Bitrix
  2. Se connecter à DB
  3. Vérifiez le nombre d'e-mails non envoyés
  4. Comparez la quantité avec la limite
  5. Prendre la décision d'envoyer une notification




la mise en oeuvre



Le script shell recevra 3 paramètres:



  1. Le chemin de la configuration du site Bitrix (path_to_bxdb_config)
  2. Texte de la requête de base de données (single_num_value_query)
  3. Valeur maximale autorisée (max_num_value)


Pour un fonctionnement correct, la requête de base de données doit renvoyer une seule valeur numérique.



Code de script 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




Un exemple d'appel du script 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






Vérification des résultats d'exécution avec les codes de fin de script
:



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




Tout fonctionne comme il se doit! Dans le premier cas, la valeur de la base de données ne dépasse pas celle spécifiée, le script émet le code 0 à la fin. Dans le second, la valeur de la base de données dépasse celle spécifiée, le script se termine par un code d'erreur.



Configurer monit



Dans cet article, je vais fournir un exemple de configuration monit pour l'envoi de messages par e-mail.

On suppose que monit est déjà installé et configuré sur la machine.



Pour augmenter la fiabilité, dans la configuration monitrc, vous devez spécifier un compte sur un serveur de messagerie différent de celui utilisé par Bitrix pour envoyer des lettres . De plus, en configurant et en exécutant des scripts supplémentaires dans la configuration de monit, vous pouvez envoyer des messages aux messageries instantanées et aux réseaux sociaux .



Exemple de configuration de 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/.



Pour simplifier la démonstration, cet exemple a défini 2 cycles (ici 1 cycle = 30 sec).

Pour que monit n'envoie pas de fausses alertes, en conditions réelles, vous devez définir autant de cycles pour que les lettres aient le temps de partir - il est sélectionné empiriquement. Ici, vous devez prendre en compte le nombre moyen de messages générés par le site, et la vitesse (temps) de leur traitement par le serveur de messagerie.



Pour vérifier le travail de configuration dans le terminal, exécutez:

# systemctl restart monit
# monit status


on a:

Aucun message non envoyé




Avec des messages non envoyés




Voici à quoi ressemblent les notifications de monit:

Des messages non envoyés sont apparus!




Tous les messages ont été envoyés (maintenant tout va bien).




L'envoi de notifications depuis monit fonctionne correctement.



Conclusion



J'espère que la solution s'est avérée assez polyvalente et adaptée à d'autres tâches.



C'est tout! Les sources de l'article peuvent être téléchargées ici .



PS Qui n'est-il pas difficile de partager dans les commentaires - avez-vous des tâches similaires?

Si oui, comment sont-ils résolus?



All Articles