Hi,

I've written PostAuthHook which controls the number of demo sessions
on our access servers and dynamically clears lines for registered
users (see it below).
Everything works fine but when I try to set custom reject reason
Radiator 2.17.1 puts 3(!) Reply-Message attribute in reply:

*** Sending to x.x.x.x port 1025 ....
Code:       Access-Reject
Identifier: 26
Authentic:  <199><15>NJ?<165><241>r<146><246><177><20><231><139>A<12>
Attributes:
        Service-Type = Framed-User
        Framed-Protocol = PPP
        Framed-IP-Netmask = 255.255.255.255
        Framed-Routing = None
        Framed-MTU = 1500
        Framed-Compression = Van-Jacobson-TCP-IP
        Framed-IP-Address = 172.16.1.2
        Reply-Message = "Demo limit exceeded"
        Reply-Message = "Request Denied"
        Reply-Message = ""

It's not critical but annoying.
Is it possible to set just one Reply-Message attribute?

Here is the exerption from radius.cfg:
...
<SessionDatabase SQL>
        Identifier      SessDB
        DBSource        dbi:Oracle:host.somewhere-in.ru
        DBUsername      zzzz
        DBAuth          xxxx
</SessionDatabase>
...
<AuthBy PLSQL>
    Identifier  DialUp
    NoDefault
    DBSource    dbi:Oracle:host.somewhere-in.ru
    DBUsername  zzzz
    DBAuth      xxxx

    # Authentication
    AuthBlock   BEGIN \
                    get_user_data('%n','%N',:passwd,:check_item,:reply_item); \
                END;

    AuthParamDef        :passwd,        User-Password,  check
    AuthParamDef        :check_item,    GENERIC,        check
    AuthParamDef        :reply_item,    GENERIC,        reply

    # Accounting
    AccountingStopsOnly
    AcctSQLStatement DECLARE \
                        ret_val integer; \
                        BEGIN \
                 ret_val := stat.new_dialup_log_record_f('%{User-Name}', \
                                              '%j:%k:%p %f-%g-%i', \
                                              '%{Acct-Session-Time}', \
                                              '%{Acct-Input-Octets}', \
                                              '%{Acct-Output-Octets}', \
                                              '%{Acct-Session-Id}', \
                                              
'%{Acct-Terminate-Cause}%{Ascend-Disconnect-Cause}', \
                                              '%N', \
                                              '%{NAS-Port}', \
                                              '%{Framed-IP-Address}'); \
                         END;
</Auth>
...
<Handler>
        AcctLogFileName         %L/account.log
        PasswordLogFileName     %L/password.log

        AuthBy DialUp
        PostAuthHook file:"%D/checkDemo"
        AccountingHandled
        RejectHasReason
        SessionDatabase         SessDB
</Handler>


checkDemo
#
sub {
    my $request = ${$_[0]};
    my $reply = ${$_[1]};
    my $result = ${$_[2]};

    &main::log($main::LOG_DEBUG, "Entering checkDemo");
    
    my %client = (
        # client           type,limit
        'x.x.x.x'  => ['Cisco', 28],
        'y.y.y.y' => ['Ascend', 28]
    );
    my %kick = (
        'Cisco'         => \&kickOnCisco,
        'Ascend'        => \&kickOnAscend
    );

    # Exit if it's not Access-Request
    return if ($request->code ne 'Access-Request');

    my $community = "zzzzzzzzzz";
    my $sdb;

    # Get IP of the pool and username
    my $nas_ip = $request->get_attr('NAS-IP-Address');
    my $user_name = $request->get_attr('User-Name');

    if ($result == $main::ACCEPT) {

        # Check how many lines are used on the pool
        $sdb = &Radius::SessGeneric::find('SessDB');
        my $lines_used = $sdb->sessionsOnNAS($nas_ip,$request);
        
        if ($lines_used >= $client{$nas_ip}[1]) {

            if ($user_name eq 'demo') {
                ${$_[2]} = $main::REJECT;
                $reply->change_attr('Reply-Message','Demo limit exceeded');
                &main::log($main::LOG_INFO, "Line limit for demo exceeded($lines_used 
$client{$nas_ip}[1]) on $nas_ip");
            }
            else {
                # Kick one of the demo
                &{$kick{$client{$nas_ip}[0]}}($sdb,$nas_ip,$lines_used - 
$client{$nas_ip}[1],$user_name);
            }
        }
    }
    
    &main::log($main::LOG_DEBUG, "Exiting checkDemo");

# Subroutines
    sub kickOnCisco {
        my $sessdb = $_[0];
        my $ip = $_[1];
        my $count = $_[2];
        my $name = $_[3];

        my $CiscoOID = ".1.3.6.1.4.1.9.2.1.76.0";
        my @ifNumber = (13, 14, 15, 16, 17, 18, 19, 20,
                        5,  6,  7,  8,  9,  10, 11, 12);

        # Select demos from DB
        my $q = "SELECT NASPORT 
                    FROM RADONLINE
                    WHERE
                        (NASIDENTIFIER ='$ip') AND
                        (USERNAME ='demo')";

        my $sth = $sessdb->prepareAndExecute($q);
        return unless $sth;

        # Lets kick 
        my $nasPort;
        while (($nasPort) = $sth->fetchrow())
        {
            &main::log($main::LOG_INFO,"Kicking demo from $ip:$nasPort for $name");
            # Kicking
            my $result = &Radius::SNMP::snmpset($ip,
                            $community,
                            $CiscoOID,
                            'i', $ifNumber[$nasPort-1]);
                                                                           
            # Not more then count
            last if --$count ;
        }

        return;
    }
    
    sub kickOnAscend {
        my $sessdb = $_[0];
        my $ip = $_[1];
        my $count = $_[2];
        my $name = $_[3];

        # Select demos from DB
        my $q = "SELECT ACCTSESSIONID 
                    FROM RADONLINE
                    WHERE
                        (NASIDENTIFIER ='$ip') AND
                        (USERNAME ='demo')";

        my $sth = $sessdb->prepareAndExecute($q);
        return unless $sth;

        # Lets kick 
        my $sessId;
        while (($sessId) = $sth->fetchrow())
        {
            &main::log($main::LOG_INFO,"Kicking demo from $ip, session $sessId for 
$name");
            # Kicking
            my $result = &Radius::SNMP::snmpset($ip,
                            $community,
                            "$Radius::Nas::AscendMIB.12.3.1.3.$sessId",
                            'i', 1);
                                                                           
            # Not more then count
            last if --$count ;
        }

        return;
    }
}


With respect,
Pavel A Crasotin
____________________________________
OJSC SeverTransCom
40/13 Sobinova, Yaroslavl, 150000, Russia
Tel/Fax: +7 (0852) 47-71-70, 47-69-49
         +7 (0852) 72-17-28, 72-17-38



===
Archive at http://www.starport.net/~radiator/
Announcements on [EMAIL PROTECTED]
To unsubscribe, email '[EMAIL PROTECTED]' with
'unsubscribe radiator' in the body of the message.

Reply via email to