Задача: Проработать как настроить подключение Asterisk 16 к MySQL через драйвер ODBC

Использование связки Asterisk 16 + MySQL через драйвер ODBC (Open Database Connectivity) нужно когда хотите вести записи CDR (Call Detail Records) и CEL (Channel Event Logging)

Необходимые приготовления:

Asterisk 16

(tips_ubuntu_18_04_odbc_v1.odt)

Шаг №1:

ekzorchik@srv-bionic:~$ sudo nano /etc/odbcinst.ini

[MySQL]

Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w.so

UsageCount=1

ekzorchik@srv-bionic:~$ odbcinst -q -d

[MySQL]

Шаг №2: Создаю базу данных, пользователя и пароль:

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "create database asteriskcdrdb character set utf8"

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "create user 'asteriskuser'@'localhost' identified by 'asterpass'"

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "grant all on asteriskcdrdb.* to 'asteriskuser'@'localhost';"

Этот файл служит для создания идентификатора для Asterisk 16. Asterisk будет ссылаться на название, указанное в этом файле.

ekzorchik@srv-bionic:~$ sudo nano /etc/odbc.ini

[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

ekzorchik@srv-bionic:~$ echo "select 1" | isql -v asteriskcdrdb

+---------------------------------------+

| Connected! |

| |

| sql-statement |

| help [tablename] |

| quit |

| |

+---------------------------------------+

SQL> select 1

+---------------------+

| 1 |

+---------------------+

| 1 |

+---------------------+

SQLRowCount returns 1

1 rows fetched

SQL>

Шаг №3: Подключаемся к созданной базе данных и создаем необходимые таблицы (CDR и CEL):

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@

mysql> use asteriskcdrdb;

Database changed

CREATE TABLE IF NOT EXISTS `cdr` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`calldate` datetime NOT NULL DEFAULT '1970-01-01 00:00:01',

`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 '1970-01-01 00:00:01',

`answer` datetime NOT NULL DEFAULT '1970-01-01 00:00:01',

`end` datetime NOT NULL DEFAULT '1970-01-01 00:00:01',

`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 ;

Query OK, 0 rows affected (0.17 sec)

На заметку: Если не прокатывает создание таблицы, то значит формат колонки содержит нулевые значение, а с этим не сработает добавление выше и будет ошибка вида:

ERROR 1067 (42000): Invalid default value for ‘calldate’

Теперь создаю таблицу cel

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`)

);

Query OK, 0 rows affected (0.07 sec)

mysql> quit

Bye

Шаг №4: Теперь нужно пересобрать Asterisk для работы с ODBC драйвером, т.е. Нужен модуль res_config_mysql.so

ekzorchik@srv-asterisk:~$ cd /usr/src/asterisk-*/

ekzorchik@srv-asterisk:/usr/src/asterisk-*$ sudo make menuselect

Add-ons (See README-addons.txt) — отмечаю клавишей «Enter» res_config_mysql и нажимаю Save & Exit

пересобрать Asterisk для работы с ODBC драйвером

CC="cc" CXX="g++" LD="" AR="" RANLIB="" CFLAGS="" LDFLAGS="" make -C menuselect CONFIGURE_SILENT="--silent" gmenuselect

make[1]: Entering directory '/usr/src/asterisk-*/menuselect'

make[1]: Nothing to be done for 'gmenuselect'.

make[1]: Leaving directory '/usr/src/asterisk-*/menuselect'

make[1]: Entering directory '/usr/src/asterisk-*'

menuselect changes saved!

make[1]: Leaving directory '/usr/src/asterisk-*'

ekzorchik@srv-asterisk:/usr/src/asterisk-*$

Шаг №5: Выполняем установку:

ekzorchik@srv-asterisk:/usr/src/asterisk-*$ sudo make install

ekzorchik@srv-bionic:/usr/src/asterisk-*$ cd ~

ekzorchik@srv-bionic:~$ sudo asterisk -rx "module show res_config_mysql"

Usage: module show [like keyword]

Shows Asterisk modules currently in use, and usage statistics.

Добавляю нижеследующие секции в конфигурационный файл:

ekzorchik@srv-bionic:~$ sudo nano /etc/asterisk/res_odbc.conf

[asteriskcdrdb]

enabled=yes

dsn=asteriskcdrdb

pre-connect=yes

username=asteriskuser

password=asterpass

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

Шаг №6: Настройка сбора логов CDR (вписываем в конец файла:)

ekzorchik@srv-bionic:~$ sudo nano /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

Шаг №7: Настройка сбора логов CEL

Включаем генерацию CEL данных в Asterisk, в секции [general]

ekzorchik@srv-bionic:~$ sudo nano /etc/asterisk/cel.conf

[general]

enable=yes

apps=all

events=ALL

dateformat = %F %T

[manager]

[radius]

вписываем в конец файла:

ekzorchik@srv-bionic:~$ sudo nano /etc/asterisk/cel_odbc.conf

[cel]

connection=asteriskcdrdb

loguniqueid=yes

table=cel

Где cel – название таблицы в MySQL, asteriskcdrdb – название соединения ODBC из файла /etc/asterisk/res_odbc.conf

Перезапускаем Asterisk:

ekzorchik@srv-asterisk:~$ sudo systemctl stop asterisk && sudo systemctl start asterisk && sudo systemctl status asterisk | head -n5

● asterisk.service - LSB: Asterisk PBX

Loaded: loaded (/etc/init.d/asterisk; generated)

Active: active (running) since Wed 2019-12-04 22:15:26 MSK; 13ms ago

Docs: man:systemd-sysv-generator(8)

Process: 3472 ExecStop=/etc/init.d/asterisk stop (code=exited, status=0/SUCCESS)

ekzorchik@srv-asterisk:~$

Через CLI Asterisk проверим подключение к БД через драйвер ODBC:

ekzorchik@srv-bionic:~$ sudo asterisk -rv

srv-bionic*CLI> odbc show

ODBC DSN Settings

-----------------

Name: asteriskcdrdb

DSN: asteriskcdrdb

Number of active connections: 1 (out of 1)

Связь с базой данных MySQL настроена. Теперь данные CDR и CEL будут записываться в соответствующие таблицы. А вот как их просматривать через Web-интерфейс, в этом мне поможет Web-оснастка Asterisk CDR Viewer Mod. О том как ее развернуть на текущем сервере с ролью Asterisk будет следующая заметка. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.