 |
Клиент |
 |
Зарегистрирован: 20 янв 2012, 19:36 Сообщения: 89 Откуда: Волгодонск Карма: 0
|
Вот копия рабочей версии, та что используется сейчас. Код: package ru.bitel.bgbilling.modules.inet.dyn.device.redback;
import java.nio.ByteBuffer; import java.util.List;
import ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket; import ru.bitel.bgbilling.kernel.network.dhcp.DhcpProtocolHandler; import ru.bitel.bgbilling.kernel.network.radius.RadiusAttribute; import ru.bitel.bgbilling.kernel.network.radius.RadiusDictionary; import ru.bitel.bgbilling.kernel.network.radius.RadiusPacket; import ru.bitel.bgbilling.kernel.network.radius.RadiusPacket.RadiusPacketOption; import ru.bitel.bgbilling.kernel.network.radius.RadiusProtocolHandler; import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice; import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType; import ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.ParameterMap; import ru.bitel.common.Utils; import ru.bitel.common.sql.ConnectionSet;
public class SmartEdgeClipsProtocolHandler extends SmartEdgeProtocolHandler implements RadiusProtocolHandler, DhcpProtocolHandler { public static final int Agent_Remote_Id = 96; public static final int Agent_Circuit_Id = 97; public static final int Mac_Addr = 145; public static final int DHCP_Option = 202;
/** * Код атрибута - agent-remote-id */ protected int agentOptionRemoteIdType; /** * Код атрибута - agent-circuit-id */ protected int agentOptionCircuitIdType; /** * Нужно ли удалять заголовок (2 байта, тип+длина) из значения DHCP-опции */ protected int agentOptionRemoveHeader;
/** * Тип поиска сервиса */ protected int servSearchMode; @Override public void init( Setup setup, int moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap deviceConfig ) throws Exception { super.init( setup, moduleId, inetDevice, inetDeviceType, deviceConfig ); agentOptionRemoteIdType = deviceConfig.getInt( "radius.agent.option.remoteId.type", deviceConfig.getInt( "radius.agentRemoteId.type", Agent_Remote_Id ) ); agentOptionCircuitIdType = deviceConfig.getInt( "radius.agent.option.circuitId.type", Agent_Circuit_Id ); agentOptionRemoveHeader = deviceConfig.getInt( "radius.agent.option.removeHeader", 2 );
servSearchMode = deviceConfig.getInt( "radius.servSearchMode", deviceConfig.getInt( "radius.serviceSearchMode", InetDevice.SERV_SEARCH_MODE_LOGIN ) ); }
/** * Установка username * @param request */ protected void setUsername( final RadiusPacket request ) { String macAddr = request.getStringAttribute( radiusVendor, Mac_Addr, null ); if( macAddr != null ) { String callingStation = macAddr.replaceAll( "\\-", "" );
request.setStringAttribute( -1, RadiusDictionary.Calling_Station_Id, callingStation ); }
byte[] remoteId = request.getByteAttribute( radiusVendor, Agent_Remote_Id, null ); byte[] circuitId = request.getByteAttribute( radiusVendor, Agent_Circuit_Id, null );
if( remoteId != null && circuitId != null ) { // String userName; // if (circuitId.length == 11) { // userName = Utils.bytesToString( remoteId, true, null ).substring(10, 22) + ":" + Utils.bytesToString( circuitId, true, null ).substring(20, 22); // } // else // { // userName = Utils.bytesToString( remoteId, true, null ) + ":" + Utils.bytesToString( circuitId, true, null ); // } // // // userName = userName.toLowerCase(); // request.setStringAttribute( -1, 1, userName );
String userName = Utils.bytesToString( remoteId, true, null ) + ":" + Utils.bytesToString( circuitId, true, null ); userName = userName.toLowerCase(); request.setStringAttribute( -1, 1, userName );
} } /** * Установка опции option c удалением заголовка, если необходимо (обычно два байта - тип и длина DHCP-субопции) * @param request * @param ra * @param remove * @param option */ protected void setAgentOption( final RadiusPacket request, final RadiusAttribute<?> ra, int remove, final RadiusPacketOption<Object> option ) { if( remove > 0 ) { ByteBuffer data = ra.getData(); data.position( remove ); data = data.slice();
request.setOption( option, data );
System.out.println( Utils.bytesToString (Utils.byteBufferAsArray( data ), false, " ") ); } else { request.setOption( option, ra.getValue() ); } }
protected void setAgentOption( final RadiusPacket request, final List<RadiusAttribute<?>> ras, int position, int value, int remove, final RadiusPacketOption<Object> option ) { for( int i = 0, size = ras.size(); i < size; i++ ) { RadiusAttribute<?> ra = ras.get( i ); ByteBuffer data = ra.getData(); if( data.get( position ) == value ) { data.position( remove ); data = data.slice(); request.setOption( option, data ); } } }
/** * Установка опций в запрос устройства-агента для последующей обработки * @param request */ protected void setAgentOptions( final RadiusPacket request ) { switch( agentOptionRemoteIdType ) { case 0: break;
case DHCP_Option: { List<RadiusAttribute<?>> ras = request.getAttributes( radiusVendor, DHCP_Option ); if( ras != null ) { setAgentOption( request, ras, 3, 1, 4, InetRadiusProcessor.AGENT_REMOTE_ID ); }
break; }
default: { RadiusAttribute<?> ra = request.getAttribute( radiusVendor, agentOptionRemoteIdType ); if( ra != null ) { setAgentOption( request, ra, agentOptionRemoveHeader, InetRadiusProcessor.AGENT_REMOTE_ID ); }
break; } }
System.out.println( agentOptionCircuitIdType );
switch( agentOptionCircuitIdType ) { case 0: break;
case DHCP_Option: { List<RadiusAttribute<?>> ras = request.getAttributes( radiusVendor, DHCP_Option ); if( ras != null ) { setAgentOption( request, ras, 3, 2, 4, InetRadiusProcessor.AGENT_CIRCUIT_ID ); }
break; }
default: { RadiusAttribute<?> ra = request.getAttribute( radiusVendor, agentOptionCircuitIdType ); System.out.println( Utils.bytesToString (Utils.byteBufferAsArray( ra.getData() ), false, " ") ); if( ra != null ) { setAgentOption( request, ra, 0, InetRadiusProcessor.AGENT_CIRCUIT_ID ); }
break; } } }
@Override public void preprocessAccessRequest( final RadiusPacket request, final RadiusPacket response, final ConnectionSet connectionSet ) throws Exception { super.preprocessAccessRequest( request, response, connectionSet ); // устанавливаем поле username setUsername( request ); // устанавливаем agent-remote-id setAgentOptions( request ); }
@Override public void postprocessAccessRequest( final RadiusPacket request, final RadiusPacket response, final ConnectionSet connectionSet ) throws Exception { super.postprocessAccessRequest( request, response, connectionSet );
response.removeAttributes( -1, RadiusDictionary.Framed_IP_Address ); }
@Override protected void preprocessAccountingRequestImpl( final int acctStatusType, final RadiusPacket request, final RadiusPacket response, final ConnectionSet connectionSet ) throws Exception { super.preprocessAccountingRequestImpl( acctStatusType, request, response, connectionSet );
switch( acctStatusType ) { // если сервисный аккаунтинг case 101: case 102: case 103: { } break;
default: { // устанавливаем поле username setUsername( request ); // устанавливаем agent-remote-id setAgentOptions( request ); } break; } }
@Override public void preprocessDhcpRequest( DhcpPacket request, DhcpPacket response ) throws Exception { // необходимо для старого поиска по логину if( servSearchMode == InetDevice.SERV_SEARCH_MODE_LOGIN ) { // подмена try { byte[] circuitId = request.getSubOption( (byte)1 ).value; byte[] remoteId = request.getSubOption( (byte)2 ).value; byte[] mac = new byte[6]; byte[] port = new byte[1]; System.arraycopy( circuitId, 5, port, 0, 1 ); System.arraycopy( remoteId, 2, mac, 0, 6 ); request.setSubOption( (byte)1, port ); request.setSubOption( (byte)2, mac ); } catch( java.lang.NullPointerException e ) { return; } } }
@Override public void postprocessDhcpRequest( DhcpPacket request, DhcpPacket response ) throws Exception { } } предложенный вами код для парсинга эльтекса был подправлен по поиску remoteid, не корректно находил мак: request.setOption( InetDhcpProcessor.AGENT_REMOTE_ID, Arrays.copyOfRange( remoteId, 5, 11 ) );
_________________ Клиент: вер. 7.2.146 / 14.05.2019 16:00:05 Сервер: вер. 7.2.1001 / 14.05.2019 16:02:13 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_121
card: вер. 7.2.198 / 28.03.2019 16:11:52 dialup: вер. 7.2.301 / 07.02.2019 11:16:31 inet: вер. 7.2.591 / 14.05.2019 16:02:31 ipn: вер. 7.2.229 / 07.02.2019 11:15:34 mps: вер. 7.2.166 / 14.05.2019 16:02:47 npay: вер. 7.2.170 / 11.04.2019 18:27:20 phone: вер. 7.2.250 / 04.04.2019 18:32:01 reports: вер. 7.2.196 / 23.04.2019 20:46:16 trayinfo: вер. 7.2.159 / 07.02.2019 11:21:06 voice: вер. 7.2.30 / 13.05.2019 15:19:29 voiceip: вер. 7.2.175 / 19.03.2019 16:40:51
|
|