Небольшой скрипт для Naumen Phone Outsourcing

в 8:24, , рубрики: bash scripting, naumen, Песочница, телефония, метки: ,

Есть задача, в начале каждого месяца выгружать из недр Naumen Phone Outsourcing (для простоты, буду звать его далее NPO) записи разговоров за предыдущий месяц с сортировкой по проектам и по дням месяца. Как это реализовать?
В NPO всё это добро хранится по адресу "/opt/naumen/nauphone/spool/naubuddyd/mp3/YYYY/MM/". Единственное «но» — всё это хранится в одной куче. На помощь нам приходит таблица tbl_gl_call_info в которой мы выделим названия файлов с записями разговоров по конкретному проекту (для этого есть поле sessionid для названия файла, к которому мы прибавим расширение ".wav", и поле parentuid в котором хранится ID проекта). Нужный нам промежуток времени хранится в поле incomingtime. При этом нас будут интересовать только звонки, на которые ответил оператор (finalstage='operator') или которые оператор переадресовал (finalstage='redirect'). Всё делается одним простым select'ом:

select a.sessionid||'.wav' from tbl_gl_call_info a where a.parentuid='тут_пишем_project_ID' and 
to_number(to_char(a.incomingtime, 'YYYY'))=2013 and 
to_number(to_char(a.incomingtime, 'MM'))=04 and
(a.finalstage='operator' or a.finalstage='redirect')

На выходе скрипта получаем нужный список файлов. Теперь всё, что нам остаётся — это найти эти файлы и записать в нужную нам директорию.
Тут включается моя природная лень, и я решаю доверить всю рутинную работу компьютеру. Для начала создадим файл в котором будем сопоставлять название проекта с его ID в системе NPO:

Project_1                  project1code
Project_2                  project2code

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

#!/bin/bash

##################################################
# (cc) 2013 by Sergey Kirgizov (skirgizov@ya.ru) #
##################################################

# Начальная проверка вводимых аргументов
year=`date +%Y`
if [[ ! "$1" || ! "$2" ]]; then
    echo "Использование: report.sh YYYY MM"
    exit
fi

if [[ "$1" -lt "2012" || "$1" -gt "$year" ]]; then
    echo "Год должен быть в промежутке от 2012 до $year"
    exit
fi

if [[ "$2" -lt "01" || "$2" -gt "12" ]]; then
    echo "Вы указали неверный месяц. Используйте число от 01 до 12"
    exit
fi

# Задаём переменные
wdir="/home/user/report"			# Рабочая директория
user=user					# имя пользователя для доступа к базе данных NPO
pass=password 					# пароль
dbase="url.to.database:port/databasename"	# URL и название базы данных
conf_lines=`cat $wdir/etc/projects.conf | wc -l`
let "conf_lines += 1" | # wc упорно выдаёт количество строк на одну меньше, видать с 0 считает.
i=0

# Очищаем результаты предыдущей работы
rm -rf $wdir/data/*
rm -rf $wdir/export/*

# Готовим списки файлов
while [ "$i" -lt "$conf_lines" ]
do
    let "i += 1"
    project=`cat $wdir/etc/projects.conf | head -n$i | tail -n1 | awk '{print $1}'`
    code=`cat $wdir/etc/projects.conf | head -n$i | tail -n1 | awk '{print $2}'`
    echo "select a.sessionid||'.wav' from tbl_gl_call_info a where a.parentuid='$code'" > $wdir/data/waw.sql
    echo "and to_number(to_char(a.incomingtime, 'YYYY'))=$1 and to_number(to_char(a.incomingtime, 'MM'))=$2" >> $wdir/data/waw.sql
    echo "and (a.finalstage='operator' or a.finalstage='redirect');" >> $wdir/data/waw.sql
    echo "exit;" >> $wdir/data/waw.sql
    sqlplus -S $user/$pass@$dbase @$wdir/data/waw.sql | grep nauss > $wdir/data/"$project".lst # Используем "grep nauss", чтобы убрать лишний выхлоп sqlplus'a
done
i=1

# Копируем файлы
while [ "$i" -lt "$conf_lines" ]
do
    project=`cat $wdir/etc/projects.conf | head -n$i | tail -n1 | awk '{print $1}'`
    code=`cat $wdir/etc/projects.conf | head -n$i | tail -n1 | awk '{print $2}'`
    FILES=`cat $wdir/data/"$project".lst`
    mkdir $wdir/export/$project
    echo -n "По проекту $project..."
    n=0
    for file in $FILES
    do
		let "n += 1"
		find /opt/naumen/nauphone/spool/naubuddyd/mp3/$1/$2 -name $file -exec cp {} --parents --target-directory=$wdir/export/$project/ ;
    done
    mv $wdir/export/$project/opt/naumen/nauphone/spool/naubuddyd/mp3/$1/$2/* $wdir/export/$project/ # Перемещаем файлы по дням месяца вверх директории проекта
    rm -rf $wdir/export/$project/opt # И удаляем лишнее
    echo " $n файлов."
    let "i += 1"
done

Для полноты картины создадим скриптик, который будет раз в месяц запускать предыдущий скрипт с нужными параметрами, а результат отсылать нам на почту:

#!/bin/bash

# Задаём переменные

wdir=/home/user/report 					# Рабочий каталог
year=`date +%Y` 					# Текущий год
month=`date --date "1 month ago" +%m` 			# Предыдущий месяц
SUBJECT="Выгрузка за $month месяц." 			# Тема письма
EMAIL="mail@mailserver.com"				# Кому (через запятую)
EMAILMESSAGE="$wdir/msg.txt"				# Путь к файлу с текстом письма

# Работаем

echo "Выгрузка за $month месяц $year года." > $EMAILMESSAGE
$wdir/report.sh $year $month >> $EMAILMESSAGE		# Запускаем скрипт отчёта и результат пишем в текст письма
/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE	# отправляем письмо

И скормим его cron'u

0 1 1 * *  /home/user/report/report.sh

Вот и всё. Надеюсь, кому-нибудь пригодится.

Автор: cepxuo

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js