Передача ACCEPT вместо REJECT вместе с доп. аттрибутами
Материал из BiTel WiKi
(Различия между версиями)
Victor (Обсуждение | вклад) |
Феанор (Обсуждение | вклад) (Правка выборки IP адреса. Если у клиента было назначено несколько адресов в разные периоды времени, то выбирался самый первый. Добавлено) |
||
(9 промежуточных версий не показаны.) | |||
Строка 4: | Строка 4: | ||
Про привязки скриптов поведения к договору читайте в документации к BGBilling. | Про привязки скриптов поведения к договору читайте в документации к BGBilling. | ||
- | < | + | <source lang="java"> |
import bitel.billing.server.call.bean.Login; | import bitel.billing.server.call.bean.Login; | ||
import bitel.billing.server.radius.*; | import bitel.billing.server.radius.*; | ||
Строка 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(); | ||
Строка 23: | Строка 36: | ||
login_ip = 0; | login_ip = 0; | ||
while( rs.next() ) | while( rs.next() ) | ||
- | login_ip = rs. | + | 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 - ошибка ввода пароля. | // 0 - нет ошибки, 2 - ошибка ввода пароля. | ||
- | if( | + | if( errCode != 0 && errCode != 2 ) |
{ | { | ||
Строка 44: | Строка 67: | ||
// Framed-IP-Address | // Framed-IP-Address | ||
+ | //(int)login_ip чтобы установить Long значение в SetIntValue | ||
+ | //иначе для адресов выше 2147483647 будет выдаваться неверный адрес | ||
raIp = new RadiusAttribute( 8 ); | raIp = new RadiusAttribute( 8 ); | ||
- | raIp.setIntValue( login_ip ); | + | raIp.setIntValue((int) login_ip ); |
// Session-Timeout = 900 (15 min) | // Session-Timeout = 900 (15 min) | ||
Строка 72: | Строка 97: | ||
} | } | ||
- | // Пишем в специальную табличку текущий код | + | // Пишем в специальную табличку текущий код ошибки, кроме Password Error, |
- | // на специальной информационной страничке. | + | // для дальнейшего вывода на специальной информационной страничке. |
+ | if( errCode != 2 ) | ||
+ | { | ||
+ | ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" ); | ||
- | ps | + | ps.setInt( 1, login_ip ); |
+ | rs = ps.executeQuery(); | ||
- | + | found = false; | |
- | rs | + | while( rs.next() ) |
+ | found = true; | ||
- | found = | + | 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. | + | ps.executeUpdate(); |
- | + | } | |
+ | </source> | ||
- | |||
- | </ | + | Структура таблицы dialup_conn_error: |
+ | <source lang="sql"> | ||
+ | CREATE TABLE `dialup_conn_error` ( | ||
+ | `ip` int(11) NOT NULL default '0', | ||
+ | `error_code` int(11) NOT NULL default '0' | ||
+ | ); | ||
+ | </source> |
Текущая версия на 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' );