version 1.61, 2001/12/20 17:43:05
|
version 1.71, 2002/02/12 23:08:27
|
Line 45
|
Line 45
|
# 9/30,10/22,11/13,11/15,11/16 Scott Harrison |
# 9/30,10/22,11/13,11/15,11/16 Scott Harrison |
# 11/26,11/27 Gerd Kortemeyer |
# 11/26,11/27 Gerd Kortemeyer |
# 12/20 Scott Harrison |
# 12/20 Scott Harrison |
# |
# 12/22 Gerd Kortemeyer |
|
# YEAR=2002 |
|
# 01/20/02,02/05 Gerd Kortemeyer |
|
# 02/05 Guy Albertelli |
|
# 02/07 Scott Harrison |
|
# 02/12 Gerd Kortemeyer |
### |
### |
|
|
# based on "Perl Cookbook" ISBN 1-56592-243-3 |
# based on "Perl Cookbook" ISBN 1-56592-243-3 |
Line 83 sub catchexception {
|
Line 88 sub catchexception {
|
die($error); |
die($error); |
} |
} |
|
|
|
sub timeout { |
|
&logthis("<font color=ref>CRITICAL: TIME OUT ".$$."</font>"); |
|
&catchexception('Timeout'); |
|
} |
# -------------------------------- Set signal handlers to record abnormal exits |
# -------------------------------- Set signal handlers to record abnormal exits |
|
|
$SIG{'QUIT'}=\&catchexception; |
$SIG{'QUIT'}=\&catchexception; |
Line 130 open (CONFIG,"$perlvar{'lonTabDir'}/host
|
Line 139 open (CONFIG,"$perlvar{'lonTabDir'}/host
|
|
|
while ($configline=<CONFIG>) { |
while ($configline=<CONFIG>) { |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
chomp($ip); |
chomp($ip); $ip=~s/\D+$//; |
$hostid{$ip}=$id; |
$hostid{$ip}=$id; |
if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; } |
if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; } |
$PREFORK++; |
$PREFORK++; |
Line 157 $children = 0; # cu
|
Line 166 $children = 0; # cu
|
sub REAPER { # takes care of dead children |
sub REAPER { # takes care of dead children |
$SIG{CHLD} = \&REAPER; |
$SIG{CHLD} = \&REAPER; |
my $pid = wait; |
my $pid = wait; |
$children --; |
if (defined($children{$pid})) { |
&logthis("Child $pid died"); |
&logthis("Child $pid died"); |
delete $children{$pid}; |
$children --; |
|
delete $children{$pid}; |
|
} else { |
|
&logthis("Unknown Child $pid died"); |
|
} |
} |
} |
|
|
sub HUNTSMAN { # signal handler for SIGINT |
sub HUNTSMAN { # signal handler for SIGINT |
Line 186 sub checkchildren {
|
Line 199 sub checkchildren {
|
&initnewstatus(); |
&initnewstatus(); |
&logstatus(); |
&logstatus(); |
&logthis('Going to check on the children'); |
&logthis('Going to check on the children'); |
|
$docdir=$perlvar{'lonDocRoot'}; |
foreach (sort keys %children) { |
foreach (sort keys %children) { |
sleep 1; |
sleep 1; |
unless (kill 'USR1' => $_) { |
unless (kill 'USR1' => $_) { |
Line 193 sub checkchildren {
|
Line 207 sub checkchildren {
|
&logstatus($$.' is dead'); |
&logstatus($$.' is dead'); |
} |
} |
} |
} |
|
sleep 5; |
|
foreach (sort keys %children) { |
|
unless (-e "$docdir/lon-status/londchld/$_.txt") { |
|
&logthis('Child '.$_.' did not respond'); |
|
kill 9 => $_; |
|
$emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; |
|
$subj="LON: $perlvar{'lonHostID'} killed lond process $_"; |
|
my $result=`echo 'Killed lond process $_.' | mailto $emailto -s '$subj' > /dev/null`; |
|
$execdir=$perlvar{'lonDaemons'}; |
|
$result=`/bin/cp $execdir/logs/lond.log $execdir/logs/lond.log.$_` |
|
} |
|
} |
} |
} |
|
|
# --------------------------------------------------------------------- Logging |
# --------------------------------------------------------------------- Logging |
Line 211 sub logthis {
|
Line 237 sub logthis {
|
|
|
sub logstatus { |
sub logstatus { |
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".$status."\t".$lastlog."\n"; |
print $fh $$."\t".$status."\t".$lastlog."\n"; |
|
$fh->close(); |
|
} |
|
{ |
|
my $fh=IO::File->new(">$docdir/lon-status/londchld/$$.txt"); |
|
print $fh $status."\n".$lastlog."\n".time; |
|
$fh->close(); |
|
} |
} |
} |
|
|
sub initnewstatus { |
sub initnewstatus { |
Line 221 sub initnewstatus {
|
Line 255 sub initnewstatus {
|
my $now=time; |
my $now=time; |
my $local=localtime($now); |
my $local=localtime($now); |
print $fh "LOND status $local - parent $$\n\n"; |
print $fh "LOND status $local - parent $$\n\n"; |
|
opendir(DIR,"$docdir/lon-status/londchld"); |
|
while ($filename=readdir(DIR)) { |
|
unlink("$docdir/lon-status/londchld/$filename"); |
|
} |
|
closedir(DIR); |
} |
} |
|
|
# -------------------------------------------------------------- Status setting |
# -------------------------------------------------------------- Status setting |
Line 430 sub make_new_child {
|
Line 469 sub make_new_child {
|
# Child can *not* return from this subroutine. |
# Child can *not* return from this subroutine. |
$SIG{INT} = 'DEFAULT'; # make SIGINT kill us as it did before |
$SIG{INT} = 'DEFAULT'; # make SIGINT kill us as it did before |
$SIG{USR1}= \&logstatus; |
$SIG{USR1}= \&logstatus; |
|
$SIG{ALRM}= \&timeout; |
$lastlog='Forked '; |
$lastlog='Forked '; |
$status='Forked'; |
$status='Forked'; |
|
|
Line 498 sub make_new_child {
|
Line 538 sub make_new_child {
|
chomp($userinput); |
chomp($userinput); |
&status('Processing '.$hostid{$clientip}.': '.$userinput); |
&status('Processing '.$hostid{$clientip}.': '.$userinput); |
my $wasenc=0; |
my $wasenc=0; |
|
alarm(120); |
# ------------------------------------------------------------ See if encrypted |
# ------------------------------------------------------------ See if encrypted |
if ($userinput =~ /^enc/) { |
if ($userinput =~ /^enc/) { |
if ($cipher) { |
if ($cipher) { |
Line 599 sub make_new_child {
|
Line 640 sub make_new_child {
|
$pwdcorrect=!$?; |
$pwdcorrect=!$?; |
} |
} |
} elsif ($howpwd eq 'krb4') { |
} elsif ($howpwd eq 'krb4') { |
|
$null=pack("C",0); |
|
unless ($upass=~/$null/) { |
$pwdcorrect=( |
$pwdcorrect=( |
Authen::Krb4::get_pw_in_tkt($uname,"", |
Authen::Krb4::get_pw_in_tkt($uname,"", |
$contentpwd,'krbtgt',$contentpwd,1, |
$contentpwd,'krbtgt',$contentpwd,1, |
$upass) == 0); |
$upass) == 0); |
|
} else { $pwdcorrect=0; } |
} elsif ($howpwd eq 'localauth') { |
} elsif ($howpwd eq 'localauth') { |
$pwdcorrect=&localauth::localauth($uname,$upass, |
$pwdcorrect=&localauth::localauth($uname,$upass, |
$contentpwd); |
$contentpwd); |
Line 676 sub make_new_child {
|
Line 720 sub make_new_child {
|
$fpnow.='/'.$fpparts[$i]; |
$fpnow.='/'.$fpparts[$i]; |
unless (-e $fpnow) { |
unless (-e $fpnow) { |
unless (mkdir($fpnow,0777)) { |
unless (mkdir($fpnow,0777)) { |
$fperror="error:$!\n"; |
$fperror="error:$!"; |
} |
} |
} |
} |
} |
} |
Line 1089 sub make_new_child {
|
Line 1133 sub make_new_child {
|
} |
} |
# ------------------------------------------------------------------------ dump |
# ------------------------------------------------------------------------ dump |
} elsif ($userinput =~ /^dump/) { |
} elsif ($userinput =~ /^dump/) { |
my ($cmd,$udom,$uname,$namespace) |
my ($cmd,$udom,$uname,$namespace,$regexp) |
=split(/:/,$userinput); |
=split(/:/,$userinput); |
$namespace=~s/\//\_/g; |
$namespace=~s/\//\_/g; |
$namespace=~s/\W//g; |
$namespace=~s/\W//g; |
|
if (defined($regexp)) { |
|
$regexp=&unescape($regexp); |
|
} else { |
|
$regexp='.'; |
|
} |
my $proname=propath($udom,$uname); |
my $proname=propath($udom,$uname); |
my $qresult=''; |
my $qresult=''; |
if (tie(%hash,'GDBM_File',"$proname/$namespace.db",&GDBM_READER,0640)) { |
if (tie(%hash,'GDBM_File',"$proname/$namespace.db",&GDBM_READER,0640)) { |
foreach $key (keys %hash) { |
foreach $key (keys %hash) { |
$qresult.="$key=$hash{$key}&"; |
if (eval('$key=~/$regexp/')) { |
|
$qresult.="$key=$hash{$key}&"; |
|
} |
} |
} |
if (untie(%hash)) { |
if (untie(%hash)) { |
$qresult=~s/\&$//; |
$qresult=~s/\&$//; |
Line 1327 sub make_new_child {
|
Line 1378 sub make_new_child {
|
print $client "unknown_cmd\n"; |
print $client "unknown_cmd\n"; |
} |
} |
# -------------------------------------------------------------------- complete |
# -------------------------------------------------------------------- complete |
|
alarm(0); |
&status('Listening to '.$hostid{$clientip}); |
&status('Listening to '.$hostid{$clientip}); |
} |
} |
# --------------------------------------------- client unknown or fishy, refuse |
# --------------------------------------------- client unknown or fishy, refuse |