Есть задача, в начале каждого месяца выгружать из недр 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