Diff for /loncom/loncron between versions 1.45 and 1.46

version 1.45, 2004/01/09 17:43:40 version 1.46, 2004/05/11 19:12:50
Line 20  use LONCAPA::Configuration; Line 20  use LONCAPA::Configuration;
   
 use IO::File;  use IO::File;
 use IO::Socket;  use IO::Socket;
   use strict;
   #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 38  sub reply { Line 44  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">       <p><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>
Line 59  sub start_daemon { Line 70  sub start_daemon {
     system("$perlvar{'lonDaemons'}/$progname 2>>$perlvar{'lonDaemons'}/logs/${daemon}_errors");      system("$perlvar{'lonDaemons'}/$progname 2>>$perlvar{'lonDaemons'}/logs/${daemon}_errors");
     sleep 2;      sleep 2;
     if (-e $pidfile) {      if (-e $pidfile) {
  print $fh "Seems like it started ...<p>";   &log($fh,"Seems like it started ...<p>");
  my $lfh=IO::File->new("$pidfile");   my $lfh=IO::File->new("$pidfile");
  my $daemonpid=<$lfh>;   my $daemonpid=<$lfh>;
  chomp($daemonpid);   chomp($daemonpid);
Line 70  sub start_daemon { Line 81  sub start_daemon {
     return 0;      return 0;
  }   }
     }      }
     print $fh "Seems like that did not work!<p>";      &log($fh,"Seems like that did not work!<p>");
     $errors++;      $errors++;
     return 0;      return 0;
 }  }
Line 78  sub start_daemon { Line 89  sub start_daemon {
 sub checkon_daemon {  sub checkon_daemon {
     my ($fh,$daemon,$maxsize,$sendusr1)=@_;      my ($fh,$daemon,$maxsize,$sendusr1)=@_;
   
     print $fh '<hr><a name="'.$daemon.'"><h2>'.$daemon.'</h2><h3>Log</h3><pre>';      &log($fh,'<hr><a name="'.$daemon.'"><h2>'.$daemon.'</h2><h3>Log</h3><pre>');
     printf("%-10s ",$daemon);      printf("%-10s ",$daemon);
     if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){      if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
  open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|");   open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|");
  while ($line=<DFH>) {    while (my $line=<DFH>) { 
     print $fh "$line";      &log($fh,"$line");
     if ($line=~/INFO/) { $notices++; }      if ($line=~/INFO/) { $notices++; }
     if ($line=~/WARNING/) { $notices++; }      if ($line=~/WARNING/) { $notices++; }
     if ($line=~/CRITICAL/) { $warnings++; }      if ($line=~/CRITICAL/) { $warnings++; }
  };   };
  close (DFH);   close (DFH);
     }      }
     print $fh "</pre>";      &log($fh,"</pre>");
           
     my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";      my $pidfile="$perlvar{'lonDaemons'}/logs/$daemon.pid";
           
     my $restartflag=1;      my $restartflag=1;
           my $daemonpid;
     if (-e $pidfile) {      if (-e $pidfile) {
  my $lfh=IO::File->new("$pidfile");   my $lfh=IO::File->new("$pidfile");
  my $daemonpid=<$lfh>;   $daemonpid=<$lfh>;
  chomp($daemonpid);   chomp($daemonpid);
  if (kill 0 => $daemonpid) {   if (kill 0 => $daemonpid) {
     print $fh "<h3>$daemon at pid $daemonpid responding";      &log($fh,"<h3>$daemon at pid $daemonpid responding");
     if ($sendusr1) { print $fh ", sending USR1"; }      if ($sendusr1) { &log($fh,", sending USR1"); }
     print $fh "</h3>";      &log($fh,"</h3>");
     if ($sendusr1) { kill USR1 => $daemonpid; }      if ($sendusr1) { kill USR1 => $daemonpid; }
     $restartflag=0;      $restartflag=0;
     print "running\n";      print "running\n";
  } else {   } else {
     $errors++;      $errors++;
     print $fh "<h3>$daemon at pid $daemonpid not responding</h3>";      &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
     $restartflag=1;      $restartflag=1;
     print $fh "<h3>Decided to clean up stale .pid file and restart $daemon</h3>";      &log($fh,"<h3>Decided to clean up stale .pid file and restart $daemon</h3>");
  }   }
     }      }
     if ($restartflag==1) {      if ($restartflag==1) {
  $simplestatus{$daemon}='off';   $simplestatus{$daemon}='off';
  $errors++;   $errors++;
  print $fh '<br><font color="red">Killall '.$daemon.': '.   &log($fh,'<br><font color="red">Killall '.$daemon.': '.
     `killall $daemon 2>&1`.' - ';      `killall $daemon 2>&1`.' - ');
  sleep 2;   sleep 2;
  print $fh unlink($pidfile).' - '.   &log($fh,unlink($pidfile).' - '.
     `killall -9 $daemon 2>&1`.      `killall -9 $daemon 2>&1`.
     '</font><br>';      '</font><br>');
  print $fh "<h3>$daemon not running, trying to start</h3>";   &log($fh,"<h3>$daemon not running, trying to start</h3>");
   
  if (&start_daemon($fh,$daemon,$pidfile)) {   if (&start_daemon($fh,$daemon,$pidfile)) {
     print $fh "<h3>$daemon at pid $daemonpid responding</h3>";      &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");
     $simplestatus{$daemon}='restarted';      $simplestatus{$daemon}='restarted';
     print "started\n";      print "started\n";
  } else {   } else {
     $errors++;      $errors++;
     print $fh "<h3>$daemon at pid $daemonpid not responding</h3>";      &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
     print $fh "Give it one more try ...<p>";      &log($fh,"Give it one more try ...<p>");
     print " ";      print " ";
     if (&start_daemon($fh,$daemon,$pidfile)) {      if (&start_daemon($fh,$daemon,$pidfile)) {
  print $fh "<h3>$daemon at pid $daemonpid responding</h3>";   &log($fh,"<h3>$daemon at pid $daemonpid responding</h3>");
  $simplestatus{$daemon}='restarted';   $simplestatus{$daemon}='restarted';
  print "started\n";   print "started\n";
     } else {      } else {
  print " failed\n";   print " failed\n";
  $simplestatus{$daemon}='failed';   $simplestatus{$daemon}='failed';
  $errors++; $errors++;   $errors++; $errors++;
  print $fh "<h3>$daemon at pid $daemonpid not responding</h3>";   &log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>");
  print $fh "Unable to start $daemon<p>";   &log($fh,"Unable to start $daemon<p>");
     }      }
  }   }
   
  if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){   if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
     print $fh "<p><pre>";      &log($fh,"<p><pre>");
     open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");      open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");
     while ($line=<DFH>) {       while (my $line=<DFH>) { 
  print $fh "$line";   &log($fh,"$line");
  if ($line=~/WARNING/) { $notices++; }   if ($line=~/WARNING/) { $notices++; }
  if ($line=~/CRITICAL/) { $notices++; }   if ($line=~/CRITICAL/) { $notices++; }
     };      };
     close (DFH);      close (DFH);
     print $fh "</pre>";      &log($fh,"</pre>");
  }   }
     }      }
           
     $fname="$perlvar{'lonDaemons'}/logs/$daemon.log";      my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log";
           
     my ($dev,$ino,$mode,$nlink,      my ($dev,$ino,$mode,$nlink,
  $uid,$gid,$rdev,$size,   $uid,$gid,$rdev,$size,
Line 168  sub checkon_daemon { Line 179  sub checkon_daemon {
  $blksize,$blocks)=stat($fname);   $blksize,$blocks)=stat($fname);
           
     if ($size>$maxsize) {      if ($size>$maxsize) {
  print $fh "Rotating logs ...<p>";   &log($fh,"Rotating logs ...<p>");
  rename("$fname.2","$fname.3");   rename("$fname.2","$fname.3");
  rename("$fname.1","$fname.2");   rename("$fname.1","$fname.2");
  rename("$fname","$fname.1");   rename("$fname","$fname.1");
Line 176  sub checkon_daemon { Line 187  sub checkon_daemon {
   
     &errout($fh);      &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  # --------------------------------------------------------------------- Machine
 my $wwwid=getpwnam('www');  sub log_machine_info {
 if ($wwwid!=$<) {      my ($fh)=@_;
     print("User ID mismatch.  This program must be run as user 'www'\n");      &log($fh,'<hr><a name="machine"><h2>Machine Information</h2>');
     $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";      &log($fh,"<h3>loadavg</h3>");
     $subj="LON: $perlvar{'lonHostID'} User ID mismatch";  
     system("echo 'User ID mismatch.  loncron must be run as user www.' |\      open (LOADAVGH,"/proc/loadavg");
  mailto $emailto -s '$subj' > /dev/null");      my $loadavg=<LOADAVGH>;
     exit 1;      close (LOADAVGH);
 }  
   
 # ------------------------------------------------------------- Read hosts file  
 {  
     my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab");  
           
     while (my $configline=<$config>) {      &log($fh,"<tt>$loadavg</tt>");
  my ($id,$domain,$role,$name,$ip,$domdescr)=split(/:/,$configline);      
  if ($id && $domain && $role && $name && $ip) {      my @parts=split(/\s+/,$loadavg);
     $hostname{$id}=$name;      if ($parts[1]>4.0) {
     $hostdom{$id}=$domain;   $errors++;
     $hostip{$id}=$ip;      } elsif ($parts[1]>2.0) {
     $hostrole{$id}=$role;   $warnings++;
     if ($domdescr) { $domaindescription{$domain}=$domdescr; }      } elsif ($parts[1]>1.0) {
     if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) {   $notices++;
  $libserv{$id}=$name;  
     }  
  } else {  
     if ($configline) {  
 # &logthis("Skipping hosts.tab line -$configline-");  
     }  
  }  
     }      }
 }  
   
 # ------------------------------------------------------ Read spare server file      &log($fh,"<h3>df</h3>");
 {      &log($fh,"<pre>");
     my $config=IO::File->new("$perlvar{'lonTabDir'}/spare.tab");  
           open (DFH,"df|");
     while (my $configline=<$config>) {      while (my $line=<DFH>) { 
  chomp($configline);   &log($fh,"$line"); 
  if (($configline) && ($configline ne $perlvar{'lonHostID'})) {   @parts=split(/\s+/,$line);
     $spareid{$configline}=1;   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;
   
 $errors=0;      open (PSH,"ps -aux --cols 140 |");
 $warnings=0;      while (my $line=<PSH>) { 
 $notices=0;   &log($fh,"$line"); 
    $psproc++;
       }
       close (PSH);
       &log($fh,"</pre>");
   
 $now=time;      if ($psproc>200) { $notices++; }
 $date=localtime($now);      if ($psproc>250) { $notices++; }
   
 {      &errout($fh);
   }
   
   sub start_logging {
       my ($hostdom,$hostrole,$hostname,$spareid)=@_;
     my $fh=IO::File->new(">$statusdir/newstatus.html");      my $fh=IO::File->new(">$statusdir/newstatus.html");
     my %simplestatus=();      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>
Line 282  $date=localtime($now); Line 280  $date=localtime($now);
 <li><a href="#lonnet">lonnet</a>  <li><a href="#lonnet">lonnet</a>
 <li><a href="#connections">Connections</a>  <li><a href="#connections">Connections</a>
 <li><a href="#delayed">Delayed Messages</a>  <li><a href="#delayed">Delayed Messages</a>
 <li><a href="#errcount">Error Count</a>  <li><a href="#errcount">Error Coindex.html.unt</a>
 </ol>  </ol>
 <hr>  <hr>
 <a name="configuration">  <a name="configuration">
Line 291  $date=localtime($now); Line 289  $date=localtime($now);
 <table border=2>  <table border=2>
 ENDHEADERS  ENDHEADERS
   
     foreach $varname (sort(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>$perlvar{$varname}</td></tr>\n");
     }  
     print $fh "</table><h3>Hosts</h3><table border=2>";  
     foreach $id (sort(keys(%hostname))) {  
  print $fh   
     "<tr><td>$id</td><td>$hostdom{$id}</td><td>$hostrole{$id}</td>";  
  print $fh "<td>$hostname{$id}</td><td>$hostip{$id}</td></tr>\n";  
     }  
     print $fh "</table><h3>Spare Hosts</h3><ol>";  
     foreach $id (sort(keys(%spareid))) {  
  print $fh "<li>$id\n";  
     }  
       
     print $fh "</ol>\n";  
   
 # --------------------------------------------------------------------- Machine  
       
     print $fh '<hr><a name="machine"><h2>Machine Information</h2>';  
     print $fh "<h3>loadavg</h3>";  
       
     open (LOADAVGH,"/proc/loadavg");  
     $loadavg=<LOADAVGH>;  
     close (LOADAVGH);  
       
     print $fh "<tt>$loadavg</tt>";  
       
     @parts=split(/\s+/,$loadavg);  
     if ($parts[1]>4.0) {  
  $errors++;  
     } elsif ($parts[1]>2.0) {  
  $warnings++;  
     } elsif ($parts[1]>1.0) {  
  $notices++;  
     }  
   
     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) {   
     $warnings++;  
     $notices++;   
  } elsif ($usage>80) {  
     $warnings++;  
  } elsif ($usage>60) {  
     $notices++;  
  }  
  if ($usage>95) { $warnings++; $warnings++; $simplestatus{'diskfull'}++; }  
     }      }
     close (DFH);      &log($fh,"</table><h3>Hosts</h3><table border=2>");
     print $fh "</pre>";      foreach my $id (sort(keys(%{$hostname}))) {
    &log($fh,
       "<tr><td>$id</td><td>".$hostdom->{$id}.
     print $fh "<h3>ps</h3>";      "</td><td>".$hostrole->{$id}.
     print $fh "<pre>";      "</td><td>".$hostname->{$id}."</td></tr>\n");
     $psproc=0;      }
       &log($fh,"</table><h3>Spare Hosts</h3><ol>");
     open (PSH,"ps -aux --cols 140 |");      foreach my $id (sort(keys(%{$spareid}))) {
     while ($line=<PSH>) {    &log($fh,"<li>$id\n");
  print $fh "$line";   
  $psproc++;  
     }      }
     close (PSH);      &log($fh,"</ol>\n");
     print $fh "</pre>";      return $fh;
   }
     if ($psproc>200) { $notices++; }  
     if ($psproc>250) { $notices++; }  
   
     &errout($fh);  
   
 # --------------------------------------------------------------- clean out tmp  # --------------------------------------------------------------- clean out tmp
     print $fh '<hr><a name="tmp"><h2>Temporary Files</h2>';  sub clean_tmp {
     $cleaned=0;      my ($fh)=@_;
     $old=0;      &log($fh,'<hr><a name="tmp"><h2>Temporary Files</h2>');
     while ($fname=<$perlvar{'lonDaemons'}/tmp/*>) {      my $cleaned=0;
       my $old=0;
       while (my $fname=<$perlvar{'lonDaemons'}/tmp/*>) {
  my ($dev,$ino,$mode,$nlink,   my ($dev,$ino,$mode,$nlink,
     $uid,$gid,$rdev,$size,      $uid,$gid,$rdev,$size,
     $atime,$mtime,$ctime,      $atime,$mtime,$ctime,
     $blksize,$blocks)=stat($fname);      $blksize,$blocks)=stat($fname);
  $now=time;   my $now=time;
  $since=$now-$mtime;   my $since=$now-$mtime;
  if ($since>$perlvar{'lonExpire'}) {   if ($since>$perlvar{'lonExpire'}) {
     $line='';      my $line='';
     if (open(PROBE,$fname)) {      if (open(PROBE,$fname)) {
  $line=<PROBE>;   $line=<PROBE>;
  close(PROBE);   close(PROBE);
Line 394  ENDHEADERS Line 336  ENDHEADERS
  } else { $old++; }   } 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  # ------------------------------------------------------------ clean out lonIDs
     print $fh '<hr><a name="tokens"><h2>Session Tokens</h2>';  sub clean_lonIDs {
     $cleaned=0;      my ($fh)=@_;
     $active=0;      &log($fh,'<hr><a name="tokens"><h2>Session Tokens</h2>');
     while ($fname=<$perlvar{'lonIDsDir'}/*>) {      my $cleaned=0;
       my $active=0;
       while (my $fname=<$perlvar{'lonIDsDir'}/*>) {
  my ($dev,$ino,$mode,$nlink,   my ($dev,$ino,$mode,$nlink,
     $uid,$gid,$rdev,$size,      $uid,$gid,$rdev,$size,
     $atime,$mtime,$ctime,      $atime,$mtime,$ctime,
     $blksize,$blocks)=stat($fname);      $blksize,$blocks)=stat($fname);
  $now=time;   my $now=time;
  $since=$now-$mtime;   my $since=$now-$mtime;
  if ($since>$perlvar{'lonExpire'}) {   if ($since>$perlvar{'lonExpire'}) {
     $cleaned++;      $cleaned++;
     print $fh "Unlinking $fname<br>";      &log($fh,"Unlinking $fname<br>");
     unlink("$fname");      unlink("$fname");
  } else {   } else {
     $active++;      $active++;
  }   }
   
     }      }
     print $fh "<p>Cleaned up ".$cleaned." stale session token(s).";      &log($fh,"<p>Cleaned up ".$cleaned." stale session token(s).");
     print $fh "<h3>$active open session(s)</h3>";      &log($fh,"<h3>$active open session(s)</h3>");
   }
   
 # ----------------------------------------------------------------------- httpd  
   
     print $fh '<hr><a name="httpd"><h2>httpd</h2><h3>Access Log</h3><pre>';  # ----------------------------------------------------------------------- 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|");      open (DFH,"tail -n25 /etc/httpd/logs/access_log|");
     while ($line=<DFH>) { print $fh "$line" };      while (my $line=<DFH>) { &log($fh,"$line") };
     close (DFH);      close (DFH);
   
     print $fh "</pre><h3>Error Log</h3><pre>";      &log($fh,"</pre><h3>Error Log</h3><pre>");
   
     open (DFH,"tail -n25 /etc/httpd/logs/error_log|");      open (DFH,"tail -n25 /etc/httpd/logs/error_log|");
     while ($line=<DFH>) {       while (my $line=<DFH>) { 
  print $fh "$line";   &log($fh,"$line");
  if ($line=~/\[error\]/) { $notices++; }    if ($line=~/\[error\]/) { $notices++; } 
     };      }
     close (DFH);      close (DFH);
     print $fh "</pre>";      &log($fh,"</pre>");
     &errout($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  # ---------------------------------------------------------------------- lonnet
   
     print $fh '<hr><a name="lonnet"><h2>lonnet</h2><h3>Temp Log</h3><pre>';  sub rotate_logs {
       my ($fh)=@_;
       &log($fh,'<hr><a name="lonnet"><h2>lonnet</h2><h3>Temp Log</h3><pre>');
     print "checking logs\n";      print "checking logs\n";
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){      if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){
  open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");   open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");
  while ($line=<DFH>) {    while (my $line=<DFH>) { 
     print $fh "$line";      &log($fh,"$line");
  };   }
  close (DFH);   close (DFH);
     }      }
     print $fh "</pre><h3>Perm Log</h3><pre>";      &log($fh,"</pre><h3>Perm Log</h3><pre>");
           
     if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {      if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
  open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");   open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
  while ($line=<DFH>) {    while (my $line=<DFH>) { 
     print $fh "$line";      &log($fh,"$line");
  };   }
  close (DFH);   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,      my ($dev,$ino,$mode,$nlink,
  $uid,$gid,$rdev,$size,   $uid,$gid,$rdev,$size,
Line 486  ENDHEADERS Line 418  ENDHEADERS
  $blksize,$blocks)=stat($fname);   $blksize,$blocks)=stat($fname);
   
     if ($size>40000) {      if ($size>40000) {
  print $fh "Rotating logs ...<p>";   &log($fh,"Rotating logs ...<p>");
  rename("$fname.2","$fname.3");   rename("$fname.2","$fname.3");
  rename("$fname.1","$fname.2");   rename("$fname.1","$fname.2");
  rename("$fname","$fname.1");   rename("$fname","$fname.1");
     }      }
   
     print $fh "</pre>";      &log($fh,"</pre>");
     &errout($fh);      &errout($fh);
 # ----------------------------------------------------------------- Connections  }
   
     print $fh '<hr><a name="connections"><h2>Connections</h2>';  # ----------------------------------------------------------------- Connections
   sub test_connections {
       my ($fh,$hostname)=@_;
       &log($fh,'<hr><a name="connections"><h2>Connections</h2>');
     print "testing connections\n";      print "testing connections\n";
     print $fh "<table border=2>";      &log($fh,"<table border=2>");
     foreach $tryserver (sort(keys(%hostname))) {      foreach my $tryserver (sort(keys(%{$hostname}))) {
  print(".");   print(".");
  $answer=reply("pong",$tryserver);   my $result;
    my $answer=reply("pong",$tryserver);
  if ($answer eq "$tryserver:$perlvar{'lonHostID'}") {   if ($answer eq "$tryserver:$perlvar{'lonHostID'}") {
     $result="<b>ok</b>";      $result="<b>ok</b>";
  } else {   } else {
Line 510  ENDHEADERS Line 446  ENDHEADERS
     if ($answer eq 'con_lost') { $warnings++; }      if ($answer eq 'con_lost') { $warnings++; }
  }   }
  if ($answer =~ /con_lost/) { print(" $tryserver down\n"); }   if ($answer =~ /con_lost/) { print(" $tryserver down\n"); }
  print $fh "<tr><td>$tryserver</td><td>$result</td></tr>\n";   &log($fh,"<tr><td>$tryserver</td><td>$result</td></tr>\n");
   
     }      }
     print $fh "</table>";      &log($fh,"</table>");
   
     &errout($fh);      &errout($fh);
 # ------------------------------------------------------------ Delayed messages  }
   
     print $fh '<hr><a name="delayed"><h2>Delayed Messages</h2>';  
   # ------------------------------------------------------------ Delayed messages
   sub check_delayed_msg {
       my ($fh)=@_;
       &log($fh,'<hr><a name="delayed"><h2>Delayed Messages</h2>');
     print "checking buffers\n";      print "checking buffers\n";
       
       &log($fh,'<h3>Scanning Permanent Log</h3>');
   
     print $fh '<h3>Scanning Permanent Log</h3>';      my $unsend=0;
   
     $unsend=0;      my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");
     {      while (my $line=<$dfh>) {
  my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");   my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line);
  while ($line=<$dfh>) {   if ($sdf eq 'F') { 
     ($time,$sdf,$dserv,$dcmd)=split(/:/,$line);      my $local=localtime($time);
     if ($sdf eq 'F') {       &log($fh,"<b>Failed: $time, $dserv, $dcmd</b><br>");
  $local=localtime($time);      $warnings++;
  print $fh "<b>Failed: $time, $dserv, $dcmd</b><br>";  
  $warnings++;  
     }  
     if ($sdf eq 'S') { $unsend--; }  
     if ($sdf eq 'D') { $unsend++; }  
  }   }
    if ($sdf eq 'S') { $unsend--; }
    if ($sdf eq 'D') { $unsend++; }
     }      }
     print $fh "Total unsend messages: <b>$unsend</b><p>\n";  
       &log($fh,"Total unsend messages: <b>$unsend</b><p>\n");
     $warnings=$warnings+5*$unsend;      $warnings=$warnings+5*$unsend;
   
     if ($unsend) { $simplestatus{'unsend'}=$unsend; }      if ($unsend) { $simplestatus{'unsend'}=$unsend; }
     print $fh "<h3>Outgoing Buffer</h3>";      &log($fh,"<h3>Outgoing Buffer</h3>");
   
     open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");      open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
     while ($line=<DFH>) {       while (my $line=<DFH>) { 
  print $fh "$line<br>";   &log($fh,"$line<br>");
     };      }
     close (DFH);      close (DFH);
   }
   
 # ------------------------------------------------------------------------- End  sub finish_logging {
     print $fh "<a name=errcount>\n";      my ($fh)=@_;
       &log($fh,"<a name=errcount>\n");
     $totalcount=$notices+4*$warnings+100*$errors;      $totalcount=$notices+4*$warnings+100*$errors;
     &errout($fh);      &errout($fh);
     print $fh "<h1>Total Error Count: $totalcount</h1>";      &log($fh,"<h1>Total Error Count: $totalcount</h1>");
     $now=time;      my $now=time;
     $date=localtime($now);      my $date=localtime($now);
     print $fh "<hr>$date ($now)</body></html>\n";      &log($fh,"<hr>$date ($now)</body></html>\n");
     print "lon-status webpage updated\n";      print "lon-status webpage updated\n";
     $fh->close();      $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");      my $sfh=IO::File->new(">$statusdir/loncron_simple.txt");
     foreach (keys %simplestatus) {      foreach (keys %simplestatus) {
  print $sfh $_.'='.$simplestatus{$_}.'&';   print $sfh $_.'='.$simplestatus{$_}.'&';
Line 574  rename ("$statusdir/newstatus.html","$st Line 517  rename ("$statusdir/newstatus.html","$st
     print $sfh "\n";      print $sfh "\n";
     $sfh->close();      $sfh->close();
 }  }
 if ($totalcount>200) {  
   sub send_mail {
     print "sending mail\n";      print "sending mail\n";
     $emailto="$perlvar{'lonAdmEMail'}";      my $emailto="$perlvar{'lonAdmEMail'}";
     if ($totalcount>1000) {      if ($totalcount>1000) {
  $emailto.=",$perlvar{'lonSysEMail'}";   $emailto.=",$perlvar{'lonSysEMail'}";
     }      }
     $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices";       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");      system("metasend -b -t $emailto -s '$subj' -f $statusdir/index.html -m text/html");
 }  }
   
   # ================================================================ Main Program
   sub main () {
   # --------------------------------- 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>) {
    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;
   
   # ------------------------------------------------------ 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=&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(); }
   }
   
   &main();
 1;  1;
   
   

Removed from v.1.45  
changed lines
  Added in v.1.46


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.