Екатерина
13.06.2019
1450

Настройка хранения записей в mp3 на Asterisk+FreePBX.

Описание: в ряде интеграций АТС на базе asterisk возникла необходимость конвертации wav в mp3. В частности, это нужно для корректной прослушки записей методом обратного звонка в MIKO (что это и как настраивать описано в статье https://voxlink.ru/kb/asterisk-configuration/ustanovka-modulya-1c-ot-miko-na-freepbx-2-11-s-asterisk-11/) и значительно (а так же безопасно) экономит место на носителях. Чтобы этого достичь нам понадобится: найти триггер обработки завершения […]

Описание: в ряде интеграций АТС на базе asterisk возникла необходимость конвертации wav в mp3. В частности, это нужно для корректной прослушки записей методом обратного звонка в MIKO (что это и как настраивать описано в статье https://voxlink.ru/kb/asterisk-configuration/ustanovka-modulya-1c-ot-miko-na-freepbx-2-11-s-asterisk-11/) и значительно (а так же безопасно) экономит место на носителях.

Чтобы этого достичь нам понадобится:

  • найти триггер обработки завершения вызова с возможностью передачи аргументов
  • написать скрипт-конвертор который и будет выполнять нашу задачу

Перейдём к описанию.

К счастью триггер уже есть в интерфейсе администрирования FreePBX. Но он скрыт по-умолчанию, чтобы его найти нужно перейти в «advanced settings» и включить два следующие пунта:

Отображение дополнительных пунктов

После чего поиском по странице ищем пункт «Post Call Recording Script»

Триггер после вызова

Как и гласит название и подсказка, это то что нам нужно: поле для указания скрипта который выполнится при завершении каждого вызова. И помимо прочего он может принимать аргументы. Добавим сюда строчку следующего вида:

/var/lib/asterisk/agi-bin/realtime_transfer.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME}

После не забываем нажать «submit»+«apply».

И переходим непосредственно к созданию этого скрипта. Открываем консоль сервера (ssh), авторизуемся и выполняем следующие команды:

# cd /var/lib/asterisk/agi-bin/
# nano realtime_transfer.sh

И уже далее содержимое в зависимости от настроек вашей АТС:

#!/usr/bin

Бессменный заголовок bash-скриптов

#YEAR=$1
#MONTH=$2
#DAY=$3
#CALLFILENAME=$4

Памятка по аргументом, поскольку обработка ведётся не по ассоциативному массиву, а по порядковому.

FILE=/var/spool/asterisk/monitor/$1/$2/$3/$4

Указание пути к директории хранения записей.

Внимание! На разных АТС он может быть разным. Например, при кластеризации или выносе папки записей «monitor» в примонтированный раздел и носитель. Так же возможны исключения в которых записи не градируются по директориям по дате вида «/год/месяц/день».

Для того чтобы сразу убедиться в  работоспособности и доступе к записям в скрипт внедрена проверка и логирование. Чуть позже вернёмся к этому моменту, а пока рассмотрим главный код:

# Конвертация и удаление оригинала
/usr/bin/lame -h -b 192 $FILE.wav $FILE.mp3 && /bin/rm -rf $FILE.wav

Как и гласит комментарий: первая команда силами приложения «lame» выполняет конвертацию из wav в mp3.

Внимание! Вторая команда должна быть обязательно соединена с первой двойным «&amp;&amp;» – это означает, что она выполнится только при успешном коде возврата первой. Формально оригинал wav будет удалён <strong>только</strong> при успешной конвертации и наличии mp3-файла. Если команды записать последовательно оригинал будет удалён вне зависимости от наличия копии в другом формате, что может привести к потере записи в принципе.
# Запрос учётки MySQL
mysqlpass="$(grep "AMPDBPASS" /etc/freepbx.conf | awk '{printf $3}' | sed  -e "s/['|;]//g")"
Внимание! Эта строка парсер используется только на дистрибутивах FreePBX, в которых есть файл /etc/freepbx.conf следующего вида:
<?php
$amp_conf['AMPDBUSER'] = 'freepbxuser';
$amp_conf['AMPDBPASS'] = '80**************50';
$amp_conf['AMPDBHOST'] = 'localhost';
$amp_conf['AMPDBNAME'] = 'asterisk';
$amp_conf['AMPDBENGINE'] = 'mysql';
$amp_conf['datasource'] = ''; //for sqlite3

require_once('/var/www/html/admin/bootstrap.php');
?>

В противном случае нужно указать пароль в переменной вручную.

mysqlpass=”ui************ahsh”

Далее нужно поправить ссылки на новый файл.

# Замена форматов
# CDR
querty="UPDATE cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

Как и гласит комментарий, здесь производится замена формата в cdr таблице базы asteriskcdrdb.

Внимание! Если данная модификация проводится с целью обеспечить работу прослушивания записи через обратный звонок в панели, производить симметричную замену нужно ещё и в таблице PT1C_cdr в той же базе asteriskcdrdb. И не забыть переключить приложение воспроизведения записей: advanced settings.
# PT1C_cdr
querty="UPDATE PT1C_cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

По готовности назначаем права на выполнения и меняем пользователя файла скрипта:

# chmod a+x /var/lib/asterisk/agi-bin/realtime_transfer.sh
# chown asterisk. /var/lib/asterisk/agi-bin/realtime_transfer.sh

Проверяем:

Права и принадлежность скрипта

Если картинка совпадает, значит всё сделано верно. Теперь можем проверить работу надстройки. Ставим в консоли папку с записями на мониторинг:

watch ls -l /var/spool/asterisk/monitor/2019/03/25/

И делаем вызов.

Демонстрация

После чего проверяем результат:

Физическое наличие файла
Ссылка на файл из CDR
Ссылки на файлы из PT1C_cdr

Как уже говорилось мониторить работу скрипта можно в реальном времени через файл лога:

tailf /var/log/asterisk/full | grep "Transfer"

И совершить или дождаться звонок. Результат следующего вида означает что «мгновенная конвертация» выполнена успешно:

Мониторинг через лог

Код скрипта целиком:

#!/bin/bash

#YEAR=$1
#MONTH=$2
#DAY=$3
#CALLFILENAME=$4

FILE=/var/spool/asterisk/monitor/$1/$2/$3/$4

# Проверка наличия файла
if [ -f "$FILE.wav" ]; then

        # Конвертация и удаление оригинала
        /usr/bin/lame -h -b 192 $FILE.wav $FILE.mp3 && /bin/rm -rf $FILE.wav

        # Запрос учётки MySQL
        mysqlpass="$(grep "AMPDBPASS" /etc/freepbx.conf | awk '{printf $3}' | sed  -e "s/['|;]//g")"

        # Замена форматов
        # CDR
        querty="UPDATE cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
        mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

        # PT1C_cdr
        querty="UPDATE PT1C_cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
        mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

        # Логирование действий
        /bin/echo "Transfer complete! Before: $FILE.wav,  after: $FILE.mp3" >> /var/log/asterisk/full

else

        # Логирование действий
        /bin/echo "Transfer failure! File not found!" >> /var/log/asterisk/full

fi

# !!! Перенести в Post Call Recording Script !!!
# /var/lib/asterisk/agi-bin/realtime_transfer.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME}
 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices