Страшная тема, из разряда эзотерических, но мне почему-то нравится это дело.
Без лишних слов приступим
На повестке дня:
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/[[db_context@]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
Перегружаем модуль(мне помог только рестарт Астериска)
Все..)
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
Конструктивная критика как всегда приветствуется)