Гибкое хранение записей разговоров
Часто записи разговоров могут храниться на сервере IP-телефонии ограниченное время, но, в некоторых случаях, среди всех записей разговоров можно выделить более важные, – те, которые должны храниться на сервере значительно большее время, либо параллельно копироваться на какой-либо еще ресурс или отправляться на почту, в телеграм. В ОС Linux периодические действия (например, проверка даты создания и […]
Часто записи разговоров могут храниться на сервере IP-телефонии ограниченное время, но, в некоторых случаях, среди всех записей разговоров можно выделить более важные, – те, которые должны храниться на сервере значительно большее время, либо параллельно копироваться на какой-либо еще ресурс или отправляться на почту, в телеграм.
В ОС Linux периодические действия (например, проверка даты создания и удаление старых записей) могут выполняться с помощью скриптов, добавленных в планировщик cron. Например, скрипт периодического удаления старых записей разговоров, периодически запускающийся в кроне, может выглядеть так:
#!/usr/bin/php -q
<?php
//хранить, дней
$days = 60;
//директория с записями
$records_dir = '/var/spool/asterisk/monitor';
$cmd = '/usr/bin/find ' . $records_dir . ' -mtime +' . $days . ' -exec /bin/rm \{\} \; >/dev/null 2>&1';
exec($cmd);
?>
В примере использовались CentOS 7, Asterisk 13, FreePBX 13.
В случае если необходимо хранить некоторые записи разговоров дольше (поступившие на некоторые, более важные номера) или определить различные сроки хранения для различных групп номеров нужно изменить скрипт, добавив в него несколько проверок. По умолчанию во FreePBX записи хранятся в директории ${MIXMON_DIR}/год/месяц/день, а имя файла с записями имеет вид:
тип_звонка-куда-откуда-дата_время-uniqid.расширение
Т.е. для внутреннего звонка со 100 на 101 имя файла с записью разговора звонка 2021-03-20 в 08:06:57 будет вида:
internal-101-100-20210320-080657-1618895217.0.wav
Исходя из этого, можно, например, с помощью использования регулярного выражения получить все записи в указанной директории и поддиректориях, хранящиеся в формате mp3 или wav, старше 60 дней:
/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex ".*\.\(mp3\|wav\)"
Записи разговоров (более важные — с номером 200), находящихся в директории и поддиректориях /var/spool/asterisk/monitor , которые старше 60 дней, а также, — в формате mp3 или wav:
/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex ".*-200-.*\.\(mp3\|wav\)"
И, также, аналогично — записи разговоров входящих звонков на 200 (которые старше 60 дней):
/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex '.*-200-[0-9]+-[0-9]+-[0-9]+-[0-9]+\.[0-9]+.*\.\(mp3\|wav\)'
Записи исходящих звонков с номера 200 (старше 60 дней):
/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex ".*-[0-9]+-200-[0-9]+-[0-9]+-[0-9]+\.[0-9]+.*\.\(mp3\|wav\)"
Записи разговоров не на 200 номер (старше 60 дней):
/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex '.*-[?!/20*-/][0-9]+-[0-9]+-[0-9]+-[0-9]+\.[0-9]+.*\.\(mp3\|wav\)'
Про альтернативное хранение записей (изменение структуры директорий и имен файлов с записями) – см. статью.
Для корректной работы скриптов, удаляющих старые файлы, необходимо, чтобы на сервере всегда было корректное время. См. подробнее о настройке NTP в статьях 1 и 2.
Предположим записи разговоров, связанные с первой группой номеров (100,103) должны храниться 90 дней, со второй (102,104) – 180, звонки с/на 600, 700 – 90 дней, остальные номера должны храниться 60 дней.
Создаем скрипт:
#!/usr/bin/php -q
<?php
//хранить, дней
$days = 60;
//директория с записями
$records_dir = '/var/spool/asterisk/monitor';
$groups = array(
array(100,103),
array(102,104),
array(600,700)
);
$days_before = array(60,90,180,365);
//в цикле обрабатываем сначала первый интервал (старше 60, но менее 90 дней), потом остальные
//последний интервал от 365 до 375 дней
// т.к. удаляющий старые записи скрипт будет запускаться еженедельно for($i=0;$i<count($days_before);$i++)
{
$younger = ($i+1<count($days_before))?$days_before[$i+1]:375;
$older = $days_before[$i];
$cmd = '/usr/bin/find ' . $records_dir . ' -mtime +' . $older . ' -mtime -' . $younger . ' -regex ".*\.\(mp3\|wav\)"';
$old_rec_files = '';
exec($cmd,$old_rec_files);
foreach($old_rec_files as $rec_filename)
{
if($i == 3){
//удаление всех файлов старше 365 дней
delete_old_records($days_before[3],$records_dir);
}else{
//проверка необходимо ли удалять файл
//не относится ли запись к тем, которые необходимо хранить подольше: 90, 180 или 365 дней
if(in_groups($rec_filename,$i,$groups) !== true)
{
//echo "Файл " . $rec_filename . " удаляется. Срок хранения истек.\r\n";
$cmd ='rm ' . $rec_filename . ' >/dev/null 2>&1';
exec($cmd);
}
else {
//echo "Файл " . $rec_filename . " остается\r\n";
}
}
}
}
//определяет, принадлежит ли запись к группам более важных
function in_groups($filename,$i,$groups)
{
$pos = false;
for($j=$i;$j<count($groups);$j++)
{
foreach($groups[$j] as $number)
{
$pos = false;
//если в имени файла с записью есть подстрока с номером одной из групп
$pos = strripos($filename, "-" . $number . "-");
if ($pos !== false) {
//echo "filename $filename \r\n";
//echo 'return true' . "\r\n";
//запись необходимо хранить дольше, возвращаем true
return true;
}
}
}
return false;
}
//удаляет записи в директории $records_dir старше $ older
function delete_old_records($older,$records_dir)
{
$cmd = '/usr/bin/find ' . $records_dir . ' -mtime +' . $older . ' -regex \'.*\.\(mp3\|wav\)\'';
//echo "\r\n delete_old_records cmd = $cmd \r\n";
exec($cmd);
}
?>
После запуска скрипта проверяем имеющиеся файлы с записями. Записи с номерами 100,103 (не старше 90 дней); 102,104 (не старше 180 дней); 600,700 (не старше 365 дней) сохранены, остальные (старше 60 дней) — удалены.
Для выполнения скрипта еженедельно, его необходимо перенести в директорию /etc/cron.weekly.
Записи разговоров, имеющие большее значение, можно также после окончания разговора копировать на отдельный ресурс или отсылать, например, на почту.
Если же, необходимо выделить только записи разговоров с определенными номерами, то это можно сделать посредством периодического выполнения скрипта, добавленного в крон, либо используя Post Call Recording Script.
Для периодического копирования записей с помощью крон – создаем скрипт:
#!/usr/bin/php -q
<?php
//отключение вывода ошибок и предупреждений
error_reporting(0);
//более, минут
$older_mins = 1;
//меньше, минут
$younger_mins = 6;
//записи с этими номерами будут искаться и копироваться
$numbers = array(102,103);
//директория, куда будут копироваться записи
$dst_dir = '/mnt/important-records/';
//устанавливаем таймзону
date_default_timezone_set('Europe/Moscow');
//текущая дата в формате год-месяц-день
$date = date('Y-m-d');
//поддиректория, куда будут копироваться записи (с текущей датой)
$dst_dir = $dst_dir . $date.”/”;
//директория с записями
$records_dir = '/var/spool/asterisk/monitor';
foreach($numbers as $number){
echo "number $number \r\n";
//поиск в директории с записями записи с одним из номеров,
//которая старше $older_mins, но младше $younger_mins
$cmd = '/usr/bin/find ' . $records_dir . ' -mmin +' . $older_mins . ' -mmin -' . $younger_mins . ' -regex ".*-'. $number . '-.*\.\(mp3\|wav\)"';
$records = '';
exec($cmd,$records);
if(count($records)>0){
foreach($records as $record){
//только имя файла с записью, без пути к нему
$filename_only = explode("/",$record);
$filename_only = $filename_only[count($filename_only)-1];
//если отсутствует поддиректория с текущей датой в
// директории назначения - создаем ее и копируем туда запись
if(!is_dir($dst_dir)) {
mkdir($dst_dir, 0755, true);
copy($record,$dst_dir . $filename_only);
}else{
//иначе просто копируем запись
copy($record,$dst_dir . $filename_only);
}
}
}
}
Устанавливаем скрипту права на выполнение с помощью chmod +x и добавляем в планировщик:
сrontab –e
Например, чтобы скрипт запускался каждые 5 мин. нужно добавить запись:
*/5 * * * * /путь/к/скрипту/имя_скрипта.php
Об использовании Post Call Recording Script (после завершения разговора — конвертирование записи разговора в mp3 с отправкой на почту) см. статью.
См. также статью о распространенных проблемах с записями разговоров и их решении .
Остались вопросы?
Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.