Часть статьи «Звездные счета» опубликованной в февральском номере журнала
В AsteriskNOW функции учета и тарификации звонков развиты еще недостаточно, поэтому если требуется такая функциональность, следует обратиться к продуктам сторонних разработчиков. Для примера возьмем AstBill
Среди них:
— просмотр информации о SIP, IAX учетных записей, персональный контактный каталог с подкатегориями;
— поддержка виртуальных учетных записей, с возможностью привязки к любому номеру;
— биллинг, основанный на продолжительности звонка и направлении;
— вывод баланса, расходов и платежей по каждому счету, звонки в кредит, предоплаченные услуги;
— отсылка предупреждений о малом количестве средств на указанный e-mail;
— возможность звонка через GUI.
И многое другое, чего вполне достаточно для любой SMB организации или небольшого VoIP провайдера. К сожалению, интерфейс не локализован, но человек с базовым английским найдет все необходимое, хотя, возможно, и не сразу, так как функций у AstBill очень много. Кстати, внешний вид можно изменить при помощи тем.
Для установки понадобится сам Asterisk, СУБД MySQL 5.х и веб-сервер Apache 2.x, а Drupal уже входит в состав AstBill, поэтому отдельно устанавливать его не нужно. Проект предлагает демонстрационную версию AstBill Live CD, который построен на базе дистрибутива Dawn Small Linux и включающий уже все необходимое.
Установка всех дополнительных компонентов уже много раз описывалась как на страницах журнала, так и на многочисленных ресурсах Интернет, тем более при использовании репозитария — это пустяковое дело. Поэтому сосредоточимся лишь на том, как ввести в строй 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 работать не будет. По умолчанию оно так и есть, но на всякий случай не поленись, проверь. И, наконец, остался последний файл, но уже входящий в состав Asterisk — /etc/asterisk/res_mysql_conf, в котором нужно сделать то же самое.
$ sudo mcedit /etc/asterisk/res_mysql_conf
[general]
dbhost = localhost
dbname = astbill
dbuser = astbilluser
dbpass = astbill419
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 и изменить информацию о своей учетной записи – имя пользователя, e-mail, пароль, статус (Active), роль. Система по умолчанию поддерживает четыре роли, каждая из которых может иметь строго определенные права: Admin, анонимный пользователь, зарегистрированный пользователь и партнер. Вторая и третья в настройках по умолчанию заблокированы. Изменить права можно, зайдя на страницу Administer – Access control. Там же в roles можно создать новые роли и проверить, включена ли учетная запись по имени пользователя или e-mail.
Работа с учетными записями в 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
Биллинг в 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, MS SQL, Sybase и некоторые другие. При необходимости можно самому написать скрипты для извлечения нужных данных и тарификации разговоров.
//
Спасибо огромное за предоставленную инструкцию/ установка прошла на ubuntu 7.10 asterisk 1.4.10 deb + asterisk-mysql + asterisk-addons. Astabill — демо версия?
//
Нет
//
все сделал как написано по инструкции. Хотел создать учетную запись администратора. ничего не получилось — учетная запись просто не появляется после применения настроек.
//
Ставится как и положено, что-то не то делаешь.
//
Сделал по инструкции. Постоянно просит ввести логин и пароль при переходе с одной вкладки на другую
//
2pawlo
А куки в браузере включены?
//
Та же проблема
//
You have just to modify 2 functions in 2 files.
/wwwroot/includes/database.mysql.inc
//————————————————————
function db_connect($url) {
$url = parse_url($url);
// Allow for non-standard MySQL port.
if (isset($url[‘port’])) {
$url[‘host’] = $url[‘host’] .’:’. $url[‘port’];
}
$connection = mysql_connect($url[‘host’], $url[‘user’], $url[‘pass’], TRUE) or die(mysql_error());
mysql_select_db(substr($url[‘path’], 1)) or die(‘unable to select database’);
// *** add this here ***
register_shutdown_function(‘session_write_close’);
// *********************
return $connection;
}
//—————————————————————
/wwwroot/includes/session.inc includes/session.inc
//—————————————————————
function sess_read($key) {
global $user;
$result = db_query_range(«SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = ‘%s’ AND u.status roles = array();
// ******** add this here *********
register_shutdown_function(‘session_write_close’);
// ********************************
$result = db_query(«SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = %d», $user->uid);
while ($role = db_fetch_object($result)) {
$user->roles[$role->rid] = $role->name;
}
return !empty($user->session) ? $user->session : »;
}
//————————————————————-
//
До версии php 5.2 все работает нормально
у меня 5.1.29 — все Ok
//
Нет ли у astbill ограничения на количество одновременных звонков? На живой системе как то не хочется тестить
//
Это бессмысленная штука, т.к. она для биллинга пользуется cdr записями, которые сформировал asterisk. А он их сами знаете как формирует — все хорошо, пока трансферы не начнутся…