--- loncom/loncron 2003/10/14 15:36:21 1.44 +++ loncom/loncron 2005/04/13 18:56:07 1.58 @@ -1,25 +1,47 @@ #!/usr/bin/perl -# The LearningOnline Network -# Housekeeping program, started by cron +# Housekeeping program, started by cron, loncontrol and loncron.pl # -# (TCP networking package -# 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30, -# 7/1,7/2,7/9,7/10,7/12 Gerd Kortemeyer) +# $Id: loncron,v 1.58 2005/04/13 18:56:07 albertel Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ # -# 7/14,7/15,7/19,7/21,7/22,11/18, -# 2/8 Gerd Kortemeyer -# 12/23 Gerd Kortemeyer -# YEAR=2001 -# 09/04,09/06,11/26 Gerd Kortemeyer $|=1; +use strict; use lib '/home/httpd/lib/perl/'; use LONCAPA::Configuration; use IO::File; use IO::Socket; +use HTML::Entities; +use Getopt::Long; +#globals +use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount); + +my $statusdir="/home/httpd/html/lon-status"; + # -------------------------------------------------- Non-critical communication sub reply { @@ -38,28 +60,41 @@ sub reply { # --------------------------------------------------------- Output error status +sub log { + my $fh=shift; + if ($fh) { print $fh @_ } +} + sub errout { my $fh=shift; - print $fh (< + &log($fh,(< -
Notices$notices
Warnings$warnings
Errors$errors

Top

+

Top

ENDERROUT } sub start_daemon { - my ($fh,$daemon,$pidfile) = @_; + my ($fh,$daemon,$pidfile,$args) = @_; my $progname=$daemon; - if ($daemon eq 'lonc' && $ARGV[0] eq 'new') { + if ($daemon eq 'lonc' && $args eq 'new') { $progname='loncnew'; print "new "; } - system("$perlvar{'lonDaemons'}/$progname 2>>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); + my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors"; + my $size=(stat($error_fname))[7]; + if ($size>40000) { + &log($fh,"

Rotating error logs ...

"); + rename("$error_fname.2","$error_fname.3"); + rename("$error_fname.1","$error_fname.2"); + rename("$error_fname","$error_fname.1"); + } + system("$perlvar{'lonDaemons'}/$progname 2>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); sleep 2; if (-e $pidfile) { - print $fh "Seems like it started ...

"; + &log($fh,"

Seems like it started ...

"); my $lfh=IO::File->new("$pidfile"); my $daemonpid=<$lfh>; chomp($daemonpid); @@ -70,97 +105,99 @@ sub start_daemon { return 0; } } - print $fh "Seems like that did not work!

"; + &log($fh,"

Seems like that did not work!

"); $errors++; return 0; } sub checkon_daemon { - my ($fh,$daemon,$maxsize,$sendusr1)=@_; + my ($fh,$daemon,$maxsize,$sendusr1,$args)=@_; - print $fh '

'.$daemon.'

Log

';
-    printf("%-10s ",$daemon);
+    &log($fh,'

'.$daemon.'

Log

'); + printf("%-15s ",$daemon); if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){ open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|"); - while ($line=) { - print $fh "$line"; + while (my $line=) { + &log($fh,"$line"); if ($line=~/INFO/) { $notices++; } if ($line=~/WARNING/) { $notices++; } if ($line=~/CRITICAL/) { $warnings++; } }; close (DFH); } - print $fh "

"; + &log($fh,"

"); my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid"; my $restartflag=1; - + my $daemonpid; if (-e $pidfile) { my $lfh=IO::File->new("$pidfile"); - my $daemonpid=<$lfh>; + $daemonpid=<$lfh>; chomp($daemonpid); if (kill 0 => $daemonpid) { - print $fh "

$daemon at pid $daemonpid responding"; - if ($sendusr1) { print $fh ", sending USR1"; } - print $fh "

"; + &log($fh,"

$daemon at pid $daemonpid responding"); + if ($sendusr1) { &log($fh,", sending USR1"); } + &log($fh,"

"); if ($sendusr1) { kill USR1 => $daemonpid; } $restartflag=0; print "running\n"; } else { $errors++; - print $fh "

$daemon at pid $daemonpid not responding

"; + &log($fh,"

$daemon at pid $daemonpid not responding

"); $restartflag=1; - print $fh "

Decided to clean up stale .pid file and restart $daemon

"; + &log($fh,"

Decided to clean up stale .pid file and restart $daemon

"); } } if ($restartflag==1) { $simplestatus{$daemon}='off'; $errors++; - print $fh '
Killall '.$daemon.': '. - `killall $daemon 2>&1`.' - '; + my $kadaemon=$daemon; + if ($kadaemon eq 'lonmemcached') { $kadaemon='memcached'; } + &log($fh,'
Killall '.$daemon.': '. + `killall $kadaemon 2>&1`.' - '); sleep 2; - print $fh unlink($pidfile).' - '. - `killall -9 $daemon 2>&1`. - '
'; - print $fh "

$daemon not running, trying to start

"; + &log($fh,unlink($pidfile).' - '. + `killall -9 $kadaemon 2>&1`. + '

'); + &log($fh,"

$daemon not running, trying to start

"); - if (&start_daemon($fh,$daemon,$pidfile)) { - print $fh "

$daemon at pid $daemonpid responding

"; + if (&start_daemon($fh,$daemon,$pidfile,$args)) { + &log($fh,"

$daemon at pid $daemonpid responding

"); $simplestatus{$daemon}='restarted'; print "started\n"; } else { $errors++; - print $fh "

$daemon at pid $daemonpid not responding

"; - print $fh "Give it one more try ...

"; + &log($fh,"

$daemon at pid $daemonpid not responding

"); + &log($fh,"

Give it one more try ...

"); print " "; - if (&start_daemon($fh,$daemon,$pidfile)) { - print $fh "

$daemon at pid $daemonpid responding

"; + if (&start_daemon($fh,$daemon,$pidfile,$args)) { + &log($fh,"

$daemon at pid $daemonpid responding

"); $simplestatus{$daemon}='restarted'; print "started\n"; } else { print " failed\n"; $simplestatus{$daemon}='failed'; $errors++; $errors++; - print $fh "

$daemon at pid $daemonpid not responding

"; - print $fh "Unable to start $daemon

"; + &log($fh,"

$daemon at pid $daemonpid not responding

"); + &log($fh,"

Unable to start $daemon

"); } } if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){ - print $fh "

";
+	    &log($fh,"

");
 	    open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");
-	    while ($line=) { 
-		print $fh "$line";
+	    while (my $line=) { 
+		&log($fh,"$line");
 		if ($line=~/WARNING/) { $notices++; }
 		if ($line=~/CRITICAL/) { $notices++; }
 	    };
 	    close (DFH);
-	    print $fh "
"; + &log($fh,"

"); } } - $fname="$perlvar{'lonDaemons'}/logs/$daemon.log"; + my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log"; my ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev,$size, @@ -168,7 +205,7 @@ sub checkon_daemon { $blksize,$blocks)=stat($fname); if ($size>$maxsize) { - print $fh "Rotating logs ...

"; + &log($fh,"

Rotating logs ...

"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); @@ -176,149 +213,20 @@ sub checkon_daemon { &errout($fh); } -# ================================================================ Main Program - -# --------------------------------- Read loncapa_apache.conf and loncapa.conf -my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); -%perlvar=%{$perlvarref}; -undef $perlvarref; -delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed -delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed - -# --------------------------------------- Make sure that LON-CAPA is configured -# I only test for one thing here (lonHostID). This is just a safeguard. -if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) { - print("Unconfigured machine.\n"); - $emailto=$perlvar{'lonSysEMail'}; - $hostname=`/bin/hostname`; - chop $hostname; - $hostname=~s/[^\w\.]//g; # make sure is safe to pass through shell - $subj="LON: Unconfigured machine $hostname"; - system("echo 'Unconfigured machine $hostname.' |\ - mailto $emailto -s '$subj' > /dev/null"); - exit 1; -} - -# ----------------------------- Make sure this process is running from user=www -my $wwwid=getpwnam('www'); -if ($wwwid!=$<) { - print("User ID mismatch. This program must be run as user 'www'\n"); - $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; - $subj="LON: $perlvar{'lonHostID'} User ID mismatch"; - system("echo 'User ID mismatch. loncron must be run as user www.' |\ - mailto $emailto -s '$subj' > /dev/null"); - exit 1; -} - -# ------------------------------------------------------------- Read hosts file -{ - my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab"); - - while (my $configline=<$config>) { - my ($id,$domain,$role,$name,$ip,$domdescr)=split(/:/,$configline); - if ($id && $domain && $role && $name && $ip) { - $hostname{$id}=$name; - $hostdom{$id}=$domain; - $hostip{$id}=$ip; - $hostrole{$id}=$role; - if ($domdescr) { $domaindescription{$domain}=$domdescr; } - if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) { - $libserv{$id}=$name; - } - } else { - if ($configline) { -# &logthis("Skipping hosts.tab line -$configline-"); - } - } - } -} - -# ------------------------------------------------------ Read spare server file -{ - my $config=IO::File->new("$perlvar{'lonTabDir'}/spare.tab"); - - while (my $configline=<$config>) { - chomp($configline); - if (($configline) && ($configline ne $perlvar{'lonHostID'})) { - $spareid{$configline}=1; - } - } -} - -# ---------------------------------------------------------------- Start report - -$statusdir="/home/httpd/html/lon-status"; - -$errors=0; -$warnings=0; -$notices=0; - -$now=time; -$date=localtime($now); - -{ - my $fh=IO::File->new(">$statusdir/newstatus.html"); - my %simplestatus=(); - - print $fh (< - -LON Status Report $perlvar{'lonHostID'} - - -
-

LON Status Report $perlvar{'lonHostID'}

-

$date ($now)

-
    -
  1. Configuration -
  2. Machine Information -
  3. Temporary Files -
  4. Session Tokens -
  5. httpd -
  6. lonsql -
  7. lond -
  8. lonc -
  9. lonhttpd -
  10. lonnet -
  11. Connections -
  12. Delayed Messages -
  13. Error Count -
-
- -

Configuration

-

PerlVars

- -ENDHEADERS - - foreach $varname (sort(keys(%perlvar))) { - print $fh "\n"; - } - print $fh "
$varname$perlvar{$varname}

Hosts

"; - foreach $id (sort(keys(%hostname))) { - print $fh - ""; - print $fh "\n"; - } - print $fh "
$id$hostdom{$id}$hostrole{$id}$hostname{$id}$hostip{$id}

Spare Hosts

    "; - foreach $id (sort(keys(%spareid))) { - print $fh "
  1. $id\n"; - } - - print $fh "
\n"; # --------------------------------------------------------------------- Machine - - print $fh '

Machine Information

'; - print $fh "

loadavg

"; - +sub log_machine_info { + my ($fh)=@_; + &log($fh,'

Machine Information

'); + &log($fh,"

loadavg

"); + open (LOADAVGH,"/proc/loadavg"); - $loadavg=; + my $loadavg=; close (LOADAVGH); - print $fh "$loadavg"; + &log($fh,"$loadavg"); - @parts=split(/\s+/,$loadavg); + my @parts=split(/\s+/,$loadavg); if ($parts[1]>4.0) { $errors++; } elsif ($parts[1]>2.0) { @@ -327,14 +235,14 @@ ENDHEADERS $notices++; } - print $fh "

df

"; - print $fh "
";
+    &log($fh,"

df

"); + &log($fh,"
");
 
     open (DFH,"df|");
-    while ($line=) { 
-	print $fh "$line"; 
+    while (my $line=) { 
+	&log($fh,&encode_entities($line,'<>&"')); 
 	@parts=split(/\s+/,$line);
-	$usage=$parts[4];
+	my $usage=$parts[4];
 	$usage=~s/\W//g;
 	if ($usage>90) { 
 	    $warnings++;
@@ -347,39 +255,100 @@ ENDHEADERS
 	if ($usage>95) { $warnings++; $warnings++; $simplestatus{'diskfull'}++; }
     }
     close (DFH);
-    print $fh "
"; + &log($fh,"
"); - print $fh "

ps

"; - print $fh "
";
-    $psproc=0;
+    &log($fh,"

ps

"); + &log($fh,"
");
+    my $psproc=0;
 
-    open (PSH,"ps -aux|");
-    while ($line=) { 
-	print $fh "$line"; 
+    open (PSH,"ps aux --cols 140 |");
+    while (my $line=) { 
+	&log($fh,&encode_entities($line,'<>&"')); 
 	$psproc++;
     }
     close (PSH);
-    print $fh "
"; + &log($fh,"
"); if ($psproc>200) { $notices++; } if ($psproc>250) { $notices++; } &errout($fh); +} + +sub start_logging { + my ($hostdom,$hostrole,$hostname,$spareid)=@_; + my $fh=IO::File->new(">$statusdir/newstatus.html"); + my %simplestatus=(); + my $now=time; + my $date=localtime($now); + + + &log($fh,(< + +LON Status Report $perlvar{'lonHostID'} + + +
+

LON Status Report $perlvar{'lonHostID'}

+

$date ($now)

+
    +
  1. Configuration
  2. +
  3. Machine Information
  4. +
  5. Temporary Files
  6. +
  7. Session Tokens
  8. +
  9. httpd
  10. +
  11. lonsql
  12. +
  13. lond
  14. +
  15. lonc
  16. +
  17. lonhttpd
  18. +
  19. lonnet
  20. +
  21. Connections
  22. +
  23. Delayed Messages
  24. +
  25. Error Count
  26. +
+
+ +

Configuration

+

PerlVars

+ +ENDHEADERS + + foreach my $varname (sort(keys(%perlvar))) { + &log($fh,"\n"); + } + &log($fh,"
$varname". + &encode_entities($perlvar{$varname},'<>&"')."

Hosts

"); + foreach my $id (sort(keys(%{$hostname}))) { + &log($fh, + "\n"); + } + &log($fh,"
$id".$hostdom->{$id}. + "".$hostrole->{$id}. + "".$hostname->{$id}."

Spare Hosts

    "); + foreach my $id (sort(keys(%{$spareid}))) { + &log($fh,"
  1. $id\n
  2. "); + } + &log($fh,"
\n"); + return $fh; +} # --------------------------------------------------------------- clean out tmp - print $fh '

Temporary Files

'; - $cleaned=0; - $old=0; - while ($fname=<$perlvar{'lonDaemons'}/tmp/*>) { +sub clean_tmp { + my ($fh)=@_; + &log($fh,'

Temporary Files

'); + my $cleaned=0; + my $old=0; + while (my $fname=<$perlvar{'lonDaemons'}/tmp/*>) { my ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev,$size, $atime,$mtime,$ctime, $blksize,$blocks)=stat($fname); - $now=time; - $since=$now-$mtime; + my $now=time; + my $since=$now-$mtime; if ($since>$perlvar{'lonExpire'}) { - $line=''; + my $line=''; if (open(PROBE,$fname)) { $line=; close(PROBE); @@ -394,91 +363,81 @@ ENDHEADERS } else { $old++; } } } - } - print $fh "Cleaned up ".$cleaned." files (".$old." old checkout tokens)."; + &log($fh,"Cleaned up ".$cleaned." files (".$old." old checkout tokens)."); +} # ------------------------------------------------------------ clean out lonIDs - print $fh '

Session Tokens

'; - $cleaned=0; - $active=0; - while ($fname=<$perlvar{'lonIDsDir'}/*>) { +sub clean_lonIDs { + my ($fh)=@_; + &log($fh,'

Session Tokens

'); + my $cleaned=0; + my $active=0; + while (my $fname=<$perlvar{'lonIDsDir'}/*>) { my ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev,$size, $atime,$mtime,$ctime, $blksize,$blocks)=stat($fname); - $now=time; - $since=$now-$mtime; + my $now=time; + my $since=$now-$mtime; if ($since>$perlvar{'lonExpire'}) { $cleaned++; - print $fh "Unlinking $fname
"; + &log($fh,"Unlinking $fname
"); unlink("$fname"); } else { $active++; } - } - print $fh "

Cleaned up ".$cleaned." stale session token(s)."; - print $fh "

$active open session(s)

"; + &log($fh,"

Cleaned up ".$cleaned." stale session token(s).

"); + &log($fh,"

$active open session(s)

"); +} -# ----------------------------------------------------------------------- httpd - print $fh '

httpd

Access Log

';
+# ----------------------------------------------------------------------- httpd
+sub check_httpd_logs {
+    my ($fh)=@_;
+    &log($fh,'

httpd

Access Log

');
     
     open (DFH,"tail -n25 /etc/httpd/logs/access_log|");
-    while ($line=) { print $fh "$line" };
+    while (my $line=) { &log($fh,&encode_entities($line,'<>&"')) };
     close (DFH);
-
-    print $fh "

Error Log

";
-
+	
+    &log($fh,"

Error Log

");
+	
     open (DFH,"tail -n25 /etc/httpd/logs/error_log|");
-    while ($line=) { 
-	print $fh "$line";
+    while (my $line=) { 
+	&log($fh,"$line");
 	if ($line=~/\[error\]/) { $notices++; } 
-    };
+    }
     close (DFH);
-    print $fh "
"; + &log($fh,"
"); &errout($fh); - - -# ---------------------------------------------------------------------- lonsql - - &checkon_daemon($fh,'lonsql',200000); - -# ------------------------------------------------------------------------ lond - - &checkon_daemon($fh,'lond',40000,1); - -# ------------------------------------------------------------------------ lonc - - &checkon_daemon($fh,'lonc',40000,1); - -# -------------------------------------------------------------------- lonhttpd - - &checkon_daemon($fh,'lonhttpd',40000); +} # ---------------------------------------------------------------------- lonnet - print $fh '

lonnet

Temp Log

';
+sub rotate_lonnet_logs {
+    my ($fh)=@_;
+    &log($fh,'

lonnet

Temp Log

');
     print "checking logs\n";
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){
 	open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");
-	while ($line=) { 
-	    print $fh "$line";
-	};
+	while (my $line=) { 
+	    &log($fh,&encode_entities($line,'<>&"'));
+	}
 	close (DFH);
     }
-    print $fh "

Perm Log

";
+    &log($fh,"

Perm Log

");
     
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
 	open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
-	while ($line=) { 
-	    print $fh "$line";
-	};
+	while (my $line=) { 
+	    &log($fh,&encode_entities($line,'<>&"'));
+	}
 	close (DFH);
-    } else { print $fh "No perm log\n" }
+    } else { &log($fh,"No perm log\n") }
 
-    $fname="$perlvar{'lonDaemons'}/logs/lonnet.log";
+    my $fname="$perlvar{'lonDaemons'}/logs/lonnet.log";
 
     my ($dev,$ino,$mode,$nlink,
 	$uid,$gid,$rdev,$size,
@@ -486,87 +445,106 @@ ENDHEADERS
 	$blksize,$blocks)=stat($fname);
 
     if ($size>40000) {
-	print $fh "Rotating logs ...

"; + &log($fh,"

Rotating logs ...

"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); } - print $fh "
"; + &log($fh,"
"); &errout($fh); -# ----------------------------------------------------------------- Connections +} - print $fh '

Connections

'; +# ----------------------------------------------------------------- Connections +sub test_connections { + my ($fh,$hostname)=@_; + &log($fh,'

Connections

'); print "testing connections\n"; - print $fh ""; - foreach $tryserver (sort(keys(%hostname))) { + &log($fh,"
"); + my ($good,$bad)=(0,0); + foreach my $tryserver (sort(keys(%{$hostname}))) { print("."); - $answer=reply("pong",$tryserver); + my $result; + my $answer=reply("ping",$tryserver); if ($answer eq "$tryserver:$perlvar{'lonHostID'}") { $result="ok"; + $good++; } else { $result=$answer; $warnings++; - if ($answer eq 'con_lost') { $warnings++; } + if ($answer eq 'con_lost') { + $bad++; + $warnings++; + } else { + $good++; #self connection + } } if ($answer =~ /con_lost/) { print(" $tryserver down\n"); } - print $fh "\n"; - + &log($fh,"\n"); } - print $fh "
$tryserver$result
$tryserver$result
"; - + &log($fh,""); + print "\n$good good, $bad bad connections\n"; &errout($fh); -# ------------------------------------------------------------ Delayed messages +} + - print $fh '

Delayed Messages

'; +# ------------------------------------------------------------ Delayed messages +sub check_delayed_msg { + my ($fh)=@_; + &log($fh,'

Delayed Messages

'); print "checking buffers\n"; + + &log($fh,'

Scanning Permanent Log

'); - print $fh '

Scanning Permanent Log

'; + my $unsend=0; - $unsend=0; - { - my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log"); - while ($line=<$dfh>) { - ($time,$sdf,$dserv,$dcmd)=split(/:/,$line); - if ($sdf eq 'F') { - $local=localtime($time); - print $fh "Failed: $time, $dserv, $dcmd
"; - $warnings++; - } - if ($sdf eq 'S') { $unsend--; } - if ($sdf eq 'D') { $unsend++; } + my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log"); + while (my $line=<$dfh>) { + my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line); + if ($sdf eq 'F') { + my $local=localtime($time); + &log($fh,"Failed: $time, $dserv, $dcmd
"); + $warnings++; } + if ($sdf eq 'S') { $unsend--; } + if ($sdf eq 'D') { $unsend++; } } - print $fh "Total unsend messages: $unsend

\n"; + + &log($fh,"

Total unsend messages: $unsend

\n"); $warnings=$warnings+5*$unsend; if ($unsend) { $simplestatus{'unsend'}=$unsend; } - print $fh "

Outgoing Buffer

"; + &log($fh,"

Outgoing Buffer

\n
");
 
     open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
-    while ($line=) { 
-	print $fh "$line
"; - }; + while (my $line=) { + &log($fh,&encode_entities($line,'<>&"')); + } + &log($fh,"
\n"); close (DFH); +} -# ------------------------------------------------------------------------- End - print $fh "
\n"; +sub finish_logging { + my ($fh)=@_; + &log($fh,"\n"); $totalcount=$notices+4*$warnings+100*$errors; &errout($fh); - print $fh "

Total Error Count: $totalcount

"; - $now=time; - $date=localtime($now); - print $fh "
$date ($now)\n"; + &log($fh,"

Total Error Count: $totalcount

"); + my $now=time; + my $date=localtime($now); + &log($fh,"
$date ($now)\n"); print "lon-status webpage updated\n"; $fh->close(); + + if ($errors) { $simplestatus{'errors'}=$errors; } + if ($warnings) { $simplestatus{'warnings'}=$warnings; } + if ($notices) { $simplestatus{'notices'}=$notices; } + $simplestatus{'time'}=time; } -if ($errors) { $simplestatus{'errors'}=$errors; } -if ($warnings) { $simplestatus{'warnings'}=$warnings; } -if ($notices) { $simplestatus{'notices'}=$notices; } -$simplestatus{'time'}=time; -rename ("$statusdir/newstatus.html","$statusdir/index.html"); -{ +sub log_simplestatus { + rename ("$statusdir/newstatus.html","$statusdir/index.html"); + my $sfh=IO::File->new(">$statusdir/loncron_simple.txt"); foreach (keys %simplestatus) { print $sfh $_.'='.$simplestatus{$_}.'&'; @@ -574,15 +552,149 @@ rename ("$statusdir/newstatus.html","$st print $sfh "\n"; $sfh->close(); } -if ($totalcount>200) { + +sub send_mail { print "sending mail\n"; - $emailto="$perlvar{'lonAdmEMail'}"; - if ($totalcount>1000) { + my $emailto="$perlvar{'lonAdmEMail'}"; + if ($totalcount>2500) { $emailto.=",$perlvar{'lonSysEMail'}"; } - $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices"; - system("metasend -b -t $emailto -s '$subj' -f $statusdir/index.html -m text/html"); + my $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices"; + + my $result=system("metasend -b -S 4000000 -t $emailto -s '$subj' -f $statusdir/index.html -m text/html >& /dev/null"); + if ($result != 0) { + $result=system("mail -s '$subj' $emailto < $statusdir/index.html"); + } +} + +sub usage { + print(< \$help, + "oldlonc" => \$oldlonc, + "justcheckdaemons" => \$justcheckdaemons, + "noemail" => \$noemail, + "justcheckconnections" => \$justcheckconnections + ); + if ($help) { &usage(); return; } +# --------------------------------- Read loncapa_apache.conf and loncapa.conf + my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); + %perlvar=%{$perlvarref}; + undef $perlvarref; + delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed + delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed + +# --------------------------------------- Make sure that LON-CAPA is configured +# I only test for one thing here (lonHostID). This is just a safeguard. + if ('{[[[[lonHostID]]]]}' eq $perlvar{'lonHostID'}) { + print("Unconfigured machine.\n"); + my $emailto=$perlvar{'lonSysEMail'}; + my $hostname=`/bin/hostname`; + chop $hostname; + $hostname=~s/[^\w\.]//g; # make sure is safe to pass through shell + my $subj="LON: Unconfigured machine $hostname"; + system("echo 'Unconfigured machine $hostname.' |\ + mailto $emailto -s '$subj' > /dev/null"); + exit 1; + } + +# ----------------------------- Make sure this process is running from user=www + my $wwwid=getpwnam('www'); + if ($wwwid!=$<) { + print("User ID mismatch. This program must be run as user 'www'\n"); + my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; + my $subj="LON: $perlvar{'lonHostID'} User ID mismatch"; + system("echo 'User ID mismatch. loncron must be run as user www.' |\ + mailto $emailto -s '$subj' > /dev/null"); + exit 1; + } + +# ------------------------------------------------------------- Read hosts file + my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab"); + + my (%hostname,%hostdom,%hostrole,%spareid); + while (my $configline=<$config>) { + next if ($configline =~ /^(\#|\s*\$)/); + my ($id,$domain,$role,$name)=split(/:/,$configline); + if ($id && $domain && $role && $name) { + $name=~s/\s//g; + $hostname{$id}=$name; + $hostdom{$id}=$domain; + $hostrole{$id}=$role; + } + } + undef $config; + +# ------------------------------------------------------ Read spare server file + $config=IO::File->new("$perlvar{'lonTabDir'}/spare.tab"); + + while (my $configline=<$config>) { + chomp($configline); + if (($configline) && ($configline ne $perlvar{'lonHostID'})) { + $spareid{$configline}=1; + } + } + undef $config; + +# ---------------------------------------------------------------- Start report + + $errors=0; + $warnings=0; + $notices=0; + + + my $fh; + if (!$justcheckdaemons && !$justcheckconnections) { + $fh=&start_logging(\%hostdom,\%hostrole,\%hostname,\%spareid); + + &log_machine_info($fh); + &clean_tmp($fh); + &clean_lonIDs($fh); + &check_httpd_logs($fh); + &rotate_lonnet_logs($fh); + } + if (!$justcheckconnections) { + &checkon_daemon($fh,'lonsql',200000); + &checkon_daemon($fh,'lond',40000,1); + my $args='new'; + if ($oldlonc) { $args = ''; } + &checkon_daemon($fh,'lonc',40000,1,$args); + &checkon_daemon($fh,'lonhttpd',40000); + &checkon_daemon($fh,'lonmemcached',40000); + } + if (!$justcheckdaemons) { + &test_connections($fh,\%hostname); + } + if (!$justcheckdaemons && !$justcheckconnections) { + &check_delayed_msg($fh); + &finish_logging($fh); + &log_simplestatus(); + + if ($totalcount>200 && !$noemail) { &send_mail(); } + } } + +&main(); 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.