Есть задача, в начале каждого месяца выгружать из недр 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'ом:
На выходе скрипта получаем нужный список файлов. Теперь всё, что нам остаётся — это найти эти файлы и записать в нужную нам директорию.
Тут включается моя природная лень, и я решаю доверить всю рутинную работу компьютеру. Для начала создадим файл в котором будем сопоставлять название проекта с его ID в системе NPO:
и оставим в конце пустую строку.
Далее доверим всю работу этому скрипту, указывая при запуске год и месяц, за который нужно собрать файлы:
Для полноты картины создадим скриптик, который будет раз в месяц запускать предыдущий скрипт с нужными параметрами, а результат отсылать нам на почту:
И скормим его cron'u
Вот и всё. Надеюсь, кому-нибудь пригодится.
В NPO всё это добро хранится по адресу "/opt/naumen/nauphone/spool/naubuddyd/mp3/YYYY/MM/". Единственное «но» — всё это хранится в одной куче. На помощь нам приходит таблица tbl_gl_call_info в которой мы выделим названия файлов с записями разговоров по конкретному проекту (для этого есть поле sessionid для названия файла, к которому мы прибавим расширение ".wav", и поле parentuid в котором хранится ID проекта). Нужный нам промежуток времени хранится в поле incomingtime. При этом нас будут интересовать только звонки, на которые ответил оператор (finalstage='operator') или которые оператор переадресовал (finalstage='redirect'). Всё делается одним простым select'ом:
select distinct 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 distinct 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
Вот и всё. Надеюсь, кому-нибудь пригодится.
