Настройка подключения Asterisk 13 к MySQL через драйвер ODBC на Debian.
Рассмотрим как подключить Asterisk 13 к MySQL посредством ODBC (Open Database Connectivity) для ведения записей CDR (Call Detail Records) и CEL (Channel Event Logging).
До версии Asterisk 13, для хранения CDR и CEL в MySQL использовал драйвер cdr_mysql.so и cel_mysql.so. Начиная с Asterisk 13 эти модули Deprecated (Устарели) и не рекомендованы к использованию. Разработчики рекомендуют использовать технологию ODBC.
Исходные данные:
- Debian 8 Jessie
- Asterisk 13 (13.22.0)
- MySQL (5.5.60)
Подготовка системы
Перед началом установки обновляем систему до актуального состояния:
apt-get update && sudo apt-get upgrade -yУстанавливаем необходимые зависимости:
apt-get install unixodbc unixodbc-dev libmyodbc libmysqlclient-dev -yНастройка драйвера ODBC
Приводим файл конфигурации /etc/odbcinst.ini к виду:
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1Проверим связность ODBC и MySQL:
odbcinst -q -dРезультат должен быть следующим:
[MySQL]Редактируем файл /etc/odbc.ini, приводим в соответствие:
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
Driver=MySQL
Server=localhost
User=asteriskuser
Password=asterpass
Database=asteriskcdrdb
Port=3306
Charset=utf8
Socket=/var/run/mysqld/mysqld.sock
Option=3Проверим использование утилиты ISQL:
echo "select 1" | isql -v MySQL-asteriskcdrdbВывод:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1 |
+---------------------+
| 1 |
+---------------------+
SQLRowCount returns 1
1 rows fetchedНастройка MySQL
Для корректного отображения «Кириллицы» в таблицах, необходимо выполнить настройку MySQL на использование кодировки UTF-8 из данной статьи.
Создадим базу данных и пользователя:
CREATE DATABASE asteriskcdrdb default charset utf8;
GRANT ALL PRIVILEGES ON asteriskcdrdb.* to asteriskuser@localhost IDENTIFIED BY 'asterpass';
FLUSH PRIVILEGES;Подключаемся к созданной базе данных и создаем необходимые таблицы (CDR и CEL):
use asteriskcdrdb;
CREATE TABLE IF NOT EXISTS `cdr` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`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 '',
`start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`answer` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`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` int(11) NOT NULL DEFAULT '0',
`truedst` varchar(80) NOT NULL DEFAULT '',
`did` varchar(50) NOT NULL DEFAULT '',
`didanswer` varchar(60) NOT NULL DEFAULT '',
`recordingfile` varchar(255) DEFAULT 'none',
PRIMARY KEY (`id`),
KEY `calldate` (`calldate`),
KEY `clid` (`clid`),
KEY `src` (`src`),
KEY `dst` (`dst`),
KEY `disposition` (`disposition`),
KEY `uniqueid` (`uniqueid`),
KEY `dcontext` (`dcontext`),
KEY `didanswer` (`didanswer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE `cel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventtype` varchar(30) NOT NULL,
`eventtime` datetime NOT NULL,
`cid_name` varchar(80) NOT NULL,
`cid_num` varchar(80) NOT NULL,
`cid_ani` varchar(80) NOT NULL,
`cid_rdnis` varchar(80) NOT NULL,
`cid_dnid` varchar(80) NOT NULL,
`exten` varchar(80) NOT NULL,
`context` varchar(80) NOT NULL,
`channame` varchar(80) NOT NULL,
`src` varchar(80) NOT NULL,
`dst` varchar(80) NOT NULL,
`channel` varchar(80) NOT NULL,
`dstchannel` varchar(80) NOT NULL,
`appname` varchar(80) NOT NULL,
`appdata` varchar(80) NOT NULL,
`amaflags` int(11) NOT NULL,
`accountcode` varchar(20) NOT NULL,
`uniqueid` varchar(32) NOT NULL,
`linkedid` varchar(32) NOT NULL,
`peer` varchar(80) NOT NULL,
`userdeftype` varchar(255) NOT NULL,
`eventextra` varchar(255) NOT NULL,
`userfield` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `uniqueid_index` (`uniqueid`),
KEY `linkedid_index` (`linkedid`)
);Если планируется использовать доработанный Asterisk CDR Viewer Mod, то необходимо так же добавить триггер, для корректного отображения вызываемого номера (вводить последовательно):
DROP TRIGGER IF EXISTS `t_cdr`;
DELIMITER //
CREATE TRIGGER `t_cdr` BEFORE INSERT ON `cdr`
FOR EACH ROW BEGIN
IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.truedst != '') THEN
SET NEW.dst = NEW.truedst;
END IF;
END
//
DELIMITER ;
exit;Настройка Asterisk 13
Для работы связки с ODBC драйвером, необходимо наличие установленного в Asterisk модуля res_config_mysql.so. Если Asterisk был собран без данного модуля, то необходимо его пересобрать с модулем и выполнить установку.
Добавление модуля
Переходим в каталог с дистрибутивом Asterisk, вызываем меню:
make menuselectОтмечаем необходимый модуль и нажимаем Save & Exit:
Выполняем установку:
make installРедактируем файл /etc/asterisk/res_odbc.conf, вписываем в конец файла:
[asteriskcdrdb]
enabled=yes
dsn=MySQL-asteriskcdrdb
pre-connect=yes
username=asteriskuser
password=asterpass/etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.Настройка сбора логов CDR
В файле конфигурации /etc/asterisk/cdr_adaptive_odbc.conf вписываем в конец файла:
[first]
connection=asteriskcdrdb
table=cdr
loguniqueid=yes
usegmtime = no
alias start => calldate
alias truedst => truedst
alias didanswer => didanswercdr_adaptive_odbc.conf, вместо cdr_odbc.conf, обусловлено тем что мне необходимо использование custom полей, для занесения каких то своих данных в таблицу CDR.Настройка сбора логов CEL
В файле конфигурации /etc/asterisk/cel.conf, в секции [general] приписываем:
[general]
enable=yes
apps=all
events=ALL
dateformat = %F %TРедактируем файл /etc/asterisk/cel_odbc.conf, вписываем в конец файла:
[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=celГде:
cel– название таблицы в MySQLasteriskcdrdb– название соединения ODBC из файла/etc/asterisk/res_odbc.conf
Перезапускаем Asterisk:
systemctl restart asteriskПроверка
Через cli проверим подключение к БД через драйвер ODBC:
*CLI> odbc show
ODBC DSN Settings
-----------------
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last connection attempt: 1970-01-01 03:00:00
Number of active connections: 1 (out of 1)Связь с базой данных MySQL настроена. Теперь данные CDR и CEL будут записываться в соответствующие таблицы. Для удобного просмотра информации из базы данных, рекомендую использовать Asterisk CDR Viewer Mod.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение
Нет комментариев.