Просмотр Исходного

Скрипт выгружает 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 формате),
# -в файле есть лишние символы, например точка с запятой ";" или проблемы.
# "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}