rlm_exec and retriving RAD_REQUEST attribute values
Matt morris
mmorris36 at hotmail.com
Wed Aug 24 22:05:35 CEST 2005
Hello list,
This has probably been asked a lot times before, but I just couldn't get the
attributes values from accounting request packets with my perl script. I am
trying to do some database queries when I received stop accounting request
packets, here are the relevant sections of my radiusd.conf and script file:
=============
radiusd.conf:
=============
modules {
exec {
wait = yes
input_pairs = request
}
exec custom123 {
wait = no
program = "/usr/src/myscript.pl %{Acct-Unique-Session-Id} %{User-Name}
%{Called-Station-Id}"
input-pairs = request
output-pairs = reply
packet-type = Accounting-Request
}
}
instantiate {
exec
custom123
expr
}
accounting {
detail
unix
radutmp
sql
custom123
}
=============================================================
myscript.pl (simplifed the accounting section for the purpose of posting):
=============================================================
#!/usr/bin/perl
use DBI;
use Data::Dumper;
use strict 'vars';
use vars qw(%RAD_REQUEST %RAD_REPLY %RAD_CHECK);
use Data::Dumper;
my %RAD_REQUEST;
my %RAD_REPLY;
my %RAD_CHECK;
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
*/
&test_call;
return RLM_MODULE_OK;
}
sub authorize {
&test_call;
return RLM_MODULE_OK;
}
sub authenticate {
if ($RAD_REQUEST{'User-Name'} =~ /^baduser/i) {
$RAD_REPLY{'Reply-Message'} = "Denied access by rlm_perl function";
return RLM_MODULE_REJECT;
} else {
$RAD_REPLY{'h323-credit-amount'} = "100";
return RLM_MODULE_OK;
}
}
sub preacct {
return RLM_MODULE_OK;
}
sub accounting {
if ($RAD_REQUEST{'Acct-Status-Type'} eq "Stop") {
open(FILEWRITE, "> /downloads/tronsun/testperlfile.log");
print FILEWRITE "Logging RAD Request Attributes\n";
print FILEWRITE "Acct-Unique-Session-Id :
$RAD_REQUEST{'Acct-Unique-Session-Id'}\n";
close FILEWRITE;
return RLM_MODULE_OK;
}
else {
return RLM_MODULE_NOOP;
}
}
sub checksimul {
return RLM_MODULE_OK;
}
sub xlat {
my ($filename,$a,$b,$c,$d) = @_;
&radiusd::radlog(1, "From xlat $filename ");
&radiusd::radlog(1,"From xlat $a $b $c $d ");
local *FH;
open FH, $filename or die "open '$filename' $!";
local($/) = undef;
my $sub = <FH>;
close FH;
my $eval = qq{ sub handler{ $sub;} };
eval $eval;
eval {main->handler;};
}
sub detach {
&radiusd::radlog(0,"rlm_perl::Detaching. Reloading. Done.");
}
sub log_request_attributes {
for (keys %RAD_REQUEST) {
&radiusd::radlog(1, "RAD_REQUEST: $_ = $RAD_REQUEST{$_}");
}
}
&accounting();
==========================================================================
End myscript.pl
==========================================================================
=============================
My Accounting-Request packet:
=============================
Acct-Session-Id = "1124643784.6"
h323-connect-time = "2005-08-22 01:04:29"
h323-setup-time = "2005-08-22 01:04:25"
Cisco-NAS-Port = "SIP/14002-081332c8"
Called-Station-Id = "18001112345"
Acct-Status-Type = Stop
h323-conf-id = "A46B7F2B-0D73-4E75-ABCF-F6CA7140B9D5 at 192.168.1.101"
NAS-IP-Address = 123.123.123.123
Acct-Session-Time = 67
Calling-Station-Id = "9871234"
h323-disconnect-time = "2005-08-22 01:05:36"
Cisco-AVPair = "codec-type-rate=ulaw;useragent=X-Lite release 1103m;"
User-Name = "9871234"
NAS-Identifier = "Asterisk"
NAS-Port = 5070
Acct-Delay-Time = 4
Client-IP-Address = 127.0.0.1
Acct-Unique-Session-Id = "44e82fcfd875db6f"
Timestamp = 1124643865
======================
After the script is ran in freeradius, there is no value in
$RAD_REQUEST{'Acct-Status-Type'} and $RAD_REQUEST{'Acct-Unique-Session-Id'}
Right now I'm putting the attributes into the arugments when executing
myscript.pl (as shown in radiusd.conf), which works fine. But I would like
to know the proper way. Please point me the right direction. Thank you very
much.
_________________________________________________________________
MSN® Calendar keeps you organized and takes the effort out of scheduling
get-togethers.
http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines
Start enjoying all the benefits of MSN® Premium right now and get the
first two months FREE*.
More information about the Freeradius-Users
mailing list