Asterisk RealTime


Введение

из файла doc/README.extconfig:


Механизм конфигурации для Asterisk использущий внешние хранилища данных - это результат работы Anthony Minessale II, Mark Spencer и Constantine Filin. Этот механизм разработан для того, чтобы обеспечить легкую и единообразную интеграцию между конфигурационными структурами, которые используются в Asterisk и внешними SQL базами данных (однажды может быть и с LDAP).

Внешние источники для конфигурации описываются в файле /etc/asterisk/extconfig.conf , что позволяет Вам использовать вместо любого конфигурационного файла, данные полученные из базы данных (static mappings), или вместо специальных конфигурационных записей, которые могут требовать частого изменения в реальном времени, использовать полученные из базы данные для динамического создания этих объектов, записей, пиров и т.д. без необходимости перезагрузки,


Внимание: для работы RealTime необходима версия asterisk 1.2.* и выше. Если вы попытаетесь использовать это расширение со стабильной версией Asterisk (например: 1.0.9 или более ранние), то это расширение работать не будет. (в данных версиях нет поддержки механизма realtime)


cd <место, где будет создана директория asterisk с исходниками>
cvs -d :pserver:anoncvs@cvs.digium.com:/usr/cvsroot login (в поле пароля ввести: anoncvs)
cvs -d :pserver:anoncvs@cvs.digium.com:/usr/cvsroot co -r HEAD asterisk




Как это работает

В новой архитектуре RealTime, весь код, который привязан к конкретной базе данных, вынесен в отдельные драйвера для каждой конкретной базы данных. Сами обработчики каналов просто вызывают обобщенные функции для получения данных или их занесения в базу данных. Это, с точки зрения программирования, более простой и удобный способ использования этого механизма в разных программных модулях.

Доступ к базе данных осуществляется при помощи трех функций:
  • STATIC: Используется для загрузки статической конфигурации, когда модуль загружается
  • REALTIME: Используется для получения данных при вызове (или других событиях)
  • UPDATE: Используется для изменения данных объекта в базе данных

Поддержка статической загрузки из баз данных в конфигурации каналов существенно ничего не меняет. Есть "нормальные" (описанные в файле) статические peers/users и полученные из базы peers/users. Статические объекты, независимо от того, определены ли они из текстового файла конфигурации или получены из базы данных, сохраняются в памяти и, например в случае с SIP каналом, мы можем описать пиры, находящиеся за NAT, а так же у нас будет работать индикация наличия сообщений в голосовом почтовом ящике для статически описанных пиров.

Записи полученные из базы о peers/users в режиме RealTime не хранятся долго в памяти. Они загружаются только тогда, когда у нас есть какой-либо вызов и после этого удаляются из памяти. Как следствие этого есть некоторые проблемы с поддержкой функционирования клиентов, которые работают через NAT: keep-alives (qualify=) или индикация о новых сообщениях в voicemail для данных пиров не будут работать без специальных мер по кэшированию этих записей.

Примечание: Начиная с 16-03-2005 в CVS-HEAD 3/16/05, если вы включите кэширование данных полученных через RealTime в Вашем файле sip.conf, iax.conf Voicemail MWI работает, а так же работают команды типа: 'sip show peers' - смотри описание параметра: rtcachefriends=yes


In laymans terms

В стабильных 1.0.X версиях Asterisk, хранение в базе данных статических настроек конфигурации и параметров было реализовано путем кодирования процедур соединения к базам данных и запросов к ней прямо в самих модулях. Самый наглядный пример этого - это исходники app_voicemail, где Вы можете видеть код для MySQL и код для PostgreSQL , все это вперемешку с кодом модуля app_voicemail .

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

Файлы и термины

  • Драйвер - скомпиленный модуль, содержащий код специфичный для конкретной базы данных, который позволяет совершать операции, необходимые для работы механизма RealTime . На данный момент доступны драйвера только для ODBC и MySQL (из пакета asterisk-addons) .
  • конфигурационное семейство (Family) - Имя, которое ассоциировано с вызовами через механизм RealTime . Например: sippeers, sipusers, voicemail.
  • extconfig.conf - файл конфигурации, содержащий информацию необходимую для связи определенного конфигурационного семейства с определенным драйвером.
  • res_odbc.conf - Файл конфигурации для ODBC RealTime.
  • res_mysql.conf - Файл конфигурации для MySQL RealTime.
  • ODBC - Open DataBase Connectivity
  • MySQL - the world's most popular open source database

На текущий момент есть только два метода использования механизма RealTime : ODBC и MySQL. Да, Вы можете использовать и ODBC для работы с MySQL и множество других баз данных, работа с которыми поддерживается в ODBC.

Замечание

Использование PostgreSQL с механизмом RealTime.

Как сконфигурировать RealTime - Метод с ODBC

(Данное описание подразумевает, что у Вас на сервере уже установлен ODBC.)
Когда Вы начинаете компилировать Asterisk, Makefile, тот что в директории res/ , должен определить инсталированно ли у Вас ODBC и если это так, то для Вас будет скомпилирован модуль res_config_odbc.so .
Открываем файл /etc/asterisk/res_odbc.conf и конфигурируем Ваше соединение с ODBC. В файле asterisk/configs/res_odbc.conf.sample Вы можете найти некоторые примеры конфигурации.
Примечание: файл res_config_odbc.conf - более не используется и не загружается.

Далее идем к параграфу 'Extconfig'

Как сконфигурировать RealTime - метод с MySQL

(Данное описание подразумевает, что у Вас на сервере уже установлен клиент MySQL, как библиотека для линковки, так и .h фалы необходимые для компиляции.)
Сначала возьмем исходники asterisk-addons из CVS:

cd <место, где будет создана директория asterisk-addons с исходниками>
cvs -d :pserver:anoncvs@cvs.digium.com:/usr/cvsroot login (в поле пароля ввести: anoncvs)
cvs -d :pserver:anoncvs@cvs.digium.com:/usr/cvsroot co asterisk-addons


Потом идем в поддиректорию asterisk-addons подправляем Makefile под свои нужды и делаем 'gmake; gmake install'. (Эта процедура также скомпилирует и установит другие дополнения, которые содержаться в этом пакете, если они Вам без надобности, тогда просто в этой директории запустите 'gmake' и после успешной компиляции вручную скопируйте файл res_config_mysql.so в директорию, где находятся Ваши модули для asterisk.)
Далее, скопируем asterisk-addons/configs/res_mysql.conf.sample в /etc/asterisk/res_mysql.conf (или в другое место, где лежат Ваши настройки для asterisk)
Отредактируйте этот файл согласно Вашим настройкам. В данный момент драйвер MySQL поддерживает несколько баз данных на одном сервере, но может использовать только один MySQL сервер для работы.

Теперь надо отредактировать файл /etc/asterisk/extconfig.conf

Extconfig - Статическая конфигурация

Статическая конфигурация позволяет Вам хранить настройки из регулярных файлов конфигурации (*.conf) в базе данных . Данные конфигурации считывается из базы, когда Asterisk стартует или перегружается. Некоторые модули могут перечитывать свою конфигурацию из базы, когда приходит команда на перезагрузку их конфигурации (Например: "sip reload").

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

=> , [ ,table_name ]
queues.conf => odbc,asterisk,ast_config
sip.conf => mysql,asterisk


В вышеприведенном примере мы имеем два примера. Первый пример связывает конфигурационный файл 'queues.conf' с таблицей 'ast_config', которая находится в базе данных 'asterisk', используя драйвер ODBC.
Второй пример связывает конфигурацию 'sip.conf' с таблицей 'sip.conf' (т.к. мы не определили имя таблицы, то по умолчанию будет использовано имя файла для ее названия) из базы данных 'asterisk', используя драйвер MySQL.
Если использовать эти примеры, то, когда будет загружаться app_queue.so, RealTime драйвер ODBC будет выполнять запросы и получать необходимую информацию. То же самое будет и при загрузке chan_sip.so, только будет использоваться драйвер MySQL.

Extconfig - конфигурация для RealTime объектов

Конфигурация для RealTime , которая описывается в этом разделе, описывает конфигурацию объектов, которая считывается и изменяется в режиме реального времени.

Пример: Предположим, что у Вас есть 2 SIP пользователя, определенных в файле sip.conf и Вы хотите добавить третьего пользователя. Тогда Вам необходимо добавить его описание в файл sip.conf и в asterisk консоли выполнить команду 'sip reload'. Эта команда заставляет asterisk перечитать Ваш файл sip.conf и это даст возможность Вашему третьему пользователю зарегистрироваться.
С RealTime в режиме конфигурации в реальном времени, все что Вам надо - это добавить одну новую запись в таблицу, с которой связана конфигурация sipusers. В этом случае перегружать ничего не надо.

Описание RealTime конфигурации в реальном времени производится в следующем формате:

=> , [ ,table_name ]
sippeers => mysql,asterisk,sip_peers
sipusers => mysql,asterisk,sip_users
queues => mysql,asterisk,queue_table
queue_members => mysql,asterisk,queue_member_table
voicemail => mysql,test


Выше мы имеем четыре примера. Первый связывает конфигурационное семейство "sippeers" с таблицей "sip_peers" в базе данных "asterisk" используя драйвер MySQL. Последний пример связывает конфигурационное семейство "voicemail" с таблицей "voicemail" (т.к. мы опустили имя таблицы, то по умолчанию будет использовано имя конфигурационного семейства) в базе данных "test" используя драйвер MySQL.

Стоит отметить, что sipusers и sippeers могут быть связаны с одной и той же таблицей, если Вам так нужно.

Обратите внимание: что файл extconfig.conf перечитывается каждый раз, когда вы подключаетесь к CLI asterisk.


Данный раздел показал Вам как сделать, чтобы Ваша конфигурация считывалась из базы данных. Теперь самое время создать сами таблицы. Т.к. описания таблиц различаются для каждого конфигурационного семейства (family), подробные описания для каждого семейства вынесены в отдельные описания.



Примечание: При создании таблиц, я помимо полей, необходимых для работы самого механизма RealTime, добавил некоторые поля, которые используются только в моем FrontEnd (на php) для управления конфигурацией. Это такие поля как:

  • Дата и время когда была создана запись.
  • Кто (под каким логином) создал запись.
  • Когда и кем последний раз вносились изменения в запись.
  • Коментарий к записи (описание).
  • И кое-где я еще использовал поле, предназначенное для сортировки записей.

Mysql версии 4.1*: Если у Вас используется данная версия mysql сервера, то у Вас могут возникнуть некоторые проблемы с кодировками. Небольшой FAQ на эту тему можно найти тут: http://phpclub.ru/faq/Mysql41Rus


Выводы

Механизм RealTime довольно неплох. С помощью web интерфейса Вы можете, например, дать Вашим сотрудникам ограниченные права на редактирование плана набора без необходимости перезагрузки и доступа к другим частям asterisk.

Механизм RealTime на данный момент поддерживается для следующих конфигурационных семейств (Family):
  • sippeers
  • sipusers
  • iaxpeers
  • iaxusers
  • voicemail
  • queues и queue_members (используются вместе для приложения Queue).
  • extensions
Примечание: Имя семейства (family) для описания расширений, описанных при помощи RealTime , может быть выбрано по Вашему желанию. Для более детальной информации, смотрите раздел: Asterisk Realtime Extensions .

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



Ссылки по теме: