recommend HTML::Mason
[freeside.git] / FS / bin / freeside-selfservice-server
index 6cfafda..864c2d4 100644 (file)
@@ -15,7 +15,7 @@ use POSIX qw(:sys_wait_h setsid);
 use IO::Handle;
 use IO::Select;
 use IO::File;
-use Storable qw(nstore_fd fd_retrieve);
+use Storable 2.09 qw(nstore_fd fd_retrieve);
 use Net::SSH qw(sshopen2);
 use FS::UID qw(adminsuidsetup forksuidsetup);
 use FS::ClientAPI;
@@ -24,7 +24,7 @@ use FS::Conf;
 use FS::cust_bill;
 use FS::cust_pkg;
 
-$Debug = 2; # >= 2 will log packet contents, including potentially compromising
+$Debug = 1; # >= 2 will log packet contents, including potentially compromising
             # information
 
 $shutdown = 0;
@@ -33,8 +33,10 @@ $kids = 0;
 
 my $user = shift or die &usage;
 my $machine = shift or die &usage;
-my $pid_file = "/var/run/freeside-selfservice-server.$user.pid";
-#my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; $FS::UID::datasrc not posible, but should include machine name at least, hmm
+my $tag = scalar(@ARGV) ? shift : '';
+
+# $FS::UID::datasrc not posible
+my $pid_file = "/var/run/freeside-selfservice-server.$user.$machine.pid";
 
 my $lock_file = "/usr/local/etc/freeside/selfservice.$machine.writelock";
 open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!";
@@ -43,11 +45,6 @@ open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!";
 
 my $conf = new FS::Conf;
 
-if ($conf->exists('selfservice_server-quiet')) {
-    $FS::cust_bill::quiet = 1;
-    $FS::cust_pkg::quiet = 1;
-}
-
 my $clientd = "/usr/local/sbin/freeside-selfservice-clientd"; #better name?
 
 my $warnkids=0;
@@ -55,7 +52,7 @@ while (1) {
   my($writer,$reader,$error) = (new IO::Handle, new IO::Handle, new IO::Handle);
   warn "connecting to $machine\n" if $Debug;
 
-  $ssh_pid = sshopen2($machine,$reader,$writer,$clientd);
+  $ssh_pid = sshopen2($machine,$reader,$writer,$clientd,$tag);
 
 #  nstore_fd(\*writer, {'hi'=>'there'});
 
@@ -78,7 +75,18 @@ while (1) {
 
     warn "receiving packet from client\n" if $Debug;
 
-    my $packet = fd_retrieve($reader);
+    my $packet = eval { fd_retrieve($reader); };
+    if ( $@ ) {
+      warn "Storable error receiving packet from client".
+           " (assuming lost connection): $@\n"
+        if $Debug;
+      if ( $ssh_pid ) {
+        warn "sending TERM signal to ssh process $ssh_pid\n" if $Debug;
+        kill 'TERM', $ssh_pid;
+        $ssh_pid = 0;
+      }
+      last;
+    }
     warn "packet received\n".
          join('', map { " $_=>$packet->{$_}\n" } keys %$packet )
       if $Debug > 1;
@@ -124,6 +132,9 @@ while (1) {
 
   }
 
+  warn "connection lost, reconnecting\n" if $Debug;
+  sleep 3;
+
 }
 
 ###