Русский
Русский
English
Статистика
Реклама

Из песочницы Доверяй, но проверяй контроль неотправленных писем в Битриксе с уведомлением админу

Предыстория


Когда-то у меня возникла необходимость проверять наличие неотправленных сообщений в 1С-Битрикс: Управление сайтом (далее Битрикс) и получать уведомления об этом. Проблемы с отправкой почты были крайне редкими, однако довольно неприятными событиями, т.к. обычно это были заказы, подтверждения регистрации и прочие важные письма.

Сложность была в том, что если используемый Битриксом метод отправки почты перестал работать(с большой вероятностью причина в этом), то этим же самым методом отправлять уведомление будет ненадёжно.

Погуглив, я не нашёл чего-то бесплатного и готового, однако встретил немало вопросов/ответов о неотправленных письмах из Битрикса каким образом их найти, какими могут быть причины их появления и т.п. Поэтому счёл нужным поделиться своим решением.

Задача


  1. Получить реквизиты для соединения с БД из конфига сайта Битрикса
  2. Соединиться с БД
  3. Проверить количество неотправленных писем
  4. Сравнить количество с предельно допустимым
  5. Принять решение об отправке уведомления


Реализация


На вход shell-скрипту будут поступать 3 параметра:

  1. Путь к конфигу сайта Битрикса (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)" # получение пути к mysqlphp="$(which php)" # получение пути к phpdeclare -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 10fi# выход если конфиг пустой или его нет if ! [ -s "${CLParams[path_to_bxdb_config]}" ] ; then     printf "File ${CLParams[path_to_bxdb_config]} doesn't exist or empty.\n"    exit 20fi# выход если параметр запроса к БД содержит команду из "запретного списка"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 1fi


Пример вызова скрипта
#!/bin/bashcheck_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: 2success

Добавим неотправленных сообщений и запустим снова.

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

а теперь:

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


Все работает как нужно! В первом случае значение в БД не превышает заданного, скрипт выдает код 0 по завершении. Во втором значение в БД превышает заданное, скрипт завершается с кодом ошибки.

Настройка конфигурации monit


В данной статье я приведу пример конфигурации monit для отправки сообщений на e-mail.
Подразумевается, что на машине уже установлен и настроен monit.

Для повышения надёжности, в конфиге monitrc следует указывать аккаунт на почтовом сервере, отличном от используемого Битриксом для отправки писем. Кроме того, путем настройки и запуска дополнительных скриптов в конфигурации monit можно выполнять отправку сообщений в мессенджеры и соцсети.

Пример конфигурации monit
check program ab_cd_unsent_check with path /home/bitrix/scripts/ab_cd_unsent_check.shevery 2 cycles    group mailif status != 0 then alert

Файл конфигурации следует поместить в /etc/monit.d/.

Для упрощения демонстрации, в этом примере установлено 2 цикла (здесь 1 цикл = 30 сек).
Чтобы monit не отправлял ложные алерты, в реальных условиях, нужно ставить столько циклов, чтобы письма успевали уходить подбирается опытным путём. Здесь следует учитывать среднее количество сообщений, генерируемых сайтом, и скорость(время) их обработки почтовым сервером.

Для проверки работы конфигурации в терминале выполняем:
# systemctl restart monit# monit status

получаем:
Без неотправленных сообщений


С неотправленными сообщениями


Так выглядят уведомления от monit на почту:
Появились неотправленные сообщения!


Все сообщения отправлены (теперь всё норм.).


Отправка уведомлений из monit работает корректно.

Заключение


Надеюсь решение получилось достаточно универсальным и подойдёт для других задач.

Вот и всё! Исходники для статьи можно скачать здесь.

P.S. Кому не сложно прошу поделиться в комментариях возникают ли у вас подобные задачи?
Если да, то каким образом они решаются?
Источник: habr.com
К списку статей
Опубликовано: 09.07.2020 20:08:37
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

1с-битрикс

Битрикс

Мониторинг сайта

Shell scripting

Php

Mysql

Monit

Centos 7

Категории

Последние комментарии

© 2006-2020, personeltest.ru