X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsession.pm;h=615c8ae8b49ecfd8bfce93e0216125635b9eb20d;hp=b85a5822f9830bc92723ef1b18bc599fdda2595c;hb=74e058c8a010ef6feb539248a550d0bb169c1e94;hpb=7f07089722bfcabe3bf42619bb2bdb81fd8d44e1 diff --git a/FS/FS/session.pm b/FS/FS/session.pm index b85a5822f..615c8ae8b 100644 --- a/FS/FS/session.pm +++ b/FS/FS/session.pm @@ -1,7 +1,8 @@ package FS::session; use strict; -use vars qw( @ISA ); +use vars qw( @ISA $conf $start $stop ); +use FS::UID qw( dbh ); use FS::Record qw( qsearchs ); use FS::svc_acct; use FS::port; @@ -9,6 +10,12 @@ use FS::nas; @ISA = qw(FS::Record); +$FS::UID::callback{'FS::session'} = sub { + $conf = new FS::Conf; + $start = $conf->exists('session-start') ? $conf->config('session-start') : ''; + $stop = $conf->exists('session-stop') ? $conf->config('session-stop') : ''; +}; + =head1 NAME FS::session - Object methods for session records @@ -94,15 +101,34 @@ sub insert { $error = $self->check; return $error if $error; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + if ( qsearchs('session', { 'portnum' => $self->portnum, 'logout' => '' } ) ) { + $dbh->rollback if $oldAutoCommit; + return "a session on that port is already open!"; + } + $self->setfield('login', time()) unless $self->getfield('login'); $error = $self->SUPER::insert; - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } $self->nas_heartbeat($self->getfield('login')); - #session-starting callback! - + #session-starting callback + #redundant with heartbeat, yuck + my $port = qsearchs('port',{'portnum'=>$self->portnum}); + my $nas = qsearchs('nas',{'nasnum'=>$port->nasnum}); + #kcuy + my( $ip, $nasip, $nasfqdn ) = ( $port->ip, $nas->nasip, $nas->nasfqdn ); + system( eval qq("$start") ) if $start; + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; } @@ -124,7 +150,7 @@ it is replaced with the current time. =cut sub replace { - my $self = shift; + my($self, $old) = @_; my $error; local $SIG{HUP} = 'IGNORE'; @@ -134,17 +160,35 @@ sub replace { local $SIG{TSTP} = 'IGNORE'; local $SIG{PIPE} = 'IGNORE'; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + $error = $self->check; - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } $self->setfield('logout', time()) unless $self->getfield('logout'); - $error = $self->SUPER::replace; - return $error if $error; + $error = $self->SUPER::replace($old); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } $self->nas_heartbeat($self->getfield('logout')); - #session-ending callback! + #session-ending callback + #redundant with heartbeat, yuck + my $port = qsearchs('port',{'portnum'=>$self->portnum}); + my $nas = qsearchs('nas',{'nasnum'=>$port->nasnum}); + #kcuy + my( $ip, $nasip, $nasfqdn ) = ( $port->ip, $nas->nasip, $nas->nasfqdn ); + system( eval qq("$stop") ) if $stop; + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; } @@ -172,7 +216,7 @@ sub check { return $error if $error; return "Unknown svcnum" unless qsearchs('svc_acct', { 'svcnum' => $self->svcnum } ); - ''; + $self->SUPER::check; } =item nas_heartbeat @@ -188,15 +232,28 @@ sub nas_heartbeat { $nas->heartbeat(shift); } -=back +=item svc_acct -=head1 VERSION +Returns the svc_acct record associated with this session (see L). -$Id: session.pm,v 1.2 2000-11-07 15:00:37 ivan Exp $ +=cut + +sub svc_acct { + my $self = shift; + qsearchs('svc_acct', { 'svcnum' => $self->svcnum } ); +} + +=back =head1 BUGS -The author forgot to customize this manpage. +Maybe you shouldn't be able to insert a session if there's currently an open +session on that port. Or maybe the open session on that port should be flagged +as problematic? autoclosed? *sigh* + +Hmm, sessions refer to current svc_acct records... probably need to constrain +deletions to svc_acct records such that no svc_acct records are deleted which +have a session (even if long-closed). =head1 SEE ALSO