X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fsqlradius.pm;h=4f67ac6c3a44c3dd1bfdc2e623d2b29b791b4208;hb=624b2d44625f69d71175c3348cae635d580c890b;hp=88b7ed399039ddc6542ff23331bca82bd61cc75a;hpb=7905f5dfd903529a6de89875e6fae74638a89aa3;p=freeside.git diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm index 88b7ed399..4f67ac6c3 100644 --- a/FS/FS/part_export/sqlradius.pm +++ b/FS/FS/part_export/sqlradius.pm @@ -1,6 +1,7 @@ package FS::part_export::sqlradius; -use vars qw(@ISA $DEBUG %info %options $notes1 $notes2); +use vars qw(@ISA @EXPORT_OK $DEBUG %info %options $notes1 $notes2); +use Exporter; use Tie::IxHash; use FS::Record qw( dbh qsearch qsearchs str2time_sql ); use FS::part_export; @@ -9,6 +10,7 @@ use FS::export_svc; use Carp qw( cluck ); @ISA = qw(FS::part_export); +@EXPORT_OK = qw( sqlradius_connect ); $DEBUG = 0; @@ -32,7 +34,7 @@ tie %options, 'Tie::IxHash', type => 'checkbox', label => 'Show the Called-Station-ID on session reports', }, - 'overlimit_groups' => { label => 'Radius groups to assign to svc_acct which has exceeded its bandwidth or time limit', } , + '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)', } , 'groups_susp_reason' => { label => 'Radius group mapping to reason (via template user) (svcnum|username|username@domain reasonnum|reason)', type => 'textarea', @@ -49,7 +51,7 @@ END $notes2 = <<'END'; An existing RADIUS database will be updated in realtime, but you can use -freeside-sqlradius-reset +freeside-sqlradius-reset to delete the entire RADIUS database and repopulate the tables from the Freeside database. See the DBI documentation @@ -95,24 +97,24 @@ sub export_username { } sub _export_insert { - my($self, $svc_acct) = (shift, shift); + my($self, $svc_x) = (shift, shift); foreach my $table (qw(reply check)) { my $method = "radius_$table"; - my %attrib = $svc_acct->$method(); + my %attrib = $svc_x->$method(); next unless keys %attrib; - my $err_or_queue = $self->sqlradius_queue( $svc_acct->svcnum, 'insert', - $table, $self->export_username($svc_acct), %attrib ); + my $err_or_queue = $self->sqlradius_queue( $svc_x->svcnum, 'insert', + $table, $self->export_username($svc_x), %attrib ); return $err_or_queue unless ref($err_or_queue); } - my @groups = $svc_acct->radius_groups; + my @groups = $svc_x->radius_groups; if ( @groups ) { - cluck localtime(). ": queuing usergroup_insert for ". $svc_acct->svcnum. - " (". $self->export_username($svc_acct). " with ". join(", ", @groups) + cluck localtime(). ": queuing usergroup_insert for ". $svc_x->svcnum. + " (". $self->export_username($svc_x). " with ". join(", ", @groups) if $DEBUG; my $err_or_queue = $self->sqlradius_queue( - $svc_acct->svcnum, 'usergroup_insert', - $self->export_username($svc_acct), @groups ); + $svc_x->svcnum, 'usergroup_insert', + $self->export_username($svc_x), @groups ); return $err_or_queue unless ref($err_or_queue); } ''; @@ -283,9 +285,9 @@ sub _export_unsuspend { } sub _export_delete { - my( $self, $svc_acct ) = (shift, shift); - my $err_or_queue = $self->sqlradius_queue( $svc_acct->svcnum, 'delete', - $self->export_username($svc_acct) ); + my( $self, $svc_x ) = (shift, shift); + my $err_or_queue = $self->sqlradius_queue( $svc_x->svcnum, 'delete', + $self->export_username($svc_x) ); ref($err_or_queue) ? '' : $err_or_queue; } @@ -364,7 +366,7 @@ sub sqlradius_insert { #subroutine, not method $i_sth->execute( $username, $attribute, - ( $attribute =~ /Password/i ? '==' : ':=' ), + ( $attribute eq 'Password' ? '==' : ':=' ), $attributes{$attribute}, ) or die $i_sth->errstr; @@ -503,8 +505,34 @@ sub sqlreplace_usergroups { #-- +=item usage_sessions HASHREF + =item usage_sessions TIMESTAMP_START TIMESTAMP_END [ SVC_ACCT [ IP [ PREFIX [ SQL_SELECT ] ] ] ] +New-style: pass a hashref with the following keys: + +=over 4 + +=item stoptime_start - Lower bound for AcctStopTime, as a UNIX timestamp + +=item stoptime_end - Upper bound for AcctStopTime, as a UNIX timestamp + +=item open_sessions - Only show records with no AcctStopTime (typically used without stoptime_* options and with starttime_* options instead) + +=item starttime_start - Lower bound for AcctStartTime, as a UNIX timestamp + +=item starttime_end - Upper bound for AcctStartTime, as a UNIX timestamp + +=item svc_acct + +=item ip + +=item prefix + +=back + +Old-style: + TIMESTAMP_START and TIMESTAMP_END are specified as UNIX timestamps; see L. Also see L and L for conversion functions. @@ -546,11 +574,24 @@ Returns an arrayref of hashrefs with the following fields: #some false laziness w/cust_svc::seconds_since_sqlradacct sub usage_sessions { - my( $self, $start, $end ) = splice(@_, 0, 3); - my $svc_acct = @_ ? shift : ''; - my $ip = @_ ? shift : ''; - my $prefix = @_ ? shift : ''; - #my $select = @_ ? shift : '*'; + my( $self ) = shift; + + my $opt = {}; + my($start, $end, $svc_acct, $ip, $prefix) = ( '', '', '', '', ''); + if ( ref($_[0]) ) { + $opt = shift; + $start = $opt->{stoptime_start}; + $end = $opt->{stoptime_end}; + $svc_acct = $opt->{svc_acct}; + $ip = $opt->{ip}; + $prefix = $opt->{prefix}; + } else { + ( $start, $end ) = splice(@_, 0, 2); + $svc_acct = @_ ? shift : ''; + $ip = @_ ? shift : ''; + $prefix = @_ ? shift : ''; + #my $select = @_ ? shift : '*'; + } $end ||= 2147483647; @@ -572,37 +613,56 @@ sub usage_sessions { ); my @param = (); - my $where = ''; + my @where = (); if ( $svc_acct ) { my $username = $self->export_username($svc_acct); if ( $svc_acct =~ /^([^@]+)\@([^@]+)$/ ) { - $where = '( UserName = ? OR ( UserName = ? AND Realm = ? ) ) AND'; + push @where, '( UserName = ? OR ( UserName = ? AND Realm = ? ) )'; push @param, $username, $1, $2; } else { - $where = 'UserName = ? AND'; + push @where, 'UserName = ?'; push @param, $username; } } if ( length($ip) ) { - $where .= ' FramedIPAddress = ? AND'; + push @where, ' FramedIPAddress = ?'; push @param, $ip; } if ( length($prefix) ) { #assume sip: for now, else things get ugly trying to match /^\w+:$prefix/ - $where .= " CalledStationID LIKE 'sip:$prefix\%' AND"; + push @where, " CalledStationID LIKE 'sip:$prefix\%'"; + } + + if ( $start ) { + push @where, "$str2time AcctStopTime ) >= ?"; + push @param, $start; + } + if ( $end ) { + push @where, "$str2time AcctStopTime ) <= ?"; + push @param, $end; + } + if ( $opt->{open_sessions} ) { + push @where, 'AcctStopTime IS NULL'; + } + if ( $opt->{starttime_start} ) { + push @where, "$str2time AcctStartTime ) >= ?"; + push @param, $opt->{starttime_start}; + } + if ( $opt->{starttime_end} ) { + push @where, "$str2time AcctStartTime ) <= ?"; + push @param, $opt->{starttime_end}; } - push @param, $start, $end; + my $where = join(' AND ', @where); + $where = "WHERE $where" if $where; my $sth = $dbh->prepare('SELECT '. join(', ', @fields). " FROM radacct - WHERE $where - $str2time AcctStopTime ) >= ? - AND $str2time AcctStopTime ) <= ? - ORDER BY AcctStartTime DESC + $where + ORDER BY AcctStartTime DESC ") or die $dbh->errstr; $sth->execute(@param) or die $sth->errstr; @@ -614,7 +674,7 @@ sub usage_sessions { =cut -sub update_svc_acct { +sub update_svc { my $self = shift; my $conf = new FS::Conf; @@ -648,7 +708,7 @@ sub update_svc_acct { $UserName = lc($UserName) unless $conf->exists('username-uppercase'); - my %search = ( 'username' => $UserName ); + #my %search = ( 'username' => $UserName ); my $extra_sql = ''; if ( ref($self) =~ /withdomain/ ) { #well... @@ -741,7 +801,7 @@ sub all_sqlradius { my @part_export = (); push @part_export, qsearch('part_export', { 'exporttype' => $_ } ) - foreach qw(sqlradius sqlradius_withdomain radiator); + foreach qw( sqlradius sqlradius_withdomain radiator phone_sqlradius ); @part_export; }