version 1.81, 2009/06/11 00:15:27
|
version 1.95, 2011/11/14 17:27:34
|
Line 32 use strict;
|
Line 32 use strict;
|
|
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
|
use LONCAPA; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::loncommon; |
use Apache::loncommon; |
|
|
Line 347 ENDHEADERS
|
Line 348 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++; } |
|
} |
|
} |
|
} |
} |
&log($fh,"Cleaned up ".$cleaned." files (".$old." old checkout tokens)."); |
} |
|
|
|
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); |
|
} |
|
return ($cleaned,$old,$removed); |
} |
} |
|
|
# ------------------------------------------------------------ clean out lonIDs |
# ------------------------------------------------------------ clean out lonIDs |
Line 420 sub clean_sockets {
|
Line 515 sub clean_sockets {
|
# ----------------------------------------------------------------------- httpd |
# ----------------------------------------------------------------------- httpd |
sub check_httpd_logs { |
sub check_httpd_logs { |
my ($fh)=@_; |
my ($fh)=@_; |
&log($fh,'<hr /><a name="httpd" /><h2>httpd</h2><h3>Access Log</h3><pre>'); |
if (open(PIPE,"./lchttpdlogs|")) { |
|
while (my $line=<PIPE>) { |
open (DFH,"tail -n25 /etc/httpd/logs/access_log|"); |
&log($fh,$line); |
while (my $line=<DFH>) { &log($fh,&encode_entities($line,'<>&"')) }; |
if ($line=~/\[error\]/) { $notices++; } |
close (DFH); |
} |
|
close(PIPE); |
&log($fh,"</pre><h3>Error Log</h3><pre>"); |
|
|
|
open (DFH,"tail -n25 /etc/httpd/logs/error_log|"); |
|
while (my $line=<DFH>) { |
|
&log($fh,"$line"); |
|
if ($line=~/\[error\]/) { $notices++; } |
|
} |
} |
close (DFH); |
|
&log($fh,"</pre>"); |
|
&errout($fh); |
&errout($fh); |
} |
} |
|
|
Line 470 sub rotate_lonnet_logs {
|
Line 557 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 535 sub check_delayed_msg {
|
Line 627 sub check_delayed_msg {
|
} |
} |
|
|
&log($fh,"<p>Total unsend messages: <b>$unsend</b></p>\n"); |
&log($fh,"<p>Total unsend messages: <b>$unsend</b></p>\n"); |
$warnings=$warnings+5*$unsend; |
if ($unsend > 0) { |
|
$warnings=$warnings+5*$unsend; |
|
} |
|
|
if ($unsend) { $simplestatus{'unsend'}=$unsend; } |
if ($unsend) { $simplestatus{'unsend'}=$unsend; } |
&log($fh,"<h3>Outgoing Buffer</h3>\n<pre>"); |
&log($fh,"<h3>Outgoing Buffer</h3>\n<pre>"); |
Line 549 sub check_delayed_msg {
|
Line 643 sub check_delayed_msg {
|
} |
} |
&log($fh,"</pre>\n"); |
&log($fh,"</pre>\n"); |
close (DFH); |
close (DFH); |
|
my %hostname = &Apache::lonnet::all_hostnames(); |
|
my $numhosts = scalar(keys(%hostname)); |
# pong to all servers that have delayed messages |
# pong to all servers that have delayed messages |
# this will trigger a reverse connection, which should flush the buffers |
# this will trigger a reverse connection, which should flush the buffers |
foreach my $tryserver (keys %servers) { |
foreach my $tryserver (sort(keys(%servers))) { |
my $answer=&Apache::lonnet::reply("pong",$tryserver); |
if ($hostname{$tryserver} || !$numhosts) { |
&log($fh,"Pong to $tryserver: $answer<br />"); |
my $answer; |
|
eval { |
|
local $SIG{ ALRM } = sub { die "TIMEOUT" }; |
|
alarm(20); |
|
$answer = &Apache::lonnet::reply("pong",$tryserver); |
|
alarm(0); |
|
}; |
|
if ($@ && $@ =~ m/TIMEOUT/) { |
|
&log($fh,"Attempted pong to $tryserver timed out<br />"); |
|
print "time out while contacting: $tryserver for pong\n"; |
|
} else { |
|
&log($fh,"Pong to $tryserver: $answer<br />"); |
|
} |
|
} else { |
|
&log($fh,"$tryserver has delayed messages, but is not part of the cluster -- skipping 'Pong'.<br />"); |
|
} |
} |
} |
} |
} |
|
|
Line 586 sub log_simplestatus {
|
Line 697 sub log_simplestatus {
|
$sfh->close(); |
$sfh->close(); |
} |
} |
|
|
|
sub write_loncaparevs { |
|
print "Retrieving LON-CAPA version information\n"; |
|
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; |
|
eval { |
|
local $SIG{ ALRM } = sub { die "TIMEOUT" }; |
|
alarm(10); |
|
$loncaparev = |
|
&Apache::lonnet::get_server_loncaparev('',$id,1,'loncron'); |
|
alarm(0); |
|
}; |
|
if ($@ && $@ =~ m/TIMEOUT/) { |
|
print "time out while contacting lonHost: $id for version\n"; |
|
} |
|
if ($loncaparev =~ /^[\w.\-]+$/) { |
|
print $fh $id.':'.$loncaparev."\n"; |
|
} |
|
} |
|
} |
|
close($fh); |
|
} |
|
return; |
|
} |
|
|
|
sub write_serverhomeIDs { |
|
print "Retrieving LON-CAPA lonHostID information\n"; |
|
if (open(my $fh,">$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { |
|
my %name_to_host = &Apache::lonnet::all_names(); |
|
foreach my $name (sort(keys(%name_to_host))) { |
|
if ($name ne '') { |
|
if (ref($name_to_host{$name}) eq 'ARRAY') { |
|
my $serverhomeID; |
|
eval { |
|
local $SIG{ ALRM } = sub { die "TIMEOUT" }; |
|
alarm(10); |
|
$serverhomeID = |
|
&Apache::lonnet::get_server_homeID($name,1,'loncron'); |
|
alarm(0); |
|
}; |
|
if ($@ && $@ =~ m/TIMEOUT/) { |
|
print "Time out while contacting server: $name\n"; |
|
} |
|
if ($serverhomeID ne '') { |
|
print $fh $name.':'.$serverhomeID."\n"; |
|
} else { |
|
print $fh $name.':'.$name_to_host{$name}->[0]."\n"; |
|
} |
|
} |
|
} |
|
} |
|
close($fh); |
|
} |
|
return; |
|
} |
|
|
sub send_mail { |
sub send_mail { |
print "sending mail\n"; |
print "sending mail\n"; |
my $defdom = $perlvar{'lonDefDomain'}; |
my $defdom = $perlvar{'lonDefDomain'}; |
Line 686 sub main () {
|
Line 855 sub main () {
|
print $fh "$key\n"; |
print $fh "$key\n"; |
} |
} |
close($fh); |
close($fh); |
my $execpath = $perlvar{'lonDaemons'}.'/lciptables'; |
if (&LONCAPA::try_to_lock('/tmp/lock_lciptables')) { |
system("$execpath $tmpfile"); |
my $execpath = $perlvar{'lonDaemons'}.'/lciptables'; |
unlink($fh); |
system("$execpath $tmpfile"); |
|
unlink('/tmp/lock_lciptables'); # Remove the lock file. |
|
} |
|
unlink($tmpfile); |
} |
} |
} |
} |
|
|
Line 731 sub main () {
|
Line 903 sub main () {
|
&check_delayed_msg($fh); |
&check_delayed_msg($fh); |
&finish_logging($fh); |
&finish_logging($fh); |
&log_simplestatus(); |
&log_simplestatus(); |
|
&write_loncaparevs(); |
|
&write_serverhomeIDs(); |
|
|
if ($totalcount>200 && !$noemail) { &send_mail(); } |
if ($totalcount>200 && !$noemail) { &send_mail(); } |
} |
} |