diff options
author | ivan <ivan> | 2003-09-06 01:44:41 +0000 |
---|---|---|
committer | ivan <ivan> | 2003-09-06 01:44:41 +0000 |
commit | f205bf9569a727c40ee9617bb64aa9fcdcd91953 (patch) | |
tree | aa303f1e82e685d33a79ea05153b02e84669baca | |
parent | 00467435f886dae5c7b0538fd6ba41c3908a5733 (diff) |
add get_session_history_sqlradacct
backport $ignore_quantity from 1.5
-rw-r--r-- | FS/FS/cust_svc.pm | 62 | ||||
-rw-r--r-- | FS/FS/svc_acct.pm | 12 |
2 files changed, 72 insertions, 2 deletions
diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm index 68734a6b9..4c5a64059 100644 --- a/FS/FS/cust_svc.pm +++ b/FS/FS/cust_svc.pm @@ -1,7 +1,7 @@ package FS::cust_svc; use strict; -use vars qw( @ISA ); +use vars qw( @ISA $ignore_quantity ); use Carp qw( cluck ); use FS::Record qw( qsearch qsearchs dbh ); use FS::cust_pkg; @@ -17,6 +17,8 @@ use FS::part_export; @ISA = qw( FS::Record ); +$ignore_quantity = 0; + sub _cache { my $self = shift; my ( $hashref, $cache ) = @_; @@ -229,7 +231,7 @@ sub check { }); return "Already ". scalar(@cust_svc). " ". $part_svc->svc. " services for pkgnum ". $self->pkgnum - if scalar(@cust_svc) >= $quantity; + if scalar(@cust_svc) >= $quantity && !$ignore_quantity; } ''; #no error @@ -500,6 +502,62 @@ sub attribute_since_sqlradacct { } +=item get_session_history_sqlradacct TIMESTAMP_START TIMESTAMP_END + +See L<FS::svc_acct/get_session_history_sqlradacct>. Equivalent to +$cust_svc->svc_x->get_session_history_sqlradacct, but more efficient. +Meaningless for records where B<svcdb> is not "svc_acct". + +=cut + +sub get_session_history { + my($self, $start, $end, $attrib) = @_; + + my $username = $self->svc_x->username; + + my @part_export = $self->part_svc->part_export('sqlradius') + or die "no sqlradius export configured for this service type"; + #or return undef; + + my @sessions = (); + + foreach my $part_export ( @part_export ) { + + my $dbh = DBI->connect( map { $part_export->option($_) } + qw(datasrc username password) ) + or die "can't connect to sqlradius database: ". $DBI::errstr; + + #select a unix time conversion function based on database type + my $str2time; + if ( $dbh->{Driver}->{Name} eq 'mysql' ) { + $str2time = 'UNIX_TIMESTAMP('; + } elsif ( $dbh->{Driver}->{Name} eq 'Pg' ) { + $str2time = 'EXTRACT( EPOCH FROM '; + } else { + warn "warning: unknown database type ". $dbh->{Driver}->{Name}. + "; guessing how to convert to UNIX timestamps"; + $str2time = 'extract(epoch from '; + } + + my @fields = qw( acctstarttime acctstoptime acctsessiontime + acctinputoctets acctoutputoctets framedipaddress ); + + my $sth = $dbh->prepare('SELECT '. join(', ', @fields). + " FROM radacct + WHERE UserName = ? + AND $str2time AcctStopTime ) >= ? + AND $str2time AcctStopTime ) <= ? + ORDER BY AcctStartTime DESC + ") or die $dbh->errstr; + $sth->execute($username, $start, $end) or die $sth->errstr; + + push @sessions, map { { %$_ } } @{ $sth->fetchall_arrayref({}) }; + + } + \@sessions + +} + =back =head1 BUGS diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index ff44ffacf..734059af5 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -1019,6 +1019,18 @@ sub attribute_since_sqlradacct { } +=item get_session_history TIMESTAMP_START TIMESTAMP_END + +Returns an array of hash references of this customers login history for the +given time range. (document this better) + +=cut + +sub get_session_history { + my $self = shift; + $self->cust_svc->get_session_history(@_); +} + =item radius_groups Returns all RADIUS groups for this account (see L<FS::radius_usergroup>). |