--- loncom/Attic/lonc 2000/02/08 17:34:24 1.5
+++ loncom/Attic/lonc 2001/01/10 17:53:51 1.13
@@ -12,7 +12,10 @@
# 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 Gerd Kortemeyer
+# 2/8,7/25 Gerd Kortemeyer
+# 12/05 Scott Harrison
+# 12/05 Gerd Kortemeyer
+#
# based on nonforker from Perl Cookbook
# - server who multiplexes without forking
@@ -25,8 +28,24 @@ use Fcntl;
use Tie::RefHash;
use Crypt::IDEA;
+# grabs exception and records it to log before exiting
+sub catchexception {
+ my ($signal)=@_;
+ $SIG{'QUIT'}='DEFAULT';
+ $SIG{__DIE__}='DEFAULT';
+ &logthis("CRITICAL: "
+ ."ABNORMAL EXIT. Child $$ for server $wasserver died through "
+ ."\"$signal\" with this parameter->[$@]");
+ die($@);
+}
+
$childmaxattempts=10;
+# -------------------------------- Set signal handlers to record abnormal exits
+
+$SIG{'QUIT'}=\&catchexception;
+$SIG{__DIE__}=\&catchexception;
+
# ------------------------------------ Read httpd access.conf and get variables
open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf";
@@ -40,6 +59,27 @@ while ($configline=) {
}
close(CONFIG);
+# ----------------------------- Make sure this process is running from user=www
+my $wwwid=getpwnam('www');
+if ($wwwid!=$<) {
+ $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";
+ $subj="LON: $perlvar{'lonHostID'} User ID mismatch";
+ system("echo 'User ID mismatch. loncron must be run as user www.' |\
+ mailto $emailto -s '$subj' > /dev/null");
+ exit 1;
+}
+
+# --------------------------------------------- Check if other instance running
+
+my $pidfile="$perlvar{'lonDaemons'}/logs/lonc.pid";
+
+if (-e $pidfile) {
+ my $lfh=IO::File->new("$pidfile");
+ my $pide=<$lfh>;
+ chomp($pide);
+ if (kill 0 => $pide) { die "already running"; }
+}
+
# ------------------------------------------------------------- Read hosts file
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file";
@@ -64,8 +104,8 @@ sub REAPER { # ta
$SIG{CHLD} = \&REAPER;
my $pid = wait;
my $wasserver=$children{$pid};
- &logthis(
- "CRITICAL: Child $pid for server $wasserver died");
+ &logthis("CRITICAL: "
+ ."Child $pid for server $wasserver died ($childatt{$wasserver})");
delete $children{$pid};
delete $childpid{$wasserver};
my $port = "$perlvar{'lonSockDir'}/$wasserver";
@@ -85,18 +125,20 @@ sub HUPSMAN { # sig
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children
kill 'INT' => keys %children;
&logthis("CRITICAL: Restarting");
+ unlink("$execdir/logs/lonc.pid");
my $execdir=$perlvar{'lonDaemons'};
exec("$execdir/lonc"); # here we go again
}
sub USRMAN {
- %childatt=();
&logthis("USR1: Trying to establish connections again");
foreach $thisserver (keys %hostip) {
$answer=subreply("ping",$thisserver);
- &logthis(
- "USR1: Ping $thisserver (pid >$childpid{$thisserver}<): >$answer<");
+ &logthis("USR1: Ping $thisserver "
+ ."(pid >$childpid{$thisserver}<, $childatt{thisserver} attempts): "
+ ." >$answer<");
}
+ %childatt=();
}
# -------------------------------------------------- Non-critical communication
@@ -178,13 +220,12 @@ while (1) {
# See who died and start new one
foreach $thisserver (keys %hostip) {
if (!$childpid{$thisserver}) {
- if ($childatt{$thisserver}<=$childmaxattempt) {
- my $ainfoatt=1*$childatt{$thisserver};
+ if ($childatt{$thisserver}<=$childmaxattempts) {
+ $childatt{$thisserver}++;
&logthis(
"INFO: Trying to reconnect for $thisserver "
- ."($ainfoatt of $childmaxattempts attempts)");
+ ."($childatt{$thisserver} of $childmaxattempts attempts)");
make_new_child($thisserver);
- $childatt{$thisserver}++;
}
}
}
@@ -261,7 +302,7 @@ $key=$key.$buildkey.$key.$buildkey.$key.
$key=substr($key,0,32);
my $cipherkey=pack("H32",$key);
if ($cipher=new IDEA $cipherkey) {
- &logthis("Secure connection inititalized: $conserver");
+ &logthis("Secure connection initialized: $conserver");
} else {
my $st=120+int(rand(240));
&logthis(
@@ -489,7 +530,3 @@ sub nonblock {
or die "Can't make socket nonblocking: $!\n";
}
-
-
-
-