Хранение конфигурации Asterisk 18 в СУБД MariaDB

  • Михаил
  • 25 мин. на прочтение
  • 341
  • 19 Jan 2023
  • 30 Jan 2023

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

Подразумевается, что у нас уже установлен Asterisk. Данный процесс подробнее рассмотрен в статье

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

yum install mariadb-server -y

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

systemctl enable mariadb --now

Проверяем

systemctl start mariadb
systemctl status mariadb

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

mysqladmin -u root password

Сборка Asterisk

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

asterisk -V

Переходим в каталог, куда будем загружать исходник:

cd /usr/src

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

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-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-jansson-bundled --with-pjproject-bundled --with-mysqlclient

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

make menuselect

В разделе 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 'asterP@ssw0rd';

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

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

> use asterisk
> source /root/asterisk-18.16.0/contrib/realtime/mysql/mysql_config.sql
> source /root/asterisk-18.16.0/contrib/realtime/mysql/mysql_cdr.sql
> source /root/asterisk-18.16.0/contrib/realtime/mysql/mysql_voicemail.sql

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

> \q

ODBC коннектор

В нашем примере используется MariaDB, поэтому нам нужно установить коннектор данной СУБД. Для этого переходим по ссылке mariadb.com/downloads/connectors и выбираем для загрузки ODBC-коннектор и нашу версию операционной системы:

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

Ниже появится ссылка, которую нужно скопировать:

Копируем ссылку для загрузки odbc

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

wget https://dlm.mariadb.com/2338606/Connectors/odbc/connector-odbc-3.1.16/mariadb-connector-odbc-3.1.16-centos7-amd64.tar.gz

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

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

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

cp mariadb-connector-odbc-*-centos7-amd64/lib/mariadb/lib* /usr/lib/

Настраиваем odbc драйвер:

vi /etc/odbcinst.ini

Добавляем строки:

...

[MariaDB]

Description     = ODBC for MariaDB

Driver          = /usr/lib/libmaodbc.so

FileUsage       = 1

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

vi /etc/odbc.ini

[Asterisk]

Driver = MariaDB

SERVER=127.0.0.1

DATABASE = asterisk

UID=asteruser

PWD=asterpassword123

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

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

echo "select 1" | isql -v asterisk root P@ssw0rd

Отключаемся: 

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        => asterP@ssw0rd
pre-connect     => yes
max_connections => 100
sanitysql       => select 1

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

systemctl restart asterisk

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

asterisk -r

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

> odbc show

Мы должны увидеть что-то на подобие:

ODBC DSN Settings
-----------------
  Name:   asterisk-conf
  DSN:    Asterisk
    Number of active connections: 1 (out of 100)
    Logging: Disabled

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

На текущем шаге, 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 -p

* и вводим пароль (в нашем случае asterP@ssw0rd).

Добавим 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';

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

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

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 asterisk.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 |

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

ПолеПример значенияОписание поля
accountcodeNULLДополнительное поле для идентификации клиента. Может использоваться, если не хватает стандартного набора параметров.
src1001Кто звонит.
dst1004Кому позвонили.
dcontextoutcalingКонтекст (группа правил обработки звонка).
clid"1001" <1001>Caller identification или CID. Состоит из имени и номера звонящего.
channelSIP/1001-00000000Канал, который принимает вызов.
dstchannelSIP/1004-00000001Канал исходящего вызова.
lastappDialDialplan обработки вызова.
lastdataSIP/1004,,mЧто передавалось в lastapp.
start2017-12-07 16:11:24Начало звонка.
answerNULLВремя, за которое подняли трубку. NULL — трубку не подняли.
end2017-12-07 16:11:32Дата и время окончания звонка.
duration7Длительность звонка в секундах.
billsec0Время разговора (с момента поднятия трубки).
dispositionNO ANSWERСостояние вызова. Возможные варианты:
- ANSWERED - отвечен.
- NO ANSWER - ответа нет.
- CONGESTION / FAILED - ошибка вызова.
- BUSY - занято.
amaflagsDOCUMENTATIONНе используется.
userfieldNULLПользовательские параметры для канала.
uniqueid1512652284.0Уникальный идентификатор канала звонящего.
linkedid1512652284.0Уникальный идентификатор канала звонящего.
peeraccountNULLКод учетной записи канала Стороны 2.
sequence0Номер последовательности канала.

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