--- loncom/Attic/lonc 2002/02/06 14:15:37 1.25
+++ loncom/Attic/lonc 2002/02/19 21:12:22 1.26
@@ -5,7 +5,7 @@
# provides persistent TCP connections to the other servers in the network
# through multiplexed domain sockets
#
-# $Id: lonc,v 1.25 2002/02/06 14:15:37 albertel Exp $
+# $Id: lonc,v 1.26 2002/02/19 21:12:22 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",10);
+ 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
@@ -298,7 +340,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 +361,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(
"INFO: Trying to reconnect for $thisserver "
."($childatt{$thisserver} of $childmaxattempts attempts)");
make_new_child($thisserver);
- }
+ } else {
+ &logthis(
+ "INFO: Skipping $thisserver "
+ ."($childatt{$thisserver} of $childmaxattempts attempts)");
+ }
+
}
}
}