Freeswitch CDR ODBC MySQL
Сохранение CDR в mysql и просмотр данных о звонках FreeSWITCH при помощи веб интерфейса - CDR-Viewer.
Подготовим FreeSWITCH для работы с MySQL через ODBC
Предполагается, что сервер mysql (mariadb) установлен.
yum install -y mysql-connector-odbc unixODBC unixODBC-devel
Проверим odbcinst.ini
# Driver from the mysql-connector-odbc package # Setup from the unixODBC package [MySQL] Description = ODBC for MySQL Driver = /usr/lib/libmyodbc5.so Setup = /usr/lib/libodbcmyS.so Driver64 = /usr/lib64/libmyodbc5.so Setup64 = /usr/lib64/libodbcmyS.so FileUsage = 1
Заполним odbc.ini
[freeswitchcdr] Driver=MySQL SERVER=localhost PORT=3306 DATABASE=freeswitchcdr USER=DB_USER PASSWORD=DB_PASSWORD
Проверим подключение к MySQL
echo "select 1" | isql -v freeswitchcdr
Создадим БД MySQL в формате asteriskcdrdb
Создайте файл, например:
touch freeswitchcdr.sql
И скопируйте в него структуру таблицы БД:
CREATE TABLE cdr ( calldate datetime NOT NULL default '0000-00-00 00:00:00', 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 '', 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 '', uniqueid varchar(32) NOT NULL default '', userfield varchar(255) NOT NULL default '', did varchar(50) NOT NULL default '', recordingfile varchar(255) NOT NULL default '', KEY `calldate` (`calldate`), KEY `dst` (`dst`), KEY `accountcode` (`accountcode`), KEY `uniqueid` (`uniqueid`) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Создаем БД: freeswitchcdr
mysqladmin create freeswitchcdr
Создаем таблицу:cdr
mysql freeswitchcdr < freeswitchcdr.sql
Задаем права на БД с параметрами определенными в odbc.ini
mysql> GRANT ALL PRIVILEGES ON freeswitchcdr.* TO DB_USER@localhost IDENTIFIED BY 'DB_PASSWORD'; flush privileges; \q
Подготовим FreeSWITCH
Расскомментируйте строку event_handlers/mod_odbc_cdr в файле исходников FS ../freeswitch/modules.conf
и выполните make && make install.
По окончании компиляции скопируйте файл odbc_cdr.conf.xml из исходников в директорию, где установлен FS.
В моем примере это /usr/local/src/freeswitch и /usr/local/freeswitch соответственно
cp /usr/local/src/freeswitch/src/mod/event_handlers/mod_odbc_cdr/conf/autoload_configs/odbc_cdr.conf.xml /usr/local/freeswitch/conf/autoload_configs/odbc_cdr.conf.xml
И заполните файл следующим содержанием, где параметры БД (odbc-dsn), данные определенные нами в odbc.ini:
<configuration name="odbc_cdr.conf" description="ODBC CDR Configuration"> <settings> <!-- <param name="odbc-dsn" value="freeswitchcdr:DB_USER:DB_PASSWORD"/> --> <param name="odbc-dsn" value="odbc://freeswitch" /> <!-- global value can be "a-leg", "b-leg", "both" (default is "both") --> <param name="log-leg" value="both" /> <!-- value can be "always", "never", "on-db-fail" --> <param name="write-csv" value="on-db-fail" /> <!-- location to store csv copy of CDR --> <param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr" /> <!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" --> <param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed" /> <!-- dump SQL statement after leg ends --> <param name="debug-sql" value="true" /> </settings> <tables> <!-- only a-legs will be inserted into this table --> <table name="cdr" log-leg="a-leg"> <field name="calldate" chan-var-name="start_stamp" /> <field name="clid" chan-var-name="caller_id_name" /> <field name="src" chan-var-name="caller_id_number" /> <field name="dst" chan-var-name="destination_number" /> <field name="dcontext" chan-var-name="" /> <field name="channel" chan-var-name="channel_name" /> <field name="dstchannel" chan-var-name="bridge_channel" /> <field name="lastapp" chan-var-name="hangup_cause" /> <field name="lastdata" chan-var-name="sip_hangup_disposition" /> <field name="duration" chan-var-name="duration" /> <field name="billsec" chan-var-name="billsec" /> <field name="disposition" chan-var-name="hangup_cause" /> <field name="lastapp" chan-var-name="current_application" /> <field name="amaflags" chan-var-name="amaflags" /> <field name="uniqueid" chan-var-name="uuid" /> <field name="recordingfile" chan-var-name="recordingfile" /> <field name="userfield" chan-var-name="" /> </table> </tables> </configuration>
Для имени файла записи использовано имя переменной recordingfile.
В диалплане FS надо определить в контексте вызова, например:
<action application="set" data="recordingfile=${uuid}.mp3"/>
а сама запись выполняется:
<action application="record_session" data="$${rec_dir_custom}/${recordingfile}"/>
где, $${rec_dir_custom} глобальная переменная заданная в vars.xml:
<X-PRE-PROCESS cmd="set" data="rec_dir_custom=/your/record_directory"/>
Загрузим модуль mod_odbc_cdr
fs_cli
load mod_odbc_cdr
Если в дальнейшем вы будете вносить изменения в файл odbc_cdr.conf.xml их можно применить командой:
reload mod_odbc_cdr
Подготовим Freeswitch CDR Viewer
Скачайте модифицированную версию с нашего сайта: freeswitch-cdr-viewer.tar.gz
cd /var/www/html tar zxvf freeswitch-cdr-viewer.tar.gz cd freeswitch-cdr-viewer/include
или скачайте оригинальную версию Asterisk CDR Viewer:
git clone https://github.com/g613/asterisk-cdr-viewer.git cd asterisk-cdr-viewer/include
Отредактируем файл config.inc.php
$db_type = 'mysql'; $db_host = 'localhost'; $db_port = '3306'; $db_user = 'DB_USER'; $db_pass = 'DB_PASSWORD'; $db_name = 'freeswitchcdr'; $db_table_name = 'cdr'; $db_options = array();
Если все сделано правильно в Asterisk-CDR-Viewer будут отображаться свежие данные о вызовах: