session monitor
[freeside.git] / fs_sesmon / fs_session_server
index be0a017..46e53d1 100644 (file)
@@ -12,6 +12,8 @@ use FS::Record qw( qsearch qsearchs );
 #use FS::cust_main_county;
 #use FS::cust_main;
 use FS::session;
+use FS::port;
+use FS::svc_acct;
 
 #require "configfile";
 $Debug = 1;
@@ -42,12 +44,70 @@ while (1) {
     }
 
     if ( $command eq 'login' ) {
-
+      $error = &login(\%hash);
+      print $writer "$error\n";
     } elsif ( $command eq 'logoff' ) {
-
+      $error = &logoff(\%hash);
+      print $writer "$error\n";
     } elsif ( $command eq 'portnum' ) {
-
+      if ( exists $hash{'ip'} ) {
+        $hash{'ip'} =~ /^([\d\.]+)$/ or $1='nomatch';
+        $port = qsearchs('port', { 'ip' => $1 } );
+      } else {
+        $hash{'nasnum'} =~ /^(\d+)$/ and my $nasnum = $1;
+        $hash{'nasport'} =~ /^(\d+)$/ and my $nasport = $1;
+        $port = qsearchs('port', { 'nasnum'=>$nasnum, 'nasport'=>$nasport } );
+      }
+      print $writer ( $port ? $port->portnum : '' ), "\n";
     } else {
       warn "$me WARNING: unrecognized command";
     }
+  }
+  #won't ever reach without code above to throw out of loop, but...
+  close $writer;
+  close $reader;
+  warn "connection to $machine lost!\n"
+  sleep 5;
+  warn "reconnecting...\n";
+}
+
+sub login {
+  my $href = shift;
+  $href->{'username'} =~ /^([a-z0-9_\-\.]+)$/ or return "Illegal username";
+  my $username = $1;
+  $svc_acct = qsearchs('svc_acct', { 'username' => $username } )
+    or return "Unknown user";
+  return "Incorrect password"
+    if defined($href->{'password'})
+       && $href->{'password'} ne $svc_acct->_password;
+  my $session = new FS::session {
+    'portnum' => $href->{'portnum'},
+    'svcnum'  => $svc_acct->svcnum,
+    'login'   => $href->{'login'},
+  };
+  $session->insert;
+}
+
+sub logout {
+  my $href = shift;
+  $href->{'username'} =~ /^([a-z0-9_\-\.]+)$/ or return "Illegal username";
+  my $username = $1;
+  $svc_acct = qsearchs('svc_acct', { 'username' => $username } )
+    or return "Unknown user";
+  return "Incorrect password"
+    if defined($href->{'password'})
+       && $href->{'password'} ne $svc_acct->_password;
+  my $session = qsearchs FS::session {
+    'portnum' => $href->{'portnum'},
+    'svcnum'  => $svc_acct->svcnum,
+    'logoff'  => '',
+  };
+  return "No currently open sessios found for that user/port!" unless $session;
+  my $nsession = new FS::session ( { $old->hash } );
+  $nsession->replace($session);
+}
+
+sub usage {
+  die "Usage:\n\n  fs_session_server user machine\n";
+}