Diff for /loncom/loncron between versions 1.1 and 1.53

version 1.1, 1999/10/13 17:48:51 version 1.53, 2004/06/09 13:30:41
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
   
 # The LearningOnline Network  # Housekeeping program, started by cron, loncontrol and loncron.pl
 # Housekeeping program, started by cron  
 #  #
 # (TCP networking package  # $Id$
 # 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)  
 #  #
 # 7/14,7/15,7/19,7/21,7/22 Gerd Kortemeyer  # 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/
   #
   
   $|=1;
   use strict;
   
   use lib '/home/httpd/lib/perl/';
   use LONCAPA::Configuration;
   
 use IO::File;  use IO::File;
 use IO::Socket;  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  # -------------------------------------------------- Non-critical communication
 sub reply {  sub reply {
Line 29  sub reply { Line 60  sub reply {
   
 # --------------------------------------------------------- Output error status  # --------------------------------------------------------- Output error status
   
   sub log {
       my $fh=shift;
       if ($fh) { print $fh @_  }
   }
   
 sub errout {  sub errout {
    my $fh=shift;     my $fh=shift;
    print $fh (<<ENDERROUT);     &log($fh,(<<ENDERROUT));
      <p><table border=2 bgcolor="#CCCCCC">       <table border="2" bgcolor="#CCCCCC">
      <tr><td>Notices</td><td>$notices</td></tr>       <tr><td>Notices</td><td>$notices</td></tr>
      <tr><td>Warnings</td><td>$warnings</td></tr>       <tr><td>Warnings</td><td>$warnings</td></tr>
      <tr><td>Errors</td><td>$errors</td></tr>       <tr><td>Errors</td><td>$errors</td></tr>
      </table><p><a href="#top">Top</a><p>       </table><p><a href="#top">Top</a></p>
 ENDERROUT  ENDERROUT
 }  }
   
 # -------------------------------------------------------------- Permanent logs  sub start_daemon {
 sub logperm {      my ($fh,$daemon,$pidfile,$args) = @_;
     my $message=shift;      my $progname=$daemon;
     my $execdir=$perlvar{'lonDaemons'};      if ($daemon eq 'lonc' && $args eq 'new') {
     my $now=time;   $progname='loncnew'; 
     my $local=localtime($now);   print "new ";
     my $fh=Apache::File->new(">>$execdir/logs/lonnet.perm.log");  
     print $fh "$now:$message:$local\n";  
     return 1;  
 }  
   
 # ------------------------------------------------ Try to send delayed messages  
 sub senddelayed {  
     my $fh=shift;  
     my $dfname;  
     my $path="$perlvar{'lonSockDir'}/delayed";  
     print $fh "<h3>Attempting to send delayed messages</h3>";  
     while ($dfname=<$path/*>) {  
         my $wcmd;  
         {  
          my $dfh=IO::File->new($dfname);  
          $wcmd=<$dfh>;  
         }  
         my ($server,$cmd)=split(/:/,$wcmd);  
         chomp($cmd);  
         my $answer=reply($cmd,$server);  
         if ($answer ne 'con_lost') {  
     unlink("$dfname");  
             print $fh "Send $cmd to $server: $answer<br>\n";  
             &logperm("S:$server:$cmd");  
         } else {  
             print $fh "Failed to deliver $cmd to $server<br>\n";  
             $warnings++;  
         }          
     }      }
       my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors";
       my $size=(stat($error_fname))[7];
       if ($size>40000) {
    &log($fh,"<p>Rotating error logs ...</p>");
    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,"<p>Seems like it started ...</p>");
    my $lfh=IO::File->new("$pidfile");
    my $daemonpid=<$lfh>;
    chomp($daemonpid);
    sleep 2;
    if (kill 0 => $daemonpid) {
       return 1;
    } else {
       return 0;
    }
       }
       &log($fh,"<p>Seems like that did not work!</p>");
       $errors++;
       return 0;
 }  }
   
 # ================================================================ Main Program  sub checkon_daemon {
       my ($fh,$daemon,$maxsize,$sendusr1,$args)=@_;
   
 # ------------------------------------------------------------ Read access.conf  
 {  
     my $config=IO::File->new("/etc/httpd/conf/access.conf");  
   
     while (my $configline=<$config>) {      &log($fh,'<hr /><a name="'.$daemon.'" /><h2>'.$daemon.'</h2><h3>Log</h3><p style="white-space: pre;"><tt>');
         if ($configline =~ /PerlSetVar/) {      printf("%-10s ",$daemon);
    my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);      if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
            $perlvar{$varname}=$varvalue;   open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|");
         }   while (my $line=<DFH>) { 
       &log($fh,"$line");
       if ($line=~/INFO/) { $notices++; }
       if ($line=~/WARNING/) { $notices++; }
       if ($line=~/CRITICAL/) { $warnings++; }
    };
    close (DFH);
       }
       &log($fh,"</tt></p>");
       
       my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";
       
       my $restartflag=1;
       my $daemonpid;
       if (-e $pidfile) {
    my $lfh=IO::File->new("$pidfile");
    $daemonpid=<$lfh>;
    chomp($daemonpid);
    if (kill 0 => $daemonpid) {
       &log($fh,"<h3>$daemon at pid $daemonpid responding");
       if ($sendusr1) { &log($fh,", sending USR1"); }
       &log($fh,"</h3>");
       if ($sendusr1) { kill USR1 => $daemonpid; }
       $restartflag=0;
       print "running\n";
    } else {
       $errors++;
       &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
       $restartflag=1;
       &log($fh,"<h3>Decided to clean up stale .pid file and restart $daemon</h3>");
    }
       }
       if ($restartflag==1) {
    $simplestatus{$daemon}='off';
    $errors++;
    &log($fh,'<br><font color="red">Killall '.$daemon.': '.
       `killall $daemon 2>&1`.' - ');
    sleep 2;
    &log($fh,unlink($pidfile).' - '.
       `killall -9 $daemon 2>&1`.
       '</font><br>');
    &log($fh,"<h3>$daemon not running, trying to start</h3>");
   
    if (&start_daemon($fh,$daemon,$pidfile,$args)) {
       &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");
       $simplestatus{$daemon}='restarted';
       print "started\n";
    } else {
       $errors++;
       &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
       &log($fh,"<p>Give it one more try ...</p>");
       print " ";
       if (&start_daemon($fh,$daemon,$pidfile,$args)) {
    &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");
    $simplestatus{$daemon}='restarted';
    print "started\n";
       } else {
    print " failed\n";
    $simplestatus{$daemon}='failed';
    $errors++; $errors++;
    &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
    &log($fh,"<p>Unable to start $daemon</p>");
       }
    }
   
    if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
       &log($fh,"<p><pre>");
       open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");
       while (my $line=<DFH>) { 
    &log($fh,"$line");
    if ($line=~/WARNING/) { $notices++; }
    if ($line=~/CRITICAL/) { $notices++; }
       };
       close (DFH);
       &log($fh,"</pre></p>");
    }
       }
       
       my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log";
       
       my ($dev,$ino,$mode,$nlink,
    $uid,$gid,$rdev,$size,
    $atime,$mtime,$ctime,
    $blksize,$blocks)=stat($fname);
       
       if ($size>$maxsize) {
    &log($fh,"<p>Rotating logs ...</p>");
    rename("$fname.2","$fname.3");
    rename("$fname.1","$fname.2");
    rename("$fname","$fname.1");
     }      }
 }  
   
 # ------------------------------------------------------------- Read hosts file      &errout($fh);
 {  }
     my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab");  
   
     while (my $configline=<$config>) {  # --------------------------------------------------------------------- Machine
        my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);  sub log_machine_info {
        $hostname{$id}=$name;      my ($fh)=@_;
        $hostdom{$id}=$domain;      &log($fh,'<hr /><a name="machine" /><h2>Machine Information</h2>');
        $hostrole{$id}=$role;      &log($fh,"<h3>loadavg</h3>");
        $hostip{$id}=$ip;  
        if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) {      open (LOADAVGH,"/proc/loadavg");
    $libserv{$id}=$name;      my $loadavg=<LOADAVGH>;
        }      close (LOADAVGH);
       
       &log($fh,"<tt>$loadavg</tt>");
       
       my @parts=split(/\s+/,$loadavg);
       if ($parts[1]>4.0) {
    $errors++;
       } elsif ($parts[1]>2.0) {
    $warnings++;
       } elsif ($parts[1]>1.0) {
    $notices++;
     }      }
 }  
   
 # ------------------------------------------------------ Read spare server file      &log($fh,"<h3>df</h3>");
 {      &log($fh,"<pre>");
     my $config=IO::File->new("$perlvar{'lonTabDir'}/spare.tab");  
   
     while (my $configline=<$config>) {      open (DFH,"df|");
        chomp($configline);      while (my $line=<DFH>) { 
        if (($configline) && ($configline ne $perlvar{'lonHostID'})) {   &log($fh,&encode_entities($line,'<>&"')); 
           $spareid{$configline}=1;   @parts=split(/\s+/,$line);
        }   my $usage=$parts[4];
    $usage=~s/\W//g;
    if ($usage>90) { 
       $warnings++;
       $notices++; 
    } elsif ($usage>80) {
       $warnings++;
    } elsif ($usage>60) {
       $notices++;
    }
    if ($usage>95) { $warnings++; $warnings++; $simplestatus{'diskfull'}++; }
     }      }
 }      close (DFH);
       &log($fh,"</pre>");
   
 # ---------------------------------------------------------------- Start report  
   
 $statusdir="/home/httpd/html/lon-status";      &log($fh,"<h3>ps</h3>");
       &log($fh,"<pre>");
       my $psproc=0;
   
       open (PSH,"ps aux --cols 140 |");
       while (my $line=<PSH>) { 
    &log($fh,&encode_entities($line,'<>&"')); 
    $psproc++;
       }
       close (PSH);
       &log($fh,"</pre>");
   
 $errors=0;      if ($psproc>200) { $notices++; }
 $warnings=0;      if ($psproc>250) { $notices++; }
 $notices=0;  
   
 $now=time;      &errout($fh);
 $date=localtime($now);  }
   
 {  sub start_logging {
 my $fh=IO::File->new(">$statusdir/newstatus.html");      my ($hostdom,$hostrole,$hostname,$spareid)=@_;
       my $fh=IO::File->new(">$statusdir/newstatus.html");
       my %simplestatus=();
       my $now=time;
       my $date=localtime($now);
       
   
 print $fh (<<ENDHEADERS);      &log($fh,(<<ENDHEADERS));
 <html>  <html>
 <head>  <head>
 <title>LON Status Report $perlvar{'lonHostID'}</title>  <title>LON Status Report $perlvar{'lonHostID'}</title>
 </head>  </head>
 <body bgcolor="#FFFFFF">  <body bgcolor="#AAAAAA">
 <a name="top">  <a name="top" />
 <h1>LON Status Report $perlvar{'lonHostID'}</h1>  <h1>LON Status Report $perlvar{'lonHostID'}</h1>
 <h2>$date ($now)</h2>  <h2>$date ($now)</h2>
 <ol>  <ol>
 <li><a href="#configuration">Configuration</a>  <li><a href="#configuration">Configuration</a></li>
 <li><a href="#machine">Machine Information</a>  <li><a href="#machine">Machine Information</a></li>
 <li><a href="#httpd">httpd</a>  <li><a href="#tmp">Temporary Files</a></li>
 <li><a href="#lond">lond</a>  <li><a href="#tokens">Session Tokens</a></li>
 <li><a href="#lonc">lonc</a>  <li><a href="#httpd">httpd</a></li>
 <li><a href="#lonnet">lonnet</a>  <li><a href="#lonsql">lonsql</a></li>
 <li><a href="#connections">Connections</a>  <li><a href="#lond">lond</a></li>
 <li><a href="#delayed">Delayed Messages</a>  <li><a href="#lonc">lonc</a></li>
 <li><a href="#errcount">Error Count</a>  <li><a href="#lonhttpd">lonhttpd</a></li>
   <li><a href="#lonnet">lonnet</a></li>
   <li><a href="#connections">Connections</a></li>
   <li><a href="#delayed">Delayed Messages</a></li>
   <li><a href="#errcount">Error Count</a></li>
 </ol>  </ol>
 <hr>  <hr />
 <a name="configuration">  <a name="configuration" />
 <h2>Configuration</h2>  <h2>Configuration</h2>
 <h3>PerlVars</h3>  <h3>PerlVars</h3>
 <table border=2>  <table border="2">
 ENDHEADERS  ENDHEADERS
   
 foreach $varname (keys %perlvar) {      foreach my $varname (sort(keys(%perlvar))) {
     print $fh "<tr><td>$varname</td><td>$perlvar{$varname}</td></tr>\n";   &log($fh,"<tr><td>$varname</td><td>".
        &encode_entities($perlvar{$varname},'<>&"')."</td></tr>\n");
       }
       &log($fh,"</table><h3>Hosts</h3><table border='2'>");
       foreach my $id (sort(keys(%{$hostname}))) {
    &log($fh,
       "<tr><td>$id</td><td>".$hostdom->{$id}.
       "</td><td>".$hostrole->{$id}.
       "</td><td>".$hostname->{$id}."</td></tr>\n");
       }
       &log($fh,"</table><h3>Spare Hosts</h3><ol>");
       foreach my $id (sort(keys(%{$spareid}))) {
    &log($fh,"<li>$id\n</li>");
       }
       &log($fh,"</ol>\n");
       return $fh;
   }
   
   # --------------------------------------------------------------- clean out tmp
   sub clean_tmp {
       my ($fh)=@_;
       &log($fh,'<hr /><a name="tmp" /><h2>Temporary Files</h2>');
       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);
    my $now=time;
    my $since=$now-$mtime;
    if ($since>$perlvar{'lonExpire'}) {
       my $line='';
       if (open(PROBE,$fname)) {
    $line=<PROBE>;
    close(PROBE);
       }
       unless ($line=~/^CHECKOUTTOKEN\&/) {
    $cleaned++;
    unlink("$fname");
       } else {
    if ($since>365*$perlvar{'lonExpire'}) {
       $cleaned++;
       unlink("$fname");
    } else { $old++; }
       }
    }
       }
       &log($fh,"Cleaned up ".$cleaned." files (".$old." old checkout tokens).");
 }  }
 print $fh "</table><h3>Hosts</h3><table border=2>";  
 foreach $id (keys %hostname) {  # ------------------------------------------------------------ clean out lonIDs
 print $fh   sub clean_lonIDs {
     "<tr><td>$id</td><td>$hostdom{$id}</td><td>$hostrole{$id}</td>";      my ($fh)=@_;
 print $fh "<td>$hostname{$id}</td><td>$hostip{$id}</td></tr>\n";      &log($fh,'<hr /><a name="tokens" /><h2>Session Tokens</h2>');
       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);
    my $now=time;
    my $since=$now-$mtime;
    if ($since>$perlvar{'lonExpire'}) {
       $cleaned++;
       &log($fh,"Unlinking $fname<br>");
       unlink("$fname");
    } else {
       $active++;
    }
       }
       &log($fh,"<p>Cleaned up ".$cleaned." stale session token(s).</p>");
       &log($fh,"<h3>$active open session(s)</h3>");
 }  }
 print $fh "</table><h3>Spare Hosts</h3><ol>";  
 foreach $id (keys %spareid) {  
     print $fh "<li>$id\n";  # ----------------------------------------------------------------------- httpd
   sub check_httpd_logs {
       my ($fh)=@_;
       &log($fh,'<hr /><a name="httpd" /><h2>httpd</h2><h3>Access Log</h3><pre>');
       
       open (DFH,"tail -n25 /etc/httpd/logs/access_log|");
       while (my $line=<DFH>) { &log($fh,&encode_entities($line,'<>&"')) };
       close (DFH);
   
       &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);
 }  }
   
 print $fh "</ol>\n";  # ---------------------------------------------------------------------- lonnet
   
 # --------------------------------------------------------------------- Machine  sub rotate_lonnet_logs {
       my ($fh)=@_;
       &log($fh,'<hr /><a name="lonnet" /><h2>lonnet</h2><h3>Temp Log</h3><pre>');
       print "checking logs\n";
       if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){
    open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");
    while (my $line=<DFH>) { 
       &log($fh,&encode_entities($line,'<>&"'));
    }
    close (DFH);
       }
       &log($fh,"</pre><h3>Perm Log</h3><pre>");
       
       if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
    open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
    while (my $line=<DFH>) { 
       &log($fh,&encode_entities($line,'<>&"'));
    }
    close (DFH);
       } else { &log($fh,"No perm log\n") }
   
       my $fname="$perlvar{'lonDaemons'}/logs/lonnet.log";
   
       my ($dev,$ino,$mode,$nlink,
    $uid,$gid,$rdev,$size,
    $atime,$mtime,$ctime,
    $blksize,$blocks)=stat($fname);
   
       if ($size>40000) {
    &log($fh,"<p>Rotating logs ...</p>");
    rename("$fname.2","$fname.3");
    rename("$fname.1","$fname.2");
    rename("$fname","$fname.1");
       }
   
 print $fh '<hr><a name="machine"><h2>Machine Information</h2>';      &log($fh,"</pre>");
 print $fh "<h3>loadavg</h3>";      &errout($fh);
   }
   
 open (LOADAVGH,"/proc/loadavg");  # ----------------------------------------------------------------- Connections
 $loadavg=<LOADAVGH>;  sub test_connections {
 close (LOADAVGH);      my ($fh,$hostname)=@_;
       &log($fh,'<hr /><a name="connections" /><h2>Connections</h2>');
       print "testing connections\n";
       &log($fh,"<table border='2'>");
       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="<b>ok</b>";
       $good++;
    } else {
       $result=$answer;
       $warnings++;
       if ($answer eq 'con_lost') {
    $bad++;
    $warnings++;
       } else {
    $good++; #self connection
       }
    }
    if ($answer =~ /con_lost/) { print(" $tryserver down\n"); }
    &log($fh,"<tr><td>$tryserver</td><td>$result</td></tr>\n");
       }
       &log($fh,"</table>");
       print "\n$good good, $bad bad connections\n";
       &errout($fh);
   }
   
 print $fh "<tt>$loadavg</tt>";  
   
 @parts=split(/\s+/,$loadavg);  # ------------------------------------------------------------ Delayed messages
 if ($parts[1]>3.0) {  sub check_delayed_msg {
     $errors++;      my ($fh)=@_;
 } elsif ($parts[1]>2.0) {      &log($fh,'<hr /><a name="delayed" /><h2>Delayed Messages</h2>');
     $warnings++;      print "checking buffers\n";
 } elsif ($parts[1]>1.0) {      
     $notices++;      &log($fh,'<h3>Scanning Permanent Log</h3>');
 }  
   
 print $fh "<h3>df</h3>";  
 print $fh "<pre>";  
   
 open (DFH,"df|");  
 while ($line=<DFH>) {   
    print $fh "$line";   
    @parts=split(/\s+/,$line);  
    $usage=$parts[4];  
    $usage=~s/\W//g;  
    if ($usage>90) {   
       $errors++;   
    } elsif ($usage>80) {  
       $warnings++;  
    } elsif ($usage>60) {  
       $notices++;  
    }  
    if ($usage>95) { $errors++; }  
 }  
 close (DFH);  
 print $fh "</pre>";  
 &errout($fh);  
 # ----------------------------------------------------------------------- httpd  
   
 print $fh '<hr><a name="httpd"><h2>httpd</h2><h3>Access Log</h3><pre>';      my $unsend=0;
   
 open (DFH,"tail -n40 /etc/httpd/logs/access_log|");      my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");
 while ($line=<DFH>) { print $fh "$line" };      while (my $line=<$dfh>) {
 close (DFH);   my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line);
    if ($sdf eq 'F') { 
 print $fh "</pre><h3>Error Log</h3><pre>";      my $local=localtime($time);
       &log($fh,"<b>Failed: $time, $dserv, $dcmd</b><br>");
 open (DFH,"tail -n50 /etc/httpd/logs/error_log|");      $warnings++;
 while ($line=<DFH>) {    }
    print $fh "$line";   if ($sdf eq 'S') { $unsend--; }
    if ($line=~/\[error\]/) { $notices++; }    if ($sdf eq 'D') { $unsend++; }
 };      }
 close (DFH);  
 print $fh "</pre>";  
 &errout($fh);  
 # ------------------------------------------------------------------------ lond  
   
 print $fh '<hr><a name="lond"><h2>lond</h2><h3>Log</h3><pre>';  
   
 if (-e "$perlvar{'lonDaemons'}/logs/lond.log"){  
 open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lond.log|");  
 while ($line=<DFH>) {   
    print $fh "$line";  
    if ($line=~/giving up/) { $notices++; }  
 };  
 close (DFH);  
 }  
 print $fh "</pre>";  
   
 my $londfile="$perlvar{'lonDaemons'}/logs/lond.pid";  
   
 if (-e $londfile) {  
    my $lfh=IO::File->new("$londfile");  
    my $londpid=<$lfh>;  
    chomp($londpid);  
    if (kill 0 => $londpid) {  
       print $fh "<h3>lond at pid $londpid responding</h3>";  
    } else {  
       $errors++; $errors++;  
       print $fh "<h3>lond at pid $londpid not responding</h3>";  
    }  
 } else {  
    $errors++;  
    print $fh "<h3>lond not running, trying to start</h3>";  
    system("$perlvar{'lonDaemons'}/lond");  
    sleep 120;  
    if (-e $londfile) {  
        print $fh "Seems like it started ...<p>";  
        my $lfh=IO::File->new("$londfile");  
        my $londpid=<$lfh>;  
        chomp($londpid);  
        sleep 30;  
        if (kill 0 => $londpid) {  
           print $fh "<h3>lond at pid $londpid responding</h3>";  
        } else {  
           $errors++; $errors++;  
           print $fh "<h3>lond at pid $londpid not responding</h3>";  
           print $fh "Give it one more try ...<p>";  
           system("$perlvar{'lonDaemons'}/lond");  
           sleep 120;  
        }  
    } else {  
        print $fh "Seems like that did not work!<p>";  
        $errors++;  
    }  
 }  
   
 $fname="$perlvar{'lonDaemons'}/logs/lond.log";  
   
                           my ($dev,$ino,$mode,$nlink,  
                               $uid,$gid,$rdev,$size,  
                               $atime,$mtime,$ctime,  
                               $blksize,$blocks)=stat($fname);  
   
 if ($size>40000) {  
     print $fh "Rotating logs ...<p>";  
     rename("$fname.2","$fname.3");  
     rename("$fname.1","$fname.2");  
     rename("$fname","$fname.1");  
 }  
   
 &errout($fh);  
 # ------------------------------------------------------------------------ lonc  
   
 print $fh '<hr><a name="lonc"><h2>lonc</h2><h3>Log</h3><pre>';  
   
 if (-e "$perlvar{'lonDaemons'}/logs/lonc.log"){  
 open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonc.log|");  
 while ($line=<DFH>) {   
    print $fh "$line";  
    if ($line=~/died/) { $notices++; }  
 };  
 close (DFH);  
 }  
 print $fh "</pre>";  
   
 my $loncfile="$perlvar{'lonDaemons'}/logs/lonc.pid";  
   
 if (-e $loncfile) {  
    my $lfh=IO::File->new("$loncfile");  
    my $loncpid=<$lfh>;  
    chomp($loncpid);  
    if (kill 0 => $loncpid) {  
       print $fh "<h3>lonc at pid $loncpid responding, sending USR1</h3>";  
       kill USR1 => $loncpid;  
    } else {  
       $errors++; $errors++;  
       print $fh "<h3>lonc at pid $loncpid not responding</h3>";  
    }  
 } else {  
    $errors++;  
    print $fh "<h3>lonc not running, trying to start</h3>";  
    system("$perlvar{'lonDaemons'}/lonc");  
    sleep 120;  
    if (-e $loncfile) {  
        print $fh "Seems like it started ...<p>";  
        my $lfh=IO::File->new("$loncfile");  
        my $loncpid=<$lfh>;  
        chomp($loncpid);  
        sleep 30;  
        if (kill 0 => $loncpid) {  
           print $fh "<h3>lonc at pid $loncpid responding</h3>";  
        } else {  
           $errors++; $errors++;  
           print $fh "<h3>lonc at pid $loncpid not responding</h3>";  
           print $fh "Give it one more try ...<p>";  
           system("$perlvar{'lonDaemons'}/lonc");  
           sleep 120;  
        }  
    } else {  
        print $fh "Seems like that did not work!<p>";  
        $errors++;  
    }  
 }  
   
 $fname="$perlvar{'lonDaemons'}/logs/lonc.log";  
   
                           my ($dev,$ino,$mode,$nlink,  
                               $uid,$gid,$rdev,$size,  
                               $atime,$mtime,$ctime,  
                               $blksize,$blocks)=stat($fname);  
   
 if ($size>40000) {  
     print $fh "Rotating logs ...<p>";  
     rename("$fname.2","$fname.3");  
     rename("$fname.1","$fname.2");  
     rename("$fname","$fname.1");  
 }  
   
          &log($fh,"<p>Total unsend messages: <b>$unsend</b></p>\n");
 &errout($fh);      $warnings=$warnings+5*$unsend;
 # ---------------------------------------------------------------------- lonnet  
   
 print $fh '<hr><a name="lonnet"><h2>lonnet</h2><h3>Temp Log</h3><pre>';      if ($unsend) { $simplestatus{'unsend'}=$unsend; }
 if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){      &log($fh,"<h3>Outgoing Buffer</h3>\n<pre>");
 open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");  
 while ($line=<DFH>) {   
     print $fh "$line";  
     if ($line=~/Delayed/) { $warnings++; }  
     if ($line=~/giving up/) { $warnings++; }  
     if ($line=~/FAILED/) { $errors++; }  
 };  
 close (DFH);  
 }  
 print $fh "</pre><h3>Perm Log</h3>";  
   
 if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {  
     open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");  
 while ($line=<DFH>) {   
    print $fh "$line";  
 };  
 close (DFH);  
 } else { print $fh "No perm log\n" }  
   
 $fname="$perlvar{'lonDaemons'}/logs/lonnet.log";  
   
                           my ($dev,$ino,$mode,$nlink,  
                               $uid,$gid,$rdev,$size,  
                               $atime,$mtime,$ctime,  
                               $blksize,$blocks)=stat($fname);  
   
 if ($size>40000) {  
     print $fh "Rotating logs ...<p>";  
     rename("$fname.2","$fname.3");  
     rename("$fname.1","$fname.2");  
     rename("$fname","$fname.1");  
 }  
   
 print $fh "</pre>";      open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
 &errout($fh);      while (my $line=<DFH>) { 
 # ----------------------------------------------------------------- Connections   &log($fh,&encode_entities($line,'<>&"'));
       }
       &log($fh,"</pre>\n");
       close (DFH);
   }
   
 print $fh '<hr><a name="connections"><h2>Connections</h2>';  sub finish_logging {
       my ($fh)=@_;
       &log($fh,"<a name='errcount' />\n");
       $totalcount=$notices+4*$warnings+100*$errors;
       &errout($fh);
       &log($fh,"<h1>Total Error Count: $totalcount</h1>");
       my $now=time;
       my $date=localtime($now);
       &log($fh,"<hr />$date ($now)</body></html>\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;
   }
   
   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{$_}.'&';
       }
       print $sfh "\n";
       $sfh->close();
   }
   
 print $fh "<table border=2>";  sub send_mail {
 foreach $tryserver (keys %hostname) {      print "sending mail\n";
       my $emailto="$perlvar{'lonAdmEMail'}";
       if ($totalcount>1000) {
    $emailto.=",$perlvar{'lonSysEMail'}";
       }
       my $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices"; 
   
     $answer=reply("pong",$tryserver);      my $result=system("metasend -b -t $emailto -s '$subj' -f $statusdir/index.html -m text/html >& /dev/null");
     if ($answer eq "$tryserver:$perlvar{'lonHostID'}") {      if ($result != 0) {
  $result="<b>ok</b>";   $result=system("mail -s '$subj' $emailto < $statusdir/index.html");
     } else {  
         $result=$answer;  
         $warnings++;  
         if ($answer eq 'con_lost') { $warnings++; }  
     }      }
     print $fh "<tr><td>$tryserver</td><td>$result</td></tr>\n";  }
   
   sub usage {
       print(<<USAGE);
   loncron - housekeeping program that checks up on various parts of Lon-CAPA
   
   Options:
      --help     Display help
      --oldlonc  When starting the lonc daemon use 'lonc' not 'loncnew'
      --noemail  Do not send the status email
      --justcheckconnections  Only check the current status of the lonc/d
                                   connections, do not send emails do not
                                   check if the daemons are running, do not
                                   generate lon-status
      --justcheckdaemons      Only check that all of the Lon-CAPA daemons are
                                   running, do not send emails do not
                                   check the lonc/d connections, do not
                                   generate lon-status
                              
   USAGE
 }  }
 print $fh "</table>";  
   
 &errout($fh);  # ================================================================ Main Program
 # ------------------------------------------------------------ Delayed messages  sub main () {
       my ($oldlonc,$help,$justcheckdaemons,$noemail,$justcheckconnections);
       &GetOptions("help"                 => \$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;
       }
   
 print $fh '<hr><a name="delayed"><h2>Delayed Messages</h2>';  # ----------------------------- 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;
       }
   
 &senddelayed($fh);  # ------------------------------------------------------------- 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,$ip,$domdescr)=split(/:/,$configline);
    if ($id && $domain && $role && $name && $ip) {
       $hostname{$id}=$name;
       $hostdom{$id}=$domain;
       $hostrole{$id}=$role;
    }
       }
       undef $config;
   
 print $fh '<h3>Scanning Permanent Log</h3>';  # ------------------------------------------------------ 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;
   
 $unsend=0;  # ---------------------------------------------------------------- Start report
 {  
     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 "<b>Failed: $time, $dserv, $dcmd</b><br>";  
             $warnings++;  
         }  
         if ($sdf eq 'S') { $unsend--; }  
         if ($sdf eq 'D') { $unsend++; }  
     }  
 }  
 print $fh "Total unsend messages: <b>$unsend</b><p>\n";  
 $warnings=$warnings+5*$unsend;  
   
 print $fh "<h3>Outgoing Buffer</h3>";  
   
 open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");  
 while ($line=<DFH>) {   
     print $fh "$line<br>";  
 };  
 close (DFH);  
   
 # ------------------------------------------------------------------------- End  
 print $fh "<a name=errcount>\n";  
 $totalcount=$notices+4*$warnings+100*$errors;  
 &errout($fh);  
 print $fh "<h1>Total Error Count: $totalcount</h1>";  
 $now=time;  
 $date=localtime($now);  
 print $fh "<hr>$date ($now)</body></html>\n";  
   
       $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);
       }
       if (!$justcheckdaemons) {
    &test_connections($fh,\%hostname);
       }
       if (!$justcheckdaemons && !$justcheckconnections) {
    &check_delayed_msg($fh);
    &finish_logging($fh);
    &log_simplestatus();
   
    if ($totalcount>200 && !$noemail) { &send_mail(); }
       }
 }  }
   
 rename ("$statusdir/newstatus.html","$statusdir/index.html");  &main();
   
 if ($totalcount>200) {  
    $emailto="$perlvar{'lonAdmEMail'},$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");  
 }  
 1;  1;
   
   

Removed from v.1.1  
changed lines
  Added in v.1.53


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.