Выгрузка CDR c MERA (MVTS) в Carbon Billing 5

Skip to end of metadata
Go to start of metadata

Скрипт выгружает CDR с MERA на FTP биллинга.

  • Даты звонка (начало, завершение) в CDR-файлах создаваемых MERA записываются в формате Unix Time, их необходимо конвертировать в формат подобный "2019-06-06 15:57:57", в приведенном ниже скрипте эту задачу выполняет дополнительный скрипт cdrformat.pl, вызываемый для преобразования каждой записи о вызове в отдельности.
  • В скрипте добавлена защита от повторного запуска. У пользователя от имени которого выполняется скрипт должен быть доступ до LOCK-файла (/tmp/lock в примере), директория в которой он должен размещаться должна существовать.
#!/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
Введите метки, чтобы добавить к этой странице:
Please wait 
Ищите метку? просто начните печатать.