Сергей Маликов
07.05.2021
253824

Гибкое хранение записей разговоров

Часто записи разговоров могут храниться на сервере 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\)"
 Все файлы в формате mp3 или wav старше 60 дней
Все файлы в формате mp3 или wav старше 60 дней

Записи разговоров (более важные — с номером 200), находящихся в директории и поддиректориях /var/spool/asterisk/monitor , которые старше 60 дней, а также, — в формате mp3 или wav:

/usr/bin/find /var/spool/asterisk/monitor -mtime +60 -regex ".*-200-.*\.\(mp3\|wav\)"
Записи разговоров с номером 200
Записи разговоров с номером 200

И, также, аналогично — записи разговоров входящих звонков на 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
Записи звонков на 200

Записи исходящих звонков с номера 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 дней
Записи звонков с номера 200, старше 60 дней

Записи разговоров не на 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\)'
 Записи звонков старше 60 дней не на номер 200
Записи звонков старше 60 дней не на номер 200
По умолчанию утилита find не переходит по символическим ссылкам. Если в директории с записями имеются символические ссылки, указывающие на другие директории, содержимое в которых также необходимо обрабатывать  – необходимо использовать параметр –L.

Про альтернативное хранение записей (изменение структуры директорий и имен файлов с записями) – см. статью.

Для корректной работы скриптов, удаляющих старые файлы, необходимо, чтобы на сервере всегда было корректное время. См. подробнее о настройке 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);
}
?>
После создания скрипта или загрузки его на сервер, скрипту необходимо установить права на выполнение с помощью команды chmod +x /путь_к_скрипту/имя_скрипта.

После запуска скрипта проверяем имеющиеся файлы с записями. Записи с номерами 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 с отправкой на почту) см. статью.

См. также статью о распространенных проблемах с записями разговоров и их решении .

Книга 101 функция Asterisk
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Скачать книгу
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.