Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 110, ФЕВРАЛЬ 2008 г.

Звездные счета

Сергей «grinder» Яремчук

Хакер, номер #110, стр. 110-148-1

(grinder@ua.fm)

Поднимаем web-интерфейс и биллинг для VoIP-сервера

Сервер Asterisk обладает действительно большими возможностями, но чтобы ими воспользоваться в полной мере, потребуется некоторое время на его освоение. Графический интерфейс заметно упростит и ускорит этот процесс. А для организаций, предоставляющих услуги VoIP-связи, наверняка потребуется некоторая система анализа и тарификации звонков. О некоторых решениях, имеющих подобную функциональность, мы сегодня и поговорим.

Установка AsteriskNOW

После освоения основных директив конфигурационных файлов Asterisk новые настройки производятся практически молниеносно. Но новичкам будет немного сложновато, да и администратор с опытом некоторые операции наверняка захочет хоть как-то упростить. Разработчики Asterisk предлагают свое решение вопроса - веб-интерфейс AsteriskNOW, который будет работать с версией 1.4. В настоящее время AsteriskNOW доступен исключительно через CVS. Познакомиться с ним можно, скачав дистрибутив AsteriskNOW (www.asterisknow.org), который также разрабатывается в Digium. Через интерфейс можно произвести большинство настроек, которые приходится выполнять администратору в повседневной эксплуатации. Это управление учетными записями, настройка внешних соединений, устройств для работы с аналоговыми и цифровыми линиями, работа с голосовой почтой, конференции, голосовые меню, парковки вызова, вывод различной информации и графиков о работе сервиса, в том числе и CDR. В текущем варианте пока нельзя настроить все и вся, но для большинства стандартных операций его возможностей хватает с головой. А если нет, то, обратившись к соответствующему меню AsteriskNOW, можно редактировать конфиги Asterisk, вводя нужные параметры вручную.

По традиции для установки будем использовать Ubuntu, хотя в других дистрибутивах весь процесс выглядит аналогично. В поставке Ubuntu по умолчанию нет инструментов для работы с SVN. Поэтому ставим нужный пакет и создаем локальное зеркало:

$ sudo apt-get install subversion

$ svn checkout http://svn.digium.com/svn/asterisk-gui/trunk asterisk-gui

В результате этих действий в текущем каталоге появится подкаталог asterisk-gui:

$ cd asterisk-gui

А дальше идут обычные «./configure; make; sudo make install». После установки будет предложено инсталлировать конфигурационные файлы командой make samples. Необходимости в этом нет, но если ты все же решил, тогда вначале сохрани старые файлы:

$ sudo cp -r /etc/asterisk /etc/asterisk.backup

Затем вручную восстанови те, в которых ранее уже производились настройки. Теперь, чтобы GUI заработал, следует внести пару изменений в некоторые конфиги. Но прежде советую запустить команду make checkconfig, которая подскажет, в каком файле имеется несоответствие и откуда начинать копать:

$ sudo make checkconfig

--- Checking Asterisk configuration to see if it will support the GUI ---

* Checking for http.conf: OK

* Checking for manager.conf: OK

* Checking if HTTP is enabled: FAILED

-- Please be sure you have 'enabled = yes'

-- in /etc/asterisk/http.conf

make: *** [checkconfig] Ошибка 1

Открываем конфигурационный файл встроенного веб-сервера /etc/asterisk/http.conf в текстовом редакторе и правим:

$ sudo mcedit /etc/asterisk/http.conf

enabled = yes

enablestatic = yes

; Принимать соединения со всех интерфейсов

bindaddr = 0.0.0.0

И в manager.conf:

$ sudo mcedit /etc/asterisk/manager.conf

enabled = yes

webenabled = yes

; Заводим учетную запись admin с паролем password для настроек сервера, даем ему соответствующие права и разрешаем заходить только с определенного адреса

[admin]

secret = password

read = system,call,log,verbose,command,agent,config,user

write = system,call,log,verbose,command,agent,config,user

deny = 0.0.0.0/0.0.0.0

permit = 192.168.1.100/255.255.255.0

В шаблоне конфигурации пользователя не приведен параметр config. Если его не добавить, то ты не сможешь редактировать настройки Asterisk. Поэтому не забудь его дописать. Теперь запускаем еще раз make checkconfig и, если утилита не ругается, идем дальше. Подсказки по URL смотри в ее выводе. Набираем в браузере http://127.0.0.1:8088/asterisk/static/config/setup/install.html, регистрируемся с параметрами учетной записи, созданной выше, и следуем указаниям мастера предварительной настройки. В дальнейшем настройки можно будет изменить, поэтому если ты не знаешь, что делать, некоторые шаги пока можно пропустить. Хотя если ввести все, что он просит, по окончании ты получишь вполне работоспособную систему, и искать, что и где добавить, не придется.

Сначала мастер протестирует оборудование, и если найдет устройства сопряжения с аналоговыми линиями, то выведет их список в первом окне. По окончании нажимаем Next, в списке Local Extension выбираем количество цифр, которое будут иметь локальные номера, и в поле First Extension Number - номер, который будет присвоен первому пользователю. Флажок «Allow analog phones…» разрешает номерам с аналоговой линии назначать несколько экстеншенов.

На следующем шаге Service Providers можно указать данные VoIP-провайдера. Нажимаем Add Service Provider, затем в поле Provider Type выбираем тип подключения. Возможны варианты: Analog, VoIP (три предустановленных провайдера) и Custom VoIP. В последнем случае все параметры придется заполнить самостоятельно. В поле Comment добавляем описание, в списке Protocol выбираем протокол sip или iax, в поле Host указываем адрес провайдера и чуть ниже учетные данные. После нажатия на Save в списке List of Service Providers появится новая запись. Нажатие на поле Options откроет меню, в котором можно выбрать кодеки для работы с этим провайдером и расширенные настройки. В Advanced можно дополнительно указать, какой домен будет использоваться в заголовках (fromdomain), изменить название транка, задать Caller ID. Чтобы можно было подключаться извне без ввода пароля, в insecure присваиваем значение invite. Здесь же можно изменить порт сервиса в том случае, если провайдер использует нестандартный номер (SIP – 5060, IAX - 4569). И так далее.

На четвертом шаге предстоит указать правила вызова; так как пока нет диалплана по умолчанию, будет предложено его создать. Дальше идут настройки ящика для работы с голосовой почтой и некоторые его параметры (посылка сообщения на email, максимальное количество сообщений, время записи и другие). Теперь мастер предлагает создать учетную запись пользователя, который будет совершать звонки. И, наконец, на последнем шаге при помощи меню указываем, к каким экстеншенам привязаны входящие звонки. На этом все, нажимаем Finish и попадаем в основное окно программы.

Если ты ранее пробовал настраивать Asterisk при помощи конфигурационных файлов, ты быстро освоишься в AsteriskNOW. Интерфейс логичен и понятен, все настройки находишь именно в тех местах, в которых ожидаешь. Есть, конечно, и свои особенности. Например, создавая учетную запись, сразу отмечаешь, с каким протоколом он может работать: SIP и/или IAX2. Запись о новом пользователе создается в user.conf, а все разрешения указываются при помощи специальных параметров вроде hasiax, hassip, hasvoicemail, назначение которых понятно и без документации.

Интерфейс управления и учета AstBill

В AsteriskNOW функции учета и тарификации звонков развиты еще недостаточно, поэтому если требуется такая функциональность, следует обратиться к продуктам сторонних разработчиков. Для примера возьмем AstBill (astbill.com), который распространяется по лицензии GNU GPL. Система строится при помощи открытых продуктов - Apache, MySQL и Drupal - и позволяет при помощи понятного веб-интерфейса производить основные операции, полный список которых занимает два экрана. Среди них:

  • просмотр информации об учетных записях SIP, IAX, персональный контактный каталог с подкатегориями;
  • поддержка виртуальных учетных записей с возможностью привязки к любому номеру;
  • биллинг, основанный на продолжительности звонка и направлении;
  • вывод баланса, расходов и платежей по каждому счету, звонки в кредит, предоплаченные услуги;
  • отсылка предупреждений о малом количестве средств на указанный email;
  • возможность звонка через GUI и многое другое, чего вполне достаточно для любой SMB-организации или небольшого VoIP-провайдера.

К сожалению, интерфейс не локализован, но человек с базовым английским найдет все необходимое, хотя, возможно, и не сразу, так как функций у AstBill очень много. Кстати, внешний вид можно изменить при помощи тем.

Для установки понадобится сам Asterisk, СУБД MySQL 5.х и веб-сервер Apache 2.x, а Drupal уже входит в состав AstBill, поэтому отдельно устанавливать его не нужно. Проект предлагает демонстрационную версию AstBill Live CD, который построен на базе дистрибутива Dawn Small Linux (о DSL можно прочитать в этом же номере ][. - Прим. редактора) и уже включает все необходимое.

Установка всех дополнительных компонентов уже много раз описывалась как на страницах журнала, так и на многочисленных ресурсах интернета, тем более что при использовании репозитария это пустяковое дело. Поэтому сосредоточимся лишь на том, как ввести в строй AstBill.

Установка AstBill

Для начала подготовим MySQL. Установим пароль администратора (если это не сделано ранее), создадим базу astbill и дадим специальному пользователю astbilluser все необходимые привилегии:

$ mysqladmin --user=root password 'mysql_root_password'

$ mysqladmin --user=root -p create astbill

$ mysql --user root -p

mysql> GRANT ALL PRIVILEGES ON astbill.* TO astbilluser@localhost IDENTIFIED BY 'astbill_db_passwd';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Все, MySQL готов к работе. Чтобы упростить создание таблиц, разработчики предлагают файлы шаблонов, которые доступны в архиве. Получаем последнюю версию AstBill с сайта проекта, распаковываем, установочный скрипт делаем исполняемым:

$ tar jxvf astbill-0.9.22.tar.bz2

$ cd astbill

$ chmod +x install.sh

И создаем таблицы:

$ mysql --user=root -p astbill < ./database/astbill.sql

$ mysql --user=root -p astbill < ./database/astbill_proc.sql

Проверяем, что есть:

$ mysql --user=root –p

mysql> SHOW DATABASES;

+--------------------+

| Database |

+--------------------+

| information_schema |

| astbill |

| mysql |

+--------------------+

3 rows in set (0.01 sec)

mysql> use astbill;

Database changed

mysql> show tables;

Вывод покажет большое количество таблиц. Если все ОК, идем дальше.

$ sudo ./install.sh

На запрос скрипта о продолжении работы вводим yes. Кроме установки AGI-скриптов (Asterisk Gateway Interface - интерфейс взаимодействия с внешними скриптами) и файлов озвучки будут сохранены и конфигурационные файлы уже установленного Asterisk. Кроме этого, будет создан каталог /home/astbill, в нем AstBill ищет свои настройки, если нужные файлы не доступны в каталоге, куда распакован сам биллинг. После работы скрипта корневой каталог astbill находится (в моем случае) в /home/grinder/astbill/wwwroot. Чтобы сделать его видимым веб-серверу, создадим символическую ссылку (есть и другие варианты, это самый простой):

$ ln -s /home/grinder/astbill/wwwroot /var/www/html/astbill

В каталоге astbill находится конфигурационный файл astbill.conf, установки из которого считываются различными Perl- и AJAX-скриптами. Для удобства работы его можно скопировать в /home/astbill. После этого обязательно следует изменить информацию для доступа к БД:

$ sudo mcedit /home/astbill/astbill.conf

emailadd = noreply@grinder.com

company_name = GrinderTelecom

dbhost = localhost

dbname = astbill

dbuser = astbilluser

dbpass = astbill_db_passwd

dbdsn = astbilldns

HostedOn = AstBill

debug = YES

debug2 = NO YES

odbc = NO

odbc2 = YES NO

;

Не знаю почему, но разработчики поленились сделать это для другого файла - settings.php, который находится в wwwroot/sites/default. Открываем и правим внутри параметры для доступа к БД:

$ sudo mcedit /var/www/astbill/sites/default

$db_url = 'mysql://astbilluser:astbill_db_passwd@localhost/astbill';

# И правим путь, если AstBill установлен в каталог веб-сервера с другим именем

$base_url = 'http://127.0.0.1/astbill';

На этот файл есть указания в документации, но пока я не подправил параметры в аналогичном файле из подкаталога 127.0.0.1.astbill, ничего не работало. Также в документации дается совет, предписывающий убедиться, что «$db_prefix = 'pbx_';», иначе AstBill работать не будет. По умолчанию так оно и есть, но на всякий случай не поленись проверить. И, наконец, осталось отредактировать файл /etc/asterisk/res_mysql_conf (он входит в состав Asterisk).

$ sudo mcedit /etc/asterisk/res_mysql_conf

[general]

dbhost = localhost

dbname = astbill

dbuser = astbilluser

dbpass = astbill_db_passwd

dbport = 3306

# Обрати внимание на dbsock, в разных дистрибутивах этот путь отличается

dbsock = /var/run/mysqld/mysqld.sock

На этом все, можно пробовать. Запускаем Asterisk, открываем браузер и заходим на страницу http://127.0.0.1/astbill. Если загрузилась заглавная страница, значит все нормально. В противном случае внимательно читаем описание проблемы, оно довольно содержательное и помогает найти ошибку.

По умолчанию в системе заведены две учетные записи: пользователь с правами администратора (astbill, пароль demoastbill) и обычный пользователь (demo, пароль demoastbill). Первый пользователь, набравший URL, автоматически регистрируется как astbill. Поэтому следует сразу зайти в My account, выбрать вкладку Edit и изменить информацию о своей учетной записи: имя пользователя, email, пароль, статус (Active), роль. Система по умолчанию поддерживает четыре роли, каждая из которых может иметь строго определенные права: Admin, анонимный пользователь, зарегистрированный пользователь и партнер. Вторая и третья в настройках по умолчанию заблокированы. Изменить права можно, зайдя на страницу Administer – Access control. Там же в Roles можно создать новые роли и по имени пользователя или email’у проверить, включена ли учетная запись.

Работа с учетными записями в AstBill построена по нескольким принципам. Это непосредственно аккаунт, который может использоваться отдельным пользователем или быть привязан к клиенту (Customer). Партнеры (Partner) являются подобием групп и могут также включать своих клиентов. Аккаунт создается в Create Account. Здесь ты найдешь все параметры, встречающиеся при создании обычной учетной записи в Asterisk. В отличие от AstersikNOW, здесь возможен выбор только одного типа учетной записи: SIP, IAX2, Virtual Account или H323. Исходящие направления описываются в Provider Trunks, где кроме привычных параметров (учетная запись, узел, метод аутентификации) указывается и стоимость направления.

При необходимости, нажав на DialPlan, можно указать время и день недели, когда будет доступен провайдер. Это позволит задать свои тарифы для разного времени. План тарификации звонков указывается во вкладке «AstBill Admin – Setting – Rate Plans». Оплату звонков можно принимать при помощи предоплаченных Calling Cards, которые создаются в одноименной вкладке. Здесь указывается номер, карты, количество денег, срок годности, статус (Enabled/Disabled) и прочее. Настроек не много, а очень много, поэтому на освоение AstBill некоторое время все же придется потратить, но в результате ты получишь понятную систему биллинга, настроенную под конкретные условия.

Естественно, это не единственное решение. Например, стоит обратить внимание на такую систему биллинга для Asterisk, как A2Billing (trac.asterisk2billing.org/cgi-bin/trac.cgi), которая может быть использована для учета в самых разных ситуациях: традиционное предоставление услуг VoIP, callback-сервис, подсчет трафика партнерами. На сайте проекта доступна демоверсия, поэтому познакомиться с A2Billing можно и без установки.

Биллинг в Asterisk

Для каждого вызова сервер Asterisk генерирует запись CDR (Call Detail Record). По умолчанию вся информация (номер, Caller ID, направление, время начала, вызова, ответа, окончания и прочее) хранится в CSV-файле /var/log/asterisk/cdr-csv. Формат записей, даты и времени определен в файле cdr/cdr_csv.c. Для удобства учета в конфигурационных файлах или при помощи команд можно указать учетные коды (${CDR(accountcode)}), флаги AMA (Automated Message Accounting) на каждый канал или пользователя, которые будут использованы при биллинге. Возможно хранение CDR-информации в базе данных. Поддерживаются SQLite, MySQL, PostgreSQL, unixODBC, MSSQL, Sybase и некоторые другие. При необходимости скрипты для извлечения нужных данных и тарификации разговоров можно написать самому.

Содержание
ttfb: 37.576198577881 ms