[1С-Битрикс] Доверяй, но проверяй: контроль неотправленных писем в Битриксе с уведомлением админу
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Предыстория
Когда-то у меня возникла необходимость проверять наличие неотправленных сообщений в «1С-Битрикс: Управление сайтом» (далее Битрикс) и получать уведомления об этом. Проблемы с отправкой почты были крайне редкими, однако довольно неприятными событиями, т.к. обычно это были заказы, подтверждения регистрации и прочие важные письма.
Сложность была в том, что если используемый Битриксом метод отправки почты перестал работать(с большой вероятностью причина в этом), то этим же самым методом отправлять уведомление будет ненадёжно.
Погуглив, я не нашёл чего-то бесплатного и готового, однако встретил немало вопросов/ответов о неотправленных письмах из Битрикса — каким образом их найти, какими могут быть причины их появления и т.п. Поэтому счёл нужным поделиться своим решением.
Задача
- Получить реквизиты для соединения с БД из конфига сайта Битрикса
- Соединиться с БД
- Проверить количество неотправленных писем
- Сравнить количество с предельно допустимым
- Принять решение об отправке уведомления
Реализация
На вход shell-скрипту будут поступать 3 параметра:
- Путь к конфигу сайта Битрикса (path_to_bxdb_config)
- Текст запроса к БД (single_num_value_query)
- Предельно допустимая величина (max_num_value)
Для корректной работы запрос к БД должен возвращать одиночное числовое значение.
Код скрипта check_bx_db_value.sh
SPL
#!/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
SPL
#!/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
Проверка результатов выполнения с кодами завершения скрипта
SPL
запускаем:
$ ./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
В данной статье я приведу пример конфигурации monit для отправки сообщений на e-mail.
Подразумевается, что на машине уже установлен и настроен monit.
Для повышения надёжности, в конфиге monitrc следует указывать аккаунт на почтовом сервере, отличном от используемого Битриксом для отправки писем. Кроме того, путем настройки и запуска дополнительных скриптов в конфигурации monit можно выполнять отправку сообщений в мессенджеры и соцсети.
Пример конфигурации monit
SPL
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
получаем:
Без неотправленных сообщений
SPL
С неотправленными сообщениями
SPL
Так выглядят уведомления от monit на почту:
Появились неотправленные сообщения!
SPL
Все сообщения отправлены (теперь всё норм.).
SPL
Отправка уведомлений из monit работает корректно.
Заключение
Надеюсь решение получилось достаточно универсальным и подойдёт для других задач.
Вот и всё! Исходники для статьи можно скачать здесь.
P.S. Кому не сложно прошу поделиться в комментариях — возникают ли у вас подобные задачи?
Если да, то каким образом они решаются?
===========
Источник:
habr.com
===========
Похожие новости:
- [Open source, PHP, JavaScript] readable — еще один линтер для PHP
- [PHP, Symfony, API] REST API в Symfony (без FosRestBundle) с использованием JWT аутентификации. Часть 1 (перевод)
- [Laravel, PHP, Разработка веб-сайтов] Laravel-Дайджест (29 июня – 5 июля 2020)
- [PHP] Code review, это просто
- [PHP, Программирование] Понимаем JIT в PHP 8 (перевод)
- [MySQL, Python, Машинное обучение] Web server for Machine Learning 'VKF-solver'
- [1С-Битрикс, API, PHP, Разработка веб-сайтов] Ещё один велосипед: пишем свой автозагрузчик классов для Битрикс
- [Машинное обучение, MySQL, Python] Web-сервер машинного обучения «ВКФ-решатель»
- Выпуск Psalm 3.12, статистического анализитора для языка PHP. Альфа выпуск PHP 8.0
- [IT-стандарты, Интерфейсы, Спортивное программирование, Функциональное программирование] Минимизация кликов и горячие клавиши для жизни разработчика + Темнее Тёмной Темноты
Теги для поиска: #_1sbitriks (1С-Битрикс), #_bitriks (битрикс), #_monitoring_sajta (мониторинг сайта), #_shell_scripting, #_php, #_mysql, #_monit, #_centos_7, #_1sbitriks (
1С-Битрикс
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:46
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Предыстория Когда-то у меня возникла необходимость проверять наличие неотправленных сообщений в «1С-Битрикс: Управление сайтом» (далее Битрикс) и получать уведомления об этом. Проблемы с отправкой почты были крайне редкими, однако довольно неприятными событиями, т.к. обычно это были заказы, подтверждения регистрации и прочие важные письма. Сложность была в том, что если используемый Битриксом метод отправки почты перестал работать(с большой вероятностью причина в этом), то этим же самым методом отправлять уведомление будет ненадёжно. Погуглив, я не нашёл чего-то бесплатного и готового, однако встретил немало вопросов/ответов о неотправленных письмах из Битрикса — каким образом их найти, какими могут быть причины их появления и т.п. Поэтому счёл нужным поделиться своим решением. Задача
Реализация На вход shell-скрипту будут поступать 3 параметра:
Для корректной работы запрос к БД должен возвращать одиночное числовое значение. Код скрипта check_bx_db_value.shSPL#!/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.shSPL#!/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 Проверка результатов выполнения с кодами завершения скриптаSPLзапускаем:
$ ./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 В данной статье я приведу пример конфигурации monit для отправки сообщений на e-mail. Подразумевается, что на машине уже установлен и настроен monit. Для повышения надёжности, в конфиге monitrc следует указывать аккаунт на почтовом сервере, отличном от используемого Битриксом для отправки писем. Кроме того, путем настройки и запуска дополнительных скриптов в конфигурации monit можно выполнять отправку сообщений в мессенджеры и соцсети. Пример конфигурации monitSPLcheck 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 получаем: Без неотправленных сообщенийSPLС неотправленными сообщениямиSPLТак выглядят уведомления от monit на почту: Появились неотправленные сообщения!SPLВсе сообщения отправлены (теперь всё норм.).SPLОтправка уведомлений из monit работает корректно. Заключение Надеюсь решение получилось достаточно универсальным и подойдёт для других задач. Вот и всё! Исходники для статьи можно скачать здесь. P.S. Кому не сложно прошу поделиться в комментариях — возникают ли у вас подобные задачи? Если да, то каким образом они решаются? =========== Источник: habr.com =========== Похожие новости:
1С-Битрикс ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:46
Часовой пояс: UTC + 5