Передача ACCEPT вместо REJECT вместе с доп. аттрибутами
Материал из BiTel WiKi
Версия от 09:28, 2 июня 2009; Феанор (Обсуждение | вклад)
Устанавливается в Автоматизация -> Функции скриптов поведения
Тип события: 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.getLong( 1 ); errCode = event.getErrorCode(); // Если логину не присвоен IP-адрес, то даем AUTH_REJECT. if( login_ip == 0 ) { errCode = 2; response = event.getResponse(); response.setPacketType( RadiusPacket.AUTHENTICATION_REJECT ); } // 0 - нет ошибки, 2 - ошибка ввода пароля. if( errCode != 0 && errCode != 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 //(int)login_ip чтобы установить Long значение в SetIntValue //иначе для адресов выше 2147483647 будет выдаваться неверный адрес raIp = new RadiusAttribute( 8 ); raIp.setIntValue((int) 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 ); } // Пишем в специальную табличку текущий код ошибки, кроме Password Error, // для дальнейшего вывода на специальной информационной страничке. if( errCode != 2 ) { 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, errCode ); 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' );