7 use vars qw( $opt $Debug );
9 use Net::SSH qw(sshopen2);
10 use FS::UID qw(adminsuidsetup dbh);
11 use FS::Record qw( qsearchs ); #qsearch );
12 #use FS::cust_main_county;
18 #require "configfile";
21 my $user = shift or die &usage;
22 &adminsuidsetup( $user );
24 my $machine = shift or die &usage;
26 my $fs_sessiond = "/usr/local/sbin/fs_sessiond";
28 my $me = "[fs_session_server]";
31 my($reader, $writer) = (new IO::Handle, new IO::Handle);
32 $writer->autoflush(1);
33 warn "$me Connecting to $machine\n" if $Debug;
34 sshopen2($machine,$reader,$writer,$fs_sessiond);
36 warn "$me Entering main loop\n" if $Debug;
38 warn "$me Reading (waiting for) data\n" if $Debug;
39 my $command = scalar(<$reader>);
41 #DoS protection here too, to protect against a compromised client? *sigh*
43 while ( ( my $key = scalar(<$reader>) ) ne "END\n" ) {
45 chomp( $hash{$key} = scalar(<$reader>) );
48 if ( $command eq 'login' ) {
49 my $error = &login(\%hash);
50 print $writer "$error\n";
51 } elsif ( $command eq 'logout' ) {
52 my $error = &logout(\%hash);
53 print $writer "$error\n";
54 } elsif ( $command eq 'portnum' ) {
56 if ( exists $hash{'ip'} ) {
57 $hash{'ip'} =~ /^([\d\.]+)$/ or $1='nomatch';
58 $port = qsearchs('port', { 'ip' => $1 } );
60 $hash{'nasnum'} =~ /^(\d+)$/ and my $nasnum = $1;
61 $hash{'nasport'} =~ /^(\d+)$/ and my $nasport = $1;
62 $port = qsearchs('port', { 'nasnum'=>$nasnum, 'nasport'=>$nasport } );
64 print $writer ( $port ? $port->portnum : '' ), "\n";
66 warn "$me WARNING: unrecognized command: $command";
69 #won't ever reach without code above to throw out of loop, but...
72 warn "connection to $machine lost!\n";
74 warn "reconnecting...\n";
79 $href->{'username'} =~ /^([a-z0-9_\-\.]+)$/ or return "Illegal username";
81 my $svc_acct = qsearchs('svc_acct', { 'username' => $username } )
82 or return "Unknown user";
83 return "Incorrect password"
84 if exists($href->{'password'})
85 && $href->{'password'} ne $svc_acct->_password;
86 return "Time limit exceeded" unless $svc_acct->seconds;
87 my $session = new FS::session {
88 'portnum' => $href->{'portnum'},
89 'svcnum' => $svc_acct->svcnum,
90 'login' => $href->{'login'},
97 $href->{'username'} =~ /^([a-z0-9_\-\.]+)$/ or return "Illegal username";
99 local $FS::UID::AutoCommit = 0;
102 qsearchs('svc_acct', { 'username' => $username }, '', 'FOR UPDATE' )
103 or return "Unknown user";
104 return "Incorrect password"
105 if exists($href->{'password'})
106 && $href->{'password'} ne $svc_acct->_password;
107 my $session = qsearchs( 'session', {
108 'portnum' => $href->{'portnum'},
109 'svcnum' => $svc_acct->svcnum,
114 unless ( $session ) {
116 return "No currently open sessions found for that user/port!";
118 my $nsession = new FS::session ( { $session->hash } );
119 warn "$nsession replacing $session";
120 my $error = $nsession->replace($session);
123 return "can't logout: $error";
125 my $time = $nsession->logout - $nsession->login;
126 my $new_svc_acct = new FS::svc_acct ( { $svc_acct->hash } );
127 my $seconds = $new_svc_acct->seconds;
129 $seconds = 0 if $seconds < 0;
130 $new_svc_acct->seconds( $seconds );
131 $error = $new_svc_acct->replace( $svc_acct );
132 warn "can't debit time: $error\n"; #don't want to rollback, though
133 $dbh->commit or die $dbh->errstr;
138 die "Usage:\n\n fs_session_server user machine\n";