Получение уведомления при падении транка с применением Monitor Trunk Failures
В данной статье рассмотрено, как осуществить настройку Monitor Trunk Failures для получения уведомления при падении транка и получения его статуса Unavailable.
Monitor Trunk Failures – если установлен параметр в значение Yes, возможно указать пользовательский сценарий AGI, который будет вызываться для отчетов, журналов, электронной почты или других действий. Срабатывания пользовательского сценария AGI будет происходит в случае получения ошибки при совершении исходящего вызова. Непрошедшие вызовы со статусом CANCEL – отменен, NOANSWER – не отвечен, BUSY – абонент занят, учитываться не будут.
Используемое программное обеспечение:
- предустановленная дистрибутив с FreePBX;
- Telegram;
- Send Email.
Определим следующие показатели для получения в сообщении:
- версия Asterisk;
- имя транка и его статус;
- кто делал вызов;
- вызываемый номер;
- номер транка;
- текущую дату.
AGI – это встроенный в Asterisk метод выполнения внешних скриптов с использованием языков программирования. В скрипт можно, как передавать различные переменные, так и получать из него значения. Когда Asterisk инициирует запуск скрипта через AGI, он передает в него набор переменных. Все переменные обладают префиксом agi_:
agi_request — имя файла исполняемого скрипта;
agi_channel — канал, инициирующий звонок;
agi_language — языковой код;
agi_type — тип канала, инициирующий вызов;
agi_uniqueid — уникальный идентификатор звонка;
agi_version — версия Asterisk;
agi_callerid — номер звонящего (CID Number);
agi_calleridname — имя звонящего (CID Name);
agi_dnid – набранный номер;
agi_context — контекст обработки вызова.
Создадим файл с расширением «agi» и занесем его в директорию /var/lib/asterisk/agi-bin/test_trunk.agi
Внесем в него следующий код:
#!/bin/bash
# Создаем индексированный массив и запускаем цикл для получения переменных
declare -a array
while read -e ARG && [ "$ARG" ] ; do
array=(` echo $ARG | sed -e 's/://'`)
export ${array[0]}=${array[1]}
done
# Задаем переменную даты
DATE=`date "+%Y.%m.%d %H:%M:%S"`
# ID чата Telegram
ID="<ID чата>"
# URL с указанием токена бота Telegram
URL_MES="https://api.telegram.org/<токен бота>/sendMessage"
# Переменная имени и статуса требуемого транка
TRUNK_NAME=$agi_arg_1
TRUNK_STATE=`asterisk -rx "pjsip show endpoints" | grep 'Endpoint:' | grep ‘$TRUNK_NAME’ | awk '{print $3}'`
# Переменная канала, осуществившего вызов
CHANEL=$agi_channel
# Переменная набранного номера
IN_CALL=$agi_dnid
# Переменная номера транка
NUMBER_TRUNK=$agi_callerid
# Переменная версии Asterisk
VER=$agi_version
# Переменная заголовка, которая будет отправляться на почту
HEADING="Asterisk_VoxDistro_$VER"
# Переменная сообщения, которая будет отправляться в Telegram
MESSAGE="*IP-АТС «Asterisk VoxDistro» $VER*%0AПроблема с транком: $TRUNK_NAME %0AСтатус транка: *$TRUNK_STATE *%0AИсходящий вызов канала: *${CHANEL:0:10} *%0AНомер вызываемого абонента: *$IN_CALL *%0AНомер транка: *$NUMBER_TRUNK *%0A$DATE $agi_status "
# Переменная сообщения, которая будет отправляться на почту
MESSAGE2="Проблема с транком: $TRUNK_NAME\n
Статус транка: $TRUNK_STATE\n
Исходящий вызов канала: ${CHANEL:0:10}\n
Номер вызываемого абонента: $IN_CALL\n
Номер транка: $NUMBER_TRUNK\n
$DATE"
# Отправка сообщения в Telegram
curl -X POST $URL_MES -d chat_id=$ID -d parse_mode=Markdown -d text="$MESSAGE" 2>&1 > /dev/null
# Отправка сообщения на почту
/usr/local/bin/sendEmail.pl -u $HEADING -m $MESSAGE2 -o message-charset=UTF-8
Описание кода:
- Создаем индексированный массив с именем array:
declare -a array
- Получаем AGI-переменные, которые отдает Asterisk через стандартный ввод. Для этого запускаем цикл, считывающий строки из стандартного ввода. Ключ -е запускает интерактивный сеанс командной строки, чтобы получить строки для чтения и сохраняем их в ARG. Пример полученной строки: agi_callerid : 4100.
while read -e ARG && [ "$ARG" ] ; do
- Очищаем полученные значение от «:» и получаем строку: agi_callerid 4100.
array=(` echo $ARG | sed -e 's/://'`)
- Так как массив индексируемый, в полученном значении agi_callerid имеет индекс 0, а 4100 индекс 1. Экспортируем переменную и присваиваем ей имя индекса 0, значение переменной индекс 1. Результат экспорта: agi_callerid = 4100.
export ${array[0]}=${array[1]}
- Создаем переменную для определения текущей даты. Для этого используем команду date. Указанная команда имеет различный формат для получения даты.
В данном примере рассмотрим следующий формат: год — %Y, месяц — %m, день — %d, часы — %H, минуты — %M, секунду — %S. Более подробно можно ознакомиться по ссылке: https://www.unix.com/man-page/centos/1/date/ .
DATE=`date "+%Y.%m.%d %H:%M:%S"`
- Задаем переменную для ID чата Telegram. Получить ID можно воспользовавшись ботов в Telegram: getmyid_bot.
ID="<ID чата>"
- Задаем переменную URL с запросом в чат Telegram. Запрос содержит токен, который можно получить при создании бота в Telegram: BotFather.
URL_MES=https://api.telegram.org/<токен бота>/sendMessage
- Задаем переменную для имени и статуса транка. Monitor Trunk Failures будет использоваться на транке с именем «Trunk-9015», получим его имя из переменной agi_arg_1 и осуществим поиск его состояния с применением команды «pjsip show endpoints«, а также фильтрации текста grep и awk.
TRUNK_NAME=$agi_arg_1
TRUNK_STATE=`asterisk -rx "pjsip show endpoints" | grep 'Endpoint:' | grep $TRUNK_NAME | awk '{print $3}'`
- Задаем переменные полученных Agi значений.
CHANEL=$agi_channel
IN_CALL=$agi_dnid
NUMBER_TRUNK=$agi_callerid
VER=$agi_version
- Задаем переменную для заголовка электронной почты. Обратите внимание, что в ней указана переменная VER.
HEADING="Asterisk_VoxDistro_$VER"
- Задаем переменную, которая содержит текст для отправки в Telegram. К тексту можно применять форматирование. В данном примере используется стиль «Markdown», который будет указан при отправки сообщения в Telegram. *текст* — делает текст полужирным, %0A – осуществляет перенос строки. Подробнее с форматированием текста можно ознакомиться по следующей ссылке https://core.telegram.org/bots/api#markdown-style . Обратите внимание, что текст сообщения содержит переменные. Для корректного отображения переменной канала, инициализировавшего звонок, применяем способ выреза подстроки из строки ${CHANEL:0:10}.
Формат команды ${переменная:сдвиг:длина}. Пример получения значения: PJSIP/1000.
MESSAGE="*IP-АТС «Asterisk VoxDistro» $VER*%0AПроблема с транком: $TRUNK_NAME %0AСтатус транка: *$TRUNK_ STATE *%0AИсходящий вызов канала: *${CHANEL:0:10} *%0AНомер вызываемого абонента: *$IN_CALL *%0AНомер транка: *$NUMBER_TRUNK *%0A$DATE $agi_status "
- Задаем переменную для заголовка электронной почты. В тексте используются переменные. Для корректного отображения переменной канала, инициализировавшего звонок, применяем способ выреза подстроки из строки ${CHANEL:0:10}.
Формат команды ${переменная:сдвиг:длина}. Пример получения значения: PJSIP/1000. Для переноса строки применяется \n .
MESSAGE2="Проблема с транком: $TRUNK_NAME\n
Статус транка: $TRUNK_STATE\n
Исходящий вызов канала: ${CHANEL:0:10}\n
Номер вызываемого абонента: $IN_CALL\n
Номер транка: $NUMBER_TRUNK\n
$DATE"
- Команда отправки сообщения в Telegram. Для отправки сообщения используется утилита curl, с указанием функций -X – использовать метод HTTP, POST – используемый метод для отправки сообщения, -d – для отправки дополнительных данных в запросе. Для отправки дополнительных данных указываем «chat_id», «parse_mode» — стиль форматирования текста и сам текст сообщения «text». 2>&1 > /dev/null – при возникновении ошибок перенаправляем их и уничтожаем.
curl -X POST $URL_MES -d chat_id=$ID -d parse_mode=Markdown -d text="$MESSAGE" 2>&1 > /dev/null
- Для отправки почты запускаем sendEmail.pl и указываем следующие ключи: -u – заголовок сообщений, -m – текст сообщения, -o – дополнительный параметр. Дополнительным параметром кодировка сообщения для отображения корректно текста сообщения: message-charset=UTF-8.
/usr/local/bin/sendEmail.pl -u $HEADING -m $MESSAGE2 -o message-charset=UTF-8
- Не забываем задать права на исполнение и пользователя файлу, из под которого запущен Asterisk:
chmod 755 /var/lib/asterisk/agi-bin/test-trunk.agi
Для отправки почтового сообщения использовал Send Email — это легкий почтовый клиент SMTP. Он разработан для использования в скриптах bash, пакетных файлах, программах на Perl и веб-сайтах. Более подробно с ним ознакомиться или скачать его можно по ссылке: https://github.com/zehm/sendEmail .
В него вносим следующие параметры: почтовый сервер, логин/пароль от почты, адреса от кого и кому направляем почту.
Для того, чтобы включить функцию Monitor Trunk Failures перейдемиз веб-интерфейса в Settings — Advanced Settings и установим Display Monitor Trunk Failures Option значение «Yes».
Произведем настройку транка в веб-интерфейсе. Для этого перейдем в Connectivity – Trunks и выберем нужный транк. В раздел конфигурации транка включим параметр «Monitor Trunk Failures», укажем файл и название транка.
Для проверки и правильности отработки настроек, произвел поломку транка для исходящей связи (статус транка Unavailable):
Осуществим вызов на внешний номер, в консоли при правильно отработке увидим следующее:
По скриншоту видим, что вызов не был совершен. Причина недоступности и отбоя 3 — сбой подключения к магистрали. После чего отрабатывает сценарий test_trunk.agi.
Проверим почту и Telegram чат, в который придут сообщения с уведомлениями о проблеме:
Данный пример хорошо показывает, как можно с применением Monitor Trunk Failures осуществлять мониторинг за текущим состоянием транка и быть уведомленным при возникновении аварии, что в свою очередь повлияет на оперативное решение проблемы.
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.