Cisco CDR for gateway

Для выгрузки CDR на сервер биллинга не всегда подходит использование стандартного syslog-а. В IOS предусмотрено использование внешнего или съемного хранилища:

router(config)#gw-accounting file
router(config-gw-accounting-file)#primary ?
  ftp  ftp mode of file transfer
  ifs  Local file system, i.e.,flash/ mem slot device name such as flash: slot0:
Такой метод называется File Accounting. Метод File Accounting обеспечивает сбор CDR записей в файлы CSV формата (поля разделяются запятыми) и запись этих файлов на внутреннюю флэш память или на внешний FTP сервер. CDR записи формируются для каждой ветви вызова, выполняемого через голосовые шлюзы Cisco. Для CDR записей в CSV формате применяются следующие правила:

  • Каждая CDR запись имеет свой номер, который находится в начале записи. Поля, не содержащие данных, включаются как пустые поля.
  • Двенадцать полей являются общими и используются для сбора функционально-зависимой информации. Для основного вызова CDR запись генерируется с базовой информацией о вызове в функциональной части полей. Поля являются статическими относительно своих позиций, однако, назначение VSA* полей определяется типом функции.
  • CDR записи генерируются для каждой используемой функции. Например, если при выполнении вызова был выполнена передача вызова, то будут сгенерированы 2-е CDR записи: - CDR запись для основного этапа вызова; - CDR запись для этапа передачи вызова.

При настройке этого метода получения CDR информации определяются основное и дополнительное устройства для хранения информации. В случае если передача на основное устройство по какой-то причине прерывается, шлюз пытается восстановить связь с основным устройством заданное число раз, и если это не удается, то переключается на дополнительное устройство. Пользователь может затем вручную переключить вывод CDR на основное устройство при восстановления его работы. В случае, когда и дополнительное устройство прерывают свою работу, процесс учета вызовов останавливается и система фиксирует ошибку. При этом новые CDR записи будут потеряны до тех пор, пока одно из устройств записи не восстановит работоспособности и вы вручную не сделаете перезагрузку. Шлюз временно хранит информацию о выполненных вызовах в буфере памяти перед тем, как она будет записана в заданный файл. Информация добавляется в CDR файл после истечения заданного временного периода или когда буфер памяти переполняется. Шлюз закрывает CDR файл и создает новый после истечения заданного временного интервала или этот процесс может быть инициирован вручную. Другие опции позволяют выбрать специфические параметры, которые будут фиксироваться в CDR записях. CDR записи могут генерироваться в одном из следующих форматов:

  • Подробный формат;
  • Компактный формат;
  • Определяемый пользователем формат.

В минимальной конфигурации это выглядит примерно так:

gw-accounting syslog
gw-accounting file
 primary ftp 1.2.3.4/voip-cdr.txt username cdr password cdr
 secondary ftp 4.3.2.1/voip-cdr.txt username cdr password cdr
 maximum cdrflush-timer 15
 cdr-format compact
Хотя и выбран компактный формат для файлов, но не обольщайтесь. По документации в этом формате выгружаются всего 23 поля (0-22), а их там больше сотни! Имеется также возможность подстроить выдачу CDR полей под собственные потребности (создать пользовательский формат). Для этого необходимо создать шаблон, который представляет собой текстовый файл, с перечисленными в нем именами требуемых полей. Только эти CDR поля будут записываться в CDR файл. Данные из маршрутизатора можно выгрузить и принудительно:
router#file-acct flush ?
  with-close     File accounting flush pending accounting to file,and close file
  without-close  File accounting flush pending accounting to file
file-acct flush with-close - Сбрасывает данные из буфера в файл с закрытием файла.

Настройки маршрутизатора с присоединением к оператору связи по Е1 следующие:

gw-accounting file
 primary ftp 999.99.9.1/ username cdr password cdr
 maximum cdrflush-timer 15
На ftp-сервере, где разрешена запись пользователю cdr, по-умолчанию создается "скрытый" (ls -la) файл вида .имя_хоста_дата_время. Файл периодически дописывается, если есть о чем писать. Новый создается раз в сутки относительно времени настройки аккаунтинга.
VOIP-C2901(config-gw-accounting-file)#maximum fileclose-timer ?
  <60-1440>  in minutes, default is 1440min
Нет желания использовать компактный режим, так как в детализированном виде есть время соединения в секундах. Все поля разделены "," и идут ровно в том порядке, в котором они указаны в документации. ужны поля, выделенные ниже в примере: unix_time, leg-type, username, clid, dnis, h323-setup-time, override-session-time. Поле leg-type имеет несколько значений и это удобно использовать, так как на каждую "ногу" создается отдельная запись. Интересует только стык с оператором - "1", а именно вторая запись о звонке с id "80CD1398 50739150 854F5801 AC117AEF".
1426682736,788957,0,2,"80CD1398 50739150 854F5801 AC117AEF","","","19:45:04.169 KRSK Wed Mar 18 2015","","19:45:11.829 KRSK Wed Mar 18 2015","19:45:36.849 KRSK Wed Mar 18 2015","","","answer",0,"",594,93528,1413,226080,"662","662","089830000000","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",25,"","","0","999.99.9.100","","","","","","","","","","","","","","","","","","","","","","ton:0,npi:0,#:089830000000","ton:0,npi:0,pi:0,si:1,#:662","","","","","","","","","","","","Unknown","","","cisco","","","TWC","03/18/2015 19:45:04.168","662","089830000000",0,700847,80CD1398 50739150 854F5801 AC117AEF,C09DD,"","","","","","","",""
1426682737,788958,0,1,"80CD1398 50739150 854F5801 AC117AEF","","","19:45:04.525 KRSK Wed Mar 18 2015","19:45:08.415 KRSK Wed Mar 18 2015","19:45:11.815 KRSK Wed Mar 18 2015","19:45:37.185 KRSK Wed Mar 18 2015","","","originate",0,"",1413,237384,598,94168,"662","3912000000","89830000000","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",25,"Tariff:Unknown","","0","","","","","","","","","","","","","0/1:1","","","","","","","","","","ton:0,npi:0,#:089830000000","ton:0,npi:0,pi:0,si:1,#:662","","","","ton:0,npi:0,#:89830000000","ton:0,npi:0,pi:0,si:1,#:3912000000","","","","","","","Unknown","","","","","","TWC","03/18/2015 19:45:04.172","3912000000","89830000000",0,700848,80CD1398 50739150 854F5801 AC117AEF,C09DE,"","","","","","","",""
Мне нужны данные только об исходящих в телефонную сеть оператора звонках, которые будут складываться в базу sqlite:
bash$ awk -F"," '{if ($4=='1' && $14~'originate' && $68>0 && $22~'3912000') {print "insert into cisco values ("$1","$21","$22","$23","$8","$68");"} }' имя_файла_cdr > OUT.sql
bash$ sqlite3 ciscocdr.db < OUT.sql
Пример работы с базой:
bash$ sqlite3 ciscocdr.db 
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema cisco
CREATE TABLE cisco ( unix_time integer, username , clid , dnis , setuptime , sessiontime integer );
sqlite> select * from cisco where sessiontime>300 and dnis like '8%' and setuptime like '%Mar 18%' order by sessiontime desc;