--- loncom/loncron 2004/05/11 19:15:03 1.47 +++ loncom/loncron 2004/06/09 13:30:41 1.53 @@ -2,7 +2,7 @@ # Housekeeping program, started by cron, loncontrol and loncron.pl # -# $Id: loncron,v 1.47 2004/05/11 19:15:03 albertel Exp $ +# $Id: loncron,v 1.53 2004/06/09 13:30:41 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -28,13 +28,15 @@ # $|=1; +use strict; use lib '/home/httpd/lib/perl/'; use LONCAPA::Configuration; use IO::File; use IO::Socket; -use strict; +use HTML::Entities; +use Getopt::Long; #globals use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount); @@ -66,25 +68,33 @@ sub log { sub errout { my $fh=shift; &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) { - &log($fh,"Seems like it started ...

"); + &log($fh,"

Seems like it started ...

"); my $lfh=IO::File->new("$pidfile"); my $daemonpid=<$lfh>; chomp($daemonpid); @@ -95,15 +105,15 @@ sub start_daemon { return 0; } } - &log($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)=@_; - &log($fh,'

'.$daemon.'

Log

');
+    &log($fh,'

'.$daemon.'

Log

'); printf("%-10s ",$daemon); if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){ open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|"); @@ -115,7 +125,7 @@ sub checkon_daemon { }; close (DFH); } - &log($fh,"

"); + &log($fh,"

"); my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid"; @@ -150,16 +160,16 @@ sub checkon_daemon { '
'); &log($fh,"

$daemon not running, trying to start

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

$daemon at pid $daemonpid responding

"); $simplestatus{$daemon}='restarted'; print "started\n"; } else { $errors++; &log($fh,"

$daemon at pid $daemonpid not responding

"); - &log($fh,"Give it one more try ...

"); + &log($fh,"

Give it one more try ...

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

$daemon at pid $daemonpid responding

"); $simplestatus{$daemon}='restarted'; print "started\n"; @@ -168,7 +178,7 @@ sub checkon_daemon { $simplestatus{$daemon}='failed'; $errors++; $errors++; &log($fh,"

$daemon at pid $daemonpid not responding

"); - &log($fh,"Unable to start $daemon

"); + &log($fh,"

Unable to start $daemon

"); } } @@ -181,7 +191,7 @@ sub checkon_daemon { if ($line=~/CRITICAL/) { $notices++; } }; close (DFH); - &log($fh,""); + &log($fh,"

"); } } @@ -193,7 +203,7 @@ sub checkon_daemon { $blksize,$blocks)=stat($fname); if ($size>$maxsize) { - &log($fh,"Rotating logs ...

"); + &log($fh,"

Rotating logs ...

"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); @@ -205,7 +215,7 @@ sub checkon_daemon { # --------------------------------------------------------------------- Machine sub log_machine_info { my ($fh)=@_; - &log($fh,'

Machine Information

'); + &log($fh,'

Machine Information

'); &log($fh,"

loadavg

"); open (LOADAVGH,"/proc/loadavg"); @@ -228,7 +238,7 @@ sub log_machine_info { open (DFH,"df|"); while (my $line=) { - &log($fh,"$line"); + &log($fh,&encode_entities($line,'<>&"')); @parts=split(/\s+/,$line); my $usage=$parts[4]; $usage=~s/\W//g; @@ -250,9 +260,9 @@ sub log_machine_info { &log($fh,"
");
     my $psproc=0;
 
-    open (PSH,"ps -aux --cols 140 |");
+    open (PSH,"ps aux --cols 140 |");
     while (my $line=) { 
-	&log($fh,"$line"); 
+	&log($fh,&encode_entities($line,'<>&"')); 
 	$psproc++;
     }
     close (PSH);
@@ -278,35 +288,36 @@ sub start_logging {
 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 Coindex.html.unt +
  14. Configuration
  15. +
  16. Machine Information
  17. +
  18. Temporary Files
  19. +
  20. Session Tokens
  21. +
  22. httpd
  23. +
  24. lonsql
  25. +
  26. lond
  27. +
  28. lonc
  29. +
  30. lonhttpd
  31. +
  32. lonnet
  33. +
  34. Connections
  35. +
  36. Delayed Messages
  37. +
  38. Error Count
-
- +
+

Configuration

PerlVars

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

Hosts

"); + &log($fh,"

Hosts

"); foreach my $id (sort(keys(%{$hostname}))) { &log($fh, "
$id".$hostdom->{$id}. @@ -315,7 +326,7 @@ ENDHEADERS } &log($fh,"

Spare Hosts

    "); foreach my $id (sort(keys(%{$spareid}))) { - &log($fh,"
  1. $id\n"); + &log($fh,"
  2. $id\n
  3. "); } &log($fh,"
\n"); return $fh; @@ -324,7 +335,7 @@ ENDHEADERS # --------------------------------------------------------------- clean out tmp sub clean_tmp { my ($fh)=@_; - &log($fh,'

Temporary Files

'); + &log($fh,'

Temporary Files

'); my $cleaned=0; my $old=0; while (my $fname=<$perlvar{'lonDaemons'}/tmp/*>) { @@ -357,7 +368,7 @@ sub clean_tmp { # ------------------------------------------------------------ clean out lonIDs sub clean_lonIDs { my ($fh)=@_; - &log($fh,'

Session Tokens

'); + &log($fh,'

Session Tokens

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

Cleaned up ".$cleaned." stale session token(s)."); + &log($fh,"

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

"); &log($fh,"

$active open session(s)

"); } @@ -383,10 +394,10 @@ sub clean_lonIDs { # ----------------------------------------------------------------------- httpd sub check_httpd_logs { my ($fh)=@_; - &log($fh,'

httpd

Access Log

');
+    &log($fh,'

httpd

Access Log

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

Error Log

");
@@ -403,14 +414,14 @@ sub check_httpd_logs {
 
 # ---------------------------------------------------------------------- lonnet
 
-sub rotate_logs {
+sub rotate_lonnet_logs {
     my ($fh)=@_;
-    &log($fh,'

lonnet

Temp Log

');
+    &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 (my $line=) { 
-	    &log($fh,"$line");
+	    &log($fh,&encode_entities($line,'<>&"'));
 	}
 	close (DFH);
     }
@@ -419,7 +430,7 @@ sub rotate_logs {
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
 	open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
 	while (my $line=) { 
-	    &log($fh,"$line");
+	    &log($fh,&encode_entities($line,'<>&"'));
 	}
 	close (DFH);
     } else { &log($fh,"No perm log\n") }
@@ -432,7 +443,7 @@ sub rotate_logs {
 	$blksize,$blocks)=stat($fname);
 
     if ($size>40000) {
-	&log($fh,"Rotating logs ...

"); + &log($fh,"

Rotating logs ...

"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); @@ -445,25 +456,32 @@ sub rotate_logs { # ----------------------------------------------------------------- Connections sub test_connections { my ($fh,$hostname)=@_; - &log($fh,'

Connections

'); + &log($fh,'

Connections

'); print "testing connections\n"; - &log($fh,""); + &log($fh,"
"); + my ($good,$bad)=(0,0); foreach my $tryserver (sort(keys(%{$hostname}))) { print("."); my $result; my $answer=reply("pong",$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"); } &log($fh,"\n"); } &log($fh,"
$tryserver$result
"); - + print "\n$good good, $bad bad connections\n"; &errout($fh); } @@ -471,7 +489,7 @@ sub test_connections { # ------------------------------------------------------------ Delayed messages sub check_delayed_msg { my ($fh)=@_; - &log($fh,'

Delayed Messages

'); + &log($fh,'

Delayed Messages

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

Scanning Permanent Log

'); @@ -490,28 +508,29 @@ sub check_delayed_msg { if ($sdf eq 'D') { $unsend++; } } - &log($fh,"Total unsend messages: $unsend

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

Total unsend messages: $unsend

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

Outgoing Buffer

"); + &log($fh,"

Outgoing Buffer

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

Total Error Count: $totalcount

"); my $now=time; my $date=localtime($now); - &log($fh,"
$date ($now)\n"); + &log($fh,"
$date ($now)\n"); print "lon-status webpage updated\n"; $fh->close(); @@ -539,11 +558,43 @@ sub send_mail { $emailto.=",$perlvar{'lonSysEMail'}"; } my $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 $result=system("metasend -b -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}; @@ -581,15 +632,12 @@ sub main () { my (%hostname,%hostdom,%hostrole,%spareid); while (my $configline=<$config>) { + next if ($configline =~ /^(\#|\s*\$)/); my ($id,$domain,$role,$name,$ip,$domdescr)=split(/:/,$configline); if ($id && $domain && $role && $name && $ip) { $hostname{$id}=$name; $hostdom{$id}=$domain; $hostrole{$id}=$role; - } else { - if ($configline) { -# &logthis("Skipping hosts.tab line -$configline-"); - } } } undef $config; @@ -611,24 +659,35 @@ sub main () { $warnings=0; $notices=0; - my $fh=&start_logging(\%hostdom,\%hostrole,\%hostname,\%spareid); - - &log_machine_info($fh); - &clean_tmp($fh); - &clean_lonIDs($fh); - &check_httpd_logs($fh); - &checkon_daemon($fh,'lonsql',200000); - &checkon_daemon($fh,'lond',40000,1); - &checkon_daemon($fh,'lonc',40000,1); - &checkon_daemon($fh,'lonhttpd',40000); - - &test_connections($fh,\%hostname); - &check_delayed_msg($fh); - - &finish_logging($fh); - &log_simplestatus(); - if ($totalcount>200) { &send_mail(); } + 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); + } + 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();