Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk
Материал из BiTel WiKi
Admin (Обсуждение | вклад) |
Admin (Обсуждение | вклад) |
||
Строка 542: | Строка 542: | ||
Архив с '''cdr_radius.patch''' и '''dictionary.cisco''': | Архив с '''cdr_radius.patch''' и '''dictionary.cisco''': | ||
- | [[Медиа: asterisk_files.zip]] | + | |
+ | [[Медиа:asterisk_files.zip]] |
Версия 07:05, 17 апреля 2008
Начиная с версии 1.4.2 Asterisk поддерживает интеграцию с системами биллинга, базирующимися на протоколе Radius AAA. Из "трех китов" Radius'a (Authentication, Authorization, Accounting) на данный момент Asterisk может отправлять только пакеты Accounting при завершении сессии (Acct-Status-Type=Stop). При этом Asterisk использует несколько отличные от используемых в повсеместной практике VoIP атрибуты Radius (вместо привычных атрибутов Cisco используются собственные атрибуты Digium). В связи с этим возникают некоторые сложности при интеграции Asterisk'а с BGBilling'ом, поскольку последний для обсчета сессий VoIP использует атрибуты Cisco.
Интеграцию Asterisk'а с BGBilling'ом можно осуществить двумя путями:
- Используя скрипты предобработки RADIUS запросов, заменить получаемые от Asterisk'а атрибуты Digium на атрибуты Cisco. Положительной стороной данного решения можно считать отсутствие необходимости изменения программного кода Asterisk'а. Отрицательной - сложность совмещения Asterisk'а с другими системами биллинга, базирующимися на протоколе Radius (если возникнет такая необходимость), а также слабые возможности отпределения типа звонка (originate/answer) только средствами BGBilling'а.
- Посредством изменения программного кода Asterisk'а, реализовать возможность отправки им атрибутов Cisco. Преимущества данного решения - возможность более гибкого отпределения типа звонка (originate/answer) и более простая интеграция с BGBilling'ом за счет использования de facto стандартных атрибутов Cisco. К отрицательным сторонам можно отнести необходимость изменения программного кода Asterisk'а, которое требует несколько углубленных знаний. В данной статье рассматривается именно этот вариант интеграции.
В статье мы не будем подробно касаться вопросов, связанных с общими настройками Linux, Asterisk и BGBilling, описанными в документации, а только рассмотрим те дополнительные действия, которые необходимо будет предпринять для интеграции Asterisk'а с BGBilling'ом. Изложенное ниже описание решения работает у автора данной статьи в тестовом режиме и может содержать некоторые ошибки, поэтому не рекомендуется использовать эти рекомендации при предоставлении коммерческих услуг без полного понимания принципов и алгоритмов работы всех частей системы.
Итак, подразумевается, что у нас имеется:
- Установленная и настроенная ОС Linux, на которой будет установлен Asterisk
- Исходный дистрибутив Asterisk (asterisk-1.4.хх.tar.gz)
- Исходный дистрибутив radiusclient-ng (radiusclient-ng-0.5.6.tar.gz)
- Установленный и настроенный BGBilling
Установка:
1. Разворачиваем дистрибутив Asterisk и radiusclient-ng:
cd /usr/local/src tar zxvf asterisk-1.4.хх.tar.gz tar zxvf radiusclient-ng-0.5.6.tar.gz
2. Собираем radiusclient-ng
cd ./radiusclient-ng-0.5.6 ./configure make install
3. Собираем asterisk
cd ../asterisk-1.4.хх ./configure make menuconfig
На данном этапе необходимо проверить и при необходимости включить использование cdr_radius (находится в разделе [2. Call Detail Recording]). Если указанная опция недоступна, то необходимо проверить корректность установки radiusclient-ng.
В следующем шаге необходимо применить патч к файлу ./cdr/cdr_radius.c. Приложенный патч был создан для Asterisk версии 1.4.13, и в случае применения его к другим версиям, возможно возникновение ошибок.
cdr_radius.patch
--- cut here --- --- cdr_radius.c.orig 2007-06-15 03:50:40.000000000 +0600 +++ cdr_radius.c 2008-04-16 01:15:23.000000000 +0600 @@ -52,27 +52,17 @@ /*! ISO 8601 standard format */ #define DATE_FORMAT "%Y-%m-%d %T %z" -#define VENDOR_CODE 22736 +#define VENDOR_CODE 9 enum { - PW_AST_ACCT_CODE = 101, - PW_AST_SRC = 102, - PW_AST_DST = 103, - PW_AST_DST_CTX = 104, - PW_AST_CLID = 105, - PW_AST_CHAN = 106, - PW_AST_DST_CHAN = 107, - PW_AST_LAST_APP = 108, - PW_AST_LAST_DATA = 109, - PW_AST_START_TIME = 110, - PW_AST_ANSWER_TIME = 111, - PW_AST_END_TIME = 112, - PW_AST_DURATION = 113, - PW_AST_BILL_SEC = 114, - PW_AST_DISPOSITION = 115, - PW_AST_AMA_FLAGS = 116, - PW_AST_UNIQUE_ID = 117, - PW_AST_USER_FIELD = 118 + PW_H323_REMOTE_ADDRESS = 23, + PW_H323_CONF_ID = 24, + PW_H323_SETUP_TIME = 25, + PW_H323_CALL_ORIGIN = 26, + PW_H323_CALL_TYPE = 27, + PW_H323_CONNECT_TIME = 28, + PW_H323_DISCONNECT_TIME = 29, + PW_H323_DISCONNECT_CAUSE = 30 }; enum { @@ -105,49 +95,26 @@ return -1; /* Account code */ - if (!rc_avpair_add(rh, send, PW_AST_ACCT_CODE, &cdr->accountcode, strlen(cdr->accountcode), VENDOR_CODE)) - return -1; + if (strlen(cdr->accountcode)) + if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->accountcode, strlen(cdr->accountcode), 0)) + return -1; + /* Source */ - if (!rc_avpair_add(rh, send, PW_AST_SRC, &cdr->src, strlen(cdr->src), VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_CALLING_STATION_ID, &cdr->src, strlen(cdr->src), 0)) return -1; /* Destination */ - if (!rc_avpair_add(rh, send, PW_AST_DST, &cdr->dst, strlen(cdr->dst), VENDOR_CODE)) - return -1; - - /* Destination context */ - if (!rc_avpair_add(rh, send, PW_AST_DST_CTX, &cdr->dcontext, strlen(cdr->dcontext), VENDOR_CODE)) - return -1; - - /* Caller ID */ - if (!rc_avpair_add(rh, send, PW_AST_CLID, &cdr->clid, strlen(cdr->clid), VENDOR_CODE)) - return -1; - - /* Channel */ - if (!rc_avpair_add(rh, send, PW_AST_CHAN, &cdr->channel, strlen(cdr->channel), VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_CALLED_STATION_ID, &cdr->dst, strlen(cdr->dst), 0)) return -1; - /* Destination Channel */ - if (!rc_avpair_add(rh, send, PW_AST_DST_CHAN, &cdr->dstchannel, strlen(cdr->dstchannel), VENDOR_CODE)) - return -1; - - /* Last Application */ - if (!rc_avpair_add(rh, send, PW_AST_LAST_APP, &cdr->lastapp, strlen(cdr->lastapp), VENDOR_CODE)) - return -1; - - /* Last Data */ - if (!rc_avpair_add(rh, send, PW_AST_LAST_DATA, &cdr->lastdata, strlen(cdr->lastdata), VENDOR_CODE)) - return -1; - - /* Start Time */ if (ast_test_flag(&global_flags, RADIUS_FLAG_USEGMTIME)) gmtime_r(&(cdr->start.tv_sec), &tm); else ast_localtime(&(cdr->start.tv_sec), &tm, NULL); strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); - if (!rc_avpair_add(rh, send, PW_AST_START_TIME, timestr, strlen(timestr), VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_H323_SETUP_TIME, timestr, strlen(timestr), VENDOR_CODE)) return -1; /* Answer Time */ @@ -156,7 +123,7 @@ else ast_localtime(&(cdr->answer.tv_sec), &tm, NULL); strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); - if (!rc_avpair_add(rh, send, PW_AST_ANSWER_TIME, timestr, strlen(timestr), VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_H323_CONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE)) return -1; /* End Time */ @@ -165,47 +132,58 @@ else ast_localtime(&(cdr->end.tv_sec), &tm, NULL); strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); - if (!rc_avpair_add(rh, send, PW_AST_END_TIME, timestr, strlen(timestr), VENDOR_CODE)) - return -1; - - /* Duration */ - if (!rc_avpair_add(rh, send, PW_AST_DURATION, &cdr->duration, 0, VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE)) return -1; /* Billable seconds */ - if (!rc_avpair_add(rh, send, PW_AST_BILL_SEC, &cdr->billsec, 0, VENDOR_CODE)) + if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_TIME, &cdr->billsec, 0, 0)) return -1; /* Disposition */ - tmp = ast_cdr_disp2str(cdr->disposition); - if (!rc_avpair_add(rh, send, PW_AST_DISPOSITION, tmp, strlen(tmp), VENDOR_CODE)) + switch (cdr->disposition) { + case AST_CDR_ANSWERED: + tmp = "0"; + break; + case AST_CDR_NOANSWER: + tmp = "5"; + break; + case AST_CDR_BUSY: + tmp = "17"; + break; + case AST_CDR_FAILED: + tmp = "22"; + break; + case AST_CDR_NULL: + tmp = "22"; + break; + default: + tmp = "22"; + break; + } + + if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_CAUSE, tmp, strlen(tmp), VENDOR_CODE)) return -1; - /* AMA Flags */ - tmp = ast_cdr_flags2str(cdr->amaflags); - if (!rc_avpair_add(rh, send, PW_AST_AMA_FLAGS, tmp, strlen(tmp), VENDOR_CODE)) + /* Setting Acct-Session-Id attribute for proper generation + of Acct-Unique-Session-Id on server side */ + /* Unique ID */ + if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0)) + return -1; + if (!rc_avpair_add(rh, send, PW_H323_CONF_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE)) return -1; - if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUNIQUEID)) { - /* Unique ID */ - if (!rc_avpair_add(rh, send, PW_AST_UNIQUE_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE)) - return -1; - } - - if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUSERFIELD)) { - /* append the user field */ - if (!rc_avpair_add(rh, send, PW_AST_USER_FIELD, &cdr->userfield, strlen(cdr->userfield), VENDOR_CODE)) - return -1; - } - /* Setting Acct-Session-Id & User-Name attributes for proper generation - of Acct-Unique-Session-Id on server side */ - /* Channel */ - if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->channel, strlen(cdr->channel), 0)) + /* Call Type */ + if (!rc_avpair_add(rh, send, PW_H323_CALL_TYPE, "voip", 4, VENDOR_CODE)) return -1; - /* Unique ID */ - if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0)) + /* Call Origin */ + if (strcmp(cdr->userfield, "answer")) + tmp = "originate"; + else + tmp = "answer"; + + if (!rc_avpair_add(rh, send, PW_H323_CALL_ORIGIN, tmp, strlen(tmp), VENDOR_CODE)) return -1; return 0;
Данный файл момещаем в директорию ./cdr и применяем его с помощью команды
patch -p0 < cdr_radius.patch
После выпонения команды, оригинальный файл сохраняется по именем cdr_radius.c.orig, а в cdr_radius.c будет находиться измененный код.
cd ../asterisk-1.4.хх make install
На этом установку можно считать оконченной. Приступаем к настройке.
Настройка:
1. Настраиваем radiusclient-ng в соотвествии с документацией. По умолчанию, файлы конфигурации radiusclient-ng располагаются в директории /usr/local/etc/radiusclient-ng. Для корректной работы программы, возможно прийдется создать символьную ссылку на эту директорию с помощью команды
ln -s /usr/local/etc/radiusclient-ng /etc
В файле /usr/local/etc/radiusclient-ng/radiusclient.conf изменяем следующие настройки:
auth_order radius authserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в auth.port BGRadiusVoip/radius.properties acctserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в acct.port BGRadiusVoip/radius.properties
В файле /usr/local/etc/radiusclient-ng/radiusclient.conf добавляем строку для нашего сервера BGRadiusVoip, содержащую адрес сервера и пароль, который в дальнейшем будет указан в конфигурации NAS'а в BGRadiusVoip.
Для работы radiusclient-ng с атрибутами Cisco, необходимо добавить словарь атрибутов. Приложенный файл необходимо поместить в /usr/local/etc/radiusclient-ng/dictionary.cisco
--- cut here --- # -*- text -*- # # dictionary.cisco # # Accounting VSAs originally by # "Marcelo M. Sosa Lugones" <marcelo@sosa.com.ar> # # Version: $Id: dictionary.cisco,v 1.12.4.1 2005/11/30 22:17:21 aland Exp $ # # For documentation on Cisco RADIUS attributes, see: # # http://www.cisco.com/univercd/cc/td/doc/product/access/acs_serv/vapp_dev/vsaig3.htm # VENDOR Cisco 9 # # Standard attribute # BEGIN-VENDOR Cisco ATTRIBUTE Cisco-AVPair 1 string vendor=Cisco ATTRIBUTE Cisco-NAS-Port 2 string vendor=Cisco # # T.37 Store-and-Forward attributes. # ATTRIBUTE Cisco-Fax-Account-Id-Origin 3 string vendor=Cisco ATTRIBUTE Cisco-Fax-Msg-Id 4 string vendor=Cisco ATTRIBUTE Cisco-Fax-Pages 5 string vendor=Cisco ATTRIBUTE Cisco-Fax-Coverpage-Flag 6 string vendor=Cisco ATTRIBUTE Cisco-Fax-Modem-Time 7 string vendor=Cisco ATTRIBUTE Cisco-Fax-Connect-Speed 8 string vendor=Cisco ATTRIBUTE Cisco-Fax-Recipient-Count 9 string vendor=Cisco ATTRIBUTE Cisco-Fax-Process-Abort-Flag 10 string vendor=Cisco ATTRIBUTE Cisco-Fax-Dsn-Address 11 string vendor=Cisco ATTRIBUTE Cisco-Fax-Dsn-Flag 12 string vendor=Cisco ATTRIBUTE Cisco-Fax-Mdn-Address 13 string vendor=Cisco ATTRIBUTE Cisco-Fax-Mdn-Flag 14 string vendor=Cisco ATTRIBUTE Cisco-Fax-Auth-Status 15 string vendor=Cisco ATTRIBUTE Cisco-Email-Server-Address 16 string vendor=Cisco ATTRIBUTE Cisco-Email-Server-Ack-Flag 17 string vendor=Cisco ATTRIBUTE Cisco-Gateway-Id 18 string vendor=Cisco ATTRIBUTE Cisco-Call-Type 19 string vendor=Cisco ATTRIBUTE Cisco-Port-Used 20 string vendor=Cisco ATTRIBUTE Cisco-Abort-Cause 21 string vendor=Cisco # # Voice over IP attributes. # ATTRIBUTE h323-remote-address 23 string vendor=Cisco ATTRIBUTE h323-conf-id 24 string vendor=Cisco ATTRIBUTE h323-setup-time 25 string vendor=Cisco ATTRIBUTE h323-call-origin 26 string vendor=Cisco ATTRIBUTE h323-call-type 27 string vendor=Cisco ATTRIBUTE h323-connect-time 28 string vendor=Cisco ATTRIBUTE h323-disconnect-time 29 string vendor=Cisco ATTRIBUTE h323-disconnect-cause 30 string vendor=Cisco ATTRIBUTE h323-voice-quality 31 string vendor=Cisco ATTRIBUTE h323-ivr-out 32 string vendor=Cisco ATTRIBUTE h323-gw-id 33 string vendor=Cisco ATTRIBUTE h323-incoming-conf-id 35 string vendor=Cisco ATTRIBUTE h323-credit-amount 101 string vendor=Cisco ATTRIBUTE h323-credit-time 102 string vendor=Cisco ATTRIBUTE h323-return-code 103 string vendor=Cisco ATTRIBUTE h323-prompt-id 104 string vendor=Cisco ATTRIBUTE h323-time-and-day 105 string vendor=Cisco ATTRIBUTE h323-redirect-number 106 string vendor=Cisco ATTRIBUTE h323-preferred-lang 107 string vendor=Cisco ATTRIBUTE h323-redirect-ip-address 108 string vendor=Cisco ATTRIBUTE h323-billing-model 109 string vendor=Cisco ATTRIBUTE h323-currency 110 string vendor=Cisco ATTRIBUTE subscriber 111 string vendor=Cisco ATTRIBUTE gw-rxd-cdn 112 string vendor=Cisco ATTRIBUTE gw-final-xlated-cdn 113 string vendor=Cisco ATTRIBUTE remote-media-address 114 string vendor=Cisco ATTRIBUTE release-source 115 string vendor=Cisco ATTRIBUTE gw-rxd-cgn 116 string vendor=Cisco ATTRIBUTE gw-final-xlated-cgn 117 string vendor=Cisco # SIP Attributes ATTRIBUTE call-id 141 string vendor=Cisco ATTRIBUTE session-protocol 142 string vendor=Cisco ATTRIBUTE method 143 string vendor=Cisco ATTRIBUTE prev-hop-via 144 string vendor=Cisco ATTRIBUTE prev-hop-ip 145 string vendor=Cisco ATTRIBUTE incoming-req-uri 146 string vendor=Cisco ATTRIBUTE outgoing-req-uri 147 string vendor=Cisco ATTRIBUTE next-hop-ip 148 string vendor=Cisco ATTRIBUTE next-hop-dn 149 string vendor=Cisco ATTRIBUTE sip-hdr 150 string vendor=Cisco # # Extra attributes sent by the Cisco, if you configure # "radius-server vsa accounting" (requires IOS11.2+). # ATTRIBUTE Cisco-Multilink-ID 187 integer vendor=Cisco ATTRIBUTE Cisco-Num-In-Multilink 188 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Input-Octets 190 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Output-Octets 191 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Input-Packets 192 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Output-Packets 193 integer vendor=Cisco ATTRIBUTE Cisco-Maximum-Time 194 integer vendor=Cisco ATTRIBUTE Cisco-Disconnect-Cause 195 integer vendor=Cisco ATTRIBUTE Cisco-Data-Rate 197 integer vendor=Cisco ATTRIBUTE Cisco-PreSession-Time 198 integer vendor=Cisco ATTRIBUTE Cisco-PW-Lifetime 208 integer vendor=Cisco ATTRIBUTE Cisco-IP-Direct 209 integer vendor=Cisco ATTRIBUTE Cisco-PPP-VJ-Slot-Comp 210 integer vendor=Cisco ATTRIBUTE Cisco-PPP-Async-Map 212 integer vendor=Cisco ATTRIBUTE Cisco-IP-Pool-Definition 217 string vendor=Cisco ATTRIBUTE Cisco-Assign-IP-Pool 218 integer vendor=Cisco ATTRIBUTE Cisco-Route-IP 228 integer vendor=Cisco ATTRIBUTE Cisco-Link-Compression 233 integer vendor=Cisco ATTRIBUTE Cisco-Target-Util 234 integer vendor=Cisco ATTRIBUTE Cisco-Maximum-Channels 235 integer vendor=Cisco ATTRIBUTE Cisco-Data-Filter 242 integer vendor=Cisco ATTRIBUTE Cisco-Call-Filter 243 integer vendor=Cisco ATTRIBUTE Cisco-Idle-Limit 244 integer vendor=Cisco ATTRIBUTE Cisco-Account-Info 250 string vendor=Cisco ATTRIBUTE Cisco-Service-Info 251 string vendor=Cisco ATTRIBUTE Cisco-Command-Code 252 string vendor=Cisco ATTRIBUTE Cisco-Control-Info 253 string vendor=Cisco ATTRIBUTE Cisco-Xmit-Rate 255 integer vendor=Cisco VALUE Cisco-Disconnect-Cause Unknown 2 VALUE Cisco-Disconnect-Cause CLID-Authentication-Failure 4 VALUE Cisco-Disconnect-Cause No-Carrier 10 VALUE Cisco-Disconnect-Cause Lost-Carrier 11 VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 12 VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 13 VALUE Cisco-Disconnect-Cause User-Ends-Session 20 VALUE Cisco-Disconnect-Cause Idle-Timeout 21 VALUE Cisco-Disconnect-Cause Exit-Telnet-Session 22 VALUE Cisco-Disconnect-Cause No-Remote-IP-Addr 23 VALUE Cisco-Disconnect-Cause Exit-Raw-TCP 24 VALUE Cisco-Disconnect-Cause Password-Fail 25 VALUE Cisco-Disconnect-Cause Raw-TCP-Disabled 26 VALUE Cisco-Disconnect-Cause Control-C-Detected 27 VALUE Cisco-Disconnect-Cause EXEC-Program-Destroyed 28 VALUE Cisco-Disconnect-Cause Timeout-PPP-LCP 40 VALUE Cisco-Disconnect-Cause Failed-PPP-LCP-Negotiation 41 VALUE Cisco-Disconnect-Cause Failed-PPP-PAP-Auth-Fail 42 VALUE Cisco-Disconnect-Cause Failed-PPP-CHAP-Auth 43 VALUE Cisco-Disconnect-Cause Failed-PPP-Remote-Auth 44 VALUE Cisco-Disconnect-Cause PPP-Remote-Terminate 45 VALUE Cisco-Disconnect-Cause PPP-Closed-Event 46 VALUE Cisco-Disconnect-Cause Session-Timeout 100 VALUE Cisco-Disconnect-Cause Session-Failed-Security 101 VALUE Cisco-Disconnect-Cause Session-End-Callback 102 VALUE Cisco-Disconnect-Cause Invalid-Protocol 120 END-VENDOR Cisco --- cut here ---
В файле /usr/local/etc/radiusclient-ng/dictionary необходимо добавить строку:
$INCLUDE dictionary.cisco
2. Настраиваем BGRadiusVoip. Настройка сводится к описанному в документации добавлению NAS'а в модуле IP-телефония. Указываем имя NAS'а, адрес IP, пароль. Устанавливаем Вендор Cisco (он должен присутствовать в конфигурации модуля). Создаем конфигурацию NAS'а и помимо параметра service, указываем:
auth.in=voip/answer auth.out=voip/originate acct.in=voip/answer acct.out=voip/originate
3. Настраиваем Asterisk в соотвествии с документацией. Чтобы задействовать Radius Accounting, в файл /etc/asterisk/cdr.conf раскомментируем или добавим следующие строки:
[radius] usegmtime=no ; log date/time in GMT loguniqueid=yes ; log uniqueid loguserfield=yes ; log user field ; Set this to the location of the radiusclient-ng configuration file ; The default is /etc/radiusclient-ng/radiusclient.conf radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf
На этом основную настройку связки Asterisk'a с BGBilling'ом можно считать оконченной. В итоге, BGBilling должен получать примерно такие пакеты:
15 22:20:57 Type=ACCOUNTING_REQUEST Attributes: User-Name=pbxpress NAS-IP-Address=x.x.x.x NAS-Port=0 Acct-Status-Type=2 Acct-Delay-Time=0 Acct-Session-Time=699 Acct-Session-Id=1208274330.136 Calling-Station-Id=10027341003 Called-Station-Id=73512545454 h323-disconnect-cause=0 h323-connect-time=2008-04-15 21:45:46 +0000 h323-disconnect-time=2008-04-15 21:57:25 +0000 h323-conf-id=1208274330.136 h323-setup-time=2008-04-15 21:45:30 +0000 h323-call-origin=originate h323-call-type=voip
Остановимся на некоторых ньюансах определения типа звонка.
Поскольку Asterisk не является шлюзом в том понимании, которое используется при характеристике оборудования, стоящего на границе между ТФОП и сетью IP, однозначно определить средствами BGBilling'а, какие звонки являются исходящими, а какие входящими не всегда возможно, в частности в тех случаях, когда Asterisk выполняет функции транзитного софтсвича. Поэтому для реализации алгоритма определения типа звонка можно использовать следующее решение - прописывать тип звонка средствами Asterisk'a в CDR userfield. Предложенный выше измененный модуль cdr_radius будет извлекать эти данные и передавать их BGBilling'у внутри атрибутов Radius'a. Записать информацию о типе звонка в Asterisk'е можно средствами dialplan'а, к примеру:
/etc/asterisk/extensions.ael
... macro ael-answer( ext , dev ) { Set(CDR(userfield)="answer"); Dial(${dev}/${ext},120); Hangup; }; macro ael-originate( ext , dev ) { Set(CDR(userfield)="originate"); Dial(${dev}/${ext},120); Hangup; }; context ael-default { _7XXXXXXXXXX => { &ael-originate(${EXTEN},SIP/sipnet); }; _10027340XXX => &ael-answer(${EXTEN},SIP/pbxpress); _10027343XXX => &ael-answer(${EXTEN},SIP/cgp); } ...
Как видно из данного примера, при описании каждого маршрута, мы используем макрос, записывающий требуемую информацию о типе звонка.
Еще одной востребованной функцией измененного модуля cdr_radius может оказаться возможность поместить в передаваемый биллингу атрибут User-Name значение, которое можно указать для каждого peer в файлах конфигурации каналов Asterisk'a (sip.conf, iax.conf и т.д.) с помощью параметра accountcode. В этом случае, если на пользователя маршрутизируется не один или несколько номеров, а целый префикс, возможна тарификация трафика не по номерам, а по пользователям (с использованием "Поиск по User-Name=ALIAS"), при этом в ALIAS надо указывать то значение, которое вы будете помещать в accountcode.
Пример в /etc/asterisk/sip.conf
... [pbxpress] type=peer context=default ; Context for incoming calls from this user host=x.x.x.x accountcode=pbxpress
Архив с cdr_radius.patch и dictionary.cisco: