From ea550c899b991fc474b8a63205fff2f62e0570cf Mon Sep 17 00:00:00 2001 From: Robert Anderson <randerson@lbsd.net> Date: Fri, 20 Mar 2009 06:12:52 +0000 Subject: [PATCH] Return ack/nack for post accounting hook --- .../modules/features/mod_feature_capping.pm | 78 ++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/smradius/modules/features/mod_feature_capping.pm b/smradius/modules/features/mod_feature_capping.pm index 8d4cc686..f889e673 100644 --- a/smradius/modules/features/mod_feature_capping.pm +++ b/smradius/modules/features/mod_feature_capping.pm @@ -25,7 +25,7 @@ use warnings; use smradius::constants; use smradius::logging; use smradius::util; - +use Data::Dumper; # Exporter stuff require Exporter; @@ -167,8 +167,80 @@ sub post_acct_hook $server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] POST ACCT HOOK"); - return MOD_RES_SKIP; -} + my ($trafficLimit,$timeLimit); + + # Compare SMRadius-Capping-Time-Limit + if (defined($user->{'Attributes'}->{$TIME_LIMIT_KEY})) { + $server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] '".$TIME_LIMIT_KEY."' is defined"); + # Operator: := + if (defined($user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='})) { + # Is it a number? + if ($user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='}->{'Value'} =~ /^[0-9]+$/) { + $timeLimit = $user->{'Attributes'}->{$TIME_LIMIT_KEY}; + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] '".$user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='}->{'Value'}."' is NOT a numeric value"); + } + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] No valid operators for attribute '".$user->{'Attributes'}->{$TIME_LIMIT_KEY}."'"); + } + } + + + # Compare SMRadius-Capping-Traffic-Limit + if (defined($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY})) { + $server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] '".$TRAFFIC_LIMIT_KEY."' is defined"); + # Operator: += + if (defined($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='})) { + # Is it a number? + if ($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='}->{'Value'} =~ /^[0-9]+$/) { + $trafficLimit = $user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}; + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] '".$user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='}->{'Value'}."' is NOT a numeric value"); + } + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] No valid operators for attribute '".$user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}."'"); + } + } + + # Check if we need to get the users' usage + my $accountingUsage; + if (defined($timeLimit) || defined($trafficLimit)) { + # Loop with plugins to find anyting supporting getting of usage + foreach my $module (@{$server->{'plugins'}}) { + # Do we have the correct plugin? + if ($module->{'Accounting_getUsage'}) { + $server->log(LOG_INFO,"[MOD_FEATURE_CAPPING] Found plugin: '".$module->{'Name'}."'"); + # Fetch users session time & bandwidth used + my $res = $module->{'Accounting_getUsage'}($server,$user,$packet); + if (!defined($res)) { + $server->log(LOG_ERR,"[MOD_FEATURE_CAPPING] No usage data found for user '".$packet->attr('User-Name')."'"); + return MOD_RES_SKIP; + } + + $accountingUsage = $res; + } + } + } + # Check values against limits + if (defined($timeLimit)) { + if ($accountingUsage->{'TotalTimeUsage'} >= $timeLimit->{':='}->{'Value'}) { + $server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] Usage exceeds ".$timeLimit->{':='}->{'Value'}.", returning [NACK]"); + # Exceeding maximum, must be disconnected + return MOD_RES_NACK; + } + } + if (defined($trafficLimit)) { + if ($accountingUsage->{'TotalDataUsage'} >= $trafficLimit->{':='}->{'Value'}) { + $server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] Usage exceeds ".$trafficLimit->{':='}->{'Value'}.", returning [NACK]"); + # Exceeding maximum, must be disconnected + if ($packet->attr('Acct-Status-Type') eq "Alive") { + return MOD_RES_NACK; + } + } + } + + return MOD_RES_ACK; +} 1; -- GitLab