Примеры реализации конверторов логов
Материал из BiTel WiKi
Содержание |
Siemens EWSD
Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.
ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done
ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога. Формат названия файла: AMA.yyMMdd.ama.
ISKRATEL si2000
Конвертер на perl из бинарного формата si2000 в формат биллинга.
Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96).
Данный конвертер располагается в подпапке si2000.
Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:
1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется.
2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip)
3. Вызывает data_loader.sh для добавления задачи на загрузку логов
пути к локальным и ftp-папке указаны в начале скриптов.
Ericsson MD-110
Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.
Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100.
Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log.
Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :
1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log .
2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip)
3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога
пути указаны в начале скриптов.
update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh : stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts
mx96
В данном разделе речь идёт о неком устройстве mx96 (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид ггммддNN.C35, где, как несложно догадаться, "гг", "мм" и "дд" - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером. С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:
Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.
Описание записи файла вызовов "C" тип 1 (Документация CLD DAXL 0159r стр.117):
Поле Длина Формат Описание record number 6 nnnnnn 6-значный десятичный порядковый номер a_mx_nbr 2 nn Номер станции MX абонента А b_mx_nbr 2 nn Номер станции MX абонента Б date 8 yyyymmdd Дата начала вызова time 6 hhmmss Время начала вызова a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце) b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце) a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы call_type 3 nnn Тип вызова: десятичное число от 00 до 34 site_a 3 nnn Номер базовой станции абонента А channel_a 5 nnnnn Номер канала абонента А site_b 3 nnn Номер базовой станции абонента Б channel_b 5 nnnnn Номер канала абонента Б b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд) tc_wait_time 5 nnnnn Время ожидания канала связи (секунд) b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд) call_duration 5 nnnnn Продолжительность вызова (секунд) release_mode 3 nnn Режим отбоя вызова (секунд) spec_func 3 nnn Специальные функции: от 0 до 5 ch_pul_mode 3 nnn Режим тарифных импульсов ch_pulses 5 nnnnn Тарифные импульсы call_id 10 nn.n Идентификатор вызова (целое число) cr_lf 2 0D0A
Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):
NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870
Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.
Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, mx96_get_logs.pl, основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (<рабочий каталог>/source/<год>/<месяц>/<день>) и запускает конвертер форматов, convert_log.pl. Имейте ввиду - "сегодняшние" логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.
Про второй скрипт, convert_log.pl, надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.
Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.
Запуск скрипта производится как обычно:nohup mx96_get_logs.pl >> convert.out 2>&1 &
Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)
Файл crontab:SHELL=/bin/sh # convert 10 0 * * * /home/ATS/convert_mx96.sh