Примеры реализации конверторов логов
Материал из BiTel WiKi
Admin (Обсуждение | вклад) |
Zavndw (Обсуждение | вклад) (→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.
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-папке указаны в начале скриптов.
Конвертер:
Описание формата: Медиа: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
--dimOn
HuaweiV300R006
Описание формата, пример лога: Медиа: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 производства Элтекс
Почти универсальный конвертер логов для модуля phone
Тема на форуме: Почти универсальный конвертер логов для модуля phone
MC240
Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.
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)