forum.bitel.ru
http://forum.bitel.ru/

Скрипт предобработки радиус запросов
http://forum.bitel.ru/viewtopic.php?f=6&t=71
Страница 1 из 1

Автор:  Михаил [ 30 янв 2007, 15:45 ]
Заголовок сообщения:  Скрипт предобработки радиус запросов

В документации есть такой скрипт
Вынос MAC адреса из cisco-avp-pair в Caliing-Station-Id:
Код:
import bitel.billing.server.radius.*;

prefix = "client-mac-address";
length = prefix.length();
           
attributes = request.getVendorAttributes( Vendors.CISCO, CiscoVendor.Cisco_AVPair );
for( it = attributes.iterator(); it.hasNext(); )
{
     ra = (RadiusAttribute)it.next();
     value = ra.getStringValue();
                 
     if( value.startsWith( prefix ) )
     {
        request.setStringAttribute( RadiusStandartAttributes.Calling_Station_Id, value.substring( length + 1 )  );
     }
}

Не могу осилить изменить этот скрипт, чтобы вынести h323-remote-address в User-name
Прошу помочь сделать такой скрипт.
Спаcибо.
P.S.
Надо, чтобы считать входящие звонки на операторов.
Сейчас в User-Name и Calling-Station-id идет номер абонента, и абонентские логины определяются по Calling-Station-id.
Если в User-Name будет h323-remote-address - будут учитываться
и звонки на операторов.

Автор:  Amir [ 31 янв 2007, 13:57 ]
Заголовок сообщения: 

Код:
import bitel.billing.server.radius.*;

attributes = request.getVendorAttributes( Vendors.CISCO, 23 ); //h323-remote-address из dictionary.xml
for( it = attributes.iterator(); it.hasNext(); )
{
     ra = (RadiusAttribute)it.next();
     value = ra.getStringValue();

     request.setStringAttribute( RadiusStandartAttributes.User_Name, value );
}

только проверьте сначала :)

Автор:  Михаил [ 31 янв 2007, 23:11 ]
Заголовок сообщения: 

Вообщем, проверил. В User-Name подставляется h323-remote-address,
только в radius.out постоянно вылетает следующее:

Код:
java.lang.NullPointerException: Null Pointer in Method Invocation
        at bsh.Name.invokeMethod(Unknown Source)
        at bsh.BSHMethodInvocation.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHAssignment.eval(Unknown Source)
        at bsh.BSHStatementExpressionList.eval(Unknown Source)
        at bsh.BSHForStatement.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bitel.billing.server.processor.DefaultNASInfo.processRequestWithScript(DefaultNASInfo.java:274)
        at bitel.billing.server.processor.voiceip.VoiceIpNASInfo.prepareAccountRequest(VoiceIpNASInfo.java:114)
        at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:133)
        at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
        at java.lang.Thread.run(Thread.java:595)



Скорее всего на те радиус пакеты в которых атрибута h323-remote-address нет. Если бы еще вставить в скрипт проверку на наличие этого атрибута перед заменой ?...

Автор:  Администратор [ 01 фев 2007, 13:16 ]
Заголовок сообщения: 

import bitel.billing.server.radius.*;

attributes = request.getVendorAttributes( Vendors.CISCO, 23 ); //h323-remote-address из dictionary.xml
if( attributes != null )
for( it = attributes.iterator(); it.hasNext(); )
{
ra = (RadiusAttribute)it.next();
value = ra.getStringValue();

request.setStringAttribute( RadiusStandartAttributes.User_Name, value );
}

Автор:  Михаил [ 01 фев 2007, 14:29 ]
Заголовок сообщения: 

Замечательно - ошибки в radius.out пропали.
Настроил тарифные планы. Теперь все считается - и межоператорский трафик (исходящий, входящий)и абонентский (исходящий).
Спасибо за оперативную помощь.

Автор:  thedeath [ 10 окт 2007, 19:40 ]
Заголовок сообщения: 

Код:
import bitel.billing.server.radius.*;
import java.util.regex.*;

nmbr = null;
innercall = null;
attributes = request.getVendorAttributes( Vendors.CISCO, 1 ); // <attribute add="no" name="cisco-avpair" type="string" code="1"/>
if( attributes != null )
for( it = attributes.iterator(); it.hasNext(); )
{
   ra = (RadiusAttribute)it.next();
   value = ra.getStringValue();
   if ( value.indexOf("feature-vsa") >= 0 && value.indexOf("fwder:") > 0 )
   {
      nmbr = value.substring((value.indexOf("fwder:")+6),value.length());
      nmbr = nmbr.substring(0,nmbr.indexOf(","));
      break;
   }
   if ( value.indexOf("gw-rxd-cgn") >= 0 )
   {
      nmbr = value.substring((value.indexOf("#:")+2),value.length());
      break;
   }
}

nasport =  request.getVendorAttributes( Vendors.CISCO, 2 ); // <attribute name="cisco-NAS-Port" type="string" code="2"/>
callorigin = request.getVendorAttributes( Vendors.CISCO, 26 ); // <attribute name="h323-call-origin" type="string" code="26"/>
calltype =  request.getVendorAttributes( Vendors.CISCO, 27 ); // <attribute name="h323-call-type" type="string" code="27"/>

if ( callorigin == "originate" && calltype == "Telephony" && nasport.indexOf("EFXS") >= 0 )
   nmbr = "corp-сalls";

if ( nmbr != null )
   request.setStringAttribute( RadiusStandartAttributes.User_Name, nmbr);


при запросе
...
cisco-NAS-Port=EFXS 50/0/14
...
h323-call-origin=originate
h323-call-type=Telephony

в User-Name строка "corp-сalls" не подставляется.

help

Автор:  Amir [ 10 окт 2007, 21:02 ]
Заголовок сообщения: 

при сравнении строк делайте не
Код:
callorigin == "originate"

а
Код:
"originate".equals( originate )

Автор:  thedeath [ 11 окт 2007, 07:59 ]
Заголовок сообщения: 

Попробовал:
Код:
if ( "originate".equals( callorigin ) && "Telephony".equals( calltype ) && nasport.indexOf("EFXS") >= 0 )
симптомы теже.

Автор:  Администратор [ 15 окт 2007, 14:41 ]
Заголовок сообщения: 

Попробуйте так:

Код:
if ( callorigin == "originate" &&
calltype == "Telephony" &&
nasport.indexOf("EFXS") >= 0 )
{
   print( "SET!" );
   request.setStringAttribute( RadiusStandartAttributes.User_Name, "corp-сalls" );
}


Сообщение хоть выходит? В script.log должно быть.

Автор:  thedeath [ 15 окт 2007, 15:35 ]
Заголовок сообщения: 

Уже ...

После танцев с бубнами заработало в таком виде:
Код:
import bitel.billing.server.radius.*;

// Имя пользоателя, куда сыпать внутренние звонки и тп.
String rejectedusername = "corp-calls";

username = null;
numberto = null;

attributes = request.getVendorAttributes( Vendors.CISCO, 1 ); // <attribute add="no" name="cisco-avpair" type="string" code="1"/>
nasport = request.getVendorAttributes( Vendors.CISCO, 2 ); // <attribute name="cisco-NAS-Port" type="string" code="2"/>
callorigin = request.getVendorAttributes( Vendors.CISCO, 26 ); // <attribute name="h323-call-origin" type="string" code="26"/>
calltype =  request.getVendorAttributes( Vendors.CISCO, 27 ); // <attribute name="h323-call-type" type="string" code="27/>
calledid = request.getStringAttribute( RadiusStandartAttributes.Called_Station_Id ); // <attribute name="Called-Station-Id" type="string" code="30"/>

if ( nasport != null ) { nasports = nasport.toString(); }
if ( callorigin != null ) { callorigins = callorigin.toString(); }
if ( calltype != null ) { calltypes = calltype.toString(); }

if( attributes != null )
{
   for( it = attributes.iterator(); it.hasNext(); )
   {
      ra = (RadiusAttribute)it.next();
      value = ra.getStringValue();
      // Определяем был ли Transfer/Conference, выносим короткий номер "крайнего" в User-Name
      if ( value.indexOf("feature-vsa") >= 0 && value.indexOf("fwder:") > 0 )
      {
         username = value.substring((value.indexOf("fwder:")+6),value.length());
         username = username.substring(0,username.indexOf(","));
         break;
      }
      // Выносим короткий номер в User-Name, если не было Transfer/Conference
      if ( value.indexOf("gw-rxd-cgn") >= 0 )
      {
         username = value.substring((value.indexOf("#:")+2),value.length());
         break;
      }
   }
}

if ( callorigin != null && calltype != null )
{
   if ( nasport != null && callorigins.indexOf("originate") >= 0 && calltypes.indexOf("Telephony") >= 0 )
   {
      // "Убираем" внутренние звонки (локальный - локальный)
      if ( nasports.indexOf("EFXS") >= 0  )
      {
         username = rejectedusername;
      }
      // Если звонок вышел через FXO порты, приводим номер к E.164
      if ( nasports.indexOf("FXO") >= 0  )
      {
         if ( calledid.startsWith("9810") ) { numberto = calledid.substring(4); }
         else if ( calledid.startsWith("98") ) { numberto = "7" + calledid.substring(2); }
         else if ( calledid.startsWith("9") ) { numberto = "73952" + calledid.substring(1); }
         else if ( calledid.matches("8[0-5]") ) { numberto = "000000" + calledid;}
      }
   }
   // "Убираем" звонки в голосовую почту
   else if ( callorigins.indexOf("originate") >= 0 && calltypes.indexOf("VoIP") >= 0 )
   {
      if ( calledid.matches("88100") ) { username = rejectedusername; }
   }
}

if ( numberto != null )
{
   request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, numberto);
}

if ( username != null )
{
   request.setStringAttribute( RadiusStandartAttributes.User_Name, username);
}
Оч.плохо, что "бедно" документирована фича скриптов предобработки.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/