[OpenSIPS-Users] Custom RADIUS Accounting with "AAA RADIUS MODULE"
Ewgeny
evoip at ukr.net
Fri Mar 29 13:36:25 CET 2013
Hi,
I use custom radius accounting with "AAA RADIUS MODULE", because I have to adapt the RADIUS accounting with complex system, and i have to send many many specific attributes to the RADIUS server.
I'm using functions "radius_send_auth", "radius_send_acct".
I didn't find good examples in google or in mailing list - about using of "AAA RADIUS MODULE".
Due to the manual RADIUS accounting there are many nuances, which does not happening when using standart RADIUS accounting module "Acc Module" with "setflag(ACC_DO)".
As you can see in my code examples - I should call Radius Acct-Stop and Radius Acct-Start in many places of opensips.cfg.
What do you think about stability and reliability about my method of RADIUS accounting ?
I have problem with Acct-STOP on loose_route(), because not always i should do it.
For example when routing in local call - i don't start accounting, and i didn't setflag(DOACCT) - but in loose_route flags are not working.
How to do STOP package sending not every time when receive SIP BYE, but only in those cases when a START packet was sent ?
I'm sorry for my poor English....
************************************************************************************************************************************
loadmodule "aaa_radius.so"
modparam("aaa_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")
modparam("aaa_radius","sets","acct-start = (................many attributes
...............................
...............................
...............................)")
modparam("aaa_radius","sets","acct-stop = (................many attributes
...............................
...............................
...............................)")
route{
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if (is_method("BYE")) {
setflag(1); # do accounting ...
setflag(3); # ... even if the transaction fails
/*Send custom RADIUS Accounting STOP when recive BYE message*/
xog("L_NOTICE", "******************Accounting STOP $ci");
route(acctstop);
............................................................
............................................................
............................................................
# I should send ACCT STOP when CANCEL processing
if (is_method("CANCEL")) {
/*call custom RADIUS Accounting STOP*/
xlog("L_NOTICE", "****************** CANCEL Accounting STOP ci=$ci");
route(acctstop);
if (t_check_trans())
t_relay();
exit;
}
............................................................
............................................................
............................................................
/*when local call - we don't start the custom Radius accounting */
if ($rU=~"^490[0-9]{10}") {
# do lookup with method filtering
xlog("L_NOTICE", "******************* Local Call 490 - do looookup lookation");
if (!lookup("location","m")) {
switch ($retcode) {
case -1:
xlog("L_NOTICE", "-1");.
/*route forward when user is not regitered*/
route(forwarding);
exit;
case -3:
xlog("L_NOTICE", "-3");
exit;
case -2:
xlog("L_NOTICE", "-2");
exit;
};
............................................................
............................................................
............................................................
/*Call to PSTN*/
if ($rU=~"^[0-9]{8,15}$") {
xlog("L_INFO", "PSTN REQUEST : M=$rm rU=$rU F=$fu T=$tu IP=$si\n");
/*Set attributes for custom radius accounting*/
route(acctonsip);
$rd="xxx.xxx.xxx.xxx";
$rp=5060;
/*If that flag is set - then we do custom accounting onreply route*/
setflag(DOACCT);
/*route relay*/
route(1);
exit;
}.
............................................................
............................................................
............................................................
onreply_route[2] {
if (nat_uac_test("1"))
fix_nated_contact();
setflag(TRACE);
sip_trace();
if ( isflagset(10) )
rtpproxy_answer("ro");
xlog("incoming reply $rs, $rr \n");
/*if flag DOACCT is SET - and we get 200 OK - then Accounting start*/
if (isflagset(DOACCT)) {
if($rs=~"200") {
setflag(ACCTstarted);
xlog("L_NOTICE", "*****************Accounting Start ci=$ci");
/*отправляем RADIUS Acct-START*/
radius_send_acct("acct-start");
xlog("L_INFO", "radius_acct-start $ci \n");
}
}
}
............................................................
............................................................
............................................................
failure_route[1] {
xlog("L_NOTICE", "****************** Failure $rs Accounting STOP $ci");
/*RADIUS Accounting STOP*/
route(acctstop);
}
............................................................
............................................................
............................................................
/*Call custom Accounting STOP when module dialog ends the sip session*/
local_route {
/*setflag(TRACE);
sip_trace();*/
if (is_method("BYE") && $DLG_dir=="UPSTREAM"){
/*RADIUS Accounting STOP*/
xlog("L_NOTICE", "*************Accounting STOP on DIALOG local route");
route(acctstop);
}
}
***************************************************************************************************
thanks in advance
Regards
Ewgeny
More information about the Users
mailing list