--- 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)"); + } + } } }