Пример скрипта выгрузки cdr файлов с asterisk
В скрипте заложена возможность модификации csv-файла, на случай если средствами Asterisk не получится сформировать полностью корректную выгрузку.
#!/bin/bash set -eu # Путь к Master.csv со звонками с предыдущей ротации CDR_SRC_FILE='/var/log/asterisk/cdr-custom/Master.csv' # Папка где сохраняются файлы, исходный и обработанный для биллинга CDR_DST_DIR='/var/log/asterisk/cdr-csv-rotate/' # IP биллинга FTP_SERVER='10.20.30.40' # !!!Всегда cdr_ftp!!! Логин на биллинге FTP_LOGIN='cdr_ftp' # Пароль пользователя cdr_ftp FTP_PASSWORD='servicemode' # Папка с CDR NAS FTP_DIRECTORY='/cdr/Asterisk/' # В случае если в исходной CSV нужно что-то исправить, например: # -транки не всегда одинаковы (например, транк соседа SIP/TrunkCiscoXXX-YYYYYYYYY, где XXX-случайное число, YYYYYYYYY - случайное число в HEX формате), # -в файле есть лишние символы, например точка с запятой ";" или ghj,ktvs # "1"=исправляем файл, "0"=не исправляем FIX_CSV='1' # "1"=выгружаем исходный файл, "0"=не выгружаем DEBUG_SEND='1' # Проверяем что есть папка для обработанных файлов [ ! -d "$CDR_DST_DIR" ] && mkdir $CDR_DST_DIR # Переходим в папку cd "$CDR_DST_DIR" # Если Master.csv существует, запускаем в работу if [ -f "$CDR_SRC_FILE" ]; then # Получаем текущую дату DATE=`date +%Y%m%d%H%M%S` # Если нужно преобразовывать транки, сохраняем исходный файл и при необходимости тоже выгружаем на FTP (DEBUG_SEND), если транк не преобразуем - просто сохраняем текущий Master.csv для выгрузки и делаем пустой if [[ "$FIX_CSV" == "1" ]]; then # Сохраняем исходный файл на всякий случай, если DEBUG_SEND=1 - его тоже отправляет на FTP биллинга if [[ "$DEBUG_SEND" == "1" ]]; then \cp $CDR_SRC_FILE $CDR_DST_DIR/cdr-trunk_original-${DATE}.csv else \cp $CDR_SRC_FILE $CDR_DST_DIR/cdr-trunk_original-${DATE}.csv.debug_send_disabled fi # Переносим Master.csv в папку для дальнейшей модификации строк, удаляя лишние символы и преобразуя транки mv $CDR_SRC_FILE $CDR_DST_DIR/cdr-${DATE}.csv # Создаём новый Master.csv touch $CDR_SRC_FILE # Преобразуем: # -удаляем кавычки # -удаляем лишние пробелы в разделителе полей # -преобразуем транки, в примере SIP/TrunkCiscoXXX-YYYYYYYYY меняем на Neighbor (транк соседа), SIP/XXXXXXXX-YYYYYYYYY (наш транк) меняем на BestISP # В этой части вместо SED можно использовать что-либо еще, если его возможностей недостаточно: awk, python, etc sed -e 's/"//g; s/, /,/g; s|,SIP\/TrunkCisco[0-9]*-[a-zA-Z0-9]*,|,Neighbor,|g; s|,SIP\/[a-zA-Z0-9]*-[a-zA-Z0-9]*,|,BestISP,|g' -i $CDR_DST_DIR/cdr-${DATE}.csv else # Переносим Master.csv в папку для дальнейшей выгрузки mv $CDR_SRC_FILE $CDR_DST_DIR/cdr-${DATE}.csv # Создаём новый Master.csv touch $CDR_SRC_FILE fi fi # Выгружаем на FTP биллинга for f in $CDR_DST_DIR/cdr-*.csv; do echo $f f_name="${f##*/}" ftp -v -n $FTP_SERVER <<End-Of-Session > /tmp/ftplog.$$ user $FTP_LOGIN "$FTP_PASSWORD" binary pass 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 ${f}.uploaded fi done