Текст книги "Asterisk™: будущее телефонии Второе издание"
Автор книги: Джим Меггелен
Соавторы: Джаред Смит,Лейф Мадсен
Жанр:
ОС и Сети
сообщить о нарушении
Текущая страница: 22 (всего у книги 41 страниц)
Что такое GUI
Asterisk GUI – это интерфейс, который поставляется с дистрибутивом AsteriskNOW или может быть добавлен в существующую установку Asterisk. Стандартный интерфейс ориентирован на пользователя, желающего применять Asterisk как офисную АТС для небольшого предприятия с довольно типовыми требованиями к системе телефонной связи. Это самое простое, что можно сделать с помощью AJAM; рассматривайте его как бета-интерфейс, который, как можно ожидать, будет развиваться согласно желаниям сообщества. Его появление вызвало большое воодушевление в сообществе разработчиков Asterisk, потому что лежащие в основе GUI технологии поднимают планку возможностей интерфейса офисной АТС. Он также позволяет создавать пользовательские интерфейсы, нацеленные на собственные уникальные требования.
Марк Спенсер о GUI
Asterisk – мощная платформа для телефонии. Однако ценность этой мощи определяется тем, насколько она может быть полезна конкретным целевым пользователем. Графические интерфейсы (GUI) очень нужны Asterisk. Большинство GUI специально разработаны для определенной задачи. Например, некоторые GUI созданы специально для систем голосовой почты. Другие ориентированы на гостиничную отрасль. Необходимость в универсальном GUI для Asterisk существует, но приходится идти на естественный компромисс между удобством использования и простотой GUI и количеством предлагаемых им функций. Например, GUI, нужный администратору сложных и многофункциональных систем, скорее всего, будет отличаться от того, который требуется администратору офиса, отвечающему только за простые перемещения, добавление записей и изменение системы. Исходя из такого широкого диапазона требований Digium разработала инфраструктуру GUI, названную (неизобретательно) Asterisk GUI. Digium не стала разрабатывать единый GUI, а вместо этого выпустила разные GUI и инфраструктуру для упрощения процесса создания и изменения GUI для разных областей применения. Второй задачей было обеспечить такое взаимодействие GUI с традиционными конфигурационными методами Asterisk, чтобы ничто не могло воспрепятствовать его применению. Большинство GUI для Asterisk используют формат промежуточной конфигурации или базу данных, с помощью которых можно создать конфигурационные файлы для использования Asterisk. К сожалению, это означает, что любая опция, не представленная в GUI, не может быть задана «вручную» в конфигурационных файлах. А вот Asterisk GUI реально изменяет традиционные конфигурационные файлы Asterisk, то есть изменения, вносимые в GUI, и изменения, вносимые в сами файлы, могут сосуществовать и даже передаваться туда и обратно. Например, если изменить ID вызывающего абонента в файле users.conf и обновить GUI, изменения можно будет увидеть и в GUI. Аналогично, если внести изменения в GUI и перезагрузить файл, изменения
будут отражены и в нем. Если добавить новые настройки, не представленные в GUI (например, ввести nat=yes в конкретную запись в файле users.conf) и затем изменить ID вызывающего абонента в GUI, вы увидите, что строка nat=yes сохранится в файле даже несмотря на то, что произойдет изменение ID вызывающего абонента. Комментарии тоже обычно сохраняются при редактировании через GUI. Это не только означает, что GUI больше не должен отображать все возможные конфигурации, поскольку наиболее специфичные из них могут быть заданы вручную. Это также означает, что, если кто– то начнет с использования Asterisk GUI, а затем выйдет за его рамки, он вполне естественным образом сможет создавать более сложные функции, не отказываясь от уже ставшего привычным GUI.
Использование GUI
При первой регистрации во вновь созданном GUI система активирует Мастер настройки, который позволяет настроить основные элементы системы телефонной связи.
GUI может не суметь определить все типы интерфейсов TDM и в результате сообщит, что не находит определенные платы, даже несмотря на то, что они установлены. Предполагается, что со временем GUI научится определять любые платы, использующие интерфейс Zaptel, и работать с ними, но эта функциональность обещает быть сложной и на данный момент находится на этапе разработки.
Мастер настройки одну за другой предлагает некоторые базовые опции, такие как длина добавочного номера или правила набора. Мы не собираемся углубляться в детали того, как работает стандартный GUI. Он находится в процессе непрерывной разработки, и, скорее всего, читая эту книгу, вы не найдете в GUI многое из того, что мы могли бы написать здесь.
Элементы GUI
Стандартный GUI, который поставляется с AsteriskNOW (или который можно скачать через SVN), имеет стандартный набор элементов. Эти элементы представляют собой то, что может присутствовать в типовой малой офисной АТС. В настоящее время в меню представлены следующие элементы:
• Users (Абоненты).
• Conferencing (Конференц-связь).
• Voicemail (Голосовая почта).
• Call Queues (Очереди звонков).
• Service Providers (Поставщики сервисов).
• Calling Rules (Правила вызова).
• Incoming Calls (Входящие звонки).
• Voice Menus (Голосовые меню).
• Record a Menu (Запись в меню).
• Active Channels (Активные каналы).
• Graphs (Диаграммы).
• System Info (Сведения о системе).
• Backup (Создание резервной копии).
• Options (Опции).
Архитектура Asterisk GUI
Прежде чем углубляться в изучение (или разработку собственного) Asterisk GUI, важно понимать, как реализуется поток данных между клиентом (веб-броузером) и Asterisk. Поскольку эти интерфейсы являются Ajax-приложениями, многое в них не вполне понятно. Поток управления проходит примерно так:
• Броузер переходит по URL вашего приложения управления.
• Веб-сервер Asterisk отправляет броузеру HTML-страницу, библиотеки и само приложение (которое написано на JavaScript и активно использует Ajax).
• Пользователь взаимодействует с броузером; по мере необходимости приложение JavaScript присылает команды назад веб-серверу. Эти команды, представленные в форме URL, запрашивают некоторое действие от самого сервера Asterisk.
• Веб-сервер интерпретирует эти URL. Если пользователь прошел регистрацию успешно, он посылает команду (действие) Asterisk через Asterisk Manager Interface (AMI), описанный в главе 10.
• Asterisk выполняет действия и передает результаты (код состояния и, возможно, данные) на веб-сервер.
• Веб-сервер возвращает ответ Asterisk JavaScript-приложению, выполняющемуся в броузере.
• JavaScript-приложение обновляет окно броузера.
Несмотря на то что на первый взгляд это может показаться несколько сложным, не пугайтесь. Это очень гибкая и мощная архитектура, которая может использоваться для разнообразнейших приложений, а не только для Asterisk GUI. Однако сейчас сосредоточимся на совершенствовании Asterisk GUI. Начнем с настройки базовых частей и затем перейдем к установке и изменению Asterisk GUI.
Компоненты Asterisk GUI
Рассмотрим подробнее некоторые ключевые компоненты Asterisk GUI. Они будут использоваться позже в данной главе для изменения Asterisk GUI.
Asterisk Manager Interface
Как рассказывалось в главе 10, Asterisk Manager Interface обеспечивает возможность внешним программам управлять Asterisk. Интерфейс Manager – это сердце Asterisk GUI, поскольку он выполняет всю тяжелую работу.
Команды Manager по HTTP и веб-сервер Asterisk
Веб-сервер, встроенный в Asterisk, позволяет передавать команды интерфейса Manager в Asterisk по HTTP, а не подключаться непосредственно к интерфейсу Manager. Это намного упрощает для веб-приложения задачу по передаче команд AMI в Asterisk с использованием Asynchronous JavaScript Asterisk Manager (AJAM), что мы вскоре рассмотрим. Веб-сервер также можно конфигурировать на обслуживание статического содержимого, такого как HTML-файлы и изображения1.
AJAM и JavaScript
Инфраструктура AJAM использует JavaScript и XML для асинхронной отправки команд в Asterisk и обновления информации, отображаемой в веб-броузере.
Установка Asterisk GUI
Если у вас не установлен AsteriskNOW, необходимо скачать и установить файлы Asterisk GUI. После загрузки эти файлы просто компилируются и устанавливаются как часть Asterisk.
Для использования Asterisk GUI необходима Asterisk версии 1.4 или более поздней.
Самую последнюю версию файлов GUI можно найти в хранилище Subversion компании Digium2. Если на вашем компьютере установлено Subversion, код GUI можно загрузить, используя следующую команду:
Возможно, вы спрашиваете себя: «Почему веб-сервер встроен в Asterisk? Почему бы просто не использовать внешний веб-сервер?» Внешний веб-сервер может использоваться для обслуживания Asterisk GUI, но это выходит за рамки рассмотрения данной главы, поскольку модель безопасности, лежащая в основе Ajax, разрешает Ajax направлять запросы только к тому домену, порту и по тому протоколу, по которым поступила HTML-страница. Обычно такое поведение называют политикой единства происхождения. В настоящее время нет способа загрузить GUI через FTP. Эта ситуация может измениться в любой момент, поэтому не стесняйтесь и свободно проверяйте, не появилась ли обновленная информация на веб-сайте Asterisk.
# cd /usr/src # или любая папка, в которую вы хотите загрузить исходный код
# svn co http://svn.digium.com/svn/asterisk-gui/trunk asterisk-gui
Установить GUI очень просто:
# cd asterisk-gui
# ./configure
# make
# make install
# make samples
После выполнения представленных выше команд файлы GUI будут установлены и станут частью вашего дистрибутива Asterisk.
Настройка httpd.conf и manager.conf
Конфигурация веб-сервера Asterisk для обработки запросов AJAM включает несколько простых шагов. В файл /etc/asterisk/http.conf необходимо добавить (или раскомментировать) следующее:
[general] enabled=yes
enablestatic=yes ; без этого вы можете только посылать команды AMI, ; но не отображать html-содержимое
bindaddr=0.0.0.0 ; адрес, на который HTTP-сервер Asterisk должен отвечать bind po rt=8088 ; порт, по которому HTTP-сервер Asterisk должен отвечать prefix=asterisk ; будет формировать часть URI, соответствующую имени папки
Теперь, когда httpd.conf настроен, можно передать содержимое в броузер. Чтобы веб-клиент мог посылать команды в Asterisk, необходимо внести некоторые изменения в Asterisk Manager Interface (AMI). Для этого добавим несколько строк в раздел [general] файла manager.conf и учетную запись пользователя с набором разрешений config. Откроем файл manager.conf и отредактируем его следующим образом: [general]
enabled=yes ; возможно, AMI уже активирован, если используется для других целей webenabled=yes ; это активирует взаимодействие между веб-сервером Asterisk и AMI
[asterisk_http] ; пользователю может быть присвоено любое имя secret = gooey
read = system,call,log,verbose,command,agent,user,config write = system,call,log,verbose,command,agent,user,config
Сохраните изменения и перезапустите Asterisk. У вас должно получиться подключиться в веб-серверу Asterisk посредством следующего URI:
http://localhost:8088/asterisk/static/ajamdemo.html Если по какой-то причине возникли проблемы с переходом на демонстрационную страницу, вернитесь в папку исходного кода asterisk-gui и выполните команду
# make checkconfig
Вот и все! Asterisk теперь поддерживает веб-доступ. Пора переходить к реальной разработке с использованием Asterisk GUI.
Формирование Asterisk GUI
После установки файлов для Asterisk GUI можно приступать к формированию GUI. В следующих нескольких разделах поэтапно рассматриваются настройка и объединение различных компонентов с целью улучшения и расширения возможностей GUI.
Передача команд интерфейса Manager по HTTP
Asterisk GUI формирует команды для Asterisk, вызывая специально созданные URL на веб-сервере Asterisk. В этом разделе представлены примеры некоторых обычно используемых команд (действий) и соответствующие ответы веб-сервера. Эти URL AMI имеют следующую общую структуру:
http://hostname:8088/asterisk/rawman9action=KOMaHfla&.. . .пары параметр=значение... http://hostname:8088/asterisk/manager?action=KOMaHfla&. ...пары параметр=значение... http://hostname:8088/asterisk/mxml9action=KOMaHfla&... .пары параметр=значение.. .
Разница между URL rawman, manager и mxml важна. Веб-сервер экспортирует три разных представления интерфейса AMI. Если используется URL rawman, сервер возвращает в HTTP-ответе последовательность пар ключевое слово/значение. Если используется URL manager, сервер возвращает результат в HTML-формате. Аналогично, если используется URL mxml, сервер возвращает результаты в XML-формате. Для современных приложений в стиле Ajax формы rawman и mxml, пожалуй, более полезны[108]108
По той же причине людям намного проще использовать для отладки форму
manager.
[Закрыть].
Действия с параметрами, которые могут быть переданы на сервер, являются обычными командами интерфейса управления, описываемыми в приложении F. Обратите внимание: действия LOGIN и CHALLENGE уникальны тем, что посылаются не непосредственно в Asterisk, а обрабатываются интерфейсом Manager для аутентификации пользователя. Если пользователь не прошел аутентификацию, сервер не передает действие на обработку в Asterisk, а возвращает ошибку.
Ознакомимся с некоторыми широко используемыми действиями и рассмотрим, как их можно использовать для управления сервером.
LOGIN
Команда LOGIN аутентифицирует учетные данные для доступа к HTML– представлению интерфейса Manager. Как только вы зарегистрировались, Asterisk сохраняет в вашем броузере объект cookie (который действителен в течение времени, заданного настройкой httptimeout). Этот cookie используется для подключения к одному и тому же сеансу. URL
http://localhost:8088/asterisk/rawman?action=login&username= asterisk_http &secret=gooey
отправляет на веб-сервер команду на регистрацию, которая включает учетные данные. Если регистрация прошла успешно, сервер отвечает следующим образом:
Response: Success
Message: Authentication accepted
Это, конечно, очень упрощенное представление принципа работы регистрации. Отправка имени пользователя и пароля в URL является плохой практикой, хотя и очень полезной при формировании GUI. Более подходящим способом реализации регистрации и примером более сложной обработки команды является использование последовательности запрос/ответ. Сформируйте такой запрос:
http://localhost:8088/ asterisk / rawman? action=challenge&AuthType=md5
Команда CHALLENGE запускает последовательность запрос/ответ, которая может использоваться для регистрации пользователя. Сервер отвечает, отправляя запрос (произвольную строку) в ответе:
Response: Success Challenge: 113543555
Ваше приложение отвечает на запрос, вычисляя хеш MD5 запроса, конкатенированного с паролем пользователя. Вот как пользователь может вручную вычислить хеш MD5:
# echo -n 113543555gooey | md5sum
50a0f43ad4c9d99a39f1061cf7301d9a -После этого вычисленный хеш может использоваться как ключ регистрации в URL:
http://localhost:8088/asterisk/rawman?action=login&username=asterisk_ http&authtype=md5&key=50a0f43ad4c9d99a39f1061cf7301d9a
В целях безопасности регистрация должна произойти в течение пяти секунд после запроса. Также обратите внимание: чтобы система запрос/ответ работала, в броузере должен быть активирован прием объектов cookie, поскольку именно cookie гарантирует, что действие регистрации использует тот же ID сеанса интерфейса управления, что и действие запроса.
Если для запроса используется URL manager (а не rawman), ответ будет получен в формате HTML:
Manager Tester | |
Response | Success |
Challenge | 113543555 |
Аналогично, если используется представление mxml, будет получен ответ в формате XML:
Кроме формата, эти три типа ответов больше ничем не отличаются. Для большинства приложений в подобной ситуации, когда нет необходимости отображать HTML-страницу пользователю, извлечь запрос из пар ключевое слово/значение будет намного проще, чем использовать
rawman или mxml.
Передача вызова
Действие REDIRECT может использоваться для передачи вызова. Просто сформируйте такой URL:
http://localhost:8088/ asterisk / rawman? action=redirect&channel=SIP / John-ae201e78&priority=1&exten=6001
Этот URL передает заданный канал в другой добавочный номер и приоритет диалплана. Ответ на это действие такой:
Response: Success Message: Redirect Successful
Чтение конфигурационного файла
Команда GETCONFIG возвращает содержимое конфигурационного файла или его часть. HTTP-запрос
http://localhost:8088/asterisk/rawman?action=getconfig&filename= users.conf
возвращает содержимое файла users.conf. Asterisk GUI использует эту функциональность для представления текущей конфигурации Asterisk конечному пользователю. Ответ выглядит следующим образом:
Response: Success
Category-000000: general Line-000000-000000: fullname=New User Line-000000-000001: userbase=6000 Line-000000-000002: hasvoicemail=yes Line-000000-000003: hassip=yes Line-000000-000004: hasiax=yes Line-000000-000005: hasmanager=no
Line-000000-000006: callwaiting=yesLine-000000-000006: callwaiting=yes |
Line-000000-000007: threewaycalling=yes |
Line-000000-000008: callwaitingcallerid=yes Line-000000-000009: transfer=yes |
Line-000000-000010: canpark=yes |
Line-000000-000011: cancallforward=yes |
Line-000000-000012: callreturn=yes |
Line-000000-000013: callgroup=1 |
Line-000000-000014: pickupgroup=1 |
Line-000000-000015: host=dynamic |
Category-000001: 6007 |
Line-000001-000000: fullname=Bill Savage |
Line-000001-000001: secret=1234 |
Line-000001-000002: [email protected] |
Line-000001-000003: cid_number=6001 |
Line-000001-000004: zapchan= |
Line-000001-000005: context=numberplan-custom-1 |
Line-000001-000006: hasvoicemail=yes |
Line-000001-000007: hasdirectory=no |
Line-000001-000008: hassip=yes |
Line-000001-000009: hasiax=yes |
Line-000001-000010: hasmanager=no |
Line-000001-000011: callwaiting=yes |
Line-000001-000012: threewaycalling=yes |
Line-000001-000013: mailbox=6007 |
Line-000001-000014: hasagent=yes |
Line-000001-000015: group= |
Обновление конфигурационных файлов с помощью UPDATECONFIG
Действие UPDATECONFIG используется для обновления одной или более настроек конфигурационного файла. Например, чтобы удалить пользователя, необходимо выполнить такой HTTP-запрос: http://localhost:8088/asterisk/rawman?action=updateconfig&reload= yes&srcfilename=users.conf&dstfilename=users.conf&Action-000000= delcat&Cat-000000=6003& Var-000000=&Value-000000=
Ответ, свидетельствующий об ошибке
Чтобы формировать все остальные команды, пользователь должен зарегистрироваться на веб-сервере. Если пользователь не аутентифици– рован, любая из обсуждаемых выше команд будет возвращать ошибку. Если он отправлен пользователем, не прошедшим аутентификацию, URIhttp://localhost:8088/asterisk/rawman?action=ping возвращает такой свидетельствующий об ошибке ответ: Response: Error
Message: Authentication Required
Ajax, AJAM и Asterisk
Аббревиатура Ajax расшифровывается как Asynchronous JavaScript and XML (Асинхронный JavaScript и XML). Хотя этот термин включает слова «асинхронный» и «XML», это не означает ни то, что можно делать только асинхронные запросы, ни то, что должен обязательно использоваться XML. Некоторые авторы описывают Ajax просто как комбинацию HTML, JavaScript, DHTML и DOM. Следующее поколение броузеров, таких как Mozilla/Firefox, для отправки асинхронного запроса на сервер используют XMLHttpRequest (объект JavaScript). Запрос выполняется в фоновом режиме и обрабатывается сервером. Назад в броузер результат передается посредством обратного вызова: все, что возвращает сервер, может сохраняться и использоваться для обновления отображаемой страницы. Для Internet Explorer 5 или более поздних версий той же цели служит объект ActiveX XMLHttp.
Обработка форм в традиционном веб-приложении
HTML-формы обычно передаются посредством кнопки SUBMIT (ПЕРЕДАТЬ) (type=submit). После щелчка пользователем по кнопке SUBMIT (ПЕРЕДАТЬ) обработка веб-приложения останавливается и не возобновляется до тех пор, пока сервер не возвратит новую страницу полностью:
Прежде чем переходить к Ajax или JavaScript, давайте рассмотрим, как работает традиционное веб-приложение. Для описания формы, где определяются все параметры, которые пользователь хочет отправить на сервер, традиционные веб-приложения используют элемент