Примеры реализации конверторов логов

Материал из 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.

Медиа:Phone_ama.zip

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-папке указаны в начале скриптов.

Медиа:ATS.zip

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/hour_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip)

3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога

пути указаны в начале скриптов.

Медиа:ATS.zip

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
Личные инструменты