Реализация стандартного шлюза 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" );
        }
    }
Личные инструменты