Задача: Проработать как настроить подключение Asterisk 16
к MySQL
через драйвер ODBC
Использование связки Asterisk 16 + MySQL
через драйвер ODBC (Open Database Connectivity)
нужно когда хотите вести записи CDR (Call Detail Records)
и CEL (Channel Event Logging)
Необходимые приготовления:
(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
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.