Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius

Материал из BiTel WiKi

Перейти к: навигация, поиск

Начиная с версии 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'ом можно осуществить двумя путями:

  1. Используя скрипты предобработки RADIUS запросов, заменить получаемые от Asterisk'а атрибуты Digium на атрибуты Cisco. Положительной стороной данного решения можно считать отсутствие необходимости изменения программного кода Asterisk'а. Отрицательной - сложность совмещения Asterisk'а с другими системами биллинга, базирующимися на протоколе Radius (если возникнет такая необходимость). В данной статье рассматривается именно этот вариант интеграции.
  2. Посредством изменения программного кода Asterisk'а, реализовать возможность отправки им атрибутов Cisco. Преимущества данного решения - более простая интеграция с BGBilling'ом за счет использования de facto стандартных атрибутов Cisco. К отрицательным сторонам можно отнести необходимость изменения программного кода Asterisk'а, которое требует несколько углубленных знаний. Этот вариант интеграции рассматривается в статье Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk

В статье мы не будем подробно касаться вопросов, связанных с общими настройками Linux, Asterisk и BGBilling, описанными в документации, а только рассмотрим те дополнительные действия, которые необходимо будет предпринять для интеграции Asterisk'а с BGBilling'ом. Изложенное ниже описание решения работает у автора данной статьи в тестовом режиме и может содержать некоторые ошибки, поэтому не рекомендуется использовать эти рекомендации при предоставлении коммерческих услуг без полного понимания принципов и алгоритмов работы всех частей системы.

В общих чертах, описанный ниже скрипт делает следующее:

  • Заменяются атрибуты вендора Digium (22736) на аналогичные атрибуты вендора Cisco (9)
  • Если в поле accountcode стандартной статистики Астериска (CDR) присутствует какое-либо значение, то оно подставляется в атрибут User-Name, если значения нет, то в User-Name подставляется номер вызывающего абонента
  • Если в поле userfield стандартной статистики Астериска (CDR) присутствует значение "answer", то оно подставляется в атрибут h323-call-origin, при ином значении или отсутствии значения в поле userfield, в h323-call-origin будет установлено значение originate. Соответственно на основании этого значения устанавливается тип (направление) звонка


Итак, подразумевается, что у нас имеется:

  1. Установленная и настроенная ОС Linux, на которой будет установлен Asterisk
  2. Исходный дистрибутив Asterisk (asterisk-1.4.хх.tar.gz)
  3. Исходный дистрибутив radiusclient-ng (radiusclient-ng-0.5.6.tar.gz)
  4. Установленный и настроенный 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.

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 и Digium, необходимо добавить словари атрибутов. Приложенный файл необходимо поместить в /usr/local/etc/radiusclient-ng/dictionary.cisco

# -*- 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

Приложенный файл необходимо поместить в /usr/local/etc/radiusclient-ng/dictionary.digium

#
# Digium's Asterisk specific radius attributes
# markster@digium.com
#
#
VENDOR Digium 22736

BEGIN-VENDOR Digium

ATTRIBUTE       Asterisk-Acc-Code 101 string Digium
ATTRIBUTE       Asterisk-Src 102 string Digium
ATTRIBUTE       Asterisk-Dst 103 string Digium
ATTRIBUTE       Asterisk-Dst-Ctx 104 string Digium
ATTRIBUTE       Asterisk-Clid 105 string Digium
ATTRIBUTE       Asterisk-Chan 106 string Digium
ATTRIBUTE       Asterisk-Dst-Chan 107 string Digium
ATTRIBUTE       Asterisk-Last-App 108 string Digium
ATTRIBUTE       Asterisk-Last-Data 109 string Digium
ATTRIBUTE       Asterisk-Start-Time 110 string Digium
ATTRIBUTE       Asterisk-Answer-Time 111 string Digium
ATTRIBUTE       Asterisk-End-Time 112 string Digium
ATTRIBUTE       Asterisk-Duration 113 integer Digium
ATTRIBUTE       Asterisk-Bill-Sec 114 integer Digium
ATTRIBUTE       Asterisk-Disposition 115 string Digium
ATTRIBUTE       Asterisk-AMA-Flags 116 string Digium
ATTRIBUTE       Asterisk-Unique-ID 117 string Digium
ATTRIBUTE       Asterisk-User-Field 118 string Digium

END-VENDOR Digium

В файле /usr/local/etc/radiusclient-ng/dictionary необходимо добавить строки:

$INCLUDE dictionary.cisco
$INCLUDE dictionary.digium

2. Настраиваем BGRadiusVoip. Настройка сводится к описанному в документации добавлению NAS'а в модуле IP-телефонии и добавлению словаря с атрибутами Digium для BGRadiusVoip. Указываем имя NAS'а, адрес IP, пароль. Устанавливаем Вендор Cisco (он должен присутствовать в конфигурации модуля). Создаем конфигурацию NAS'а и помимо параметра service, указываем:

auth.in=VOIP/answer
auth.out=VOIP/originate
acct.in=VOIP/answer
acct.out=VOIP/originate

На закладке Скрипт предобработки в конфигурации созданного NAS'а добавляем следующий скрипт:

import bitel.billing.server.radius.*;

if (request.getIntAttribute(RadiusStandartAttributes.Acct_Status_Type) == 2) {
// Устанавливаем Calling-Station-Id = Asterisk-Src
CallingStationId = request.getVendorAttributes(22736, 102).get(0).getStringValue();
request.setStringAttribute(RadiusStandartAttributes.Calling_Station_Id, CallingStationId);

// Проверяем наличие Asterisk-Acc-Code, и если он существует,
// то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
// то устанавливаем User-Name = Calling-Station-Id
UserName = request.getVendorAttributes(22736, 101);
if (UserName != null)
	request.setStringAttribute(RadiusStandartAttributes.User_Name, UserName.get(0).getStringValue());
else
	request.setStringAttribute(RadiusStandartAttributes.User_Name, CallingStationId);

// Устанавливаем Called-Station-Id = Asterisk-Dst
request.setStringAttribute(RadiusStandartAttributes.Called_Station_Id, request.getVendorAttributes( 22736, 103 ).get(0).getStringValue());

// Проверяем наличие Asterisk-User-Field, и если такой существует,
// то на основании его значения устанавливаем h323-call-origin
CallType = request.getVendorAttributes(22736, 118);
if (CallType != null && CallType.get(0).getStringValue() .equals("answer")) {
	request.setVendorStringAttribute(26, "answer");
	request.setFlag(2); }
else {
	request.setVendorStringAttribute(26, "originate");
	request.setFlag(1); }

// Устанавливаем h323-call-type = VOIP
request.setVendorStringAttribute(27, "VOIP");

// Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec
request.setIntAttribute(RadiusStandartAttributes.Acct_Session_Time, request.getVendorAttributes( 22736, 114 ).get(0).getIntValue());

// Устанавливаем h323-setup-time = Asterisk-Start-Time
request.setVendorStringAttribute(25, request.getVendorAttributes( 22736, 110 ).get(0).getStringValue());

// Устанавливаем h323-connect-time = Asterisk-Answer-Time
request.setVendorStringAttribute(28, request.getVendorAttributes( 22736, 111 ).get(0).getStringValue());

// Устанавливаем h323-disconnect-time = Asterisk-End-Time
request.setVendorStringAttribute(29, request.getVendorAttributes( 22736, 112 ).get(0).getStringValue());

// Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition
AsteriskDisposition = request.getVendorAttributes( 22736, 115 ).get(0).getStringValue();
if (AsteriskDisposition .equals("ANSWERED"))
	request.setVendorStringAttribute(30, "0");
else if (AsteriskDisposition .equals("NO ANSWER"))
	request.setVendorStringAttribute(30, "5");
else if (AsteriskDisposition .equals("BUSY"))
	request.setVendorStringAttribute(30, "17");
else
	request.setVendorStringAttribute(30, "22");

// Устанавливаем h323-conf-id = Acct-Session-Id
request.setVendorStringAttribute(24, request.getStringAttribute(RadiusStandartAttributes.Acct_Session_Id));

} // Конец if (Acct_Status_Type == 2)

В конце файла BGBilling/BGRadiusVoip/dictionary.xml добавляем (перед строкой </vendors>)атрибуты Digium:

<vendor code="22736" name="Digium">             ^
        <attribute name="Asterisk-Acc-Code" code="101" type="string"/>
        <attribute name="Asterisk-Src" code="102" type="string"/>
        <attribute name="Asterisk-Dst" code="103" type="string"/>
        <attribute name="Asterisk-Dst-Ctx" code="104" type="string"/>
        <attribute name="Asterisk-Clid" code="105" type="string"/>
        <attribute name="Asterisk-Chan" code="106" type="string"/>
        <attribute name="Asterisk-Dst-Chan" code="107" type="string"/>
        <attribute name="Asterisk-Last-App" code="108" type="string"/>
        <attribute name="Asterisk-Last-Data" code="109" type="string"/>
        <attribute name="Asterisk-Start-Time" code="110" type="string"/>
        <attribute name="Asterisk-Answer-Time" code="111" type="string"/>
        <attribute name="Asterisk-End-Time" code="112" type="string"/>
        <attribute name="Asterisk-Duration" code="113" type="integer"/>
        <attribute name="Asterisk-Bill-Sec" code="114" type="integer"/>
        <attribute name="Asterisk-Disposition" code="115" type="string"/>
        <attribute name="Asterisk-AMA-Flags" code="116" type="string"/>
        <attribute name="Asterisk-Unique-ID" code="117" type="string"/>
        <attribute name="Asterisk-User-Field" code="118" type="string"/>
</vendor>

3. Настраиваем Asterisk в соотвествии с документацией. Чтобы задействовать Radius Accounting, в файл '''/etc/asterisk/cdr.conf'''
раскомментируем или добавим следующие строки:

<pre>
[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 должен получать примерно такие пакеты:

19 18:02:07
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=8
Calling-Station-Id=10027341004
Acct-Session-Id=1208605050.14
Called-Station-Id=77142568288
Asterisk-Dst-Ctx=ael-international
Asterisk-Clid=\u34Test User\u34 \u6010027341004\u62
Asterisk-Chan=SIP/X.X.X.X-c00105d0
Asterisk-Dst-Chan=SIP/6fxo-009eacd0
Asterisk-Last-App=Dial
Asterisk-Last-Data=SIP/6fxo/77142XXXXXX\u124120
h323-connect-time=2008-04-19 17:37:34 +0000
h323-disconnect-time=2008-04-19 17:37:42 +0000
h323-conf-id=1208605050.14
h323-setup-time=2008-04-19 17:37:30 +0000
h323-call-origin=originate
h323-call-type=VOIP
Asterisk-Acc-Code=pbxpress
Asterisk-Dst=77142XXXXXX
Asterisk-Src=10027341004
Asterisk-Unique-ID=1208605050.14
Asterisk-User-Field=originate
Asterisk-Disposition=ANSWERED
Asterisk-AMA-Flags=DOCUMENTATION
h323-disconnect-cause=0
Asterisk-Start-Time=2008-04-19 17:37:30 +0000
Asterisk-Bill-Sec=8
Asterisk-Duration=12
Asterisk-End-Time=2008-04-19 17:37:42 +0000
Asterisk-Answer-Time=2008-04-19 17:37:34 +0000

Остановимся на некоторых ньюансах определения типа звонка.

Поскольку Asterisk не является шлюзом в том понимании, которое используется при характеристике оборудования, стоящего на границе между ТФОП и сетью IP, однозначно определить средствами BGBilling'а, какие звонки являются исходящими, а какие входящими не всегда возможно, в частности в тех случаях, когда Asterisk выполняет функции транзитного софтсвича. Поэтому для реализации алгоритма определения типа звонка можно использовать следующее решение - прописывать тип звонка средствами Asterisk dialplan в CDR userfield. Предложенный выше скрипт предобработки запросов Radius будет извлекать эти данные из атрибутов Digium и на их основании устанавливать тип звонка. В следующем примере показано, как можно записать информацию о типе звонка в 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 userfield.

Еще одной востребованной функцией, реализуемой скриптом предобработки запросов 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

--ArtKZ 15:36, 19 апреля 2008 (UTC)

Личные инструменты