version 1.161, 2003/11/11 12:39:14
|
version 1.165.2.3, 2004/03/08 20:13:07
|
Line 205 sub ReadManagerTable {
|
Line 205 sub ReadManagerTable {
|
sub ValidManager { |
sub ValidManager { |
my $certificate = shift; |
my $certificate = shift; |
|
|
ReadManagerTable; |
return isManager; |
|
|
my $hostname = $hostid{$certificate}; |
|
|
|
|
|
if ($hostname ne undef) { |
|
if($managers{$hostname} ne undef) { |
|
&logthis('<font color="yellow">Authenticating manager'. |
|
" $hostname</font>"); |
|
return 1; |
|
} else { |
|
&logthis('<font color="red" failed manager authentication '. |
|
$hostname." is not a valid manager host</font>"); |
|
return 0; |
|
} |
|
} else { |
|
&logthis('<font color="red"> Failed manager authentication '. |
|
"$certificate </font>"); |
|
return 0; |
|
} |
|
} |
} |
# |
# |
# CopyFile: Called as part of the process of installing a |
# CopyFile: Called as part of the process of installing a |
Line 532 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 542 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 594 $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 655 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 686 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 710 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 728 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 745 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 787 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 985 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 995 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 1020 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 1438 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 1707 sub make_new_child {
|
Line 1717 sub make_new_child {
|
Reply($client, "refused\n", $userinput); |
Reply($client, "refused\n", $userinput); |
|
|
} |
} |
|
# ------------------------------------------------------------------- inc |
|
} elsif ($userinput =~ /^inc:/) { |
|
if(isClient) { |
|
my ($cmd,$udom,$uname,$namespace,$what) |
|
=split(/:/,$userinput); |
|
$namespace=~s/\//\_/g; |
|
$namespace=~s/\W//g; |
|
if ($namespace ne 'roles') { |
|
chomp($what); |
|
my $proname=propath($udom,$uname); |
|
my $now=time; |
|
unless ($namespace=~/^nohist\_/) { |
|
my $hfh; |
|
if ( |
|
$hfh=IO::File->new(">>$proname/$namespace.hist") |
|
) { print $hfh "P:$now:$what\n"; } |
|
} |
|
my @pairs=split(/\&/,$what); |
|
my %hash; |
|
if (tie(%hash,'GDBM_File', |
|
"$proname/$namespace.db", |
|
&GDBM_WRCREAT(),0640)) { |
|
foreach my $pair (@pairs) { |
|
my ($key,$value)=split(/=/,$pair); |
|
# We could check that we have a number... |
|
if (! defined($value) || $value eq '') { |
|
$value = 1; |
|
} |
|
$hash{$key}+=$value; |
|
} |
|
if (untie(%hash)) { |
|
print $client "ok\n"; |
|
} else { |
|
print $client "error: ".($!+0) |
|
." untie(GDBM) failed ". |
|
"while attempting put\n"; |
|
} |
|
} else { |
|
print $client "error: ".($!) |
|
." tie(GDBM) Failed ". |
|
"while attempting put\n"; |
|
} |
|
} else { |
|
print $client "refused\n"; |
|
} |
|
} else { |
|
Reply($client, "refused\n", $userinput); |
|
|
|
} |
# -------------------------------------------------------------------- rolesput |
# -------------------------------------------------------------------- rolesput |
} elsif ($userinput =~ /^rolesput/) { |
} elsif ($userinput =~ /^rolesput/) { |
if(isClient) { |
if(isClient) { |
Line 2470 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; |
|
|