... Скрипт выгружает CDR с MERA на [FTP|CarbonBilling:Настройка FTP сервера для выгрузки CDR] биллинга. {info}* Даты звонка (начало, завершение) в CDR-файлах создаваемых MERA записываются в формате Unix Time, их необходимо конвертировать в формат подобный "2019-06-06 15:57:57", в приведенном ниже скрипте эту задачу выполняет дополнительный скрипт cdrformat.pl, вызываемый для преобразования каждой записи о вызове в отдельности. * В скрипте добавлена защита от повторного запуска. У пользователя от имени которого выполняется скрипт должен быть доступ до LOCK-файла (/tmp/lock в примере), директория в которой он должен размещаться должна существовать.{info} {code}#!/bin/bash set -eu LOCK='/tmp/lock' trap __exit EXIT __exit() { local ret=$? #rm -f $TMPDIR/*.$$ if [ "$ret" != 255 ] && [ "$ret" != 250 ]; then rm -f $LOCK fi return $ret } exit_if_locked(){ if [[ -f $LOCK ]]; then echo "Already rinning" exit 250 fi } # Путь к исходным CDR CDR_SRC_DIR='/mvts/billing/' # Путь к CDR для правки (по необходимости) и выгрузки CDR_DST_DIR='/mvts/billing/cdr-csv-rotate/' # Путь к архивам CDR CDR_ARCHIVE='/mvts/billing/archive' # Путь до скрипта конвертации формата CDR CDR_CONVERTER='/mvts/CB5_Intagration/cdrformat.pl' # IP биллинга FTP_SERVER='10.0.0.1' # !!!Всегда cdr_ftp!!! Логин на биллинге FTP_LOGIN='cdr_ftp' # Пароль пользователя cdr_ftp FTP_PASSWORD='cdr_ftp' # Папка с CDR NAS FTP_DIRECTORY='/cdr/MERA/'
|
# В случае если в исходной CSV нужно что-то исправить, например: # -транки не всегда одинаковы (например, транк соседа SIP/TrunkCiscoXXX-YYYYYYYYY, где XXX-случайное число, YYYYYYYYY - случайное число в HEX формате),
|
# -в файле есть лишние символы, например точка с запятой ";" или ghj,ktvs проблемы.
|
# "1"=исправляем файл, "0"=не исправляем FIX_CSV='1'
|
... # "1"=выгружаем исходный файл, "0"=не выгружаем DEBUG='0' # 0 - не выгружаем на FTP # 1 - выгружаем UPLOAD='1' process_upload(){ # Проверяем что есть папка для обработанных файлов [ ! -d "$CDR_DST_DIR" ] && mkdir $CDR_DST_DIR # Проверяем что есть файлы для выгрузки, предполагаем что файлы могут быть - только CDR if [[ `find $CDR_SRC_DIR -maxdepth 1 -type f -not -path '*/\.*' | wc -l` != "0" ]]; then # Получаем список файлов и обрабатываем find $CDR_SRC_DIR -maxdepth 1 -type f -not -path '*/\.*' | while read CDR_SRC_FILE; do CDR_DST_FILE=`echo $CDR_SRC_FILE | sed 's|'$CDR_SRC_DIR'|'$CDR_DST_DIR'|g'` # Если дебаг включен - файл копируем и печатаем предполагаемую команду перемещения файлов if [[ "$DEBUG" == "1" ]]; then cp $CDR_SRC_FILE $CDR_DST_FILE echo 'mv '$CDR_SRC_FILE $CDR_DST_FILE # Если дебаг выключен - тотолько перемещаем файл else mv $CDR_SRC_FILE $CDR_DST_FILE fi # Исправляем CDR (по необходимости) и складываем в отдельный файл на выгрузку if [[ "$FIX_CSV" == "1" ]]; then cat $CDR_DST_FILE | while read call; do /usr/bin/perl $CDR_CONVERTER <<< $(echo $call) done > $CDR_DST_FILE.csv fi done fi # Выгружаем на FTP биллинга если выгрузка включена if [[ "$UPLOAD" == "1" ]]; then for f in ${CDR_DST_DIR}*.csv; do echo $f f_name="${f##*/}" ftp -p -v -n $FTP_SERVER <<End-Of-Session > /tmp/ftplog.$$ user $FTP_LOGIN "$FTP_PASSWORD" binary cd $FTP_DIRECTORY put "$f" "$f_name" bye End-Of-Session # Если файл выгружен корректно, переименовываем в uploaded чтобы не выгружать повторно if fgrep -q "226 Transfer complete" /tmp/ftplog.$$ ;then echo 'ftp OK' mv $f $CDR_ARCHIVE/${f_name}.uploaded base_file=${f%.csv} # Если включен дебаг - печатаем команду перемещения в терминал if [[ "$DEBUG" == "1" ]]; then echo 'mv '$base_file $CDR_ARCHIVE/${base_file##*/} fi mv $base_file $CDR_ARCHIVE/ fi done fi } main(){ exit_if_locked touch $LOCK process_upload exit 0 } main{code}
|