Подключение Asterisk к MySQL через драйвер ODBC

Подключение Asterisk к MySQL через драйвер ODBC

Asterisk до версии 13 для хранения CDR и CEL в MySQL(MariaDB) использовал драйвер cdr_mysql.so и cel_mysql.so, соответственно. Начиная с версии Asterisk 13 эти модули Deprecated (устарели) и не рекомендованы к использованию. Разработчики рекомендуют использовать технологию ODBC.
ODBC (Open Database Connectivity) — это программный интерфейс (API) доступа к базам данных, разработанный фирмой Microsoft, в сотрудничестве с Simba Technologies на основе спецификаций Call Level Interface (CLI), который разрабатывался организациями SQL Access Group, X/Open и Microsoft. Впоследствии CLI был стандартизован ISO. Стандарт CLI призван унифицировать программное взаимодействие с СУБД, сделать его независимым от поставщика СУБД и программно-аппаратной платформы.
Драйвер ODBC позволяет подключать какое-либо приложение или программу (в нашем случае это Asterisk) к различным базам данных.
В этой статье рассматривается подключение Asterisk 13 к MySQL для записи CDR и CEL на локальный сервер.

Что мы имеем:

  • Debian 8
  • Asterisk 13 (Asterisk certified/13.13-cert5)
  • MySQL 5.5.57
Итак поехали.

1. Подготовим систему:

sudo apt-get install unixodbc unixodbc-dev libmyodbc

2. Редактируем файл /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

3. Проверим связность ODBC и MySQL:

odbcinst -q -d

Результат должен быть примерно следующим:

[MySQL]

4. Редактируем файл /etc/odbc.ini

Этот файл служит для создания идентификатора для Asterisk 13. Asterisk будет ссылаться на название, указанное в этом файле. Приводим в соответствие:
[MySQL-asteriskcdrdb]
Description=MySQL Asterisk database
Driver=MySQ
Server=localhost
User=asteriskcdruser
Password=asteriskcdruser_password
Database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock
Option=3

5. Проверим использование утилиты 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

6. Настроим MySQL, если это еще не сделано:

mysql -urootuser -prootpassword
mysql> CREATE DATABASE asteriskcdrdb default charset utf8;
mysql> CREATE DATABASE asteriskcdrdb default charset utf8;
mysql>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 '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`userfield` varchar(255) NOT NULL DEFAULT '',
`did` varchar(50) NOT NULL DEFAULT '',
`recordingfile` varchar(255) NOT NULL DEFAULT '',
`cnum` varchar(40) NOT NULL DEFAULT '',
`cnam` varchar(40) NOT NULL DEFAULT '',
`outbound_cnum` varchar(40) NOT NULL DEFAULT '',
`outbound_cnam` varchar(40) NOT NULL DEFAULT '',
`dst_cnam` varchar(40) NOT NULL DEFAULT '',
KEY `calldate` (`calldate`),
KEY `dst` (`dst`),
KEY `accountcode` (`accountcode`),
KEY `uniqueid` (`uniqueid`),
KEY `did` (`did`)
)
mysql>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`)
)

7. Дадим права пользователю asteriskcdruser на БД asteriskcdrdb:

mysql>GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskcdruser'@'localhost';

Если сервер с БД и Asterisk на разных хостах, то:

mysql>GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskcdruser'@'IP адрес сервера Asterisk' identified by 'asteriskcdruser_password';
mysql>FLUSH PRIVILEGES;

8. Добавим поддержку ODBC, если ее нет в Asterisk:

~$ cd /usr/src/asterisk-certified-13.13-cert5/
~$ ./configure
~$ make menuselect
~$ make install

9. Редактируем файл /etc/asterisk/res_odbc.conf:

[asteriskcdrdb]
enabled=yes
dsn=MySQL-asteriskcdrdb
pooling=no
limit=1
pre-connect=yes
username=asteriskcdruser
password=asteriskcdruser_password

Параметр DSN отвечает за подключение Asterisk к БД, указанной в файле /etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.

10. Перезапустим сервис Asterisk:

service asterisk restart

Через CLI Asterisk проверим подключение к БД через драйвер 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)

11. Редактируем файл /etc/asterisk/cdr_odbc.conf:

[global]
dsn=asteriskcdrdb
loguniqueid=yes
dispositionstring=yes
table=cdr
usegmtime=no
hrtime=yes
newcdrcolumns=yes

12. Редактируем файл /etc/asterisk/cel_odbc.conf:

[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel