version 1.73, 2007/04/13 18:26:22
|
version 1.84, 2010/07/17 20:01:56
|
Line 33 use strict;
|
Line 33 use strict;
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::loncommon; |
|
|
use IO::File; |
use IO::File; |
use IO::Socket; |
use IO::Socket; |
Line 81 sub start_daemon {
|
Line 82 sub start_daemon {
|
} |
} |
my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors"; |
my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors"; |
&rotate_logfile($error_fname,$fh,'error logs'); |
&rotate_logfile($error_fname,$fh,'error logs'); |
|
if ($daemon eq 'lonc') { |
|
&clean_sockets($fh); |
|
} |
system("$perlvar{'lonDaemons'}/$progname 2>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); |
system("$perlvar{'lonDaemons'}/$progname 2>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); |
sleep 1; |
sleep 1; |
if (-e $pidfile) { |
if (-e $pidfile) { |
Line 302 sub start_logging {
|
Line 305 sub start_logging {
|
<li><a href="#lonsql">lonsql</a></li> |
<li><a href="#lonsql">lonsql</a></li> |
<li><a href="#lond">lond</a></li> |
<li><a href="#lond">lond</a></li> |
<li><a href="#lonc">lonc</a></li> |
<li><a href="#lonc">lonc</a></li> |
<li><a href="#lonhttpd">lonhttpd</a></li> |
|
<li><a href="#lonnet">lonnet</a></li> |
<li><a href="#lonnet">lonnet</a></li> |
<li><a href="#connections">Connections</a></li> |
<li><a href="#connections">Connections</a></li> |
<li><a href="#delayed">Delayed Messages</a></li> |
<li><a href="#delayed">Delayed Messages</a></li> |
Line 345 ENDHEADERS
|
Line 347 ENDHEADERS
|
sub clean_tmp { |
sub clean_tmp { |
my ($fh)=@_; |
my ($fh)=@_; |
&log($fh,'<hr /><a name="tmp" /><h2>Temporary Files</h2>'); |
&log($fh,'<hr /><a name="tmp" /><h2>Temporary Files</h2>'); |
my $cleaned=0; |
my ($cleaned,$old,$removed) = (0,0,0); |
my $old=0; |
my %errors = ( |
while (my $fname=<$perlvar{'lonDaemons'}/tmp/*>) { |
dir => [], |
my ($dev,$ino,$mode,$nlink, |
file => [], |
$uid,$gid,$rdev,$size, |
failopen => [], |
$atime,$mtime,$ctime, |
); |
$blksize,$blocks)=stat($fname); |
my %error_titles = ( |
my $now=time; |
dir => 'failed to remove empty directory:', |
my $since=$now-$mtime; |
file => 'failed to unlike stale file', |
if ($since>$perlvar{'lonExpire'}) { |
failopen => 'failed to open file or directory' |
my $line=''; |
); |
if (open(PROBE,$fname)) { |
($cleaned,$old,$removed) = &recursive_clean_tmp('',$cleaned,$old,$removed,\%errors); |
$line=<PROBE>; |
&log($fh,"Cleaned up: ".$cleaned." files; removed: $removed empty directories; (found: $old old checkout tokens)"); |
close(PROBE); |
foreach my $key (sort(keys(%errors))) { |
} |
if (ref($errors{$key}) eq 'ARRAY') { |
unless ($line=~/^CHECKOUTTOKEN\&/) { |
if (@{$errors{$key}} > 0) { |
$cleaned++; |
&log($fh,"Error during cleanup ($error_titles{$key}):<ul><li>". |
unlink("$fname"); |
join('</li><li><tt>',@{$errors{$key}}).'</tt></li></ul><br />'); |
} else { |
} |
if ($since>365*$perlvar{'lonExpire'}) { |
} |
$cleaned++; |
} |
unlink("$fname"); |
} |
} else { $old++; } |
|
} |
sub recursive_clean_tmp { |
} |
my ($subdir,$cleaned,$old,$removed,$errors) = @_; |
|
my $base = "$perlvar{'lonDaemons'}/tmp"; |
|
my $path = $base; |
|
next if ($subdir =~ m{\.\./}); |
|
next unless (ref($errors) eq 'HASH'); |
|
unless ($subdir eq '') { |
|
$path .= '/'.$subdir; |
|
} |
|
if (opendir(my $dh,"$path")) { |
|
while (my $file = readdir($dh)) { |
|
next if ($file =~ /^\.\.?$/); |
|
my $fname = "$path/$file"; |
|
if (-d $fname) { |
|
my $innerdir; |
|
if ($subdir eq '') { |
|
$innerdir = $file; |
|
} else { |
|
$innerdir = $subdir.'/'.$file; |
|
} |
|
($cleaned,$old,$removed) = |
|
&recursive_clean_tmp($innerdir,$cleaned,$old,$removed,$errors); |
|
my @doms = &Apache::lonnet::current_machine_domains(); |
|
|
|
if (open(my $dirhandle,$fname)) { |
|
unless (($innerdir eq 'helprequests') || |
|
(($innerdir =~ /^addcourse/) && ($innerdir !~ m{/\d+$}))) { |
|
my @contents = grep {!/^\.\.?$/} readdir($dirhandle); |
|
join('&&',@contents)."\n"; |
|
if (scalar(grep {!/^\.\.?$/} readdir($dirhandle)) == 0) { |
|
closedir($dirhandle); |
|
if ($fname =~ m{^\Q$perlvar{'lonDaemons'}\E/tmp/}) { |
|
if (rmdir($fname)) { |
|
$removed ++; |
|
} elsif (ref($errors->{dir}) eq 'ARRAY') { |
|
push(@{$errors->{dir}},$fname); |
|
} |
|
} |
|
} |
|
} else { |
|
closedir($dirhandle); |
|
} |
|
} |
|
} else { |
|
my ($dev,$ino,$mode,$nlink, |
|
$uid,$gid,$rdev,$size, |
|
$atime,$mtime,$ctime, |
|
$blksize,$blocks)=stat($fname); |
|
my $now=time; |
|
my $since=$now-$mtime; |
|
if ($since>$perlvar{'lonExpire'}) { |
|
if ($subdir eq '') { |
|
my $line=''; |
|
if ($fname =~ /\.db$/) { |
|
if (unlink($fname)) { |
|
$cleaned++; |
|
} elsif (ref($errors->{file}) eq 'ARRAY') { |
|
push(@{$errors->{file}},$fname); |
|
} |
|
} elsif (open(PROBE,$fname)) { |
|
my $line=''; |
|
$line=<PROBE>; |
|
close(PROBE); |
|
if ($line=~/^CHECKOUTTOKEN\&/) { |
|
if ($since>365*$perlvar{'lonExpire'}) { |
|
if (unlink($fname)) { |
|
$cleaned++; |
|
} elsif (ref($errors->{file}) eq 'ARRAY') { |
|
push(@{$errors->{file}},$fname); |
|
} |
|
} else { |
|
$old++; |
|
} |
|
} else { |
|
if (unlink($fname)) { |
|
$cleaned++; |
|
} elsif (ref($errors->{file}) eq 'ARRAY') { |
|
push(@{$errors->{file}},$fname); |
|
} |
|
} |
|
} elsif (ref($errors->{failopen}) eq 'ARRAY') { |
|
push(@{$errors->{failopen}},$fname); |
|
} |
|
} else { |
|
if (unlink($fname)) { |
|
$cleaned++; |
|
} elsif (ref($errors->{file}) eq 'ARRAY') { |
|
push(@{$errors->{file}},$fname); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
closedir($dh); |
|
} elsif (ref($errors->{failopen}) eq 'ARRAY') { |
|
push(@{$errors->{failopen}},$path); |
} |
} |
&log($fh,"Cleaned up ".$cleaned." files (".$old." old checkout tokens)."); |
return ($cleaned,$old,$removed); |
} |
} |
|
|
# ------------------------------------------------------------ clean out lonIDs |
# ------------------------------------------------------------ clean out lonIDs |
Line 399 sub clean_lonIDs {
|
Line 495 sub clean_lonIDs {
|
&log($fh,"<h3>$active open session(s)</h3>"); |
&log($fh,"<h3>$active open session(s)</h3>"); |
} |
} |
|
|
|
# ----------------------------------------------------------- clean out sockets |
|
sub clean_sockets { |
|
my ($fh)=@_; |
|
my $cleaned=0; |
|
opendir(SOCKETS,$perlvar{'lonSockDir'}); |
|
while (my $fname=readdir(SOCKETS)) { |
|
next if (-d $fname |
|
|| $fname=~/(mysqlsock|maximasock|rsock|\Q$perlvar{'lonSockDir'}\E)/); |
|
$cleaned++; |
|
&log($fh,"Unlinking $fname<br />"); |
|
unlink("/home/httpd/sockets/$fname"); |
|
} |
|
&log($fh,"<p>Cleaned up ".$cleaned." stale sockets.</p>"); |
|
} |
|
|
|
|
# ----------------------------------------------------------------------- httpd |
# ----------------------------------------------------------------------- httpd |
sub check_httpd_logs { |
sub check_httpd_logs { |
Line 453 sub rotate_lonnet_logs {
|
Line 564 sub rotate_lonnet_logs {
|
|
|
sub rotate_other_logs { |
sub rotate_other_logs { |
my ($fh) = @_; |
my ($fh) = @_; |
my $fname="$perlvar{'lonDaemons'}/logs/autoenroll.log"; |
my %logs = ( |
&rotate_logfile($fname,$fh,'Auto Enroll log'); |
autoenroll => 'Auto Enroll log', |
$fname="$perlvar{'lonDaemons'}/logs/autocreate.log"; |
autocreate => 'Create Course log', |
&rotate_logfile($fname,$fh,'Create Course log'); |
searchcat => 'Search Cataloguing log', |
$fname="$perlvar{'lonDaemons'}/logs/searchcat.log"; |
autoupdate => 'Auto Update log', |
&rotate_logfile($fname,$fh,'Search Cataloguing log'); |
refreshcourseids_db => 'Refresh CourseIDs db log', |
|
); |
|
foreach my $item (keys(%logs)) { |
|
my $fname=$perlvar{'lonDaemons'}.'/logs/'.$item.'.log'; |
|
&rotate_logfile($fname,$fh,$logs{$item}); |
|
} |
} |
} |
|
|
# ----------------------------------------------------------------- Connections |
# ----------------------------------------------------------------- Connections |
Line 569 sub log_simplestatus {
|
Line 685 sub log_simplestatus {
|
$sfh->close(); |
$sfh->close(); |
} |
} |
|
|
|
sub write_loncaparevs { |
|
if (open(my $fh,">$perlvar{'lonTabDir'}/loncaparevs.tab")) { |
|
my %hostname = &Apache::lonnet::all_hostnames(); |
|
foreach my $id (sort(keys(%hostname))) { |
|
if ($id ne '') { |
|
my $loncaparev = &Apache::lonnet::get_server_loncaparev('',$id,1,'loncron'); |
|
if ($loncaparev =~ /^[\d.\-]+$/) { |
|
print $fh $id.':'.$loncaparev."\n"; |
|
} |
|
} |
|
} |
|
close($fh); |
|
} |
|
return; |
|
} |
|
|
sub send_mail { |
sub send_mail { |
print "sending mail\n"; |
print "sending mail\n"; |
my $emailto="$perlvar{'lonAdmEMail'}"; |
my $defdom = $perlvar{'lonDefDomain'}; |
|
my $origmail = $perlvar{'lonAdmEMail'}; |
|
my $emailto = &Apache::loncommon::build_recipient_list(undef, |
|
'lonstatusmail',$defdom,$origmail); |
if ($totalcount>2500) { |
if ($totalcount>2500) { |
$emailto.=",$perlvar{'lonSysEMail'}"; |
$emailto.=",$perlvar{'lonSysEMail'}"; |
} |
} |
Line 623 sub main () {
|
Line 758 sub main () {
|
undef $perlvarref; |
undef $perlvarref; |
delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed |
delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed |
delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed |
delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed |
|
chdir($perlvar{'lonDaemons'}); |
# --------------------------------------- Make sure that LON-CAPA is configured |
# --------------------------------------- Make sure that LON-CAPA is configured |
# I only test for one thing here (lonHostID). This is just a safeguard. |
# I only test for one thing here (lonHostID). This is just a safeguard. |
if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) { |
if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) { |
Line 654 sub main () {
|
Line 789 sub main () {
|
&Apache::lonnet::load_domain_tab(1); |
&Apache::lonnet::load_domain_tab(1); |
&Apache::lonnet::get_iphost(1); |
&Apache::lonnet::get_iphost(1); |
|
|
|
# ----------------------------------------- Force firewall update for lond port |
|
|
|
if ((!$justcheckdaemons) && (!$justreload)) { |
|
my $now = time; |
|
my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'. |
|
$now.$$.int(rand(10000)); |
|
if (open(my $fh,">$tmpfile")) { |
|
my %iphosts = &Apache::lonnet::get_iphost(); |
|
foreach my $key (keys(%iphosts)) { |
|
print $fh "$key\n"; |
|
} |
|
close($fh); |
|
my $execpath = $perlvar{'lonDaemons'}.'/lciptables'; |
|
system("$execpath $tmpfile"); |
|
unlink($fh); |
|
} |
|
} |
|
|
# ---------------------------------------------------------------- Start report |
# ---------------------------------------------------------------- Start report |
|
|
$errors=0; |
$errors=0; |
Line 673 sub main () {
|
Line 826 sub main () {
|
&rotate_other_logs($fh); |
&rotate_other_logs($fh); |
} |
} |
if (!$justcheckconnections && !$justreload) { |
if (!$justcheckconnections && !$justreload) { |
|
&checkon_daemon($fh,'lonmemcached',40000); |
&checkon_daemon($fh,'lonsql',200000); |
&checkon_daemon($fh,'lonsql',200000); |
if ( &checkon_daemon($fh,'lond',40000,'USR1') eq 'running') { |
if ( &checkon_daemon($fh,'lond',40000,'USR1') eq 'running') { |
&checkon_daemon($fh,'lond',40000,'USR2'); |
&checkon_daemon($fh,'lond',40000,'USR2'); |
} |
} |
&checkon_daemon($fh,'lonc',40000,'USR1'); |
&checkon_daemon($fh,'lonc',40000,'USR1'); |
&checkon_daemon($fh,'lonhttpd',40000); |
|
&checkon_daemon($fh,'lonmemcached',40000); |
|
&checkon_daemon($fh,'lonmaxima',40000); |
&checkon_daemon($fh,'lonmaxima',40000); |
|
&checkon_daemon($fh,'lonr',40000); |
} |
} |
if ($justreload) { |
if ($justreload) { |
&checkon_daemon($fh,'lond',40000,'USR2'); |
&checkon_daemon($fh,'lond',40000,'USR2'); |
Line 696 sub main () {
|
Line 849 sub main () {
|
|
|
if ($totalcount>200 && !$noemail) { &send_mail(); } |
if ($totalcount>200 && !$noemail) { &send_mail(); } |
} |
} |
|
if (!$justcheckconnections && !$justreload) { |
|
&write_loncaparevs(); |
|
} |
} |
} |
|
|
&main(); |
&main(); |