--- loncom/Attic/lonc	2002/02/06 14:17:50	1.23.2.1
+++ loncom/Attic/lonc	2002/02/19 22:51:13	1.28
@@ -5,7 +5,7 @@
 # provides persistent TCP connections to the other servers in the network
 # through multiplexed domain sockets
 #
-# $Id: lonc,v 1.23.2.1 2002/02/06 14:17:50 albertel Exp $
+# $Id: lonc,v 1.28 2002/02/19 22:51:13 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,6 +43,8 @@
 # 01/10/01 Scott Harrison
 # 03/14/01,03/15,06/12,11/26,11/27,11/28 Gerd Kortemeyer
 # 12/20 Scott Harrison
+# YEAR=2002
+# 2/19/02
 # 
 # based on nonforker from Perl Cookbook
 # - server who multiplexes without forking
@@ -55,6 +57,8 @@ use Socket;
 use Fcntl;
 use Tie::RefHash;
 use Crypt::IDEA;
+use Net::Ping;
+use LWP::UserAgent();
 
 my $status='';
 my $lastlog='';
@@ -72,9 +76,47 @@ sub catchexception {
 
 $childmaxattempts=5;
 
+# -------------------------------------- Routines to see if other box available
+
+sub online {
+    my $host=shift;
+    my $p=Net::Ping->new("tcp",20);
+    my $online=$p->ping("$host");
+    $p->close();
+    undef ($p);
+    return $online;
+}
+
+sub connected {
+    my ($local,$remote)=@_;
+    $local=~s/\W//g;
+    $remote=~s/\W//g;
+
+    unless ($hostname{$local}) { return 'local_unknown'; }
+    unless ($hostname{$remote}) { return 'remote_unknown'; }
+
+    unless (&online($hostname{$local})) { return 'local_offline'; }
+
+    my $ua=new LWP::UserAgent;
+    
+    my $request=new HTTP::Request('GET',
+      "http://".$hostname{$local}.'/cgi-bin/ping.pl?'.$remote);
+
+    my $response=$ua->request($request);
+
+    unless ($response->is_success) { return 'local_error'; }
+
+    my $reply=$response->content;
+    $reply=(split("\n",$reply))[0];
+    $reply=~s/\W//g;
+    if ($reply ne $remote) { return $reply; }
+    return 'ok';
+}
+
+
 # -------------------------------- Set signal handlers to record abnormal exits
 
-$SIG{'QUIT'}=\&catchexception;
+$SIG{QUIT}=\&catchexception;
 $SIG{__DIE__}=\&catchexception;
 
 # ------------------------------------ Read httpd access.conf and get variables
@@ -118,8 +160,12 @@ open (CONFIG,"$perlvar{'lonTabDir'}/host
 while ($configline=<CONFIG>) {
     my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
     chomp($ip);
-    $hostip{$id}=$ip;
+    if ($ip) {
+     $hostip{$id}=$ip;
+     $hostname{$id}=$name;
+    }
 }
+
 close(CONFIG);
 
 # -------------------------------------------------------- Routines for forking
@@ -143,8 +189,7 @@ sub REAPER {                        # ta
     unlink($port);
 }
 
-sub HUNTSMAN {                      # signal handler for SIGINT
-    local($SIG{CHLD}) = 'IGNORE';   # we're going to kill our children
+sub hangup {
     foreach (keys %children) {
         $wasserver=$children{$_};
         &status("Closing $wasserver");
@@ -152,6 +197,11 @@ sub HUNTSMAN {                      # si
         &status("Kill PID $_ for $wasserver");
 	kill ('INT',$_);
     }
+}
+
+sub HUNTSMAN {                      # signal handler for SIGINT
+    local($SIG{CHLD}) = 'IGNORE';   # we're going to kill our children
+    &hangup();
     my $execdir=$perlvar{'lonDaemons'};
     unlink("$execdir/logs/lonc.pid");
     &logthis("<font color=red>CRITICAL: Shutting down</font>");
@@ -160,13 +210,7 @@ sub HUNTSMAN {                      # si
 
 sub HUPSMAN {                      # signal handler for SIGHUP
     local($SIG{CHLD}) = 'IGNORE';  # we're going to kill our children
-    foreach (keys %children) {
-        $wasserver=$children{$_};
-        &status("Closing $wasserver");
-        &logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver));
-        &status("Kill PID $_ for $wasserver");
-	kill ('INT',$_);
-    }
+    &hangup();
     &logthis("<font color=red>CRITICAL: Restarting</font>");
     unlink("$execdir/logs/lonc.pid");
     my $execdir=$perlvar{'lonDaemons'};
@@ -188,12 +232,6 @@ sub checkchildren {
 
 sub USRMAN {
     &logthis("USR1: Trying to establish connections again");
-    foreach $thisserver (keys %hostip) {
-	$answer=subreply("ping",$thisserver);
-        &logthis("USR1: Ping $thisserver "
-        ."(pid >$childpid{$thisserver}<, $childatt{thisserver} attempts): "
-        ." >$answer<");
-    }
     %childatt=();
     &checkchildren();
 }
@@ -298,7 +336,9 @@ $SIG{HUP}=$SIG{USR1}='IGNORE';
 &status("Forking ...");
 
 foreach $thisserver (keys %hostip) {
-    make_new_child($thisserver);
+    if (&online($hostname{$thisserver})) {
+       make_new_child($thisserver);
+    }
 }
 
 &logthis("Done starting initial servers");
@@ -317,13 +357,19 @@ while (1) {
     &status("Woke up");
     foreach $thisserver (keys %hostip) {
         if (!$childpid{$thisserver}) {
-	    if ($childatt{$thisserver}<$childmaxattempts) {
+	    if (($childatt{$thisserver}<$childmaxattempts) &&
+                (&online($hostname{$thisserver}))) {
 	       $childatt{$thisserver}++;
                &logthis(
    "<font color=yellow>INFO: Trying to reconnect for $thisserver "
   ."($childatt{$thisserver} of $childmaxattempts attempts)</font>"); 
                make_new_child($thisserver);
-	    }
+	   } else {
+               &logthis(
+   "<font color=yellow>INFO: Skipping $thisserver "
+  ."($childatt{$thisserver} of $childmaxattempts attempts)</font>");
+           } 
+               
         }       
     }
 }
@@ -570,13 +616,14 @@ while (1) {
 
     # Any complete requests to process?
     foreach $client (keys %ready) {
-	handle($client,$conserver);
+        handle($client);
     }
 
     # Buffers to flush?
     foreach $client ($select->can_write(1)) {
         # Skip this client if we have nothing to say
         next unless exists $outbuffer{$client};
+
         $rv = $client->send($outbuffer{$client}, 0);
         unless (defined $rv) {
             # Whine, but move on.
@@ -606,7 +653,7 @@ while (1) {
     }
 }
 }
-}
+
 # ------------------------------------------------------- End of make_new_child
 
 # handle($socket) deals with all pending requests for $client
@@ -614,7 +661,6 @@ sub handle {
     # requests are in $ready{$client}
     # send output to $outbuffer{$client}
     my $client = shift;
-    my $conserver = shift;
     my $request;
 
     foreach $request (@{$ready{$client}}) {
@@ -641,13 +687,10 @@ sub handle {
     eval {
         alarm(300);
         &status("Sending $conserver: $request");
-        &logthis("Sending $conserver: $request");
         print $remotesock "$request";
         &status("Waiting for reply from $conserver: $request");
-        &logthis("Waiting for reply from $conserver: $request");
         $answer=<$remotesock>;
         &status("Received reply: $request");
-        &logthis("Received reply $conserver: $answer");
         alarm(0);
     };
     if ($@=~/timeout/) { 
@@ -678,13 +721,13 @@ sub handle {
         }
 
 # ===================================================== Done processing request
-	&logthis("Completed $conserver: $request");
     }
     delete $ready{$client};
     &status("Completed $conserver: $request");
 # -------------------------------------------------------------- End non-forker
 }
 # ---------------------------------------------------------- End make_new_child
+}
 
 # nonblock($socket) puts socket into nonblocking mode
 sub nonblock {