Хранение конфига Asterisk в СУБД MySQL / MariaDB

Обновлено и опубликовано Опубликовано:

Тематические термины: AsteriskMySQLMariaDB.

Asterisk PBX поддерживает возможность хранения конфигурации в различных СУБД. В нашей инструкции рассмотрим связку с MariaDB (MySQL) на Linux Ubuntu. Мы будем использовать ODBC коннектор и метод обработки RealTime или в реальном времени (после изменения конфигурации в базе, нам не нужно будет перезапускать сервер телефонии, чтобы применить настройки).

Процесс установки и базовой настройки Asterisk подробнее рассмотрен в статье Установка Asterisk на Linux.

Установка СУБД

apt-get install mariadb-server

Разрешаем автозапуск сервиса и запускаем его:

systemctl enable mysql

systemctl start mysql

Ставим пароль для суперпользователя СУБД:

mysqladmin -u root password

Сборка Asterisk

Если Asterisk уже установлен и изначально не собирался с учетом MySQL, необходимо выполнить сборку снова. Сначала смотрим версию установленного Asterisk:

asterisk -V

Переходим по ссылке https://downloads.asterisk.org/pub/telephony/asterisk и копируем ссылку на нашу версию продукта. После скачиваем ее, например:

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15-current.tar.gz

Распаковываем архив и переходим в каталог с распакованным содержимым:

tar -xvf asterisk-*.tar.gz

cd asterisk-*

Конфигурируем исходник:

./configure ... --with-mysqlclient

* где ... — опции + with-mysqlclient, который отвечает для работу с MySQL.

Например:

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex --with-mysqlclient

Открываем окно дополнительных настроек:

make menuselect

В разделе Add-ons ставим все опции, связанные с mysql:

В разделе Add-ons ставим все опции, связанные с mysql

Выбираем Save & Exit.

Собираем исходник и устанавливаем его:

make

make install

Настройка

СУБД

Подключаемся к MariaDB:

mysql -u root -p

Создаем базу данных и пользователя:

> CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

> GRANT ALL PRIVILEGES ON asterisk.* TO 'asteruser'@'localhost' IDENTIFIED BY 'asterpassword123';

* данными командами мы создали базу данных asterisk и предоставили к ней доступ пользователю asteruser с паролем asterpassword123.

Загружаем данные в базу:

> use asterisk

> source /usr/src/asterisk-15.1.2/contrib/realtime/mysql/mysql_config.sql

> source /usr/src/asterisk-15.1.2/contrib/realtime/mysql/mysql_cdr.sql

> source /usr/src/asterisk-15.1.2/contrib/realtime/mysql/mysql_voicemail.sql

* где /usr/src/asterisk-15.1.2 — путь до распакованного исходника.

> \q

ODBC коннектор

Переходим по ссылке https://dev.mysql.com/downloads/connector/odbc и выбираем нашу версию операционной системы:

Выбор ОС при скачивании ODBC коннектора

Кликаем по Download и копируем ссылку на скачивание файла:

Копируем ссылку на odbc

В командной строке скачиваем файл, воспользовавшись ссылкой:

wget https://dev.mysql.com/get/Downloads/Connector-ODBC/5.3/mysql-connector-odbc-5.3.9-linux-ubuntu16.04-x86-64bit.tar.gz

Распаковываем архив и переходим в него:

tar -xvf mysql-connector-odbc-*.tar.gz

cd mysql-connector-odbc-*

Копируем драйверы:

cp lib/libmyodbc5* /usr/lib64

Устанавливаем odbc драйвер:

./bin/myodbc-installer -d -a -n "MySQL" -t "DRIVER=/usr/lib64/libmyodbc5w.so;"

Для подключения астериска к базе, создаем DSN:

./bin/myodbc-installer -s -a -c2 -n "Asterisk" -t "DRIVER=MySQL;SERVER=127.0.0.1;DATABASE=asterisk;UID=asteruser;PWD=asterpassword123"

* где MySQL — имя драйвера, который мы создали на предыдущем шаге; asteriskasteruserasterpassword123 — соответственно, имя базы данных, имя пользователя и пароль для подключения к СУБД.
* в случае необходимости, отредактировать DSN можно в файле /etc/odbc.ini.

Делаем тестовое подключение:

isql Asterisk

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

SQL> show tables

+--------------------------------------------------------------------------+
| Tables_in_asterisk                                                       |
+--------------------------------------------------------------------------+
| alembic_version                                                          |
| cdr                                                                      |
| extensions                                                               |
| iaxfriends                                                               |
| meetme                                                                   |
...

SQL> quit

Asterisk

Открываем конфигурационный файл с настройкой модулей:

vi /etc/asterisk/modules.conf

Добавляем в него следующие строки:

preload => res_odbc.so
preload => res_config_odbc.so

Настраиваем подключение к базе через DSN:

vi /etc/asterisk/res_odbc.conf

[asterisk-conf]
enabled         => yes
dsn             => Asterisk
username        => asteruser
password        => asterpassword123
pre-connect     => yes
max_connections => 100
sanitysql       => select 1

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

systemctl restart asterisk

Подключаемся к его консоли:

asterisk -r

Проверяем, что астер увидел odbc:

odbc show

Добавление настроек в базу

На текущем шаге, Asterisk будет использовать конфигурационные файлы. Рассмотрим процесс настройки использования СУБД с добавлением настроек в базу.

Создание extensions

Редактируем файл extconfig.conf:

vi /etc/asterisk/extconfig.conf

[settings]
sipusers => odbc,asterisk-conf,sippeers
sippeers => odbc,asterisk-conf,sippeers

* мы добавили две строчки в раздел settings, которые говорят астериску искать пиры через odbc, настройку asterisk-conf.

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

systemctl restart asterisk

В дальнейшем, все номера, которые мы будем добавлять в базу данных начнут использоваться в режиме реального времени (без необходимости перезапускать телефонную станцию).

Подключаемся к базе данных:

mysql -uasteruser -pasterpassword123

Добавим 4-е коротких номера:

> INSERT INTO asterisk.sippeers 
(`name`, `defaultuser`, `host`, `type`, `context`, `secret`, `nat`, `callgroup`, `language`, `disallow`, `allow`, `regexten`, `call-limit`) 
VALUES 
('1001', '1001', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1001', '4'),
('1002', '1002', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1002', '4'),
('1003', '1003', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1003', '4'),
('1004', '1004', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1004', '4');

* в данном примере мы создаем 4 номера 1001, 1002, 1003, 1004 с правилом обработки вызова в диалплане outcalling и паролем 1234.

Обновить запись можно командой UPDATE, например:

> UPDATE asterisk.sippeers SET `secret`='password' WHERE `name`='1001';

Проверить состояние абонентов и транков SIP можно подключившись к консоли Asterisk:

asterisk -r

*CLI> sip show peers

Правила вызова (контекст)

Открываем следующий файл:

vi /etc/asterisk/extconfig.conf

Добавляем в раздел [settings]:

[settings]
...
extensions => odbc,asterisk-conf,extensions

Открываем файл extensions.conf:

vi /etc/asterisk/extensions.conf

Создаем диалплан (группу правил):

[outcalling]
switch => Realtime/outcalling@extensions

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

systemctl restart asterisk

Подключаемся к базе и добавляем правило в диалплан outcalling:

mysql -uasteruser -pasterpassword123

> INSERT INTO asterisk.extensions VALUES (NULL, 'outcalling', '_XXXX', '1', 'DIAL', 'SIP/${EXTEN},,m');

Call Detail Record (CDR)

Теперь настроем хранение журнала вызовов в базе данных.

Открываем следующий файл:

vi /etc/asterisk/cdr_adaptive_odbc.conf

Добавляем в самый низ:

[cdr]
connection=asterisk-conf
table=cdr
alias src => source
alias channel => source_channel
alias dst => dest
alias dstchannel => dest_channel

Перезапускаем астериск:

systemctl restart asterisk

Пробуем позвонить через наш астериск и после звонка смотрим записи в базе:

mysql -uasteruser -pasterpassword123 -e "SELECT * FROM cdr"

Получим примерно следующее:

| accountcode | src  | dst  | dcontext  | clid          | channel           | dstchannel        | lastapp | lastdata    | start               | answer | end                 | duration | billsec | disposition | amaflags      | userfield | uniqueid     | linkedid     | peeraccount | sequence |
+-------------+------+------+-----------+---------------+-------------------+-------------------+---------+-------------+---------------------+--------+---------------------+----------+---------+-------------+---------------+-----------+--------------+--------------+-------------+----------+
| NULL        | 1001 | 1004 | outcaling | "1001" <1001> | SIP/1001-00000000 | SIP/1004-00000001 | Dial    | SIP/1004,,m | 2017-12-07 16:11:24 | NULL   | 2017-12-07 16:11:32 |        7 |       0 | NO ANSWER   | DOCUMENTATION | NULL      | 1512652284.0 | 1512652284.0 | NULL        |        0 |

Или в более читаемом виде:

Поле Пример значения Описание поля
accountcode NULL Дополнительное поле для идентификации клиента. Может использоваться, если не хватает стандартного набора параметров.
src 1001 Кто звонит.
dst 1004 Кому позвонили.
dcontext outcaling Контекст (группа правил обработки звонка).
clid "1001" <1001> Caller identification или CID. Состоит из имени и номера звонящего.
channel SIP/1001-00000000 Канал, который принимает вызов.
dstchannel SIP/1004-00000001 Канал исходящего вызова.
lastapp Dial Dialplan обработки вызова.
lastdata SIP/1004,,m Что передавалось в lastapp.
start 2017-12-07 16:11:24 Начало звонка.
answer NULL Время, за которое подняли трубку. NULL — трубку не подняли.
end 2017-12-07 16:11:32 Дата и время окончания звонка.
duration 7 Длительность звонка в секундах.
billsec 0 Время разговора (с момента поднятия трубки).
disposition NO ANSWER Состояние вызова. Возможные варианты:
- ANSWERED - отвечен.
- NO ANSWER - ответа нет.
- CONGESTION / FAILED - ошибка вызова.
- BUSY - занято.
amaflags DOCUMENTATION Не используется.
userfield NULL Пользовательские параметры для канала.
uniqueid 1512652284.0 Уникальный идентификатор канала звонящего.
linkedid 1512652284.0 Уникальный идентификатор канала звонящего.
peeraccount NULL Код учетной записи канала Стороны 2.
sequence 0 Номер последовательности канала.

Также существуют продукты, позволяющие в графическом интерфейсе смотреть CDR. Например, веб-приложение Asterisk CDR Viewer Mod.

# Телефония # Серверы # Базы данных # MySQL
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет