Передача ACCEPT вместо REJECT вместе с доп. аттрибутами

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

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

Устанавливается в Автоматизация -> Функции скриптов поведения

Тип события: RADIUS-аутентификация.

Про привязки скриптов поведения к договору читайте в документации к BGBilling.

import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import java.util.*;

// event.getRequest|getResponse|getLogin|getContract|getErrorCode
login = event.getLogin();

// Ищем пользователя и IP, привязанный к нему в таблице
// "radius_pair_ip_x", где "x" код модуля Dialup.
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=?" );

ps.setInt( 1, login.getId() );
rs = ps.executeQuery();

login_ip = 0;
while( rs.next() )
  login_ip = rs.getInt( 1 );

// 0 - нет ошибки, 2 - ошибка ввода пароля.
if( event.getErrorCode() != 0 && event.getErrorCode() != 2 )
{

  response = event.getResponse();

  response.setPacketType( RadiusPacket.AUTHENTICATION_ACCEPT );

  // Готовим аттрибуты на отдачу

  // Service-Type = 2 
  raSt = new RadiusAttribute( 6 ); 
  raSt.setIntValue( 2 );

  // Framed-Protocol = 1
  raFp = new RadiusAttribute( 7 ); 
  raFp.setIntValue( 1 );

  // Framed-IP-Address
  raIp = new RadiusAttribute( 8 );
  raIp.setIntValue( login_ip );

  // Session-Timeout = 900 (15 min)
  raStm = new RadiusAttribute( 27 ); 
  raStm.setIntValue( 900 );
  
  // Ascend-Client-Primary-DNS (192.168.0.3 или 3232235523 в DEC)
  rvaDNS = new RadiusVendorAttribute( 529, 135 );
  rvaDNS.setIntValue( 3232235523 );

  // Cisco-AV-Pair, устанавливаем WCCP-редирект на интерфейс
  rva = new RadiusVendorAttribute( 9, 1 );
  rva.setStringValue( "lcp:interface-config=ip wccp web-cache redirect in" );

  // Cisco-AV-Pair, Устанавливаем access-list 155 на интерфейс
  rvaAcc = new RadiusVendorAttribute( 9, 1 );
  rvaAcc.setStringValue( "ip:inacl=155" );

  response.addAttribute( raStm );
  response.addAttribute( raSt );
  response.addAttribute( raFp );
  response.addAttribute( raIp );
  response.addVendorAttribute( rvaDNS );
  response.addVendorAttribute( rva );
  response.addVendorAttribute( rvaAcc );
}

// Пишем в специальную табличку текущий код ошибки для дальнейшего вывода
// на специальной информационной страничке.

ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" );

ps.setInt( 1, login_ip );
rs = ps.executeQuery();

found = false;
while( rs.next() )
  found = true;

if( found )
  ps = con.prepareStatement( "UPDATE dialup_conn_error SET error_code=? WHERE ip=?" );
else
  ps = con.prepareStatement( "INSERT INTO dialup_conn_error(error_code,ip) VALUES(?,?)" );

ps.setInt( 1, event.getErrorCode() );
ps.setInt( 2, login_ip );

ps.executeUpdate();


Структура таблицы dialup_conn_error:

CREATE TABLE `dialup_conn_error` (
  `ip` int(11) NOT NULL default '0',
  `error_code` int(11) NOT NULL default '0'
); 
Личные инструменты