Мониторинг состояния Asterisk с помощью MonAst

4 ответов

Какой API вы используете для написания этой программы? AMI? AGI? FastAGI? DeadAGI? Вызовы? Там есть много способов получить эту информацию.

ПРИМЕЧАНИЕ . Вы не можете определить, был ли канал прослушиванием, если вы не используете файлы вызовов и/или доступ к CDR.

С AGI вы узнаете статус, который определяется вашей программой. Если вы все еще находитесь в AGI script, тогда вызов все еще продолжается и уже ответил.

Если вы используете файлы звонков, и у вас есть атрибут Archive, установленный в "yes", то после завершения вызова вы можете проверить свой каталог outoing_done (обычно/var/lib/asterisk/outgoing_done/) для вашего вызова файл. Когда вы читаете файл вызова, вы заметите, что Asterisk добавила статус внизу файла вызова, который сообщит вам окончательный статус вызова.

BEST способ получить эту информацию - это получить ваш PHP script из записей CDR на сервере Asterisk. Сделайте запись записей в CDR в базу данных MySQL, затем потяните записи для своего вызова из базы данных.

Вы можете создать демон AMI для прослушивания событий AMI, передаваемых из Asterisk. Я делал это много раз, один из них был для Asterisk GUI. Если вы создаете таблицу для статуса в своей базе данных, вы можете создать демон для прослушивания событий AMI и обновить статус по мере их возникновения. Тогда вашей веб-странице не придется вообще взаимодействовать с Asterisk, вам просто нужно будет прочитать статус из базы данных.

Одно из ключевых различий в javascript vs php заключается в том, что javascript должен использовать Asterisk http daemon вместо подключения сокета прямо к AMI. Из-за этого он должен использовать материал "waitevent". Но поскольку вы будете использовать соединение сокетов TCP, просто продолжайте циклически читать инструкцию.

Надеюсь, это поможет! Этот метод кажется самым надежным при попытке получить информацию от Asterisk.

На самом деле я использую HTML5 webSockets и AsterClick, демона промежуточного программного обеспечения, который я написал в PHP.

AsterClick - это, насколько мне известно, единственный действительно управляемый событиями Asterisk AMI-интерфейс для HTML5 на планете. Все остальные решения там все еще остаются сервера.

Я могу посмотреть статус звонков в режиме реального времени. перенос между (очередями, встречами, парковкой, отдельными лицами) просто перетаскиванием в моем браузере. Я могу создать работая ad hoc dialplan без написания диалплана или в основном что-либо еще, что Asterisk AMI может делать с NO POLLING .

В Javascript я могу использовать функцию addEventListener(), которая фактически принимает имена событий AMI в качестве параметров. Существует NO POLLING , но, когда AMI Asterisk отправляет событие, он отправляется в мой браузер через webSocket, генерируя событие, которое обрабатывает данные и испускает больше событий в браузере.

У меня также есть инструмент WBEA, который позволяет мне развернуть те же приложения HTML5 AsterClick, что и автономные исполняемые файлы для Windows и Linux.

Поиск удобного решения по мониторингу нескольких серверов Asterisk привел к замечательному инструменту:

Осмотр возможностей

MonAst позиционируется разработчиками как инструмент мониторинга, который действует как панель оператора для Asterisk. Распространяется по лицензии BSD. Проект написан с использованием Python (демон для связи с Asterisk по AMI), PHP, JS (AJAX).

Из возможностей просмотра (в режиме real-time) - следующее:
  • Работа с несколькими серверами (с помощью переключения между ними)
  • Многопользовательский режим с указанием прав доступа
  • Отображение пользователей и пиров (SIP, IAX, DAHDI, Khomp, etc...)
  • Отображение активных каналов и вызовов (с именем канала и CallerID)
  • Каналы конференции (с отображением подключённых пользователей)
  • Припаркованные звонки (Parked Calls)
  • Очереди (с отображением статистики, участников и ожидающих клиентов)
Из возможностей выполнения операций:
  • Выполнение (инициация) вызовов
  • Трансфер вызовов
  • Сброс вызовов
  • Паркование вызовов
  • Прослушивание звонков (Spy Calls)
  • Приглашение участников в конференцию
  • Удаление участников конференции
  • Добавление пользователей (или пиров) как участника любой очереди
  • Удаление участников из очереди
  • Постановка и снятие с паузы участников очереди
  • Выполнение CLI команд
Как видно - список возможностей достаточно обширный.

Установка

Подопытной системой у нас будет чистая Ubuntu 10.10 с базовыми программами и обновлениями. MonAst не обязательно ставить на хосте с Asterisk. У меня, к примеру, MonAst стоит локально на ноутбуке - и я прекрасно мониторю все наши 6 серверов с Asterisk.
Прежде чем приступить к установке MonAst - пробежимся по требованиям.
Так как демон, с помощью которого происходит обмен между Asterisk и MonAst (посредством AMI - Asterisk Manager API) написан на Python, то первым делом проверяем его присутствие в системе:
it@ubuntu-test ~ $ python --version Python 2.6.6
Если видим нечто подобное - значит все в порядке. Если по каким то причинам его нет - выполняем команду:
it@ubuntu-test ~ $ sudo apt-get update && sudo apt-get install python
Двигаемся дальше.
Так как все это будет отображатся через web-интерфейс, то нужно иметь установленный http сервер с поддержкой php, а так же php-pear. Если ранее данного комплекта не стояло - выполняем команду (дополнительно поставим mc - для удобства навигации и редактирования):
it@ubuntu-test ~ $ sudo apt-get install apache2 php5 php-pear mc
Ну и напоследок - установка зависимостей для обсуждаемого продукта. Этот список у нас невелик:
  1. Twisted Python 10.1+
  2. zope.interface 3.6+
  3. Starpy SVN-Trunk
  4. PHP PEAR Packages: (HTTP_Client)
Пакет zope.interface уже стоял в системе (был в наличии из коробки).
Ставим пакет HTTP_Client:
it@ubuntu-test:/usr/src$ sudo pear install HTTP_Client WARNING: "pear/HTTP_Client" is deprecated in favor of "pear/HTTP_Request2" WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update WARNING: "pear/HTTP_Request" is deprecated in favor of "pear/HTTP_Request2" WARNING: "pear/Net_URL" is deprecated in favor of "pear/Net_URL2" downloading HTTP_Client-1.2.1.tgz ... Starting to download HTTP_Client-1.2.1.tgz (10,202 bytes) .....done: 10,202 bytes downloading HTTP_Request-1.4.4.tgz ... Starting to download HTTP_Request-1.4.4.tgz (17,109 bytes) ...done: 17,109 bytes downloading Net_URL-1.0.15.tgz ... Starting to download Net_URL-1.0.15.tgz (6,303 bytes) ...done: 6,303 bytes downloading Net_Socket-1.0.10.tgz ... Starting to download Net_Socket-1.0.10.tgz (5,429 bytes) ...done: 5,429 bytes install ok: channel://pear.php.net/Net_URL-1.0.15 install ok: channel://pear.php.net/Net_Socket-1.0.10 install ok: channel://pear.php.net/HTTP_Request-1.4.4 install ok: channel://pear.php.net/HTTP_Client-1.2.1
Как видим - в процессе установки говорит об устаревании пакета и предлагает поставить более новый:
it@ubuntu-test:/usr/src$ sudo pear install HTTP_Request2
Пакеты Twisted и StarPy будем ставить из исходников. Но при установке выявились еще зависимости, которые и исправляем (попутно перейдем в режим суперпользователя):
it@ubuntu-test:~$ sudo su root@ubuntu-test:~$ cd /usr/src/ root@ubuntu-test:/usr/src# wget http://pypi.python.org/packages/source/T/Twisted/Twisted-12.0.0.tar.bz2#md5=root@ubuntu-test:/usr/src# wget http://downloads.sourceforge.net/project/starpy/starpy/1.0.0a13/starpy-1.0.0a13.tar.gz root@ubuntu-test:/usr/src# tar -xvf Twisted-12.0.0.tar.bz2 root@ubuntu-test:/usr/src# tar -xvf starpy-1.0.0a13.tar.gz root@ubuntu-test:/usr/src# apt-get install build-essential gcc-4.5 libssl-dev python-dev root@ubuntu-test:/usr/src# cd Twisted-12.0.0 root@ubuntu-test:/usr/src/Twisted-12.0.0# python setup.py install
Если видим надпись «Finished processing dependencies for Twisted==12.0.0 » - значит установка прошла успешно и переходим дальше. Если выскакивает ошибка - то скорее не хватает какого-то компонента. Проверте по списку - все ли зависимости установлены? Идем дальше:
root@ubuntu-test:/usr/src/Twisted-12.0.0# cd .. root@ubuntu-test:/usr/src# cd starpy-1.0.0a13 root@ubuntu-test:/usr/src/starpy-1.0.0a13# python setup.py install root@ubuntu-test:/usr/src/starpy-1.0.0a13# cd ..
Ну и самый главный виновник торжества. На момент написания актуальная версия - 3.0b4:
root@ubuntu-test:/usr/src# wget http://downloads.sourceforge.net/project/monast/Monast%20for%20Asterisk%201.4%2C%201.6%20and%201.8/3.0b4/monast-3.0b4.tar.gz root@ubuntu-test:/usr/src# tar -xvf monast-3.0b4.tar.gz root@ubuntu-test:/usr/src# cd monast-3.0b4 root@ubuntu-test:/usr/src/monast-3.0b4# ./install.sh
В процессе установки скрипт задаст пару вопросов относительно путей. Если предложенные им варианты устраивают - соглашаемся. Иначе прописываем свои данные. Я лишь изменил путь, куда ложатся.php файлы
MonAst HTML path : /var/www/asterisk/monast/

Может показаться что на этом установка закончена. Но не тут то было. Стартовый скрипт /etc/init.d/monast ставится лишь для систем SuSE, RedHat, Debian, Gentoo, Slackware, FreeBSD. Но не Ubuntu и ей подобные. Потому копируем скрипт от Debian и добавляем его в автозагрузку:
root@ubuntu-test:/usr/src/monast-3.0b4# cp contrib/init.d/rc.debian.monast /etc/init.d/monast root@ubuntu-test:/usr/src/monast-3.0b4# chmod 755 /etc/init.d/monast root@ubuntu-test:/usr/src/monast-3.0b4# update-rc.d monast defaults 91 60
Вот теперь установка у нас окончена. Можно переходить к настройке.

Настройка

Перво наперво нужно выполнить настройку самого Asterisk, дабы сабжевое ПО могло успешно подключится и обмениваться информацией. На сервере с Asterisk переходим по пути /etc/asterisk/ и правим файл manager.conf . Если серверов несколько - делаем подобные поправки на нужных.
root@asterisk ~ $ mcedit /etc/asterisk/manager.conf
; ; AMI - The Asterisk Manager Interface ; enabled = yes ; Активируем AMI port = 5038 ; Порт, по которому к данному сервису будет подключаться MonAst bindaddr = 0.0.0.0 ; Прослушиваем все интерфейсы в системе для принятия подключения displayconnects = yes ; Показывать в консоли Asterisk о факте подключения webenabled = no ; Выключаем встроенный в Asterisk static_http allowmultiplelogin = yes ; Разрешаем вход вход под одним и тем же пользователем с разных мест. timestampevents = yes ; Добавлять метку времени для событий; debug = on ; Можно включить отладочный режим для сообщений AMI secret=qwerty123 ; Пароль для подключения deny=0.0.0.0/0.0.0.0 ; Запрещаем подключение с любого адреса permit=127.0.0.1/255.255.255.0 ; И постепенно разрешаем нужные permit=192.168.1.10/255.255.255.0 ; Так разрешаем конкретный хост permit=192.168.2.0/255.255.255.0 ; А вот так можно разрешить подсеть writetimeout=100 ; Таймаут для посылки команд; Разрешения для данного пользователя. Можно указать all, но так наглядней read=system,call,log,verbose,command,agent,user,config,originate,reporting write=system,call,log,verbose,command,agent,user,config,originate,reporting
После чего перезагрузим конфигурацию Asterisk для модуля manager:
root@asterisk$ asterisk -rx "manager reload"
На этом настройка Asterisk закончена. Переходим к конфигурации самого MonAst"а.
Файл с параметрами находится по пути /etc/monast.conf . Его и правим. Скажу наперед - сложностей в настройке не возникло, приведенные в файле комментарии четко описывают тот или иной параметр. Но для примера приведу свой пример файла
root@ubuntu-test:/usr/src/monast-3.0b4# cd /etc/ root@ubuntu-test:/etc# mcedit monast.conf
# Copyright (c) 2008-2011, Diego Aguirre # All rights reserved. ## ## Global Section ## # Bind client connetions on host:port bind_host = 127.0.0.1 ; Разрешаем подключения с локального хоста bind_port = 5039 ; Порт для подключения к демону. # Use client autentication on browser auth_required = true ; Указываем сто аутентификация обязательна ## =================================== ## ## Servers Definitions ## ; Параметры для первого сервера hostname = 192.168.1.1 hostport = 5038 username = monast_user password = qwerty123 # Default user context default_context = default # Context to use in transfer calls transfer_context = default # Context and prefix for meetme meetme_context = default meetme_prefix = ; Параметры для второго сервера hostname = 192.168.2.1 hostport = 5038 username = monast_user password = qwerty123 # Default user context default_context = default # Context to use in transfer calls transfer_context = default # Context and prefix for meetme meetme_context = default meetme_prefix = ## =================================== ## ## Peers Definitions ## # sort peers (options: channel, callerid) sortby = callerid # default show/hide default = show # hide peer when default = show ;/SIP/user-1 = hide # show peer when default = hide ;/SIP/user-2 = show # always show peer. ;/SIP/user-3 = force # force CallerID (only in forced mode) ;/SIP/user-4 = force,Diego Aguirre <5555> # Create peer groups ;/@group/Group 1 = SIP/user-1,SIP/user-2 ;/@group/Group 2 = SIP/user-3,SIP/user-4 ## =================================== ## ## Meetmes / Conferences Definitions ## # default show/hide default = hide # hide meetme when default = show ;/1234 = hide # show meetme when default = hide ;/1234 = show # always show meetme ;/1234 = force ## =================================== ## ## Queues Definitions ## # defualt show/hide default = hide # show queue queue01 ;/queue01 = show # show queue queue02 with display name Support ;/queue02 = show,Support # hide queue queue03 ;/queue03 = hide # Map Member name ;/@member/SIP/user-1 = Diego Aguirre <5555> ## =================================== ## Define users and roles to use on auth_required is set to true ## roles must be: ## originate: user can originate, transfer, park and drop calls ## agent: user cans add, remove, pause and unpause members on queues ## command: user can execute asterisk cli commands ## spy: user can start a spy ; Мего-админ secret = SuperPuperDruper roles = originate,queue,command,spy servers = ALL ; Пользователь с возможностью просмотра обеих (всех) серверов secret = password roles = originate servers = ALL ; Пользователь с возможностью просмотра одного (первого) серверов secret = 12345 roles = originate servers = Server1 ; Пользователь с возможностью просмотра и выполнения команд на одном (втором) сервере secret = 54321 roles = originate,command servers = Server2
Сохраняем изменения и перезагружаем демон:
root@ubuntu-test:/etc# /etc/init.d/monast restart
Все. Можно подключаться и проверять. Открываем браузер и в строке адреса вбиваем: http://localhost/asterisk/monast/
Если ставили «auth_required = true » то вводим логин, пароль - и наслаждаемся рабочим инструментом:)


Важное замечание. В режиме «без аутентификации» все, кто работают в панели оператора MonAst - имеют полные права, т.е. являются «суперпользователями». А как мы знаем «Оружие, данное в неумелые руки, может навредить». Будьте внимательны.
Так же в файле /var/www/asterisk/monast/lib/config.php находятся параметры адреса и порта, где работает демон monast.py, параметры отображение вкладок debug и cli , а так же некоторых не менее интересных параметров.
Обзор возможностей
Теперь же пробежимся по возможностям данного программного продукта.
После входа на web-интерфейс мы видим несколько вкладок. А если быть точнее:
  • Mixed Pannels - Вкладка с практически всем разделами сразу. Удобство заключается в том, что можно отобразить лишь нужные и, не переключаясь, видеть необходимую информацию в одном месте.
  • Peers/Users - Просмотр и управление достуными пирами и пользователями.
  • Meetme Rooms - Просмотр и управление конференциями
  • Channels/Calls - Просмотр и управление активными вызовами и поднятыми каналами.
  • Parked Calls - Просмотр и управление припаркованными вызовами
  • Queues - Просмотр и управление очередью звонков
  • Asterisk CLI - Командная строка Asterisk. Если у пользователя есть права выполнения команд в консоли, то именно здесь можно ввести нечто схожее с «core show version»:)
Разобраться в возможностях не составляет труда и, возможно, даже лучше будет если Вы сами пробежитесь и опробуете доступные функции - так вы четко будете понимать что и как работает. Но я все таки опишу парочку интересных из них:)
Originate call (инициирование вызова) . Из названия функции ясно - можно соединить внутреннего абонента с каким либо номером (если он, номер, сможет обработаться Вашим dialplan"ом). Для выполнения функции нужно нажать правой кнопкой мыши (далее по тексту - пкм) на нужном аккаунте и выбрать соответствующий пункт. В появившемся окне вводим нужный номер и, вуаля - у выбранного человека звонит телефонный аппарат, он берет трубку и Asterisk соединяет его с выведенным нами номером. Так же можно перетащить мышкой один аккаунт на другой и, согласившись - инициировать соединение между ними.
Meetme Rooms (комната конференции) . Перейдя в данный раздел можно управлять уже созданными конференциями, либо создать новую и пригласить туда определённых участников. Для создания своей конференции - переходим в соответствующий раздел, нажимаем «Create Dynamic Meetme » и в окне вводим запрашиваемую информацию. Нажали «Ок» - и процесс пошел-поехал:)
Spy (прослушивание вызова) . Что она делает? Из названия можно понять - дает возможность подключится к выбранному разговору и прослушать речевой поток. Функция может быть полезна при использовании в call-центрах для контроля и проверки агентов. При этом в процессе разговора собеседники даже не подозревают о факте прослушивания. По крайней мере я, тестируя данную возможность, никакого сигнала или уведомления не слышал. Для того, чтобы пользователь панели имел право на прослушивание - нужно чтобы в поле roles его прав доступа присутствовало spy . Потому для того, чтоб ограничить использование данной функции с нехорошим умыслом - включайте аутентификацию для доступа к панели и давайте права на ее использование только доверенным для этого пользователям. Начальнику отдела, например:)

Заключение

MonAst, как и альтернативные проекты с подобной функциональностью (FOP, Links и пр.) однозначно имеет право на существование и, соответственно, использование в рабочем процессе.
Простота использования, относительная лёгкость в установке и настройке, мониторинг нескольких серверов с одного места - все это, в большинстве случаев, будет более чем достаточно.

В сегодняшней статье рассмотрим модуль, который позволяет просматривать детальную информацию о сервере IP-АТС Asterisk и о процессах, которые на нем запущены прямо из web-интерфейса FreePBX - Asterisk Info . Все примеры в данной статье будут приводиться с использованием FreePBX 13. Ту же самую информацию можно получить, используя командную строку Asterisk – . Сразу отметим, что данная информация будет понятна и полезна только продвинутым пользователям Asterisk и системным администраторам, например, при траблшутинге проблем.

Модуль Asterisk Info

Перейдём в модуль и рассмотрим его функционал. Модуль доступен по следующему пути с главной страницы Reports -> Asterisk Info

Как только мы переходим в модуль, перед нами открывается страница Summary . Здесь находится следующая информация:

  • Uptime – Показывает как долго сервер работает без отключения и рестарта
  • Reload - Показывает, когда последний раз была выполнена перезагрузка сервера. Перезагрузка происходит после нажатия на кнопку Apply Config , которая появляется после внесения изменений в конфигурацию через вэб-интерфейс
  • Active SIP Channels -Показывает, как много на сервере активных SIP каналов. Не надо путать с активными звонками.
  • Active IAX2 Channels – Показывает количество активных IAX2 каналов
  • SIP Registry - Показывает количество SIP транков, которые зарегистрированы на сервере
  • IAX2 Registry - Показывает количество IAX2 транков, которые зарегистрированы на сервере
  • SIP Peers - Показывает количество зарегистрированных SIP пиров. Пир – это внутренний номер (Extension) или транк (Trunk)
  • IAX2 Peers - Показывает количество зарегистрированных IAX2 пиров.

Справа можно выбрать другой тип отчета.

Registries


Данный отчет показывает каждое соединение, на которое зарегистрирован сервер Asterisk. Обычно здесь находится информация о транках. Этот отчёт показывает, на что зарегистрирован сервер, но не что зарегистрировано на нем, эту информацию следует искать во вкладке Peers.

Channels

Здесь выводится информация о каждом активном канале на сервере. Канал – это одно двустороннее соединение между двумя устройствами.

Peers

Здесь выводится информация о каждом устройстве, транке, внутреннем номере, которое зарегистрировано на сервере Asterisk.

SIP Info


Данный отчёт суммирует предыдущие два Registry и Peers, но выводит информацию только по SIP.

IAX Info


Данный отчёт суммирует Registry и Peers, но выводит информацию только по IAX2.

Conferences Report


Данный отчёт показывает информацию о любых активных конференциях на сервере.

Subscription Report


Показывает список всех подсказок (hints), которые созданы на сервере. Подсказка это то, на что подписана BLF кнопка на телефоне.

Voicemail Users Report