Передача ACCEPT вместо REJECT вместе с доп. аттрибутами
Материал из BiTel WiKi
(Различия между версиями)
Феанор (Обсуждение | вклад) м (Правка функции выдачи IP адреса. Устранена ошибка выдачи айпишников выше 127.255.255.255 (поддержка лонг формата ip адреса)) |
Феанор (Обсуждение | вклад) (Правка выборки IP адреса. Если у клиента было назначено несколько адресов в разные периоды времени, то выбирался самый первый. Добавлено) |
||
Строка 10: | Строка 10: | ||
import bitel.billing.server.script.event.*; | import bitel.billing.server.script.event.*; | ||
import java.util.*; | import java.util.*; | ||
+ | import bitel.billing.common.*; | ||
+ | |||
+ | cid = event.getContractID(); | ||
+ | contract = new ContractManager(con).getContractByID(cid); | ||
+ | BalanceMode = contract.getBalanceMode(); | ||
+ | if (BalanceMode == 0) | ||
+ | { | ||
+ | //Пропускаем тех кто работает по факту | ||
+ | return; | ||
+ | }; | ||
+ | DateNow = new GregorianCalendar(); | ||
+ | date_str=TimeUtils.format(DateNow, "yyyy-MM-dd"); | ||
+ | print (date_str); | ||
// event.getRequest|getResponse|getLogin|getContract|getErrorCode | // event.getRequest|getResponse|getLogin|getContract|getErrorCode | ||
login = event.getLogin(); | login = event.getLogin(); | ||
- | + | ||
// Ищем пользователя и IP, привязанный к нему в таблице | // Ищем пользователя и IP, привязанный к нему в таблице | ||
// "radius_pair_ip_x", где "x" код модуля Dialup. | // "radius_pair_ip_x", где "x" код модуля Dialup. | ||
- | ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=?" ); | + | ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=? and date2 is NULL and date1<='"+date_str+"'" ); |
- | + | ||
ps.setInt( 1, login.getId() ); | ps.setInt( 1, login.getId() ); | ||
rs = ps.executeQuery(); | rs = ps.executeQuery(); |
Текущая версия на 05:19, 5 октября 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.*; import bitel.billing.common.*; cid = event.getContractID(); contract = new ContractManager(con).getContractByID(cid); BalanceMode = contract.getBalanceMode(); if (BalanceMode == 0) { //Пропускаем тех кто работает по факту return; }; DateNow = new GregorianCalendar(); date_str=TimeUtils.format(DateNow, "yyyy-MM-dd"); print (date_str); // 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=? and date2 is NULL and date1<='"+date_str+"'" ); 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' );