--- loncom/Attic/lonc 2002/05/11 21:17:39 1.40
+++ loncom/Attic/lonc 2003/03/27 23:00:28 1.49
@@ -5,7 +5,7 @@
# provides persistent TCP connections to the other servers in the network
# through multiplexed domain sockets
#
-# $Id: lonc,v 1.40 2002/05/11 21:17:39 harris41 Exp $
+# $Id: lonc,v 1.49 2003/03/27 23:00:28 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,18 +37,14 @@
# 6/4/99,6/5,6/7,6/8,6/9,6/10,6/11,6/12,7/14,7/19,
# 10/8,10/9,10/15,11/18,12/22,
# 2/8,7/25 Gerd Kortemeyer
-# 12/05 Scott Harrison
# 12/05 Gerd Kortemeyer
# YEAR=2001
-# 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,02/22/02,02/25/02 Gerd Kortemeyer
# 3/07/02 Ron Fox
# based on nonforker from Perl Cookbook
# - server who multiplexes without forking
-# 5/11/2002 Scott Harrison
use lib '/home/httpd/lib/perl/';
use LONCAPA::Configuration;
@@ -68,16 +64,17 @@ $status='';
$lastlog='';
$conserver='SHELL';
$DEBUG = 0; # Set to 1 for annoyingly complete logs.
-
+$VERSION='$Revison$'; #' stupid emacs
+$remoteVERSION;
# -------------------------------- Set signal handlers to record abnormal exits
&status("Init exception handlers");
$SIG{QUIT}=\&catchexception;
$SIG{__DIE__}=\&catchexception;
-# ------------------------------------------- Read access.conf and loncapa.conf
-&status("Read access.conf and loncapa.conf");
-my $perlvarref=LONCAPA::Configuration::read_conf('access.conf','loncapa.conf');
+# ---------------------------------- Read loncapa_apache.conf and loncapa.conf
+&status("Read loncapa.conf and loncapa_apache.conf");
+my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
my %perlvar=%{$perlvarref};
undef $perlvarref;
@@ -259,7 +256,7 @@ unlink($port);
@allbuffered=grep /\.$conserver$/, readdir DIRHANDLE;
closedir(DIRHANDLE);
my $dfname;
- foreach (@allbuffered) {
+ foreach (sort @allbuffered) {
&status("Sending delayed: $_");
$dfname="$path/$_";
if($DEBUG) { &logthis('Sending '.$dfname); }
@@ -329,7 +326,7 @@ tie %ready, 'Tie::RefHash';
# Main loop: check reads/accepts, check writes, check ready to process
-status("Main loop");
+status("Main loop $conserver");
while (1) {
my $client;
my $rv;
@@ -369,6 +366,8 @@ while (1) {
}
$servers{$client->fileno} = $client;
nonblock($client);
+ $client->sockopt(SO_KEEPALIVE, 1);# Enable monitoring of
+ # connection liveness.
}
HandleInput($infdset, \%servers, \%inbuffer, \%outbuffer, \%ready);
HandleOutput($outfdset, \%servers, \%outbuffer, \%inbuffer,
@@ -704,75 +703,89 @@ sub openremote {
my $conserver=shift;
-&status("Opening TCP");
+ &status("Opening TCP $conserver");
my $st=120+int(rand(240)); # Sleep before opening:
-unless (
- $remotesock = IO::Socket::INET->new(PeerAddr => $hostip{$conserver},
- PeerPort => $perlvar{'londPort'},
- Proto => "tcp",
- Type => SOCK_STREAM)
- ) {
-
- &logthis(
-"WARNING: Couldn't connect to $conserver ($st secs): ");
- sleep($st);
- exit;
- };
+ unless (
+ $remotesock = IO::Socket::INET->new(PeerAddr => $hostip{$conserver},
+ PeerPort => $perlvar{'londPort'},
+ Proto => "tcp",
+ Type => SOCK_STREAM)
+ ) {
+
+ &logthis(
+ "WARNING: Couldn't connect to $conserver ($st secs): ");
+ sleep($st);
+ exit;
+ };
# ----------------------------------------------------------------- Init dialog
-&logthis("INFO Connected to $conserver, initing ");
-&status("Init dialogue: $conserver");
+ &logthis("INFO Connected to $conserver, initing");
+ &status("Init dialogue: $conserver");
$answer = londtransaction($remotesock, "init", 60);
chomp($answer);
$answer = londtransaction($remotesock, $answer, 60);
chomp($answer);
-
- if ($@=~/timeout/) {
- &logthis("Timed out during init.. exiting");
- exit;
- }
-if ($answer ne 'ok') {
- &logthis("Init reply: >$answer<");
- my $st=120+int(rand(240));
- &logthis(
-"WARNING: Init failed ($st secs)");
- sleep($st);
- exit;
-}
+ if ($@=~/timeout/) {
+ &logthis("Timed out during init.. exiting");
+ exit;
+ }
-sleep 5;
-&status("Ponging");
-print $remotesock "pong\n";
-$answer=<$remotesock>;
-chomp($answer);
-if ($answer!~/^$conserver/) {
- &logthis("Pong reply: >$answer<");
-}
+ if ($answer ne 'ok') {
+ &logthis("Init reply: >$answer<");
+ my $st=120+int(rand(240));
+ &logthis("WARNING: Init failed ($st secs)");
+ sleep($st);
+ exit;
+ }
+
+ $answer = londtransaction($remotesock,"sethost:$conserver",60);
+ chomp($answer);
+ if ( $answer ne 'ok') {
+ &logthis('WARNING: unable to specify remote host'.
+ $answer.'');
+ }
+
+ $answer = londtransaction($remotesock,"version:$VERSION",60);
+ chomp($answer);
+ if ($answer =~ /^version:/) {
+ $remoteVERSION=(split(/:/,$answer))[1];
+ } else {
+ &logthis('WARNING: request remote version failed :'.
+ $answer.': my version is :'.$VERSION.':');
+ }
+
+ sleep 5;
+ &status("Ponging $conserver");
+ print $remotesock "pong\n";
+ $answer=<$remotesock>;
+ chomp($answer);
+ if ($answer!~/^$conserver/) {
+ &logthis("Pong reply: >$answer<");
+ }
# ----------------------------------------------------------- Initialize cipher
-&status("Initialize cipher");
-print $remotesock "ekey\n";
-my $buildkey=<$remotesock>;
-my $key=$conserver.$perlvar{'lonHostID'};
-$key=~tr/a-z/A-Z/;
-$key=~tr/G-P/0-9/;
-$key=~tr/Q-Z/0-9/;
-$key=$key.$buildkey.$key.$buildkey.$key.$buildkey;
-$key=substr($key,0,32);
-my $cipherkey=pack("H32",$key);
-if ($cipher=new IDEA $cipherkey) {
- &logthis("Secure connection initialized");
-} else {
- my $st=120+int(rand(240));
- &logthis(
- "WARNING: ".
- "Could not establish secure connection ($st secs)!");
- sleep($st);
- exit;
-}
+ &status("Initialize cipher");
+ print $remotesock "ekey\n";
+ my $buildkey=<$remotesock>;
+ my $key=$conserver.$perlvar{'lonHostID'};
+ $key=~tr/a-z/A-Z/;
+ $key=~tr/G-P/0-9/;
+ $key=~tr/Q-Z/0-9/;
+ $key=$key.$buildkey.$key.$buildkey.$key.$buildkey;
+ $key=substr($key,0,32);
+ my $cipherkey=pack("H32",$key);
+ if ($cipher=new IDEA $cipherkey) {
+ &logthis("Secure connection initialized");
+ } else {
+ my $st=120+int(rand(240));
+ &logthis("WARNING: ".
+ "Could not establish secure connection ($st secs)!");
+ sleep($st);
+ exit;
+ }
&logthis(" Remote open success ");
}
@@ -977,12 +990,12 @@ sub londtransaction {
alarm(0);
};
} else {
- if($DEBUG) {
- &logthis("Timeout on send in londtransaction");
- }
+ &logthis("lonc - suiciding on send Timeout");
+ die("lonc - suiciding on send Timeout");
}
- if( ($@ =~ /timeout/) && ($DEBUG)) {
- &logthis("Timeout on receive in londtransaction");
+ if ($@ =~ /timeout/) {
+ &logthis("lonc - suiciding on read Timeout");
+ die("lonc - suiciding on read Timeout");
}
#
# Restore the initial sigmask set.
@@ -1037,6 +1050,7 @@ sub status {
my $now=time;
my $local=localtime($now);
$status=$local.': '.$what;
+ $0='lonc: '.$what.' '.$local;
}