FreePBX Мониторинг транков. Мониторим состояние транков.
При эксплуатации IP-телефонии случаются ситуации, когда транки к провайдеру телефонии переходят из нормального состояния Registered в незарегистрированное состояние. Это является одной из причин неработоспособности телефонии и поступления жалоб от пользователей. Конечно, хорошо, чтобы администратор мог, как можно быстрее, узнать о проблеме, а лучше исправить ее без личного вмешательства.
Как правило, проблема с отсутствием регистрации нормально работающих транков «лечится» перезапуском модуля sip или pjsip, а для этого достаточно небольшого скрипта, который будет мониторить состояние транков и при необходимости перезагружать указанные модули.
К делу. В сети мне удалось найти скрипты только для мониторинга SIP транков, ну а «допилить» их для PJSIP было делом техники.)
Скрипт для мониторинга SIP транков.
Ниже размещен скрипт, найденный на этом сайте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash # Задаем переменные ALLTRUNKSMINIMUM="`/usr/sbin/asterisk -rx "sip show registry"`" # Смотрим статусы транков ALLTRUNKS="`echo "$ALLTRUNKSMINIMUM" | grep "SIP registrations" | awk '{print $1}'`" # Смотрим сколько всего транков в системе REGTRUNKS="`/usr/sbin/asterisk -rx "sip show registry" | grep Registered | wc -l`" # Зарегистрированные транки (все транки со статусом Registered) # Задаем условие if [ "$REGTRUNKS" -lt "$ALLTRUNKS" ]; then # Если есть хоть один проблемный транк (В одном или более транке встретился статус отличный от Registered) то sleep 5 # Ждем 5 секунд echo `/usr/sbin/asterisk -rx "sip reload"` # Делаем sip reload sleep 5 # Ждем 5 секунд VAR="`/usr/sbin/asterisk -rx "sip show registry"`" # Смотрим статусы транков после проверки # Уведомляем на почту о том какие статусы стали после проверки echo "$VAR" | mail -s "Мониторинг транков" your@mail.ru # Если условие ложно (т.е. с транками все хорошо) else echo “ALL STATUS OK” # Просто выводим что со всеми статусами все хорошо и ничего не делаем больше fi |
Немного опишу, что делает скрипт:
- Помещает в переменную ALLTRUNKSMINIMUM вывод команды «sip show registry»
- Помещает в переменную ALLTRUNKS количество транков в системе
(grep находит строку 2 SIP registrations, а команда awk ‘{print $1}’ выбирает слово(число и т.д.) в первой позиции этой строки.
3. Помещает в переменную REGTRUNKS количество транков со статусом Registered(grep выбирает строки со словом Registered, а команда wc -l показывает количество строк, отобранных командой grep).
4. Ну и дальше идет сравнение общего количества транков с количеством зарегистрированных, и в зависимости от результата, либо перезагружает модуль sip и отправляет письмо на указанную почту со статусами транков после перезагрузки модуля, либо просто выводит в консоль сообщение, что всё ОК.
Скрипт для мониторинга PJSIP транков.
На основе вышеописанного скрипта можно создать скрипт для мониторинга PJSIP транков. Отличие состоит лишь в том, что используется команда «pjsip show registrations«(у нее немного отличается вывод) и перезагружать нужно модуль pjsip, соответственно.
Вот вывод команды «pjsip show registrations«:
Как видно, нужно искать уже строку, содержащую «Objects found» и количество транков находится уже не в первой, а в третьей позиции.
Исходя из этого скрипт приобретет следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/bin/bash #Задаем переменные ALLTRUNKSMINIMUM="`/usr/sbin/asterisk -rx "pjsip show registrations"`" ALLTRUNKS="`echo "$ALLTRUNKSMINIMUM" | grep "Objects found" | awk '{print $3}'`" # Количество транков в системе REGTRUNKS="`/usr/sbin/asterisk -rx "pjsip show registrations" | grep "Registered" | wc -l`" # Количество зарегистрированных транков # Задаем условие if [ "$REGTRUNKS" -lt "$ALLTRUNKS" ]; then # Если есть хоть один проблемный транк (В одном или более транке встретился статус отличный от Registered) то sleep 10 # Ждем 10 секунд echo `/usr/sbin/asterisk -rx "core reload"` # Делаем core reload sleep 10 # Ждем 10 секунд VAR="`/usr/sbin/asterisk -rx "pjsip show registrations"`" # Смотрим статусы транков после проверки # Уведомляем на почту о том какие статусы стали после проверки echo "$VAR" | mail -s "Мониторинг транков" your@email # Если условие ложно (т.е. с транками все хорошо) else echo “ALL STATUS OK.TRUNK REGISTERED "$REGTRUNKS" # Просто выводим что со всеми статусами все хорошо и количество зарегистрированных транков fi |
Автоматический запуск скриптов.
Ну что же, скрипты готовы, осталось заставить их выполнять свои задачи по расписанию. Для этого нужно сохранить их с расширением .sh, например, sip_trunks.sh и pjsip_trunks.sh, конвертировать в unix-формат и создать задание в cron.
Скопируйте файл скрипта в папку на сервере FreePBX(Asterisk). При помощи команды dos2unix конвертируйте в нужный формат:
dos2unix /home/scripts/sip_trunks.sh
Разрешим выполнение скрипта:
chmod +x /home/scripts/sip_trunks.sh
Теперь откроем на редактирование файл crontab командой crontab -e и внесем туда следующее:
1 |
*/2 * * * * /bin/bash /home/sip_trunk.sh |
Это значит, что скрипт будет запускаться каждые две минуты.
По умолчанию, crontab открывается в редакторе по умолчанию(обычно это vim). Если вам привычнее использовать другой редактор, можно открыть файл в нём:
1 |
EDITOR=nano crontab -e |
Сохраните файл после редактирования. Теперь ваши транки будут под присмотром.))
P.S
Для мониторинга транков с помощью zabbix нужно в скрипте перед выполняемыми командами типа /usr/sbin/asterisk -rx «sip show registry добавить /usr/bin/sudo. Также, нужно добавить пользователя zabbix в файл /etc/sudoers. Делается это при помощи команды visudo. В файл нужно добавить строку:
zabbix ALL = NOPASSWD: /usr/sbin/asterisk
Должно получиться так:
После этого нужно в файле конфигурации zabbix-agent добавить следующее:
UserParameter=asterisk.trunk,/etc/zabbix/scripts/asterisk.trunk.sh
где asterisk.trunk — ключ, по которому сервер zabbix будет получать данные от агента
а /etc/zabbix/scripts/asterisk.trunk.sh — путь к скрипту мониторинга.
После сохранения изменений в файле, перезапустите zabbix-agent командой:
1 |
systemctl restart zabbix-agent.service |
Посмотреть, какое значение отправляет агент на сервер можно так:
1 |
zabbix_agentd -t asterisk.trunk |
Спасибо за дельную инструкцию! А как можно сделать, чтобы в случае core reload, вместо отправки почты, отправлялось сообщение по jabber (xmpp). В Asterisk jabber стоит как аппликация, к сожалению из CLI сообщения не отправляет. Очень буду услышать ответ !
Спасибо за комментарий. Я, к сожалению, не использую jabber во freepbx, но, думаю, что возможность сделать то, что Вы хотите, есть. По крайней мере, мне попадался вариант отправки сообщений о входящих звонках в Телеграм.
Спасибо за ответ! jabber + asterisk использую давно, приходят уведомления, все работает ок.
Просто тут сложность возникла, что XMPP в asterisk это как аппликация, которую невозможно запустить из CLI.
Кстати, у меня скрипт работает, но каждый 2 минуты приходит емейл. А можно ли его изменить, чтобы только в случае успешного core reload, т.е. равенство всего транков и зарегистрированных приходил емейл?
Можете изменить скрипт под свои нужды(задать условие, при котором будут отправляться сообщения). У меня сообщения приходят только, когда выполняется условие, что количество зарегистрированных транков меньше, чем их общее количество. Если с транками всё в порядке, сообщения не приходят.