Дмитрий Кайдаш
19.02.2019
258

Альтернативное хранение записей

В данной статье будет описано как кардинально изменить директорию хранения записей. Может быть удобно для некоторых систем воспроизведения и статистики (CRM). Задача сформировать и распределять следующую архитектуру хранения записей: Первый уровень папок – Номера внешних телефонов. Второй – Даты звонка. (в формате ГГГГ-ММ-ДД, т.е. без времени) На втором уровне должны храниться файлы с записями разговоров. […]

В данной статье будет описано как кардинально изменить директорию хранения записей. Может быть удобно для некоторых систем воспроизведения и статистики (CRM).

Задача сформировать и распределять следующую архитектуру хранения записей:

  1. Первый уровень папок – Номера внешних телефонов.
  2. Второй – Даты звонка. (в формате ГГГГ-ММ-ДД, т.е. без времени)
    На втором уровне должны храниться файлы с записями разговоров. Название файла с разговором должно быть в следующем формате <Время начала разговора (в формате ГГГГ-ММ-ДД.ЧЧММ)> + «-» + <Номер внешнего телефона> + «-» + <Длительность разговора в секундах>.
  1. Общая директория

1.2 Внешний номер (транк)

1.2.2 Год-месяц-день

       1.2.2.1 YYYY-mm-d.hi-caller_num-billsec.wav

       1.2.2.2 YYYY-mm-d.hi-caller_num-billsec.wav

1.2.2.3 …

2.3 Год-месяц-день

2.4 …

1.3 Внешний номер (транк)

1.4…

В целях сохранения работы стандартных средств статистики, например cdr_report freepbx, не будем перемещать записи физически, а создадим в требуемой архитектуре символьные ссылки. Поскольку оперирование файловой системой – задача трудоёмкая и не предназначенная для диалплана – вынесем обработчик в отдельный скрипт, который будет выглядеть следующим образом. Открываем файл на редактирование:

# nano /usr/local/bin/rename_record.sh

И добавляем в него такой код:

#!/bin/bash
# Добавляем пути к исполнимым директориям
# полезно, для того чтобы не указывать полные пути к приложениям
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Получаем и преобразуем текущую дату в путь
# заменяем разделители на символ слеш «/»
date_path=`date +%Y/%m/%d`
if [[ "$1" == "" || "$2" == "" ]]; then
	exit 1 # Если получено не два параметра, завершаем работу
else
	# Сохраняем в переменную расширение полученного файла
	# им являются последние четыре символа первого полученного скриптом аргумента
	# необходимо если выполнялась конвертация и файл не хранится в *.wav
	type=${1: -4}
	# Преобразуем полученную строку в первом аргументе в массив
	# для удобства работы с элементами текущего файла
	# которым является первый полученный аргумент
	IFS='-' read -r -a array <<< "$1"
	# Вывод всего массива, используется для отладки
	#echo ${array[*]}
	# Формируем из полученного массива строку с датой и временем
	# в требуемом формате
	date_lk=${array[3]:0:4}-${array[3]:4:2}-${array[3]:6} #
	# Определяем направление звонка и получаем в переменную
	# внешний номер (транка)
	case ${array[0]} in
		# "internal" ) link=${array[3]}.${array[4]:0:4}-${array[2]};;
		# "external" ) link=${array[3]}.${array[4]:0:4}-${array[2]}.${array[4]:0:4};;
        	"in" ) num_lk=${array[2]} ;;
        	"out" ) num_lk=${array[1]} ;;
        	# "q" ) link=${array[3]:0:4}-${array[3]:4:2}-${array[3]:6}.${array[4]:0:4}-${array[2]};;
		* ) echo "Invalid recognithe";;
	esac
	# Проверяем наличие директории текущего внешнего номера
	# создаём при отсутствии
        if ! [ -d /tmp/${num_lk}/ ]; then
		mkdir /tmp/${num_lk}
        fi
	# Проверяем наличие поддиректории текущего времени
	# создаём при отсутствии
        if ! [ -d /tmp/${num_lk}/${date_lk}/ ]; then
        	mkdir /tmp/${num_lk}/${date_lk}
        fi
	# Формируем наименование ссылки согласно требуемому формату
	link=${date_lk}.${array[4]:0:4}-${num_lk}-$2${type}
	# Проверяем наличие ссылки в новой директории
	# создаём при отсутствии
	if ! [ -f /tmp/${num_lk}/${date_lk}/${link} ]; then
		ln -s "/var/spool/asterisk/monitor/$date_path/$1" "/tmp/${num_lk}/${date_lk}/${link}"
	fi
	# Вывод имени ссылки
	# использовалось для отладки
	#echo ${link}
fi

После чего не забываем сделать его исполнимым:

chmod +x /usr/local/bin/rename_record.sh

И назначить выполнение при каждом завершении вызова. Для этого вытянем стандартный контекст из

# nano /etc/asterisk/extensions_additional.conf

Перенесём его в файл

# nano /etc/asterisk/extensions_override_freepbx.conf

И добавим выделенную цветом часть

[macro-hangupcall]
include => macro-hangupcall-custom
exten => s,1(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?theend)
exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n(theend),ExecIf($["${ONETOUCH_RECFILE}"!="" & "${CDR(recordingfile)}"=""]?Set(CDR(recordingfile)=${ONETOUCH_RECFILE}))
; change begin
exten => s,n,System(/usr/local/bin/rename_record.sh ${CALLFILENAME}.mp3 ${CDR(billsec)})
; change end
exten => s,n,Hangup
exten => s,n,MacroExit()

После чего нужно перегрузить настройки диалплана:

CLI> dialplan reload

И проверить записи в базовой директории

Классическая структура записей

И в директории новой

Новая структура записей

Если всё настроено правильно согласно инструкций и соответствует скриншотам выше, то функционал настроен корректно. Таким или аналогичным образом можно гибко настроить хранение записей в любой архитектуре директорий и наименований, не задевая базовый функционал хранения\конвертации\удаления записей разговоров.

 
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