Asterisk_Realtime

Страшная тема, из разряда эзотерических, но мне почему-то нравится это дело.
Без лишних слов приступим
На повестке дня:
I. Realtime over ODBC
A. extconfig.conf
B. Static Realtime
C. Dynamic Realtime
II. Realtime w/o ODBC
От слов к делу:

I.
Есть два режима работы Asterisk Realtime Architecture(ARA): статическая и динамическая.
Статическая подобна режиму хранения в обычных файлах. Сделав изменения в таких файлах нужно передергивать модуль.
Динамический метод загружает, обновляет информацию когда это необходимо.
Настройка реалтайма производится в файле extconfig.conf. В файле указывается откуда и что загружать.
В этой статье описано как подключить ODBC
Коннектор создан к базе подключаемся — отлично!

I.A.Хотелось бы упомянуть о extconfig.conf и его необычные особенности

Подгружать статическую конфигурацию:

 
file.conf => driver,database[,table[,priority]]

Указывает откуда читать файл конфигурации(драйвер БД, БД, Таблицу или использует имя файла вместо названия таблицы, если не указано)

queues.conf => odbc,asterisk,ast_config

Файлы которые НЕ МОГУТ быть загружены из Realtime хранилища
asterisk.conf
extconfig.conf (этот файл)
logger.conf
Некоторые файлы могут быть загружены если будет использоваться предзагрузка модулей, в modules.conf используя ‘preload’
manager.conf
cdr.conf
rtp.conf

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

example => odbc,asterisk,alttable,1
example => mysql,asterisk,alttable,2
example2 => ldap,"dc=oxymium,dc=net",example2

Доступные движки доступа к БД:
odbc … res_config_odbc
sqlite … res_config_sqlite
pgsql … res_config_pgsql
mysql … res_config_mysql
curl … res_config_curl
ldap … res_config_ldap

Ахтунг: res_config_pgsql res_config_mysql и res_config_sqlite настраиваются в своих собственных файлах, и игнорируют настройки в этом файле.
Пример подключения:

iaxusers => odbc,asterisk
iaxpeers => odbc,asterisk
sippeers => odbc,asterisk
sipregs => odbc,asterisk ; (ограничить sipregs, если возможно, например используя представления)
voicemail => odbc,asterisk
extensions => odbc,asterisk
meetme => mysql,general
queues => odbc,asterisk
queue_members => odbc,asterisk
musiconhold => mysql,general
queue_log => mysql,general

Для активации реалтайм диалпана вы должны включить его в каждый соответствующий контект с помощью switch Синтаксис:

      switch => Realtime/[[[email protected]]tablename]/<opts>

Опция p — запрещает запросы к бд с шаблонами экстеншенов. Если у Вас нет шаблонов в определенном контексте это немного сохранит Вам ресурсы ЦПУ.
НО использование динамических диалпланов не рекомендуется, лучше использовать включения с помощью func_odbc из статического диалплана.

Настраиваем статический метод.
I.B.
Стандартный вид записи в файле extconfig.conf

filename.conf => driver,database[,table]

Если не задано имя таблицы, то в качестве названия таблицы используется имя файла.
Для статического метода используется специальный формат таблицы. Столбцы которые должны присутствовать в таблице вашей БД.

Название колонки Тип колонки Описание
id посл,автоинкремент уникальный идентификатор строки в таблице
cat_metric целое Значимость категории в файле. Чем ниже тем выше появляется в файле, подробнее дальше
var_metric целое Значимость категории в категории. Чем ниже тем выше появляется в категории, подробнее дальше. Полнезно, например, при указании порядка кодеков в sip.conf, когда нужно поставить disallow=all первым(метрика 0), далее allow=ulaw (метрика 1), потом allow=gsm (метрика 2).
filename Varchar 128 Имя файла модуля, который будет считываться с диска (напр musiconhold.conf, sip.conf, iax.conf, итд).
category Varchar 128 Название раздела в файле, например [general]. Не вкл квадратные скобки когда сохр в БД
var_name Varchar 128 Левая часть Опции от знака равно(например disallow в var_name в disallow=all).
var_val Varchar 128 Правая часть Опции от знака равно(например all в var_name в disallow=all).
commented Целое Любое значение, отличное от 0 будет расценено, так если бы оно начиналось с запятой в обычном файле (закомментировано).

Метрика задает порядок чтения данных в память. Можно представить cat_metric и var_metric как номер строки в обычном файле. Более лучшее Наибольшее значение cat_metric обрабатывается первым, потому что Астер читает категории снизу вверх,а в категории наименьшее var_metric обрабатывается первым, (например у disallow=all должно быть значение ниже чем у allow опций, чтобы быть уверенным что disallow=all будет прочитано первым).
Для примера проведем все эти манипуляции с файлом musiconhold.conf

$ cd /usr/local/etc/asterisk
$ mv musiconhold.conf musiconhold.conf.old

Выгрузим старый модуль(только рестарт всего астера помогает) и проверим класы:

*CLI> core restart now
*CLI> moh show classes
*CLI>

Создаем базу:

CREATE TABLE IF NOT EXISTS `ast_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_metric` int(10) DEFAULT NULL,
  `var_metric` int(10) DEFAULT NULL,
  `filename` varchar(128) DEFAULT NULL,
  `category` varchar(128) DEFAULT NULL,
  `var_name` varchar(128) DEFAULT NULL,
  `var_val` varchar(128) DEFAULT NULL,
  `commented` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB;

Добавляем записи:

INSERT INTO ast_config (filename,category,var_name,var_val)
  VALUES ('musiconhold.conf','default','mode','files');

INSERT INTO ast_config (filename,category,var_name,var_val)
  VALUES ('musiconhold.conf','default','directory','/usr/local/share/asterisk/moh');

Проверяем:

mysql> SELECT filename,category,var_name,var_val FROM ast_config;
+------------------+----------+-----------+-------------------------------+
| filename         | category | var_name  | var_val                       |
+------------------+----------+-----------+-------------------------------+
| musiconhold.conf | default  | mode      | files                         |
| musiconhold.conf | default  | directory | /usr/local/share/asterisk/moh |
+------------------+----------+-----------+-------------------------------+
2 rows in set (0.00 sec)

Правим extconfig.conf
Говорим что для musiconhold.conf будем использовать odbc, и коннектор который называется asterisk(в res_odbc.conf), читать будем с таблицы ast_config.

musiconhold.conf => odbc,asterisk,ast_config

Пример с MOH не самый удачный для работы со статикой(много граблей), ведь есть уже готовое семейство для динамики, и там присутствует MOH.
Как по мне статический метод немного неудобен, поэтому переходим к динамическому
I.C. Динамический метод

MySQL_CDR
Создаем файлик cdr.sql след содержания:

CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`userfield` varchar(255) NOT NULL default '',
`uniqueid` VARCHAR(32) NOT NULL default '',
`linkedid` VARCHAR(32) NOT NULL default '',
`sequence` VARCHAR(32) NOT NULL default '',
`peeraccount` VARCHAR(32) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

Заливаем это счастье в заранее созданную БД asterisk

mysql -uuser -ppass asterisk < cdr.sql

Идем править /usr/local/etc/asterisk/cdr_mysql.conf

[global]
hostname=localhost
dbname=asterisk
table=cdr
password=pass
user=user
port=3306
;sock=/tmp/mysql.sock
timezone=EEST ; Previously called usegmtime
[columns]
;тут по вкусу правим, я добавил 1 алиас
alias start => calldate

Заходим в Астер и перегружаем модуль:

asterisk -rvvvv
*CLI>module reload cdr_mysql.so

И….. все)

Если вдруг Астериску не захочется писать, Uniqueid нужно в алиасы добавить запись:
alias uniqueid => uniqueid

Есть второй способ хранить CDR используя cdr_adaptive_odbc, позволяет записывать определенные значения, добавлять нужные столбцы, фильтровать записи. Например установить стоимость минуты, прямо из диалпнана можно используя Set(CDR(per_minute_rate)=0.01)
Правим cdr_adaptive_odbc.conf

[adaptive_connection]
connection=asterisk
table=cdr

Можем задавать несколько коннектов, будем писать в несколько таблиц. Можно указать алиасы(синонимы) для полей:

[mssql_connection]
connection=production_mssql
table=call_records
alias src => Source
alias dst => Destination
alias accountcode => AccountCode
alias billsec => BillableTime

А также фильтрацию для определенных значений:

[logging_for_device_0000FFFF0008]
connection=asterisk_mysql
table=cdr_for_0000FFFF0008
filter src => 0000FFFF0008

Если вам нужно, чтобы заполнить определенную колонку информацией, основанной на название раздела, вы можете установить его статическим вариантом, который вы можете использовать с фильтром:
(В таблицу будут записаны повторяющиеся значения, единственное отличие значение поля accountcode.

[mysql_connection]
connection=asterisk_mysql
table=cdr

[filtered_mysql_connection]
connection=asterisk_mysql
table=cdr
filter src => 0000FFFF0008
static "DoNotCharge" => accountcode

Перегружаем модуль, module reload cdr_adaptive_odbc.so
И все)

Если появилось желание добавить столбец в таблицу и изменять его значение:

В мускуле
sql> ALTER TABLE cdr ADD COLUMN route_rate varchar(10);
В Астериске
*CLI> module reload cdr_adaptive_odbc.so
И теперь правим диалплан
exten => _NXXNXXXXXX,1,Verbose(1,Example of adaptive ODBC usage)
   same => n,Set(CDR(route_rate)=0.01)
   same => n,Dial(SIP/my_itsp/${EXTEN})
   same => n,Hangup()

Собственно сама структура таблицы для cdr_adaptive_odbc такая:

CREATE TABLE IF NOT EXISTS `cdr` (
  `calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `answer` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL DEFAULT '',
  `src` varchar(80) NOT NULL DEFAULT '',
  `dst` varchar(80) NOT NULL DEFAULT '',
  `dcontext` varchar(80) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `channel` varchar(80) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `dstchannel` varchar(80) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `lastapp` varchar(80) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `lastdata` varchar(80) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `duration` int(11) NOT NULL DEFAULT '0',
  `billsec` int(11) NOT NULL DEFAULT '0',
  `disposition` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `amaflags` int(11) NOT NULL DEFAULT '0',
  `accountcode` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `userfield` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `uniqueid` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `linkedid` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `sequence` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `peeraccount` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  KEY `calldate` (`calldate`),
  KEY `dst` (`dst`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Примечание по полю src, если есть callerid(ani), то именно это значение устанавливается в качестве src, если его нет, то устанавливается значение поля callerid(num). Не удивляйтесь если перед звонком вы сменили callerid(num), а в cdr все-равно старое значение — проверяйте поле ANI ))
В тоже время в queue_log используется callerid(num)

SIP REALTIME
Для начала нужно залить таблицу sipppers.sql

CREATE TABLE `sippeers` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) CHARACTER SET utf8 NOT NULL,
 `host` varchar(40) CHARACTER SET utf8 DEFAULT NULL, 
 `ipaddr` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
 `port` int(5) DEFAULT NULL,
 `regseconds` int(11) DEFAULT NULL,
 `defaultuser` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
 `fullcontact` varchar(35) CHARACTER SET utf8 DEFAULT NULL,
 `regserver` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
 `useragent` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
 `lastms` int(11) DEFAULT NULL,
 `type` enum('friend','user','peer') CHARACTER SET utf8 DEFAULT NULL,
 `context` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `deny` varchar(40) CHARACTER SET utf8 DEFAULT NULL, 
 `permit` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `secret` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `md5secret` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `remotesecret` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `transport` enum('udp','tcp','udp,tcp','tcp,udp') CHARACTER SET utf8 DEFAULT NULL,
 `dtmfmode` enum('rfc2833','info','shortinfo','inband','auto') CHARACTER SET utf8 DEFAULT NULL,
 `directmedia` enum('yes','no','nonat','update') CHARACTER SET utf8 DEFAULT NULL,
 `nat` enum('yes','no','never','route') CHARACTER SET utf8 DEFAULT NULL,
 `callgroup` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `pickupgroup` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `language` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `disallow` varchar(40) CHARACTER SET utf8 DEFAULT 'all', 
 `allow` varchar(40) CHARACTER SET utf8 DEFAULT 'g729;alaw',
 `insecure` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `cc_agent_policy` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'generic',
 `cc_monitor_policy` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'generic',
 `trustrpid` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `progressinband` enum('yes','no','never') CHARACTER SET utf8 DEFAULT NULL,
 `promiscredir` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `useclientcode` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `accountcode` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `setvar` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `callerid` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `amaflags` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `callcounter` enum('yes','no') CHARACTER SET utf8 DEFAULT 'yes',
 `busylevel` int(11) DEFAULT '1',
 `allowoverlap` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `allowsubscribe` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `videosupport` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `maxcallbitrate` int(11) DEFAULT NULL,
 `rfc2833compensate` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `mailbox` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `session-timers` enum('accept','refuse','originate') CHARACTER SET utf8 DEFAULT NULL,
 `session-expires` int(11) DEFAULT NULL,
 `session-minse` int(11) DEFAULT NULL,
 `session-refresher` enum('uac','uas') CHARACTER SET utf8 DEFAULT NULL,
 `t38pt_usertpsource` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `regexten` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `fromdomain` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `fromuser` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `qualify` varchar(40) CHARACTER SET utf8 DEFAULT 'yes',
 `defaultip` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `rtptimeout` int(11) DEFAULT NULL,
 `rtpholdtimeout` int(11) DEFAULT NULL,
 `sendrpid` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `outboundproxy` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `callbackextension` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `timert1` int(11) DEFAULT NULL,
 `timerb` int(11) DEFAULT NULL,
 `qualifyfreq` int(11) DEFAULT NULL,
 `constantssrc` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `contactpermit` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `contactdeny` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `usereqphone` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `textsupport` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `faxdetect` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `buggymwi` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `auth` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `fullname` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `trunkname` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `cid_number` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `callingpres` enum('allowed_not_screened','allowed_passed_screen','allowed_failed_screen','allowed','prohib_not_screened','prohib_passed_screen','prohib_failed_screen','prohib') CHARACTER SET utf8 DEFAULT NULL,
 `mohinterpret` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `mohsuggest` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `parkinglot` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `hasvoicemail` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `subscribemwi` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `vmexten` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
 `autoframing` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `rtpkeepalive` int(11) DEFAULT NULL,
 `g726nonstandard` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `ignoresdpversion` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `allowtransfer` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `dynamic` enum('yes','no') CHARACTER SET utf8 DEFAULT NULL,
 `notifyringing` varchar(10) COLLATE utf8_bin NOT NULL DEFAULT 'yes',
 `notifyhold` varchar(10) COLLATE utf8_bin NOT NULL DEFAULT 'yes',
 `notifycid` varchar(10) COLLATE utf8_bin NOT NULL DEFAULT 'yes',
 PRIMARY KEY (`id`),
 UNIQUE KEY `name` (`name`),
 KEY `ipaddr` (`ipaddr`,`port`),
 KEY `host` (`host`,`port`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Как заливать читаем чуть выше
Параметры кодеков: allow disallow указывать через точку с запятой alaw;ulaw;gsm
Важно также соблюдать порядок следования полей, как и в sip.conf, disallow потом allow, deny потом permit
Также если разместить поле «ipaddr» ДО «host» (в случае dynamic) то мы никогда не загрузим реальный ип девайса, так как будет перезаписан полем «host».
Обязательные параметры: type, name, secret, context, host, defaultuser.
Добавятся после регистрации пира: port, regseconds, ipaddr
Необходимо включить кеширование в sip.conf, иначе пир не загрузится в память и регистрация не сохранится. Если пиры только совершают звонки кеширование можно не включать.
Опции в sip.conf [general] отвечающий за реалтайм пиры:

Название опции Значения Описание
rtcachefriends yes,no Кешировать пиры в памяти,после их соединения с сервером(регистрация, звонок)
rtsavesysname yes,no Когда пир зарегался, сохранять systemname(который задан в asterisk.conf) в поле regserver. Удобно когда храним пиры с нескольких серверов в одной базе.
rtupdate yes,no Отсылает информацию такую как IP адрес, порт, рег период, имя пользователя в БД
rtautoclear yes,no, знач в секундах Автоматически завершать действие регистрации соединений типа friend, созданных «на лету», по тому же графику, как если бы они зарегистрировались в обычном режиме. Если задано значение yes, по истечении срока действия регистрации friend исчезнет из конфигурации до следующей регистрации. Если задано целое значение, регистрация будет действительна в течение этого количества секунд, а не в течение обычного срока действия регистрации
ignoreregexpire yes,no Если включена пир не удаляется из памяти, после истечения регистрации.

После включения rtcachefriends=yes в sip.conf и перезагрузки chan_sip.so (module reload chan_sip.so), мы можем зарегистрировать пир используя реалтайм архитектуру.

RealTime VoiceMail
Поскольку MySQL умеет BLOB(Binary Large OBject), мы можем хранить нашу голосовую почту прямо в базе данных! У меня под Фрей не заработало, кто знает как пофиксить пишем)
По мануалу делать так:
Правим voicemail.conf

[general]
format=wav49
odbcstorage=asterisk
odbctable=voicemessages

Создаем в БД табличку voicemessages

DROP TABLE IF EXISTS voicemessages;
CREATE TABLE voicemessages (
         uniqueid INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        -- Logical directory
        dir CHAR(255),
        -- Message number within the logical directory
        msgnum INT(4),
        -- The recording itself
        recording BLOB,
        -- Dialplan context
        context CHAR(80),
        -- Dialplan context, if Voicemail was invoked from a macro
        macrocontext CHAR(80),
        -- CallerID, when the message was left
        callerid CHAR(80),
        -- Date when the message was left, in Unixtime
        origtime INT(11),
        -- Length of the message, in seconds
        duration INT(11),
        -- Owner of the mailbox
        mailboxuser CHAR(30),
        -- Context of the owner of the mailbox
        mailboxcontext CHAR(30), 
        --label varchar30
        label CHAR(30),
        -- Context of the owner of the mailbox
        `read` BOOLEAN NOT NULL default 0,
        -- Text flags indicating urgency of the message
        flag CHAR(30)
  );

Управление ящиками из БД производится в 2 пинка:
Создаем табличку:

DROP TABLE IF EXISTS voicemail;
CREATE TABLE voicemail (
        -- All of these column names are very specific, including "uniqueid".  Do not change them if you wish voicemail to work.
        uniqueid INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        -- Mailbox context.
        context CHAR(80) NOT NULL DEFAULT 'default',
        -- Mailbox number.  Should be numeric.
        mailbox CHAR(80) NOT NULL,
        -- Must be numeric.  Negative if you don't want it to be changed from VoicemailMain
        password CHAR(80) NOT NULL,
        -- Used in email and for Directory app
        fullname CHAR(80),
        -- Email address (will get sound file if attach=yes)
        email CHAR(80),
        -- Email address (won't get sound file)
        pager CHAR(80),
        -- Attach sound file to email - YES/no
        attach CHAR(3),
        -- Which sound format to attach
        attachfmt CHAR(10),
        -- Send email from this address
        serveremail CHAR(80),
        -- Prompts in alternative language
        language CHAR(20),
        -- Alternative timezone, as defined in voicemail.conf
        tz CHAR(30),
        -- Delete voicemail from server after sending email notification - yes/NO
        deletevoicemail CHAR(3),
        -- Read back CallerID information during playback - yes/NO
        saycid CHAR(3),
        -- Allow user to send voicemail from within VoicemailMain - YES/no
        sendvoicemail CHAR(3),
        -- Listen to voicemail and approve before sending - yes/NO
        review CHAR(3),
        -- Warn user a temporary greeting exists - yes/NO
        tempgreetwarn CHAR(3),
        -- Allow '0' to jump out during greeting - yes/NO
        operator CHAR(3),
        -- Hear date/time of message within VoicemailMain - YES/no
        envelope CHAR(3),
        -- Hear length of message within VoicemailMain - yes/NO
        sayduration CHAR(3),
        -- Minimum duration in minutes to say
        saydurationm INT(3),
        -- Force new user to record name when entering voicemail - yes/NO
        forcename CHAR(3),
        -- Force new user to record greetings when entering voicemail - yes/NO
        forcegreetings CHAR(3),
        -- Context in which to dial extension for callback
        callback CHAR(80),
        -- Context in which to dial extension (from advanced menu)
        dialout CHAR(80),
        -- Context in which to execute 0 or * escape during greeting
        exitcontext CHAR(80),
        -- Maximum messages in a folder (100 if not specified)
        maxmsg INT(5),
        -- Increase DB gain on recorded message by this amount (0.0 means none)
        volgain DECIMAL(5,2),
        -- IMAP user for authentication (if using IMAP storage)
        imapuser VARCHAR(80),
        -- IMAP password for authentication (if using IMAP storage)
        imappassword VARCHAR(80),
        stamp timestamp
);

в extconfig.conf раскомментируем строку:

voicemail => mysql,general

Перегружаем модуль(мне помог только рестарт Астериска)
Все..)

MusicOnHold Realtime

Queues Realtime

II.
Владимир Фёдоров в своем комменте, сказал, что ODBC под большой нагрузкой часто падает, поэтому вариант без ODBC:
A. Cоздаем таблицы наших конфигов из sql файлов любезно предоставленных разрабами
выполняем в мускуле
use asterisk
source /destination/config.sql;

B. в файле res_config_mysql.conf правим секцию general под наши нужды
[general]
dbhost = localhost
dbname = asterisk
dbuser = admin
dbpass = admin
dbport = 3306
dbsock = /tmp/mysql.sock
;dbcharset = utf8
requirements=warn ; or createclose or createchar

C. в extconfig.conf
делаем следующее(разрабы подложили свинью малацы:)
написано
file.conf => driver,database[,table[,priority]]
ЧИТАТЬ
file.conf => driver,СЕКЦИЯ в res_config_….[,table[,priority]]
Если название таблицы совпадает с названием конфиг файла, то ее название можно неуказывать!
в итоге мы получим следующую запись для конфига конференций
meetme => mysql,general,meetme
ну или если хотим выежнутся, то
meetme => mysql,general

Конструктивная критика как всегда приветствуется)

Комментарии: