воскресенье, 27 мая 2012 г.

Asterisk realtime queue_log

Продолжаем рассказ о подключении к Asterisk 1.8 архитектуры реального времени или как её иначе называют realtime. О получении с использованием realtime конфигурации musiconhold рассказано в предыдущей публикации, если realtime на Asterisk настраивается впервые, рекомендуется обратиться к этой статье для первоначальной настройки. 
На этот раз мы будем подключать queue_log. Как было замечено в предыдущей публикации одним из препятствий с которым приходится сталкиваться при подключении realtime является отсутствии структуры таблицы. Те таблицы что в обилии есть на просторах интернета уже давно не актуальны, а те что идут вместе с исходным кодом Asterisk приходится модифицировать. 

При создании структуры таблицы из поставляемого с исходным кодом Asterisk файла дампа queue_log.sql в лог файле Asterisk у нас появятся ошибки:

“Realtime table queue_log@general: Column time cannot be a datetime res_config_mysql.c: Table queue_log requires a column 'data' of size '0', but no such column exists.
res_config_mysql.c: MySQL RealTime: Failed to insert into database: Unknown column 'data' in 'field list'”

Нам требуется модифицированная SQL таблица которая представлена ниже

CREATE TABLE `queue_log` (
       time varchar(32) default NULL,
       callid char(64) default NULL,
       queuename char(64) default NULL,
       agent char(64) default NULL,
       event char(32) default NULL,
       data char(64) default NULL,
       data1 char(64) default NULL,
       data2 char(64) default NULL,
       data3 char(64) default NULL,
       data4 char(64) default NULL,
       data5 char(64) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Рассмотрим по порядку назначение каждого поля.

time - Дата и время события. С некоторых пор к дате и времени через точку добавляются микросекунды, после этого поле таблицы по понятным причинам уже не может быть SQL формата datetime, меняем формат поля на varchar.
callid - "REALTIME", "NONE", или уникальный идентификатор канала.  
queuename - Имя затронутой очереди пока описанной в конфигурационном файле queues.conf
agent - Одно из значений ADDMEMBER, REMOVEMEMBER, RINGNOANSWER, EXITEMPTY, TRANSFER, AGENTDUMP, ABANDON, SYSCOMPAT, CONNECT, COMPLETECALLER, COMPLETEAGENT, AUSEALL, UNPAUSEALL, PAUSE, UNPAUSE, PENALTY, ENTERQUEUE, EXITWITHTIMEOUT, EXITEMPTY, EXITWITHKEY, или значение определённое пользователем.
data ... data5 - Аргументы связанные с событием описанном в поле event.

В конфигурационном файле логов Asterisk logger.conf по умолчанию идёт настройка таким образом, что как только для queue_log появляется возможность работы с realtime сразу начинается запись в базу данных. Поэтому теперь нам лишь требуется убрать комментарий перед надписью “queue_log => mysql,general” в конфигурационном файле extconfig.conf, выполнить команду из консоли Asterisk “module reload” и можно начинать смотреть данные которые начнут появляться в MySQL таблице queue_log. Файл queue_log находящийся в директории “/var/log/asterisk” нам больше не понадобится и его можно удалить.

суббота, 26 мая 2012 г.

Asterisk realtime

Что нам стоит “Asterisk realtime” построить!


Настройка Asterisk с использованием текстовых конфигурационных файлов приемлема на начальных этапах эксплуатации, но ещё более удобна настройка с использованием какой либо распространённой базы данных. В данной публикации будет рассмотрена работа с использованием архитектуры реального времени “Asterisk Realtime Architecture” или просто realtime.
Realtime существует в двух типах - статическом и динамическом. Статический тип похож на метод чтения из конфигурационного файла, только в данном случае все значения конфигурационного файла у нас находятся в базе данных. Чтобы заполучить изменённую конфигурацию при статическом типе realtime требуется перезагрузить модули командой “module reload” из консоли сервера Asterisk. Динамический же тип realtime, напротив, получает требуемую конфигурацию сразу по мере необходимости без какой либо перезагрузки модулей.

В интернете находится разрозненная информация о том как настроить realtime применительно к ранним версиям Asterisk. В открывающемся цикле статей я буду обобщать свой опыт настройки Asterisk realtime. Будет рассмотрено использование архитектуры реального времени на примере LTS версии Asterisk 1.8 с использованием дистрибутива CentOS 5.x при подключении к MySQL базе данных.

Настройка сервера Asterisk

Конфигурация Asterisk realtime находится в трёх файлах - extconfig.conf, res_config_mysql.conf и cdr_mysql.conf.

extconfig.conf отвечает за realtime конфигурацию iaxusers, iaxpeers, sippeers, sipregs, voicemail, extensions, meetme, queues, queue_members, musiconhold, queue_log и ряда файлов со статическим типом конфигурации. Все эти записи закрыты комментариями, мы будем убирать комментарии по ходу настройки и создания соответствующих таблиц в базе данных MySQL.
Надо заметить что изменился формат записей по отношению к предыдущим версиям Asterisk. Если в ранних версиях для настройки realtime формат записи был: “<family name> => <driver>,<database name> [,table_name]”, то теперь он стал “<family name> => <context> [,table_name]”. Как мы видим перечисления “driver” и “database name” представлены как отдельный “context”. Описание контекста находится в файле “res_config_mysql.conf”, при конфигурации по умолчанию контекстом у нас является “general”. Необязательное значение “[table_name]” не указывается в случае если “<family name>” совпадает с именем таблицы создаваемой в базе MySQL.

res_config_mysql.conf отвечает за подключение к MySQL базе данных. Разберём конфигурацию подключения. При просмотре файла мы видим следующие записи, практически все они закрыты комментариями.
[general]
;dbhost = 127.0.0.1
;dbname = asterisk
;dbuser = myuser
;dbpass = mypass
;dbport = 3306
;dbsock = /tmp/mysql.sock
;dbcharset = latin1
;requirements=warn ; or createclose or createchar
Требуется снять комментарии со всех вышеприведённых строчек, за исключением “dbsock = /tmp/mysql.sock” и изменить значения записей dbuser, dbpass и dbcharset на те значения что использовали при создании базы данных.

Предполагается что сервер MySQL у нас уже установлен, сконфигурирован под хранилище “InnoDB” и использует кодировку “utf8”. Поэтому подключившись пользователем root к серверу MySQL, создаём базу данных и пользователя.
CREATE DATABASE asteriskdb;
GRANT ALL PRIVILEGES ON asteriskdb.* TO 'asterisk'@'localhost' IDENTIFIED BY 'mypass' WITH GRANT OPTION;
flush privileges;
После подключения к консоли сервера Asterisk и применения новой конфигурации проверяем соединение с базой.
module reload
realtime mysql status
general connected to asteriskdb@127.0.0.1, port 3306 with username asterisk for 1 days, 1 hours.
cdr_mysql.conf отвечает за подключение к базе данных MySQL при использовании записи звонков (Call Detail Records). Используется для статистики звонков или основанного на CDR биллинга звонков. По умолчанию запись звонков ведётся в CSV файл “/var/log/asterisk/cdr-csv/Master.csv”. При просмотре файла мы видим записи похожие на те что были в конфигурационном файле res_config_mysql.conf.
;[global]
;hostname=database.host.name
;dbname=asteriskcdrdb
;table=cdr
;password=password
;user=asteriskcdruser
;port=3306
;sock=/tmp/mysql.sock
;timezone=UTC ; Previously called usegmtime
Теперь, так же как и ранее в файле res_config_mysql.conf нам требуется снять комментарии со всех вышеприведённых строчек, за исключением “sock = /tmp/mysql.sock” и изменить значения записей hostname, dbname, password и user на те значения что использовали при создании базы данных.

Перезагружаем сервер Asterisk и после подключения к консоли сервера проверяем соединение с базой.
cdr mysql status
Connected to asteriskdb@127.0.0.1, port 3306 using table cdr for 1 hours, 22 minutes, 39 seconds.”

Подготовка MySQL таблиц


Итак, настройка сервера произведена и теперь в базе данных MySQL создаём таблицы с требуемыми полями. К сожалению тут не всё так просто, дело в том что от версии к версии Asterisk поля меняются. Те MySQL таблицы которые можно найти в интернете от ранних версий Asterisk уже не подходят к современным версиям Asterisk и приходится их дорабатывать. Ситуация осложняется и тем что дорабатывать приходится даже те MySQL таблицы которые идут вместе с исходным кодом Asterisk и находятся в директории “asterisk-1.8.x.x/contrib/realtime/mysql”. Дело это поправимо, благо изменений в MySQL таблицах много не требуется и готовые к использованию таблицы будут представлены далее.

Asterisk musiconhold realtime


В качестве примера начнём с лёгкого на мой взгляд варианта, такого как перенос значений конфигурационного файла musiconhold.conf в базу данных MySQL. Чтобы создать требуемую таблицу воспользуемся следующей SQL командой:
CREATE TABLE musiconhold (
       name char(80) not null primary key,
       mode char(80) null,
       directory char(255) null,
       application char(255) null,
       digit char(1) null,
       sort char(10) null,
       format char(10) null,
       stamp timestamp
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Рассмотрим по порядку назначение каждого поля. Те значения которые указаны в конфигурационном файле musiconhold.conf будем указывать как значения по умолчанию.

name - имя MOH класса (‘default’ по умолчанию). 
mode - одно из значений “'custom', 'files', 'mp3nb', 'quietmp3nb' или 'quietmp3' (‘files’ по умолчанию)
directory - Указывается директория с файлами которые требуется проигрывать, возможно также указать поток или URL. Если значение mode установлено в ‘custom’ директория игнорируется. (‘/var/lib/asterisk/moh’ по умолчанию)
application - Запускается приложение которое предоставляет MOH в случае если значение mode установлено в ‘custom’. В противном случае игнорируется. (‘null’ по умолчанию)
digit - Цифра соответствующая классу MOH, в том случае если MOH возможно выбрать звонящему абоненту. (‘null’ по умолчанию)
sort - Порядок проигрывания файлов, одно из значений 'random' or 'alpha'. В случае если значение отсутствует устанавливается порядок в котором отображаются файлы в директории. (‘null’ по умолчанию)
format - Указывается формат воспроизводимого аудио файла в случае если значение mode установлено в ‘custom’. Форматом аудио файла по умолчанию является SLIN, “16 bit Signed Linear PCM” (‘null’ по умолчанию)
stamp - Временная метка модификации записи.

После этого в конфигурационном файле musicinhold.conf комментируем все записи, а в конфигурационном файле extconfig.conf напротив, убираем комментарий у записи “musiconhold => mysql,general”. Зайдя на консоль asterisk выполняем команду “module reload”. Перезагрузка модулей требуется для перемещения конфигурации из файла musiconhold.conf в базу данных MySQL.

Проверяем, у нас должна звучать та же музыка по ожиданию что была ранее описана в конфигурационном файле musiconhold.conf

Продолжение рассказа о работе с Asterisk realtime в следующих публикациях которые можно отыскать по тегам.

понедельник, 7 мая 2012 г.

Lanbilling с asterisk 1.8

После публикации статьи "Офисная АТС на Asterisk малой кровью или бюджетный способ получить мини АТС с функциями серьезной станции"  много воды утекло и много чего поменялось. Появлялись новые версии программного обеспечения, менялись способы их развёртывания.. В данной заметке я хочу обобщить свой опыт в вопросе интеграции биллинговой системы Lanbilling 1.8 с сервером asterisk 1.8 и далее дополнить статью информацией по связке asterisk 1.8 с Lanbilling 2.0

Сервер asterisk версий 1.4.x и 1.6.x снят с технической поддержки 21.04.2012, это значит что более не будет исправления проблем связанных с безопасностью и любая уязвимость ставит под угрозу работу предприятия которое обслуживается сервером указанных версий. Вместо этих версий предлагается воспользоваться LTS релизом сервера asterisk с версией 1.8, вот тут и начинаются сложности, потому что связка Lanbilling 1.8 - (agi скрипт авторизации и perl скрипт аккаунтинга) - asterisk 1.8 не работает. Это поправимо, сейчас мы во всём разберёмся.

Начинаем процесс установки с нуля, те у кого уже установлена рабочая система с lanbilling, asterisk 1.2 или asterisk 1.4, соответствующими скриптами авторизации и аккаунтинга могут сразу переходить к разделу "Обновление до asterisk 1.8 на рабочей системе".

 Установка asterisk 1.8 с нуля

Решать вопрос будем на дистрибутиве CentOS, на настоящий момент последняя версия 5.8, архитектура i386. По ходу установки дистрибутива создаём пользователя "asterisk". Далее переходим к установке соответствующих версий программного обеспечения. 

Установка биллинговой системы достаточно подробно описана в документации Lanbilling 1.8, рекомендуется ей воспользоваться при возникновении вопросов по биллинговой системе.

Для предварительного тестирования связки Lanbilling 1.8 - (agi скрипт авторизации и perl скрипт аккаунтинга) - asterisk 1.8 рекомендуется воспользоваться демонстрационными версиями Lanbilling 1.8

Устанавливаем защиту основных веток репозитория:

$sudo yum install yum-protectbase

Убеждаемся что в файле /etc/yum/pluginconf.d/protectbase.conf директива enabled=1. В файле /etc/yum.repos.d/CentOS-Base.repo устанавливаем protect=1 для разделов [base] и [updates]

Нам требуется установить сервер asterisk 1.8, для этого подключаем репозитории которые появились у компании Digium:

$sudo wget /etc/yum.repos.d/ http://packages.asterisk.org/centos/centos-asterisk.repo
$sudo wget /etc/yum.repos.d/ http://packages.digium.com/centos/centos-digium.repo

также нам потребуется репозиторий rpmforge для получения дополнительных пакетов:

$sudo rpm -ivh http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
После выполнения команд:
$sudo yum clean all
$sudo yum update
У нас в директории /etc/yum.repos.d/ должны появиться дополнительные конфигурационные файлы отвечающие за соответствующие версии asterisk. В файлах centos-asterisk-1.4.repo и centos-digium-1.4.repo директиву enabled=1 меняем на enabled=0, а в файлах centos-asterisk-1.8.repo и centos-digium-1.8.repo напротив, ставим enabled=1.

Устанавливаем asterisk 1.8
$sudo yum clean all
$sudo yum install asterisknow-version, asterisk-configs, asterisk-core, asterisk-doc, asterisk-voicemail, asterisk-sounds-moh-opsound-alaw, asterisk-sounds-core-en-ulaw, asterisk-sounds-core-en-alaw
В случае если у нас установлена плата расширения от Digium устанавливаем пакеты:
$sudo yum install asterisk-dahdi, dahdi-tools, dahdi-tools-doc
Добавляем переменные AST_USER="asterisk" и AST_GROUP="asterisk" в файл /etc/rc.d/init.d/asterisk 

Обновление до asterisk 1.8 на рабочей системе

Тем у кого уже имеется установленная рабочая система требуется сначала удалить asterisk 1.2.x или 1.4.x, а также в случае наличия карт расширения от компании Digium и соответствующие пакеты dahdi.
Проверяем корректность установленных пакетов

$sudo yum install yum-utils
$sudo package-cleanup --orphans
Удаляем пакеты из представленного списка и устанавливаем их правильные версии (yum remove, yum install) за исключением пакета(ов) которые начинаются с LB*. Это файлы биллинговой системы.

Устанавливаем asterisk 1.8
$sudo yum clean all
$sudo yum install asterisknow-version, asterisk-configs, asterisk-core, asterisk-doc, asterisk-voicemail, asterisk-sounds-moh-opsound-alaw, asterisk-sounds-core-en-ulaw, asterisk-sounds-core-en-alaw
В случае если у нас установлена плата расширения от Digium устанавливаем пакеты:
$sudo yum install asterisk-dahdi, dahdi-tools, dahdi-tools-doc
В дальнейшем можно поместить пользователей описанных в конфигурационных файлах в базу данных, для этого можно сразу установить пакеты:
$sudo yum install asterisk-addons-mysql

Настройка RADIUS авторизации и аккаунтинга

Устанавливаем пакеты:
$sudo yum install freeradius2
$sudo yum install perl-Crypt-CBC, perl-Crypt-DES, perl-RadiusPerl, perl-MD5
Устанавливаем пакет asterisk-perl:
$cd
$wget http://asterisk.gnuinter.net/files/asterisk-perl-1.03.tar.gz
$tar -zxvf asterisk-perl-1.03.tar.gz
$cd asterisk-perl-1.03/
$perl Makefile.PL
$make all
$sudo make install
Адаптируем RADIUS клиент с версии Asterisk 1.4 на работу с версией asterisk 1.8:

В новой версии Asterisk изменились события по которым происходит работа через интерфейс manager, так же есть ряд изменений по AGI интерфейсу.

$tar -zxvf radiusclient-1.8.tar.gz
Копируем agi-rad-auth.agi
$sudo cp agi-rad-auth.agi /var/lib/asterisk/agi-bin/
Копируем ast-rad-acc.pl
$sudo cp ast-rad-acc.pl /usr/sbin/
Для работы RADIUS клиента также необходим изменённый словарь (radius dictionary) который распаковываем в директорию /etc/raddb/

Настройка asterisk 1.8

Все конфигурационные файлы asterisk находятся в директории /etc/asterisk В файл modules.conf Добавляем загрузку модуля res_agi.so:
load => res_agi.so
Копируем файлы extension.conf, manager.conf, sip.conf из архива radiusclient-1.8.tar.gz в директорию /etc/asterisk Запускаем asterisk
$sudo service asterisk restart
Запускаем скрипт аккаунтинга:
$/usr/sbin/ast-rad-acc.pl
Заходим в консоль управления сервером, настраиваем SIP телефоны и делаем тестовый звонок и смотрим лог звонка в биллинговой системе Lanbilling:
$asterisk -r