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

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(M200)
 
(10 промежуточных версий не показаны.)
Строка 36: Строка 36:
Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:
Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:
http://forum.bgbilling.ru/viewtopic.php?f=10&t=3962
http://forum.bgbilling.ru/viewtopic.php?f=10&t=3962
 +
 +
 +
1) в конвертере найдена ошибка при считывании номера звонящего абонента.
 +
нужно заменить вот этот кусок в файле convert_log.pl
 +
<source lang ="perl" >
 +
                        my $lac = undef;
 +
                        my $spis_num = undef;
 +
 +
                        my $bytes_lac_len = get_bytes_len( $lac_len );
 +
                        my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 +
 +
                        if( $lac_len > 0 )
 +
                        {
 +
                                read( FILE_IN, $data, $bytes_lac_len );
 +
                                $lac = get_bcd( $data, $lac_len );
 +
                        }
 +
                        if( $spis_num_len > 0 )
 +
                        {
 +
                                read( FILE_IN, $data, $bytes_spis_num_len );
 +
                                $spis_num = get_bcd( $data, $spis_num_len );
 +
                        }
 +
 +
                        my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;
 +
 +
</source>
 +
 +
На вот этот
 +
<source lang ="perl" >
 +
my $lac = undef;
 +
            my $bytes_lac_len = get_bytes_len( $lac_len );
 +
 +
            my $first_digit;
 +
            if( $lac_len > 0 )
 +
            {
 +
                read( FILE_IN, $data, $bytes_lac_len );
 +
                $lac = get_bcd( $data, $lac_len );
 +
 +
                if ( $lac_len % 2 == 1 )
 +
                {
 +
                  my $idx = $lac_len / 2;
 +
                  my $part = substr( $data, $idx, 1 );
 +
                  my @f = unpack( 'C', $part);
 +
                  $first_digit = $f[0]&0b00001111;
 +
                }
 +
            }
 +
 +
            my $spis_num = '';
 +
 +
            my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );
 +
 +
            if( $spis_num_len > 0 )
 +
            {
 +
                if ( $first_digit )
 +
                {
 +
                  $spis_num_len--;
 +
                  $spis_num .= $first_digit;
 +
                }
 +
 +
                my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 +
 +
                read( FILE_IN, $data, $bytes_spis_num_len );
 +
                $spis_num .= get_bcd( $data, $spis_num_len );
 +
            }
 +
 +
            my $var_len = $record_len - 16 - $bytes_summa;
 +
 +
</source >
 +
 +
Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто
 +
выбрасывалась, как  остаток BCD-поля, что неверно.
 +
 +
2) В конвертере можно считывать порты с помощью замены вот этих строк
 +
 +
 +
<source lang="perl">
 +
# vhod tract
 +
        elsif( $f[0] == 113 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            print "113=>$id\n";
 +
 +
            $result{113} = $id;
 +
            $pos += 9;
 +
        }
 +
        # ishod tract
 +
        elsif( $f[0] == 114 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            print "114=>$id\n";
 +
 +
            $result{114} = $id;
 +
            $pos += 9;
 +
        }
 +
 +
</source>
 +
на эти
 +
<source lang="perl">
 +
# vhod tract
 +
        elsif( $f[0] == 113 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            #kanal(port)
 +
                my $id = "$id[0]";
 +
 +
            print "113=>$id\n";
 +
 +
            $result{113} = $id;
 +
            $pos += 9;
 +
        }
 +
        # ishod tract
 +
        elsif( $f[0] == 114 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
       
 +
            #kanal(port)
 +
                        my $id = "$id[0]";
 +
 +
 +
            print "114=>$id\n";
 +
 +
            $result{114} = $id;
 +
            $pos += 9;
 +
        }
 +
 +
</source>
== ISKRATEL si3000 ==
== ISKRATEL si3000 ==
Строка 143: Строка 275:
== M200 ==
== M200 ==
-
Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]
+
1) Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br>
 +
2) Perl скрипт, загружающий логи с ftp АТС и перерабатывающий их в формат биллинга, и архивирующий для обработки биллинга. После обработки скрипт отправляет команду на загрузку логов.
 +
[[Файл:Croncdr.zip]]
== Элком ==
== Элком ==
Строка 193: Строка 327:
== Почти универсальный конвертер логов для модуля phone ==
== Почти универсальный конвертер логов для модуля phone ==
Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=5213 Почти универсальный конвертер логов для модуля phone]
Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=5213 Почти универсальный конвертер логов для модуля phone]
 +
 +
== MC240 ==
 +
Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.
 +
 +
[[Медиа:ms240-dimon.zip]]
 +
 +
convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.
 +
 +
convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling
 +
 +
Формат имени лога ожидается такой: logYYYYMMDD.csv
 +
Дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее.
 +
В конце отправляется 24 команды на загрузку часовых логов.
 +
 +
Ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log
 +
 +
Ошибки распознавания логов в файл bglogconverter.run.error.log
 +
 +
 +
--[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)

Текущая версия на 12:10, 26 марта 2016

Содержание

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

Описание формата: Медиа:FUN559000PCR150.PDF.zip


Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет: http://forum.bgbilling.ru/viewtopic.php?f=10&t=3962


1) в конвертере найдена ошибка при считывании номера звонящего абонента. нужно заменить вот этот кусок в файле convert_log.pl

my $lac = undef;
                        my $spis_num = undef;
 
                        my $bytes_lac_len = get_bytes_len( $lac_len );
                        my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 
                        if( $lac_len > 0 )
                        {
                                read( FILE_IN, $data, $bytes_lac_len );
                                $lac = get_bcd( $data, $lac_len );
                        }
                        if( $spis_num_len > 0 )
                        {
                                read( FILE_IN, $data, $bytes_spis_num_len );
                                $spis_num = get_bcd( $data, $spis_num_len );
                        }
 
                        my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;

На вот этот

my $lac = undef;
            my $bytes_lac_len = get_bytes_len( $lac_len );
 
            my $first_digit;
            if( $lac_len > 0 )
            {
                read( FILE_IN, $data, $bytes_lac_len );
                $lac = get_bcd( $data, $lac_len );
 
                if ( $lac_len % 2 == 1 )
                {
                  my $idx = $lac_len / 2;
                  my $part = substr( $data, $idx, 1 );
                  my @f = unpack( 'C', $part);
                  $first_digit = $f[0]&0b00001111;
                }
            }
 
            my $spis_num = '';
 
            my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );
 
            if( $spis_num_len > 0 )
            {
                if ( $first_digit )
                {
                  $spis_num_len--;
                  $spis_num .= $first_digit;
                }
 
                my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 
                read( FILE_IN, $data, $bytes_spis_num_len );
                $spis_num .= get_bcd( $data, $spis_num_len );
            }
 
            my $var_len = $record_len - 16 - $bytes_summa;

Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто выбрасывалась, как остаток BCD-поля, что неверно.

2) В конвертере можно считывать порты с помощью замены вот этих строк


# vhod tract
        elsif( $f[0] == 113 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            print "113=>$id\n";
 
            $result{113} = $id;
            $pos += 9;
        }
        # ishod tract
        elsif( $f[0] == 114 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            print "114=>$id\n";
 
            $result{114} = $id;
            $pos += 9;
        }

на эти

# vhod tract
        elsif( $f[0] == 113 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            #kanal(port)
                my $id = "$id[0]";
 
            print "113=>$id\n";
 
            $result{113} = $id;
            $pos += 9;
        }
        # ishod tract
        elsif( $f[0] == 114 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            #kanal(port)
                        my $id = "$id[0]";
 
 
            print "114=>$id\n";
 
            $result{114} = $id;
            $pos += 9;
        }

ISKRATEL si3000

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

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

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

Конвертер Медиа:ATS.zip

Примерный формат логов :

MMDD HHMM duration number_from number_to port_to


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

Медиа:mx96scripts.zip

--dimOn

HuaweiV300R006

Медиа:huaweiV300R006.zip

Описание формата, пример лога: Медиа:hw300R006_Data.zip

M200

1) Тема на форуме: Автоматизация загрузки логов из ATC М-200 в BGB
2) Perl скрипт, загружающий логи с ftp АТС и перерабатывающий их в формат биллинга, и архивирующий для обработки биллинга. После обработки скрипт отправляет команду на загрузку логов. Файл:Croncdr.zip

Элком

Скрипт обрабатывает первичные логи вида:

 TML1     | TML2     | Дата                 | Длит.  |Тип| Вызывающий | Вызываемый           |
 003 : 051| 044 : 001| 13.11.2010 23:59:22  | 5      | 2 | 9875906090 | 2462526              |
 071 : 062| 005 : 019| 13.11.2010 23:53:23  | 385    | 2 | 3472460202 | 89876087603          |
 004 : 031| 044 : 001| 13.11.2010 23:59:31  | 23     | 2 | 2906090    | 2462526              |
 001 : 023| 044 : 008| 13.11.2010 23:59:00  | 58     | 2 | 2906090    | 2462526              |
 074 : 002| 078 : 060| 13.11.2010 23:58:33  | 92     | 2 | 4483       | 5558                 |
 004 : 018| 044 : 004| 13.11.2010 23:59:43  | 22     | 2 | 2906090    | 2462526              |
 074 : 005| 064 : 008| 13.11.2010 23:59:50  | 17     | 2 | 3472900444 | 2636474              |
 003 : 041| 044 : 006| 13.11.2010 23:59:49  | 17     | 2 | 2906090    | 2462526              |
 077 : 025| 017 : 007| 13.11.2010 23:34:29  | 1538   | 2 | 3472460000 | 89174914375          |
 074 : 006| 018 : 061| 13.11.2010 23:59:48  | 18     | 2 | 3472900444 | 89875971613          |

Медиа:Script_elcom_convert.zip

АТС Linea-UT фирмы Italtel

Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt. Медиа:colit_v1.0.zip

Коллектор NGN

Эта АТС современная и файлы выкладывает в бинарном формате на ftp. Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования. Для предотвращения двойного запуска использовать flock. Описание формата в файле CDR format_Rus.doc. Конвертор для windows BillEn.exe. Использование виндовой конвертором так: Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file. Описание для установке настройке находится в файле manual.txt. Медиа:ngn.zip

HUAWEI - NGN SoftX Bill iGWB

Эта АТС современная и файлы выкладывает в бинарном формате на ftp. Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования. Для предотвращения двойного запуска использовать flock. Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов. Описание формата пример логов лежит в архиве.

Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎


АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс

Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс

Почти универсальный конвертер логов для модуля phone

Тема на форуме: Почти универсальный конвертер логов для модуля phone

MC240

Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.

Медиа:ms240-dimon.zip

convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.

convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling

Формат имени лога ожидается такой: logYYYYMMDD.csv Дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее. В конце отправляется 24 команды на загрузку часовых логов.

Ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log

Ошибки распознавания логов в файл bglogconverter.run.error.log


--dimOn 10:49, 26 октября 2015 (UTC)

Личные инструменты