Скрипт выгружает CDR с MERA на FTP биллинга.
![]() |
|
#!/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