Добавить парсер для агента телефонии

LANBilling получает от АТС информацию о звонках в виде CDR-файлов. Разные модели АТС сохраняют записи о звонках в разных форматах. Чтобы биллинг мог обработать эти файлы, их необходимо преобразовать — для этого нужны парсеры. Парсеры для наиболее распространённых моделей АТС уже есть в LANBilling, но вы можете добавить свой.

Форматы CDR делятся на два вида: бинарные и текстовые. В зависимости от того, какой формат использует ваша АТС, загрузите в LANBilling файл парсера или файл конфигурации. Примеры парсеров и обработки CDR.

  • Бинарный формат — загрузите отдельный файл парсера.

  • Текстовый формат обрабатывает text_plug-in — он уже входит в LANBilling. Для обработки текстовых форматов CDR, как правило, используются регулярные выражения — POSIX Extended. Регулярное выражение и другие параметры обработки задаются в специальном файле конфигурации. Расширение файла конфигурации — «.conf», а имя — название формата в нижнем регистре. Например, alcatel-2.conf.

  1. Сохраните файл в директории /usr/local/billing/parsers/.

  2. Откройте форму агента LBphone. Перейдите на вкладку «Парсеры».

image
  1. Нажмите «Добавить».

  2. В открывшемся окне укажите название парсера. Оно должно содержать имя плагина — поле plug-in в таблице pabxes. Также заполните описание — оно будет отображаться в других формах настроек.

image
  1. Выберите тип «парсер».

  2. Введите название файла.

image
  1. Нажмите «Сохранить».
image

Набор параметров, которые можно использовать в файле конфигурации:

  • pattern — паттерн регулярного выражения. Если в синтаксисе регулярного выражения есть ошибки, в логе агента появится запись об этом.
  • datetime — номер подстроки, содержащей дату и время звонка. Используется, если дата и время в строке идут подряд.
  • date — номер подстроки, содержащей дату звонка.
  • time — номер подстроки, содержащей время звонка.
  • ani — номер подстроки, содержащей номер А.
  • dnis — номер подстроки, содержащей номер Б.
  • dir — номер подстроки, содержащей признак направления звонка.
  • duration — номер подстроки, содержащей длительность звонка в секундах.
  • dur_our — номер подстроки, содержащей длительность звонка в часах.
  • dur_min — номер подстроки, содержащей длительность звонка в минутах.
  • dur_tenths — номер подстроки, содержащей количество десятых долей минуты в длительности звонка. Используется только в definity-2.
  • trunk_in — номер подстроки, содержащей признак оператора на входящей линии
  • trunk_out — номер подстроки, содержащей признак оператора на исходящей линии
  • In — признак входящего звонка. Должен быть в кавычках.
  • Out — признак исходящего звонка. Должен быть в кавычках.
  • local — признак локального звонка. Должен быть в кавычках.
  • transfer — признак транзитного звонка. Должен быть в кавычках.
  • dateformat — формат даты и времени.
  • cause — номер подстроки, содержащей причину завершения вызова.
  • uniqueid — номер подстроки, содержащей уникальный идентификатор звонка.
  • duration_format — формат длительности звонка. Используется только в Nokia.
  1. Сохраните файл в директории /usr/local/billing/parsers-configs/.

  2. Откройте форму агента LBphone. Перейдите на вкладку «Парсеры».

image
  1. Нажмите «Добавить».

  2. В открывшемся окне укажите название парсера. Также заполните описание — оно будет отображаться в других формах настроек.

image
  1. Выберите тип «файл конфигурации».

  2. Введите название файла.

image
  1. Нажмите «Сохранить».
image

Затем добавьте станцию — в её параметрах нужно будет указать парсер. Когда ваши абоненты будут совершать вызовы, LBphone определит, с какой станции они поступают, и подключит нужный парсер.

Парсер можно добавить в форме любого агента с типом LBphone. В дальнейшем парсер можно будет использовать для остальных агентов LBphone.

Когда завершите настройку, задайте параметры в файле конфигурации, а затем запустите модуль LBphone.

Примеры парсеров и обработки CDR

Примеры для бинарного формата CDR

Пример парсера на языке Perl
#!/usr/bin/perl
$|++;
## Uncoment the following block if PBX requires authentication. #######
#open (OUT,">&3")
#print OUT "Reguired-Login\n"
#print OUT "Required-Password\n"
## End of the block ##
while(<>)
{
  if( $_ =~ m/^(\d+);(\d+);(\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d);
  ([^;]*);([^;]*);([^;]*);([^;]*);(\d*);(\d*);$/ )
  {
    if( $2 eq "0" )
    {
      next;
    }
    print "direction=$1;duration=$2;timefrom=$3;numfrom=$4;numto=$5;trunk_in=$6;
    trunk_out=$7;uniqueid=$8;cause=$9;\n";
  }
  else
  {
    print STDERR "Error: cannot parse line $_\n";
  }
}
Пример результата обработки CDR
$ cat in
0;50;2012-01-01T00:00:00;84957950677;7450737;;;13;1;
1;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
$ cat in | ./parser.pl
direction=0;duration=50;timefrom=2012-01-01T00:00:00;numfrom=84957950677;numto=7450737;
trunk_in=;trunk_out=;uniqueid=13;cause=1;
direction=1;duration=3600;timefrom=2012-01-01T00:00:00;numfrom=7450737;numto=112;
trunk_in=A;trunk_out=B;uniqueid=666;cause=2;
Error: cannot parse line ;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
$

Примеры для текстового формата CDR

Пример файла конфигурации для Alcatel OmniPCX

alcatel-2.conf:

pattern = [^[:digit:]]*([[:digit:]]+)[[:space:]]+([-\<\>]+)[[:space:]]+([^[:space:]]+)[[:space:]]+
pattern = ([0-9]+\/[0-9]+\/[0-9]+[[:space:]]+[0-9]+\:[0-9]+)[[:space:]]+
pattern = ([0-9]{2})\:([0-9]{2})\:([0-9]{2})[[:space:]]+([0-9]*)
datetime = 4
ani = 1
dnis = 8
dir = 2
duration = 7
dur_hour = 5
dur_min = 6
trunk_in = 3
trunk_out = 3
in = "<--"
out = "-->"
dateformat = %d/%m/%y %H:%M
Пример разбора CDR-файла при помощи файла конфигурации

Исходная запись:

A103 –> 0 03/11/03 08:44 00:01:10 9571135
Параметр Позиция Значение из примера
Начало звонка 4 03.11.03 08:44:00
Длительность звонка 6 00:01:10
Номер вызываемого абонента 8 9571135
Номер вызывающего абонента 1 A103
Направление звонка 2 –>

Регулярное выражение, заданное в файле конфигурации, разобьёт исходную строку на 8 подстрок.

  • Номера абонентов. В первой подстроке содержится номер абонента А, в восьмой — номер абонента Б.

  • Входящий или исходящий вызов. Плагин сравнивает вторую подстроку со строками <– (in) и –> (out). Если в исходной записи найдётся подходящее значение, плагин установит значение 0 (входящий вызов) или значение 1 (исходящий). По умолчанию все звонки считаются исходящими.

  • Начало звонка. В примере заданы параметры datetime и dateformat. Подстрока, содержащая дату и время (в примере — четвёртая) конвертируется в Unix time. При этом используется формат, заданный в строке dateformat. Если дата и время начала вызова находятся в разных частях исходной строки, их положение задаётся параметрами конфигурации date и time. В некоторых форматах время начала вызова выводится в Unix time. Для таких форматов не нужно задавать в файле конфигурации параметр dateformat. Для форматов, у которых в дате начала вызова не указывается год, используется текущий год.

  • Длительность звонка. В примере звонок продолжался 0 часов (пятая подстрока), 1 минуту (шестая подстрока), 10 секунд (седьмая подстрока). Плагин переведет часы и минуты в секунды и подсчитает общую длительность в секундах.

Пример результата обработки CDR:

direction=1;duration=70;timefrom=1067838240;numfrom=103;numto=9571135;trunk_in=0;trunk_out=0;