amarao (amarao_san) wrote,
amarao
amarao_san

Расковыриваем статистику NEAX2000

редыдущий пост херня. Приходится делать с нуля.


Запись в логе:
0!KA050104001128   04061849480406184955   0010000500503349939                         0000  10100                


Первая последовательность:
0!K - сигнатура?
Тип: (1 символ) A - исходящие (если АТС нам принадлежит, звонок с абонентского порта на транк), E - входящие
маршрут, 3 символа (050)
транк, 3 символа (101-103)

Далее фигня:  непонятная фигня на три символа (001)
Далее три символа - внутренний номер. Судя по всему, валидно и для входящего, и для исходящего.

Вторая последовательность:
0406184948 - время звонка (04 месяц 06 день 18 часов 49 минут 48 секунд) - время начала звонка
0406184955 - время окончания звонка (аналогично).

Третья последовательность:

001000050050 - неведомая херня
3349939 - номер (для длинных номеров начинается с той же позиции, но продлевается дальше, в пробелы)

Четвёртая последовательность
(неведомая херня)

Пятая последовательность:
Две цифры: начало года начала разговора
Две цифры: год конца разговора
последняя цифра не понятно.


atslog ожидает (пытаемся малой кровью пофиксить регэксп):
        #  1 direction (E - IN/ A - OUT)
        #  2 ROUTE No
        #  3 TRUNK No.
        #  4 CALLING PARTY I.D.
        #  5 Tenant Number 01-63
        #  6 CALLED NUMBER/CALLING NUMBER
        #  7 TIME OF START CONVERSATION (MMDDhhmmss)
        #  8 TIME OF CALL COMPLETION (MMDDhhmmss)
        #  9 ACCOUNT CODE
        # 10 CONDITION CODE (char 1 - transferred 0|1, char2 - call with ACC 0|1,
        #            char3 - Station originated call/Attendant assisted call)
        #
        # 11 ROUTE NUMBER 1
        # 12 ROUTE NUMBER 2
        # 13 CALLED NUMBER (OUT ONLY)
        # 14 CALL METERING (OUT ONLY)
        # 15 !?!? CID NUMBER (IN ONLY)(WTF?!?).  Manual state that pos 96-113
        #                are CALLING OFFICE,BILLING OFFICE, AUTHORIZATION CODE
        #                but in real life there is incoming number.
        # 16 YEAR OF START CONVERSATION
        # 17 YEAR OF CALL COMPLETION

Текущее выражение в neax-2000.tib:

/K([EA])(\d{3})(\d{3})(\d)(\d{2})([\d ]{6})(\d{10})(\d{10})([\d ]{10}) {3}(\d{3})(\d{3})([\d ]{3})([\d ]{32})(\d{4})([\d ]{18})([\d ]{2})([\d ]{2})([\d ])([\d ]{4})/


Жирным помечены атрибуты, которые мы хотим do match. С учётом, что во входящих CID всё равно отсутствует и смысла в звонках никакого, то мы подло делаем рекэксп только для исходящих, входящие пишутся в notwrite.log (если уж приспичит).


K([A]) - принимаем входящие, в $1 идёт тип 'A'.
далее, нам надо в 4 атрибута как угодно засунуть 9 символов, а оставшиеся три символа, 5ый атрибут - это источник исходящего звонка. Стараемся не отклоняться от оригинала, однако, для большей надёжности, заменим ([\d ]{6}) на (\d+)\s+
(\d{3})(\d{3})(\d)(\d{2})(\d+)\s+

Далее нам нужны 10-символьные цифровые строки с датами. C учётом, что начальные пробелы отрезаны, можем оставить оригинал:
(\d{10})(\d{10})

А вот далее у нас некое расхождение:

account_code, condition_code, route#1, route#2, called_number

и регэксп ([\d ]{10}) {3}(\d{3})(\d{3})([\d ]{3})([\d ]{32})

что совсем не соответствует строке:
   0010000500503349939            


потому переделываем регэксп в циничный: нам надо 4 атрибута размазать по предварительным пробелам и 12 символам.

Пишем (наобум):

\s+(\d{3})(\d{3})(\d{3})(\d{3})(\d+)\s+

Т.е. пихаем в каждый из 4 атрибутов по 3 символа, а первые пробелы выкидываем.

В принципе, этого достаточно для наших целей. Но atslog хочет ещё:

CALL_METERING, CID NUMBER, YEAR OF START CONVERSATION, YEAR OF CALL COMPLETION (4 атрибута)

Остаток строки выглядит как:
          0000  10100                


с неясным количеством пробелов.

Так что поступаем цинично:

\s+(\d{2})(\d{2})\s+(\d{2})(\d{2})\d
(обратите внимание на "съедание" кривой цифры в конце (не уверены - значит вопрос)



Итоговая строка:
/K([A])(\d{3})(\d{3})(\d)(\d{2})(\d+)\s+(\d{10})(\d{10})\s+(\d{3})(\d{3})(\d{3})(\d{3})(\d+)\s+(\d{2})(\d{2})\s+(\d{2})(\d{2}).*/

ща буду проверять

Ура! Заработало.

Итак, дифф для atslog-2.1.1:

23c23,24
< if ($str =~ /K([EA])(\d{3})(\d{3})(\d)(\d{2})([\d ]{6})(\d{10})(\d{10})([\d ]{10}) {3}(\d{3})(\d{3})([\d ]{3})([\d ]{32})(\d{4})([\d ]{18})([\d ]{2})([\d ]{2})([\d ])([\d ]{4})/){
---
> if ($str =~ /K([A])(\d{3})(\d{3})(\d)(\d{2})(\d+)\s+(\d{10})(\d{10})\s+(\d{3})(\d{3})(\d{3})(\d{3})(\d+)\s+(\d{2})(\d{2})\s+(\d{2})(\d{2}).*/){


PPS В этих цифрах закодировано экстремистское высказывание.
Tags: atslog, linux, администрирование
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments