Настройка хранения записей в 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/) и значительно (а так же безопасно) экономит место на носителях.

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

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

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

К счастью триггер уже есть в интерфейсе администрирования 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}

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