--- loncom/Attic/lonc 2002/02/06 14:13:19 1.24
+++ 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.24 2002/02/06 14:13:19 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)");
+ }
+
}
}
}
@@ -570,13 +620,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 +657,7 @@ while (1) {
}
}
}
-}
+
# ------------------------------------------------------- End of make_new_child
# handle($socket) deals with all pending requests for $client
@@ -614,7 +665,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 +691,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 +725,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 {