version 1.163, 2003/11/17 09:32:17
|
version 1.165.2.3, 2004/03/08 20:13:07
|
Line 513 sub catchexception {
|
Line 513 sub catchexception {
|
my ($error)=@_; |
my ($error)=@_; |
$SIG{'QUIT'}='DEFAULT'; |
$SIG{'QUIT'}='DEFAULT'; |
$SIG{__DIE__}='DEFAULT'; |
$SIG{__DIE__}='DEFAULT'; |
|
&status("Catching exception"); |
&logthis("<font color=red>CRITICAL: " |
&logthis("<font color=red>CRITICAL: " |
."ABNORMAL EXIT. Child $$ for server $thisserver died through " |
."ABNORMAL EXIT. Child $$ for server $thisserver died through " |
."a crash with this error msg->[$error]</font>"); |
."a crash with this error msg->[$error]</font>"); |
Line 523 sub catchexception {
|
Line 524 sub catchexception {
|
} |
} |
|
|
sub timeout { |
sub timeout { |
|
&status("Handling Timeout"); |
&logthis("<font color=ref>CRITICAL: TIME OUT ".$$."</font>"); |
&logthis("<font color=ref>CRITICAL: TIME OUT ".$$."</font>"); |
&catchexception('Timeout'); |
&catchexception('Timeout'); |
} |
} |
Line 575 $server = IO::Socket::INET->new(LocalPor
|
Line 577 $server = IO::Socket::INET->new(LocalPor
|
# global variables |
# global variables |
|
|
my %children = (); # keys are current child process IDs |
my %children = (); # keys are current child process IDs |
my $children = 0; # current number of children |
|
|
|
sub REAPER { # takes care of dead children |
sub REAPER { # takes care of dead children |
$SIG{CHLD} = \&REAPER; |
$SIG{CHLD} = \&REAPER; |
my $pid = wait; |
&status("Handling child death"); |
if (defined($children{$pid})) { |
my $pid; |
&logthis("Child $pid died"); |
do { |
$children --; |
$pid = waitpid(-1,&WNOHANG()); |
delete $children{$pid}; |
if (defined($children{$pid})) { |
} else { |
&logthis("Child $pid died"); |
&logthis("Unknown Child $pid died"); |
delete($children{$pid}); |
|
} else { |
|
&logthis("Unknown Child $pid died"); |
|
} |
|
} while ( $pid > 0 ); |
|
foreach my $child (keys(%children)) { |
|
$pid = waitpid($child,&WNOHANG()); |
|
if ($pid > 0) { |
|
&logthis("Child $child - $pid looks like we missed it's death"); |
|
delete($children{$pid}); |
|
} |
} |
} |
|
&status("Finished Handling child death"); |
} |
} |
|
|
sub HUNTSMAN { # signal handler for SIGINT |
sub HUNTSMAN { # signal handler for SIGINT |
|
&status("Killing children (INT)"); |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
kill 'INT' => keys %children; |
kill 'INT' => keys %children; |
&logthis("Free socket: ".shutdown($server,2)); # free up socket |
&logthis("Free socket: ".shutdown($server,2)); # free up socket |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
unlink("$execdir/logs/lond.pid"); |
unlink("$execdir/logs/lond.pid"); |
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
|
&status("Done killing children"); |
exit; # clean up with dignity |
exit; # clean up with dignity |
} |
} |
|
|
sub HUPSMAN { # signal handler for SIGHUP |
sub HUPSMAN { # signal handler for SIGHUP |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
&status("Killing children for restart (HUP)"); |
kill 'INT' => keys %children; |
kill 'INT' => keys %children; |
&logthis("Free socket: ".shutdown($server,2)); # free up socket |
&logthis("Free socket: ".shutdown($server,2)); # free up socket |
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
unlink("$execdir/logs/lond.pid"); |
unlink("$execdir/logs/lond.pid"); |
|
&status("Restarting self (HUP)"); |
exec("$execdir/lond"); # here we go again |
exec("$execdir/lond"); # here we go again |
} |
} |
|
|
Line 636 sub ReadHostTable {
|
Line 652 sub ReadHostTable {
|
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file"; |
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file"; |
|
|
while (my $configline=<CONFIG>) { |
while (my $configline=<CONFIG>) { |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
if (!($configline =~ /^\s*\#/)) { |
chomp($ip); $ip=~s/\D+$//; |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
$hostid{$ip}=$id; |
chomp($ip); $ip=~s/\D+$//; |
$hostdom{$id}=$domain; |
$hostid{$ip}=$id; |
$hostip{$id}=$ip; |
$hostdom{$id}=$domain; |
if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; } |
$hostip{$id}=$ip; |
|
if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; } |
|
} |
} |
} |
close(CONFIG); |
close(CONFIG); |
} |
} |
Line 667 sub ReloadApache {
|
Line 685 sub ReloadApache {
|
# now be honored. |
# now be honored. |
# |
# |
sub UpdateHosts { |
sub UpdateHosts { |
|
&status("Reload hosts.tab"); |
logthis('<font color="blue"> Updating connections </font>'); |
logthis('<font color="blue"> Updating connections </font>'); |
# |
# |
# The %children hash has the set of IP's we currently have children |
# The %children hash has the set of IP's we currently have children |
Line 691 sub UpdateHosts {
|
Line 710 sub UpdateHosts {
|
} |
} |
} |
} |
ReloadApache; |
ReloadApache; |
|
&status("Finished reloading hosts.tab"); |
} |
} |
|
|
|
|
sub checkchildren { |
sub checkchildren { |
|
&status("Checking on the children (sending signals)"); |
&initnewstatus(); |
&initnewstatus(); |
&logstatus(); |
&logstatus(); |
&logthis('Going to check on the children'); |
&logthis('Going to check on the children'); |
Line 709 sub checkchildren {
|
Line 730 sub checkchildren {
|
sleep 5; |
sleep 5; |
$SIG{ALRM} = sub { die "timeout" }; |
$SIG{ALRM} = sub { die "timeout" }; |
$SIG{__DIE__} = 'DEFAULT'; |
$SIG{__DIE__} = 'DEFAULT'; |
|
&status("Checking on the children (waiting for reports)"); |
foreach (sort keys %children) { |
foreach (sort keys %children) { |
unless (-e "$docdir/lon-status/londchld/$_.txt") { |
unless (-e "$docdir/lon-status/londchld/$_.txt") { |
eval { |
eval { |
Line 726 sub checkchildren {
|
Line 748 sub checkchildren {
|
} |
} |
$SIG{ALRM} = 'DEFAULT'; |
$SIG{ALRM} = 'DEFAULT'; |
$SIG{__DIE__} = \&catchexception; |
$SIG{__DIE__} = \&catchexception; |
|
&status("Finished checking children"); |
} |
} |
|
|
# --------------------------------------------------------------------- Logging |
# --------------------------------------------------------------------- Logging |
Line 768 sub Reply {
|
Line 791 sub Reply {
|
# ------------------------------------------------------------------ Log status |
# ------------------------------------------------------------------ Log status |
|
|
sub logstatus { |
sub logstatus { |
|
&status("Doing logging"); |
my $docdir=$perlvar{'lonDocRoot'}; |
my $docdir=$perlvar{'lonDocRoot'}; |
{ |
{ |
my $fh=IO::File->new(">>$docdir/lon-status/londstatus.txt"); |
my $fh=IO::File->new(">>$docdir/lon-status/londstatus.txt"); |
print $fh $$."\t".$currenthostid."\t".$status."\t".$lastlog."\n"; |
print $fh $$."\t".$clientname."\t".$currenthostid."\t".$status."\t".$lastlog."\n"; |
$fh->close(); |
$fh->close(); |
} |
} |
|
&status("Finished londstatus.txt"); |
{ |
{ |
my $fh=IO::File->new(">$docdir/lon-status/londchld/$$.txt"); |
my $fh=IO::File->new(">$docdir/lon-status/londchld/$$.txt"); |
print $fh $status."\n".$lastlog."\n".time; |
print $fh $status."\n".$lastlog."\n".time; |
$fh->close(); |
$fh->close(); |
} |
} |
|
&status("Finished logging"); |
} |
} |
|
|
sub initnewstatus { |
sub initnewstatus { |
Line 966 ReadHostTable;
|
Line 992 ReadHostTable;
|
# along the connection. |
# along the connection. |
|
|
while (1) { |
while (1) { |
|
&status('Starting accept'); |
$client = $server->accept() or next; |
$client = $server->accept() or next; |
|
&status('Accepted '.$client.' off to spawn'); |
make_new_child($client); |
make_new_child($client); |
|
&status('Finished spawning'); |
} |
} |
|
|
sub make_new_child { |
sub make_new_child { |
Line 976 sub make_new_child {
|
Line 1005 sub make_new_child {
|
my $sigset; |
my $sigset; |
|
|
$client = shift; |
$client = shift; |
|
&status('Starting new child '.$client); |
&logthis('<font color="green"> Attempting to start child ('.$client. |
&logthis('<font color="green"> Attempting to start child ('.$client. |
")</font>"); |
")</font>"); |
# block signal for fork |
# block signal for fork |
Line 1001 sub make_new_child {
|
Line 1031 sub make_new_child {
|
sigprocmask(SIG_UNBLOCK, $sigset) |
sigprocmask(SIG_UNBLOCK, $sigset) |
or die "Can't unblock SIGINT for fork: $!\n"; |
or die "Can't unblock SIGINT for fork: $!\n"; |
$children{$pid} = $clientip; |
$children{$pid} = $clientip; |
$children++; |
|
&status('Started child '.$pid); |
&status('Started child '.$pid); |
return; |
return; |
} else { |
} else { |
Line 1419 sub make_new_child {
|
Line 1448 sub make_new_child {
|
unless (mkdir($fpnow,0777)) { |
unless (mkdir($fpnow,0777)) { |
$fperror="error: ".($!+0) |
$fperror="error: ".($!+0) |
." mkdir failed while attempting " |
." mkdir failed while attempting " |
."makeuser\n"; |
."makeuser"; |
} |
} |
} |
} |
} |
} |
Line 2500 sub make_new_child {
|
Line 2529 sub make_new_child {
|
&logthis( |
&logthis( |
"Client $clientip ($clientname) hanging up: $userinput"); |
"Client $clientip ($clientname) hanging up: $userinput"); |
print $client "bye\n"; |
print $client "bye\n"; |
|
$client->shutdown(2); # shutdown the socket forcibly. |
$client->close(); |
$client->close(); |
last; |
last; |
|
|