Настройка ODBC для Asterisk

Однажды я установил новый Asterisk 20 из исходного кода в Ubuntu Server 22.04 и мне нужно было записывать CDR статистику звонков в базу данных MySQL, так как сервер MySQL уже был установлен и использовался другими службами. А модуль cdr_mysql исключен еще в версии Asterisk 19, поэтому мне пришлось настроить ODBC, чтобы записывать CDR в MySQL.

Сначала я пытался загрузить модуль cdr_mysql, до того как узнал что он не существует в новой версии Asterisk:

asterisk -rvvv
module load cdr_mysql.so
Unable to load module cdr_mysql.so
Command 'module load cdr_mysql.so' failed.
ERROR[3331444]: loader.c:283 module_load_error: Error loading module 'cdr_mysql.so': /usr/lib/asterisk/modules/cdr_mysql.so: cannot open shared object file: No such file or directory

Так как модуль cdr_mysql не существует, то можно воспользоваться модулями cdr_odbc или cdr_adaptive_odbc, которые настраиваются немного по другому.
Установим необходимые компоненты:

apt-cache search ODBC
apt-get install libmyodbc unixodbc unixodbc-dev lame

lame это декодер wav в mp3, пригодится так как wav это не сжатый аудио файл, также при menuselect нужно выбрать mp3 и app_macro.
Так как у меня для баз данных MySQL был установлен сервер MariaDB, то я установил пакет odbc-mariadb (если обычный MySQL, то файл /etc/odbcinst.ini нужно настроить вручную):

apt-get install odbc-mariadb

После этого появился файл /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so и файл /etc/odbcinst.ini в котором уже было указано:

[MariaDB Unicode]
Driver=libmaodbc.so
Description=MariaDB Connector/ODBC(Unicode)
Threading=0
UsageCount=1

Потом я настроил файл /etc/odbc.ini:

[MySQL-asterisk]
Description = MySQL ODBC Driver
Driver = MariaDB Unicode
Server = localhost
Database = asteriskcdrdb
User = asteriskcdr
Password = ixnfo.com
Option = 3
Charset = utf8

Проверим подключение к серверу баз данных MySQL:

isql -v MySQL-asterisk asteriskcdr ixnfo.com
show databases;
show tables;
select * from cdr;
quit

Попробуем загрузить модуль cdr_odbc.so:

asterisk -rvvv 
module load cdr_odbc.so
module show like odbc
cdr show status

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

ls /usr/lib/asterisk/modules/ | grep odbc

cd /usr/src/asterisk-*/contrib/scripts
./install_prereq install

В файле /etc/asterisk/modules.conf укажем чтобы модуль cdr_odbc.so загружался автоматически или укажем чтобы загружались все модули и запретим загрузку ненужных:

autoload = yes
;load => cdr_odbc.so
noload => cdr_custom.so
noload => cdr_sqlite3_custom
noload => cdr_csv
noload => cdr_pgsql
noload => cdr_tds
noload => cel_tds
noload => cel_radius
noload => cdr_radius
noload => cel_sqlite3_custom

Теперь настроим файл cdr_odbc.conf (внизу я закомментировал неиспользуемые параметры):

nano /etc/asterisk/cdr_odbc.conf
[global]
dsn=MySQL-asterisk
loguniqueid=yes ;Required to use the userfield
dispositionstring=yes
;newcdrcolumns=yes
;username=asteriskcdr
;password=ixnfo.com
;dbname=asteriskcdrdb
;table=cdr ;"cdr" is default table name

Если активировано «newcdrcolumns», то в таблице cdr необходимо создать дополнительные поля peeraccount, linkedid, sequence.
Если «dispositionstring» не активировано, то в поле disposition статус звонка будет вносится цифрами, например ANSWERED=8, NO ANSWER=4, BUSY=2, FAILED=1 или 0, если звонок был прерван до ответа.

Настроим файл /etc/asterisk/res_odbc.conf:

[MySQL-asterisk]
enabled => yes
dsn => MySQL-asterisk
pooling => no
limit => 1
pre-connect => yes
;username => asteriskcdr
;password => ixnfo.com
;dbname => asteriskcdrdb
;table => cdr

Имя аудиофайла почему-то не вносилось в поле recordingfile, поэтому я не заморачивался и использовал пустое поле userfield, пример extensions.conf:

[macro-recording]
exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/srv/monitor/${fname}.wav"  "/srv/monitor/${fname}.mp3" && rm -f "/srv/monitor/${fname}.wav" && chmod o+r "/srv/monitor/${fname}.mp3");
exten => s,n,Set(CDR(userfield)=${fname}.mp3);
exten => s,n,MixMonitor(/srv/monitor/${fname}.wav,b,${monopt});

[from-internal]
exten => _2XX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _2XX,n,Dial(PJSIP/${EXTEN},60,tT)
exten => _2XX,n,Hangup

А в директории с Asterisk CDR Viewer я сделал символическую ссылку на /srv/monitor/, чтобы при резервном копировании /var/www/ не архивировать гигабайты mp3 файлов.

Смотрите другие мои статьи:

Оставьте комментарий

Добавить комментарий