(RADIATOR) patch for AuthSQL module to calculate real day time ACCTSESSIONTIME
Ganbold
ganbold at micom.mng.net
Wed Dec 11 23:10:59 CST 2002
Hi,
I just wrote some codes which calculates user's connected time. We have
some PREPAID users and every time
when they use Internet during day time we have to subtract used time from
TIMELEFT column in MySQL table.
But it is not always.
if user is connected around 23:00:00 and used 3 hours we have to subtract
only one hour(3600) from TIMELEFT. If user is connected around 06:00:00 and
used 3 hours we have to subtract 2 hours(7200) from TIMELEFT.
If user is connected 01:00:00 and used 2 hours then we don't have to
subtract anything.
If user is connected 10:00:00 and used 3 hours then we have to just
subtract ACCTSESSIONTIME.
Day time means 07:00:00 - 23:59:59 (this time is charged and we want to
subtract used time from TIMELEFT)
Night time means 00:00:00 - 07:00:00 (this time is free and we don't want
to subtract used time from TIMELEFT)
Following is the code I want to add to AuthSQL.pm module.
Can somebody look at the code and give me some recommendation on that?
Can I add it to AuthSQL.pm module and use?
TIA,
Ganbold
-------------------------------------------------------------------------------------------------------------------------------
# patch for AuthSQL.pm which calculates day only duration
# Day means from 07:00:00 to 23:59:59
# if connection continued over 00:00:00 or 07:00:00 we have to get real
duration
use Time::Local;
# in handle_request
.
.
.
if ($p->getAttrByNum($Radius::Radius::ACCT_STATUS_TYPE) eq 'Stop')
{
my $session_time =
$p->getAttrByNum($Radius::Radius::ACCT_SESSION_TIME) + 0;
my $user_name = $p->getUserName;
my $time_stamp = $p->{RecvTime} - int
$p->getAttrByNum($Radius::Radius::ACCT_DELAY_TIME);
my $duration = $session_time;
########### This lines added to calculate real duration during
day time ###########################
my ($rduration, $i);
my ($start_stamp);
my ($start_hour,$end_hour);
my ($start_day, $end_day);
my
($s_tstamp_at_0,$s_tstamp_at_7,$e_tstamp_at_0,$e_tstamp_at_7);
my ($diff, $day_diff, @numDays, $thismonth);
my ($sec,$min,$hour,$mday,$mon,$wday,$yday,$isdst,$year);
# initialize first real duration
$rduration = 0;
$start_stamp = $time_stamp - $duration;
# stamp at 0 and 7 o'clock of start day
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($start_stamp);
$s_tstamp_at_0 = timelocal(0,0,0,$mday,$mon,$year);
$s_tstamp_at_7 = timelocal(0,0,7,$mday,$mon,$year);
# calculating number of days in month
for($i=0; $i<12; $i += 2){
$numDays[$i] = 31;
}
for($i=1; $i<12; $i += 2){
$numDays[$i] = 30;
}
# calculating number of days in February
if(($year % 4) != 0){
$numDays[1] = 28;
}elsif(($year % 400) == 0){
$numDays[1] = 29;
}elsif(($year % 100) == 0){
$numDays[1] = 28;
}else{
$numDays[1] = 29;
}
$thismonth = $mon;
# stamp at 0 and 7 o'clock of stop day
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($time_stamp);
$e_tstamp_at_0 = timelocal(0,0,0,$mday,$mon,$year);
$e_tstamp_at_7 = timelocal(0,0,7,$mday,$mon,$year);
# start and stop hours and start and stop days
($sec,$min,$start_hour,$start_day,$mon,$year,$wday,$yday,$isdst)
= localtime($start_stamp);
($sec,$min,$end_hour,$end_day,$mon,$year,$wday,$yday,$isdst)
= localtime($time_stamp);
$diff = int $duration/86400; # how many day's
connection continued
# day difference between start and stop
# connecton continued until beginning of the next month
if($end_day < $start_day){
$day_diff = $numDays[$thismonth] - $start_day +
$end_day;
}else{
$day_diff = $end_day - $start_day;
}
if($start_hour >= 0 && $start_hour < 7){
if($end_hour >= 0 && $end_hour < 7){
if($day_diff > 0){
$rduration = $duration - ($s_tstamp_at_7 - $start_stamp) -
($diff * 25200) - ($time_stamp - $e_tstamp_at_0);
}else{
$rduration = 0;
}
}elsif($end_hour >= 7 && $end_hour <= 23){
$rduration = $duration - ($s_tstamp_at_7 -
$start_stamp) - ($diff * 25200);
}
}elsif($start_hour >= 7 && $start_hour <= 23){
if($end_hour >= 7 && $end_hour <= 23){
$rduration = $duration - ($day_diff * 25200);
}elsif($end_hour >= 0 && $end_hour < 7){
$rduration = $duration - ($time_stamp -
$e_tstamp_at_0) - ($diff * 25200);
}
}
########### Above lines added to calculate real duration
during day time ###########################
$q = "update SUBSCRIBERS set TIMELEFT = (TIMELEFT -
$rduration) where USERNAME = '$user_name'";
$self->log($main::LOG_DEBUG, "Query is: $q\n", $p);
$self->do($q);
}
.
.
.
===
Archive at http://www.open.com.au/archives/radiator/
Announcements on radiator-announce at open.com.au
To unsubscribe, email 'majordomo at open.com.au' with
'unsubscribe radiator' in the body of the message.
More information about the radiator
mailing list