SCROLL
Среднее время на прочтение: 5 мин.

Настройка подключения 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.

Исходные данные:

Подготовка системы

Перед началом установки обновляем систему до актуального состояния:

apt-get update && sudo apt-get upgrade -y

Устанавливаем необходимые зависимости:

apt-get install unixodbc unixodbc-dev libmyodbc libmysqlclient-dev -y

Настройка драйвера ODBC

Приводим файл конфигурации /etc/odbcinst.ini к виду:

/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, приводим в соответствие:

/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
Этот файл служит для создания идентификатора для Asterisk 13. Asterisk будет ссылаться на название, указанное в этом файле.

Проверим использование утилиты 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, вписываем в конец файла:

/etc/asterisk/res_odbc.conf
[asteriskcdrdb]
enabled=yes
dsn=MySQL-asteriskcdrdb
pre-connect=yes
username=asteriskuser
password=asterpass
Параметр DSN отвечает за подключение Asterisk к БД, указанной в файле /etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.

Настройка сбора логов CDR

В файле конфигурации /etc/asterisk/cdr_adaptive_odbc.conf вписываем в конец файла:

/etc/asterisk/cdr_adaptive_odbc.conf
[first]
connection=asteriskcdrdb
table=cdr
loguniqueid=yes
usegmtime = no
alias start => calldate
alias truedst => truedst
alias didanswer => didanswer
Использование мной файла конфигурации cdr_adaptive_odbc.conf, вместо cdr_odbc.conf, обусловлено тем что мне необходимо использование custom полей, для занесения каких то своих данных в таблицу CDR.

Настройка сбора логов CEL

В файле конфигурации /etc/asterisk/cel.conf, в секции [general] приписываем:

/etc/asterisk/cel.conf
[general]
enable=yes
apps=all
events=ALL
dateformat = %F %T
Редактируем файл /etc/asterisk/cel_odbc.conf, вписываем в конец файла:
/etc/asterisk/cel_odbc.conf
[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel

Где:

  • cel – название таблицы в MySQL
  • asteriskcdrdb – название соединения 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.

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

0 комментариев

Нет комментариев.