X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fsqlradius.pm;h=5a8da7bdbf39b3bd52c507a89e386bcb988b090b;hb=a2c70ba55a0b69c310534774334d859c2e907692;hp=db66c39c0ca67839bec6c1f1d361297724b377d5;hpb=6bf3df8177a22d2275b1a68045ab5ff2e831af42;p=freeside.git diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm index db66c39c0..5a8da7bdb 100644 --- a/FS/FS/part_export/sqlradius.pm +++ b/FS/FS/part_export/sqlradius.pm @@ -9,6 +9,7 @@ use FS::part_export; use FS::svc_acct; use FS::export_svc; use Carp qw( cluck ); +use NEXT; @ISA = qw(FS::part_export); @EXPORT_OK = qw( sqlradius_connect ); @@ -47,7 +48,7 @@ tie %options, 'Tie::IxHash', }, 'show_called_station' => { type => 'checkbox', - label => 'Show the Called-Station-ID on session reports', + label => 'Show the Called-Station-ID on session reports', #as a phone number }, 'overlimit_groups' => { label => 'Radius groups to assign to svc_acct which has exceeded its bandwidth or time limit (if not overridden by overlimit_groups global or per-agent config)', @@ -133,12 +134,14 @@ sub export_username { # override for other svcdb sub radius_reply { #override for other svcdb my($self, $svc_acct) = (shift, shift); - $svc_acct->radius_reply; + my %every = $svc_acct->EVERY::radius_reply; + map { @$_ } values %every; } sub radius_check { #override for other svcdb my($self, $svc_acct) = (shift, shift); - $svc_acct->radius_check; + my %every = $svc_acct->EVERY::radius_check; + map { @$_ } values %every; } sub _export_insert { @@ -194,8 +197,8 @@ sub _export_replace { foreach my $table (qw(reply check)) { my $method = "radius_$table"; - my %new = $new->$method(); - my %old = $old->$method(); + my %new = $self->$method($new); + my %old = $self->$method($old); if ( grep { !exists $old{$_} #new attributes || $new{$_} ne $old{$_} #changed } keys %new @@ -646,6 +649,8 @@ Returns an arrayref of hashrefs with the following fields: =item acctoutputoctets +=item callingstationid + =item calledstationid =back @@ -664,7 +669,7 @@ sub usage_sessions { $opt = shift; $start = $opt->{stoptime_start}; $end = $opt->{stoptime_end}; - $svc_acct = $opt->{svc_acct}; + $svc_acct = $opt->{svc} || $opt->{svc_acct}; $ip = $opt->{ip}; $prefix = $opt->{prefix}; $summarize = $opt->{summarize}; @@ -689,7 +694,7 @@ sub usage_sessions { my @fields = ( qw( username realm framedipaddress acctsessiontime acctinputoctets acctoutputoctets - calledstationid + callingstationid calledstationid ), "$str2time acctstarttime ) as acctstarttime", "$str2time acctstoptime ) as acctstoptime", @@ -741,8 +746,11 @@ sub usage_sessions { } } if ( $opt->{session_status} ne 'closed' ) { - $acctstoptime = "( $acctstoptime ) OR " if $acctstoptime; - $acctstoptime .= 'AcctStopTime IS NULL'; + if ( $acctstoptime ) { + $acctstoptime = "( ( $acctstoptime ) OR AcctStopTime IS NULL )"; + } else { + $acctstoptime = 'AcctStopTime IS NULL'; + } } push @where, $acctstoptime; @@ -813,67 +821,90 @@ sub update_svc { "$RadAcctId ($UserName\@$Realm for ${AcctSessionTime}s" if $DEBUG; - $UserName = lc($UserName) unless $conf->exists('username-uppercase'); + my $fs_username = $UserName; - #my %search = ( 'username' => $UserName ); - - my $extra_sql = ''; - if ( ref($self) =~ /withdomain/ ) { #well... - $extra_sql = " AND '$Realm' = ( SELECT domain FROM svc_domain - WHERE svc_domain.svcnum = svc_acct.domsvc ) "; - } + $fs_username = lc($fs_username) unless $conf->exists('username-uppercase'); - my $oldAutoCommit = $FS::UID::AutoCommit; # can't undo side effects, but at - local $FS::UID::AutoCommit = 0; # least we can avoid over counting + #my %search = ( 'username' => $fs_username ); - my $status = 'skipped'; + my $status = ''; my $errinfo = "for RADIUS detail RadAcctID $RadAcctId ". "(UserName $UserName, Realm $Realm)"; - if ( $self->option('process_single_realm') - && $self->option('realm') ne $Realm ) - { - warn "WARNING: wrong realm $errinfo - skipping\n" if $DEBUG; - } else { - my @svc_acct = - grep { qsearch( 'export_svc', { 'exportnum' => $self->exportnum, - 'svcpart' => $_->cust_svc->svcpart, } ) - } - qsearch( 'svc_acct', - { 'username' => $UserName }, - '', - $extra_sql - ); - - if ( !@svc_acct ) { - warn "WARNING: no svc_acct record found $errinfo - skipping\n"; - } elsif ( scalar(@svc_acct) > 1 ) { - warn "WARNING: multiple svc_acct records found $errinfo - skipping\n"; + my $extra_sql = ''; + if ( ref($self) =~ /withdomain/ ) { #well, should be a callback to that + #module or something + my $domain; + if ( $Realm ) { + $domain = $Realm; + } elsif ( $fs_username =~ /\@/ ) { + ($fs_username, $domain) = split('@', $fs_username); } else { + warn 'WARNING: nothing Realm column and no @realm in UserName column '. + "$errinfo -- skipping\n" if $DEBUG; + $status = 'skipped (no realm)'; + } + + $extra_sql = " AND '$domain' = ( SELECT domain FROM svc_domain + WHERE svc_domain.svcnum = svc_acct.domsvc ) "; + } - my $svc_acct = $svc_acct[0]; - warn "found svc_acct ". $svc_acct->svcnum. " $errinfo\n" if $DEBUG; + my $oldAutoCommit = $FS::UID::AutoCommit; # can't undo side effects, but at + local $FS::UID::AutoCommit = 0; # least we can avoid over counting - $svc_acct->last_login($AcctStartTime); - $svc_acct->last_logout($AcctStopTime); + unless ( $status ) { - my $session_time = $AcctStopTime; - $session_time = $AcctStartTime if $self->option('ignore_long_sessions'); + $status = 'skipped'; - my $cust_pkg = $svc_acct->cust_svc->cust_pkg; - if ( $cust_pkg && $session_time < ( $cust_pkg->last_bill - || $cust_pkg->setup ) ) { - $status = 'skipped (too old)'; + if ( $self->option('process_single_realm') + && $self->option('realm') ne $Realm ) + { + warn "WARNING: wrong realm $errinfo - skipping\n" if $DEBUG; + } else { + my @svc_acct = + grep { qsearch( 'export_svc', { 'exportnum' => $self->exportnum, + 'svcpart' => $_->cust_svc->svcpart, + } + ) + } + qsearch( 'svc_acct', + { 'username' => $fs_username }, + '', + $extra_sql + ); + + if ( !@svc_acct ) { + warn "WARNING: no svc_acct record found $errinfo - skipping\n"; + } elsif ( scalar(@svc_acct) > 1 ) { + warn "WARNING: multiple svc_acct records found $errinfo - skipping\n"; } else { - my @st; - push @st, _try_decrement($svc_acct, 'seconds', $AcctSessionTime); - push @st, _try_decrement($svc_acct, 'upbytes', $AcctInputOctets); - push @st, _try_decrement($svc_acct, 'downbytes', $AcctOutputOctets); - push @st, _try_decrement($svc_acct, 'totalbytes', $AcctInputOctets - + $AcctOutputOctets); - $status=join(' ', @st); + + my $svc_acct = $svc_acct[0]; + warn "found svc_acct ". $svc_acct->svcnum. " $errinfo\n" if $DEBUG; + + $svc_acct->last_login($AcctStartTime); + $svc_acct->last_logout($AcctStopTime); + + my $session_time = $AcctStopTime; + $session_time = $AcctStartTime + if $self->option('ignore_long_sessions'); + + my $cust_pkg = $svc_acct->cust_svc->cust_pkg; + if ( $cust_pkg && $session_time < ( $cust_pkg->last_bill + || $cust_pkg->setup ) ) { + $status = 'skipped (too old)'; + } else { + my @st; + push @st, _try_decrement($svc_acct,'seconds', $AcctSessionTime); + push @st, _try_decrement($svc_acct,'upbytes', $AcctInputOctets); + push @st, _try_decrement($svc_acct,'downbytes', $AcctOutputOctets); + push @st, _try_decrement($svc_acct,'totalbytes', $AcctInputOctets + + $AcctOutputOctets); + $status=join(' ', @st); + } } } + } warn "setting FreesideStatus to $status $errinfo\n" if $DEBUG;