Реализация стандартного шлюза BGRadiusIPN
Материал из BiTel WiKi
код шлюза от версии 4.5. еще не проверен
protected void doSync() { host = gate.getGateType().getConfigOption( "radius.host" ); port = Utils.parseIntString( gate.getGateType().getConfigOption( "radius.port" ), -1 ); gid = gate.getId(); if( Utils.isEmptyString( host ) || port <= 0 ) { log.error( "Can't get IP/port for BGRadiusIPN for this gate type! " ); gateErrors.append( "Не указан адрес сервера радиуса для данного типа шлюза!" ); return; } if( log.isDebugEnabled() ) log.debug( gid + " gate: " + host + ":" + port ); try { socket = new Socket( host, port ); out = new PrintWriter( socket.getOutputStream(), true ); isr = new InputStreamReader( socket.getInputStream() ); in = new BufferedReader( isr ); nasId = String.valueOf( gate.getId() ); ruleTypes = PPPoEUtils.getRuleTypes( ruleTypeMap ); gateConfig = new DefaultServerSetup( gate.getConfig(), "\n" ); nasInspectorConf = gateConfig.getHashValuesWithPrefix( "" ); out.println( ".keepalive" ); out.print( "nas " ); out.print( nasId ); out.print( '\t' ); out.print( gate.getHost() ); out.print( '\t' ); out.print( gate.getKeyword() ); out.print( '\t' ); inspClass = nasInspectorConf.get( "class" ); out.print( inspClass != null ? inspClass : "" ); for( e : nasInspectorConf.entrySet() ) { out.print( '\t' ); out.print( e.getKey() ); out.print( '=' ); out.print( e.getValue() ); } out.println(); out.print( "list " ); out.println( nasId ); // список открытых логинов с шлюза logins = new HashSet( 5, 5 ); line = in.readLine(); while( line != null && !".".equals( line ) ) { pos = line.indexOf( "\t\t" ); if( pos >= 0 ) { logins.add( line.substring( 0, pos ) ); } line = in.readLine(); } for( UserStatus status : statusList ) { String data = status.rule.getRuleText(); pos = data.indexOf( '\t' ); String login = data.substring( 0, pos ); // флаг того то правило есть на шлюзе flag = false; // правило для этого договора есть на шлюзе if( logins.contains( login ) ) { // если правило есть а юзер заблокирован - удаляем правило if( status.status > 0 ) { out.print( "delete " ); out.print( nasId ); out.print( '\t' ); out.println( login ); if( log.isDebugEnabled() ) { log.debug( gid + " Delete\t" + login ); } } flag = true; logins.remove( login ); } // правила нет, а юзер открыт if( !flag && status.status == IPNContractStatus.STATUS_OPEN ) { command = PPPoEUtils.generateRule( nasId, gate.getGateType(), data, ruleTypes ); out.println( command ); if( log.isDebugEnabled() ) { log.debug( gid + " " + command + " " + in.readLine() ); } } } out.println( "." ); in.close(); out.close(); socket.close(); } catch( Exception e ) { log.error( "Gate unaccesible - " + host ); log.error( "-------------------------" ); log.error( "error: " + e.getLocalizedMessage() ); gateErrors.append( "Шлюз недоступен - " ); gateErrors.append( host ); gateErrors.append( "\n" ); } }