Андрей Зезюлин
14.06.2023
88904

Получение уведомления при падении транка с применением Monitor Trunk Failures

В данной статье рассмотрено, как осуществить настройку Monitor Trunk Failures для получения уведомления при падении транка и получения его статуса Unavailable.

Monitor Trunk Failures – если установлен параметр в значение Yes, возможно указать пользовательский сценарий AGI, который будет вызываться для отчетов, журналов, электронной почты или других действий. Срабатывания пользовательского сценария AGI будет происходит в случае получения ошибки при совершении исходящего вызова. Непрошедшие вызовы со статусом CANCEL – отменен, NOANSWER – не отвечен, BUSY – абонент занят, учитываться не будут.

Используемое программное обеспечение:

  • предустановленная дистрибутив с FreePBX;
  • Telegram;
  • Send Email.

Определим следующие показатели для получения в сообщении:

  1. версия Asterisk;
  2. имя транка и его статус;
  3. кто делал вызов;
  4. вызываемый номер;
  5. номер транка;
  6. текущую дату.

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
Рисунок 1. Файл test_trunk.agi
Рисунок 1. Файл test_trunk.agi

Описание кода:

  • Создаем индексированный массив с именем 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
Права и пользователь test_trunk.agi
Рисунок 2. Права и пользователь test_trunk.agi

Для отправки почтового сообщения использовал Send Email — это легкий почтовый клиент SMTP. Он разработан для использования в скриптах bash, пакетных файлах, программах на Perl и веб-сайтах. Более подробно с ним ознакомиться или скачать его можно по ссылке: https://github.com/zehm/sendEmail .

В него вносим следующие параметры: почтовый сервер, логин/пароль от почты, адреса от кого и кому направляем почту.

Рисунок 3. Настройки Send Email
Рисунок 3. Настройки Send Email

Для того, чтобы включить функцию Monitor Trunk Failures перейдемиз веб-интерфейса в Settings — Advanced Settings и установим Display Monitor Trunk Failures Option значение «Yes».

Рисунок 4. Trunk Failures Option
Рисунок 4. Включение Display Monitor Trunk Failures Option

Произведем настройку транка в веб-интерфейсе. Для этого перейдем в Connectivity – Trunks и выберем нужный транк.  В раздел конфигурации транка включим параметр «Monitor Trunk Failures», укажем файл и название транка.

Включение Monitor Trunk Failures
Рисунок 5. Включение Monitor Trunk Failures

Для проверки и правильности отработки настроек, произвел поломку транка для исходящей связи (статус транка Unavailable):

Статус транка
Рисунок 6. Статус транка

Осуществим вызов на внешний номер, в консоли при правильно отработке увидим следующее:

Рисунок 7. Отработка AGI в консоли
Рисунок 7. Отработка AGI в консоли

По скриншоту видим, что вызов не был совершен. Причина недоступности и отбоя 3 — сбой подключения к магистрали. После чего отрабатывает сценарий test_trunk.agi.

Проверим почту и Telegram чат, в который придут сообщения с уведомлениями о проблеме:

Рисунок 8. Уведомление в Telegram
Рисунок 8. Уведомление в Telegram
Рисунок 9. Уведомление на электронную почту
Рисунок 9. Уведомление на электронную почту

Данный пример хорошо показывает, как можно с применением Monitor Trunk Failures осуществлять мониторинг за текущим состоянием транка и быть уведомленным при возникновении аварии, что в свою очередь повлияет на оперативное решение проблемы. 

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.