rlm_perl DBI problems

Александр Косых avkosykh at gmail.com
Wed Apr 29 23:45:04 CEST 2009


hi
 
I have some problem with perl module in freeradius
 
There are an errors after that radius is fall down
 
Tue Apr 28 19:23:07 2009 : Error: rlm_perl: perl_embed:: module =
/usr/local/etc/raddb/processing.pl , func = reject_log exit status=
Undefined subroutine &DBD::mysql::dr::reject_log called at
/usr/local/lib/perl5/site_perl/5.8.9/mach/DBD/mysql.pm line 142.
 
Tue Apr 28 19:45:41 2009 : Error: rlm_perl: perl_embed:: module =
/usr/local/etc/raddb/processing.pl , func = reject_log exit status=
Undefined subroutine &DBD::mysql::dr::reject_log called at
/usr/local/lib/perl5/site_perl/5.8.9/mach/DBD/mysql.pm line 142.
 
Wed Apr 29 15:11:52 2009 : Error: rlm_perl: perl_embed:: module =
/usr/local/etc/raddb/processing.pl , func = reject_log exit status=
Undefined subroutine &DBI::Const::GetInfo::ODBC::reject_log called at
/usr/local/lib/perl5/site_perl/5.8.9/mach/DBI/Const/GetInfo/ODBC.pm line
1337.
 
Here is a processing.pl
 
use strict;
# use ...
 
# This is very important ! Without this script will not get the filled
hashesh from main.
use vars qw(%RAD_REQUEST %RAD_REPLY %RAD_CHECK);
use Data::Dumper;
 
my $username; 
 
my $debug       = '1';
 
#
# This the remapping of return values
#
        use constant    RLM_MODULE_REJECT=>    0;#  /* immediately reject
the request */
        use constant    RLM_MODULE_FAIL=>      1;#  /* module failed, don't
reply */
        use constant    RLM_MODULE_OK=>        2;#  /* the module is OK,
continue */
        use constant    RLM_MODULE_HANDLED=>   3;#  /* the module handled
the request, so stop. */
        use constant    RLM_MODULE_INVALID=>   4;#  /* the module considers
the request invalid. */
        use constant    RLM_MODULE_USERLOCK=>  5;#  /* reject the request
(user is locked out) */
        use constant    RLM_MODULE_NOTFOUND=>  6;#  /* user not found */
        use constant    RLM_MODULE_NOOP=>      7;#  /* module succeeded
without doing anything */
        use constant    RLM_MODULE_UPDATED=>   8;#  /* OK (pairs modified)
*/
        use constant    RLM_MODULE_NUMCODES=>  9;#  /* How many return codes
there are */
 
sub reject_log {
    #
    # -- function to log rejected users in xml format
    #
 
    $username = $RAD_REQUEST{'User-Name'};
    $username =~ s/[^a-zA-Z0-9_-]//g;
    &radiusd::radlog(1, "DEBUG reject_log: RAD_REQUEST User-Name:
".$RAD_REQUEST{'User-Name'}) if $debug;
    &radiusd::radlog(1, "DEBUG reject_log: UserName: ".$username) if $debug;
 
    my $textlog;        #       /* !!! Don't comment this line !!! */
    # Uncomment next line for text log readable from unix console (by
default log in xml)
#    $textlog = '1';
 
    # Log file
    my $logfile = '/var/log/radreject.log' if $textlog;
    my $logfilexml = '/var/log/radreject.xml';
    open (LOG, ">>$logfile") or $RAD_REPLY{'Module-Failure-Message'} =
"rlm_rejectlog: Can't open logfile." if $textlog;
    open (LOGXML, ">>$logfilexml") or $RAD_REPLY{'Module-Failure-Message'} =
"rlm_rejectlog: Can't open xml logfile." and return RLM_MODULE_FAIL;
    my $now = localtime;
 
    if ($RAD_REQUEST{'Module-Failure-Message'} eq "rlm_chap: Wrong user
password") {
        print LOG $now.
        " Password incorrect [ ".
        $RAD_REQUEST{'User-Name'}
        ." ]. (from ".
        $RAD_REQUEST{'NAS-IP-Address'}
        ." client ".
        $RAD_REQUEST{'Calling-Station-Id'}
        .")\n" if $textlog;
 
        print LOGXML "<date>".
        $now
        ."</date><message>Password incorrect</message><login>".
        $RAD_REQUEST{'User-Name'}
        ."</login><nas>".
        $RAD_REQUEST{'NAS-IP-Address'}
        ."</nas><cli_mac>".
        $RAD_REQUEST{'Calling-Station-Id'}
        ."</cli_mac>\n";
    }
    elsif($RAD_REQUEST{'Module-Failure-Message'} eq "rlm_chap: Clear text
password not available") {
        print LOG $now.
        " Login incorrect [ ".
        $RAD_REQUEST{'User-Name'}
        ." ]. (from ".
        $RAD_REQUEST{'NAS-IP-Address'}
        ." client ".
        $RAD_REQUEST{'Calling-Station-Id'}
        .")\n" if $textlog;
 
        print LOGXML "<date>".
        $now
        ."</date><message>Login incorrect</message><login>".
        $RAD_REQUEST{'User-Name'}
        ."</login><nas>".
        $RAD_REQUEST{'NAS-IP-Address'}
        ."</nas><cli_mac>".
        $RAD_REQUEST{'Calling-Station-Id'}
        ."</cli_mac>\n";
    }
    else {
        close LOGXML;
        close LOG if $textlog;
        return RLM_MODULE_NOOP;
    }
    close LOGXML;
    close LOG if $textlog;
    return RLM_MODULE_UPDATED;
}
 
sub post_auth {
    #
    # -- this function add attributes to reply
    #
 
    use DBI;
    use Time::HiRes qw(usleep);
 
    my $dblogin             = 'radius';
    my $dbpass              = 'secret';
    my $dbname              = 'RADDB';
 
    my $dbh =
DBI->connect("dbi:mysql:dbname=$dbname","$dblogin","$dbpass",{PrintError =>
0})
    or &radiusd::radlog(1, "DEBUG post_auth: DBI error: ".$DBI::errstr) if
$debug;
    if ($DBI::err != 0) {
        usleep(100000);
        $RAD_REPLY {'Reply-Message'} = "Error connecting to database.";
        return RLM_MODULE_FAIL;
    }
 
    $username = $RAD_REQUEST{'User-Name'};
    $username =~ s/[^a-zA-Z0-9_-]//g;
    &radiusd::radlog(1, "DEBUG post_auth: RAD_REQUEST User-Name:
".$RAD_REQUEST{'User-Name'}) if $debug;
    &radiusd::radlog(1, "DEBUG post_auth: UserName: ".$username) if $debug;
 
    my $query = "CALL rad_reply('".$username."')";
 
    my $sth = $dbh->prepare($query);
    my $rv = $sth->execute();
    &radiusd::radlog(1, "DEBUG: query error: ".$sth->errstr) if $debug;
 
    if (!defined $rv) {
        usleep(100000);
        $RAD_REPLY {'Reply-Message'} = "Error executing SQL query.";
 
#
#
# -- why db disconnect don't work in next line? It's say that db connect
already closed
#
#
#       $dbh->disconnect();
        return RLM_MODULE_FAIL;
    }
 
    my $attr_hash = $sth->fetchrow_hashref();
    if ($attr_hash->{is_blocked} == '0'){
        $RAD_REPLY {'Filter-Id'} = 'allow';
    }
    $RAD_REPLY {'Framed-IP-Address'} = $attr_hash->{ip};
    $RAD_REPLY {'Framed-IP-Netmask'} = '255.255.255.255';
    if ($attr_hash->{attr} ne 'NULL'){
        $RAD_REPLY {'Mikrotik-Rate-Limit'} = $attr_hash->{attr};
    }
    $RAD_REPLY {'Session-Timeout'} = '86400';
#
# -- here is the same - don't work L
#
#    $dbh->disconnect;
    return RLM_MODULE_UPDATED;
}
 
Other files
raddb/modules/rejectlog
#
# This module made for loggin reject radius answers
# using perl function reject_log
#
 
perl rejectlog {
    module = /usr/local/etc/raddb/rejectlog.pl
    func_post_auth = reject_log
}
 
raddb/sites-enable/my-site
:
post-auth {
        Post-Auth-Type REJECT {
                attr_filter.access_reject
 
                #
                # Log failed logins to xml log file or to unix log.
                #
                rejectlog
        }
        # Perl
        perl
}
:
 
Radiusd work fine a little time - an hour or an 2-3 hours but then its fall
What can I do with that errors?
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20090430/92bdeeda/attachment.html>


More information about the Freeradius-Users mailing list