File:  [LON-CAPA] / loncom / loncron
Revision 1.1: download - view: text, annotated - select for diffs
Wed Oct 13 17:48:51 1999 UTC (24 years, 7 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: #!/usr/bin/perl
    2: 
    3: # The LearningOnline Network
    4: # Housekeeping program, started by cron
    5: #
    6: # (TCP networking package
    7: # 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30,
    8: # 7/1,7/2,7/9,7/10,7/12 Gerd Kortemeyer)
    9: #
   10: # 7/14,7/15,7/19,7/21,7/22 Gerd Kortemeyer
   11: 
   12: use IO::File;
   13: use IO::Socket;
   14: 
   15: # -------------------------------------------------- Non-critical communication
   16: sub reply {
   17:     my ($cmd,$server)=@_;
   18:     my $peerfile="$perlvar{'lonSockDir'}/$server";
   19:     my $client=IO::Socket::UNIX->new(Peer    =>"$peerfile",
   20:                                      Type    => SOCK_STREAM,
   21:                                      Timeout => 10)
   22:        or return "con_lost";
   23:     print $client "$cmd\n";
   24:     my $answer=<$client>;
   25:     chomp($answer);
   26:     if (!$answer) { $answer="con_lost"; }
   27:     return $answer;
   28: }
   29: 
   30: # --------------------------------------------------------- Output error status
   31: 
   32: sub errout {
   33:    my $fh=shift;
   34:    print $fh (<<ENDERROUT);
   35:      <p><table border=2 bgcolor="#CCCCCC">
   36:      <tr><td>Notices</td><td>$notices</td></tr>
   37:      <tr><td>Warnings</td><td>$warnings</td></tr>
   38:      <tr><td>Errors</td><td>$errors</td></tr>
   39:      </table><p><a href="#top">Top</a><p>
   40: ENDERROUT
   41: }
   42: 
   43: # -------------------------------------------------------------- Permanent logs
   44: sub logperm {
   45:     my $message=shift;
   46:     my $execdir=$perlvar{'lonDaemons'};
   47:     my $now=time;
   48:     my $local=localtime($now);
   49:     my $fh=Apache::File->new(">>$execdir/logs/lonnet.perm.log");
   50:     print $fh "$now:$message:$local\n";
   51:     return 1;
   52: }
   53: 
   54: # ------------------------------------------------ Try to send delayed messages
   55: sub senddelayed {
   56:     my $fh=shift;
   57:     my $dfname;
   58:     my $path="$perlvar{'lonSockDir'}/delayed";
   59:     print $fh "<h3>Attempting to send delayed messages</h3>";
   60:     while ($dfname=<$path/*>) {
   61:         my $wcmd;
   62:         {
   63:          my $dfh=IO::File->new($dfname);
   64:          $wcmd=<$dfh>;
   65:         }
   66:         my ($server,$cmd)=split(/:/,$wcmd);
   67:         chomp($cmd);
   68:         my $answer=reply($cmd,$server);
   69:         if ($answer ne 'con_lost') {
   70: 	    unlink("$dfname");
   71:             print $fh "Send $cmd to $server: $answer<br>\n";
   72:             &logperm("S:$server:$cmd");
   73:         } else {
   74:             print $fh "Failed to deliver $cmd to $server<br>\n";
   75:             $warnings++;
   76:         }        
   77:     }
   78: }
   79: 
   80: # ================================================================ Main Program
   81: 
   82: 
   83: # ------------------------------------------------------------ Read access.conf
   84: {
   85:     my $config=IO::File->new("/etc/httpd/conf/access.conf");
   86: 
   87:     while (my $configline=<$config>) {
   88:         if ($configline =~ /PerlSetVar/) {
   89: 	   my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
   90:            $perlvar{$varname}=$varvalue;
   91:         }
   92:     }
   93: }
   94: 
   95: # ------------------------------------------------------------- Read hosts file
   96: {
   97:     my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab");
   98: 
   99:     while (my $configline=<$config>) {
  100:        my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
  101:        $hostname{$id}=$name;
  102:        $hostdom{$id}=$domain;
  103:        $hostrole{$id}=$role;
  104:        $hostip{$id}=$ip;
  105:        if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) {
  106: 	   $libserv{$id}=$name;
  107:        }
  108:     }
  109: }
  110: 
  111: # ------------------------------------------------------ Read spare server file
  112: {
  113:     my $config=IO::File->new("$perlvar{'lonTabDir'}/spare.tab");
  114: 
  115:     while (my $configline=<$config>) {
  116:        chomp($configline);
  117:        if (($configline) && ($configline ne $perlvar{'lonHostID'})) {
  118:           $spareid{$configline}=1;
  119:        }
  120:     }
  121: }
  122: 
  123: # ---------------------------------------------------------------- Start report
  124: 
  125: $statusdir="/home/httpd/html/lon-status";
  126: 
  127: $errors=0;
  128: $warnings=0;
  129: $notices=0;
  130: 
  131: $now=time;
  132: $date=localtime($now);
  133: 
  134: {
  135: my $fh=IO::File->new(">$statusdir/newstatus.html");
  136: 
  137: print $fh (<<ENDHEADERS);
  138: <html>
  139: <head>
  140: <title>LON Status Report $perlvar{'lonHostID'}</title>
  141: </head>
  142: <body bgcolor="#FFFFFF">
  143: <a name="top">
  144: <h1>LON Status Report $perlvar{'lonHostID'}</h1>
  145: <h2>$date ($now)</h2>
  146: <ol>
  147: <li><a href="#configuration">Configuration</a>
  148: <li><a href="#machine">Machine Information</a>
  149: <li><a href="#httpd">httpd</a>
  150: <li><a href="#lond">lond</a>
  151: <li><a href="#lonc">lonc</a>
  152: <li><a href="#lonnet">lonnet</a>
  153: <li><a href="#connections">Connections</a>
  154: <li><a href="#delayed">Delayed Messages</a>
  155: <li><a href="#errcount">Error Count</a>
  156: </ol>
  157: <hr>
  158: <a name="configuration">
  159: <h2>Configuration</h2>
  160: <h3>PerlVars</h3>
  161: <table border=2>
  162: ENDHEADERS
  163: 
  164: foreach $varname (keys %perlvar) {
  165:     print $fh "<tr><td>$varname</td><td>$perlvar{$varname}</td></tr>\n";
  166: }
  167: print $fh "</table><h3>Hosts</h3><table border=2>";
  168: foreach $id (keys %hostname) {
  169: print $fh 
  170:     "<tr><td>$id</td><td>$hostdom{$id}</td><td>$hostrole{$id}</td>";
  171: print $fh "<td>$hostname{$id}</td><td>$hostip{$id}</td></tr>\n";
  172: }
  173: print $fh "</table><h3>Spare Hosts</h3><ol>";
  174: foreach $id (keys %spareid) {
  175:     print $fh "<li>$id\n";
  176: }
  177: 
  178: print $fh "</ol>\n";
  179: 
  180: # --------------------------------------------------------------------- Machine
  181: 
  182: print $fh '<hr><a name="machine"><h2>Machine Information</h2>';
  183: print $fh "<h3>loadavg</h3>";
  184: 
  185: open (LOADAVGH,"/proc/loadavg");
  186: $loadavg=<LOADAVGH>;
  187: close (LOADAVGH);
  188: 
  189: print $fh "<tt>$loadavg</tt>";
  190: 
  191: @parts=split(/\s+/,$loadavg);
  192: if ($parts[1]>3.0) {
  193:     $errors++;
  194: } elsif ($parts[1]>2.0) {
  195:     $warnings++;
  196: } elsif ($parts[1]>1.0) {
  197:     $notices++;
  198: }
  199: 
  200: print $fh "<h3>df</h3>";
  201: print $fh "<pre>";
  202: 
  203: open (DFH,"df|");
  204: while ($line=<DFH>) { 
  205:    print $fh "$line"; 
  206:    @parts=split(/\s+/,$line);
  207:    $usage=$parts[4];
  208:    $usage=~s/\W//g;
  209:    if ($usage>90) { 
  210:       $errors++; 
  211:    } elsif ($usage>80) {
  212:       $warnings++;
  213:    } elsif ($usage>60) {
  214:       $notices++;
  215:    }
  216:    if ($usage>95) { $errors++; }
  217: }
  218: close (DFH);
  219: print $fh "</pre>";
  220: &errout($fh);
  221: # ----------------------------------------------------------------------- httpd
  222: 
  223: print $fh '<hr><a name="httpd"><h2>httpd</h2><h3>Access Log</h3><pre>';
  224: 
  225: open (DFH,"tail -n40 /etc/httpd/logs/access_log|");
  226: while ($line=<DFH>) { print $fh "$line" };
  227: close (DFH);
  228: 
  229: print $fh "</pre><h3>Error Log</h3><pre>";
  230: 
  231: open (DFH,"tail -n50 /etc/httpd/logs/error_log|");
  232: while ($line=<DFH>) { 
  233:    print $fh "$line";
  234:    if ($line=~/\[error\]/) { $notices++; } 
  235: };
  236: close (DFH);
  237: print $fh "</pre>";
  238: &errout($fh);
  239: # ------------------------------------------------------------------------ lond
  240: 
  241: print $fh '<hr><a name="lond"><h2>lond</h2><h3>Log</h3><pre>';
  242: 
  243: if (-e "$perlvar{'lonDaemons'}/logs/lond.log"){
  244: open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lond.log|");
  245: while ($line=<DFH>) { 
  246:    print $fh "$line";
  247:    if ($line=~/giving up/) { $notices++; }
  248: };
  249: close (DFH);
  250: }
  251: print $fh "</pre>";
  252: 
  253: my $londfile="$perlvar{'lonDaemons'}/logs/lond.pid";
  254: 
  255: if (-e $londfile) {
  256:    my $lfh=IO::File->new("$londfile");
  257:    my $londpid=<$lfh>;
  258:    chomp($londpid);
  259:    if (kill 0 => $londpid) {
  260:       print $fh "<h3>lond at pid $londpid responding</h3>";
  261:    } else {
  262:       $errors++; $errors++;
  263:       print $fh "<h3>lond at pid $londpid not responding</h3>";
  264:    }
  265: } else {
  266:    $errors++;
  267:    print $fh "<h3>lond not running, trying to start</h3>";
  268:    system("$perlvar{'lonDaemons'}/lond");
  269:    sleep 120;
  270:    if (-e $londfile) {
  271:        print $fh "Seems like it started ...<p>";
  272:        my $lfh=IO::File->new("$londfile");
  273:        my $londpid=<$lfh>;
  274:        chomp($londpid);
  275:        sleep 30;
  276:        if (kill 0 => $londpid) {
  277:           print $fh "<h3>lond at pid $londpid responding</h3>";
  278:        } else {
  279:           $errors++; $errors++;
  280:           print $fh "<h3>lond at pid $londpid not responding</h3>";
  281:           print $fh "Give it one more try ...<p>";
  282:           system("$perlvar{'lonDaemons'}/lond");
  283:           sleep 120;
  284:        }
  285:    } else {
  286:        print $fh "Seems like that did not work!<p>";
  287:        $errors++;
  288:    }
  289: }
  290: 
  291: $fname="$perlvar{'lonDaemons'}/logs/lond.log";
  292: 
  293:                           my ($dev,$ino,$mode,$nlink,
  294:                               $uid,$gid,$rdev,$size,
  295:                               $atime,$mtime,$ctime,
  296:                               $blksize,$blocks)=stat($fname);
  297: 
  298: if ($size>40000) {
  299:     print $fh "Rotating logs ...<p>";
  300:     rename("$fname.2","$fname.3");
  301:     rename("$fname.1","$fname.2");
  302:     rename("$fname","$fname.1");
  303: }
  304: 
  305: &errout($fh);
  306: # ------------------------------------------------------------------------ lonc
  307: 
  308: print $fh '<hr><a name="lonc"><h2>lonc</h2><h3>Log</h3><pre>';
  309: 
  310: if (-e "$perlvar{'lonDaemons'}/logs/lonc.log"){
  311: open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonc.log|");
  312: while ($line=<DFH>) { 
  313:    print $fh "$line";
  314:    if ($line=~/died/) { $notices++; }
  315: };
  316: close (DFH);
  317: }
  318: print $fh "</pre>";
  319: 
  320: my $loncfile="$perlvar{'lonDaemons'}/logs/lonc.pid";
  321: 
  322: if (-e $loncfile) {
  323:    my $lfh=IO::File->new("$loncfile");
  324:    my $loncpid=<$lfh>;
  325:    chomp($loncpid);
  326:    if (kill 0 => $loncpid) {
  327:       print $fh "<h3>lonc at pid $loncpid responding, sending USR1</h3>";
  328:       kill USR1 => $loncpid;
  329:    } else {
  330:       $errors++; $errors++;
  331:       print $fh "<h3>lonc at pid $loncpid not responding</h3>";
  332:    }
  333: } else {
  334:    $errors++;
  335:    print $fh "<h3>lonc not running, trying to start</h3>";
  336:    system("$perlvar{'lonDaemons'}/lonc");
  337:    sleep 120;
  338:    if (-e $loncfile) {
  339:        print $fh "Seems like it started ...<p>";
  340:        my $lfh=IO::File->new("$loncfile");
  341:        my $loncpid=<$lfh>;
  342:        chomp($loncpid);
  343:        sleep 30;
  344:        if (kill 0 => $loncpid) {
  345:           print $fh "<h3>lonc at pid $loncpid responding</h3>";
  346:        } else {
  347:           $errors++; $errors++;
  348:           print $fh "<h3>lonc at pid $loncpid not responding</h3>";
  349:           print $fh "Give it one more try ...<p>";
  350:           system("$perlvar{'lonDaemons'}/lonc");
  351:           sleep 120;
  352:        }
  353:    } else {
  354:        print $fh "Seems like that did not work!<p>";
  355:        $errors++;
  356:    }
  357: }
  358: 
  359: $fname="$perlvar{'lonDaemons'}/logs/lonc.log";
  360: 
  361:                           my ($dev,$ino,$mode,$nlink,
  362:                               $uid,$gid,$rdev,$size,
  363:                               $atime,$mtime,$ctime,
  364:                               $blksize,$blocks)=stat($fname);
  365: 
  366: if ($size>40000) {
  367:     print $fh "Rotating logs ...<p>";
  368:     rename("$fname.2","$fname.3");
  369:     rename("$fname.1","$fname.2");
  370:     rename("$fname","$fname.1");
  371: }
  372: 
  373:    
  374: &errout($fh);
  375: # ---------------------------------------------------------------------- lonnet
  376: 
  377: print $fh '<hr><a name="lonnet"><h2>lonnet</h2><h3>Temp Log</h3><pre>';
  378: if (-e "$perlvar{'lonDaemons'}/logs/lonnet.log"){
  379: open (DFH,"tail -n50 $perlvar{'lonDaemons'}/logs/lonnet.log|");
  380: while ($line=<DFH>) { 
  381:     print $fh "$line";
  382:     if ($line=~/Delayed/) { $warnings++; }
  383:     if ($line=~/giving up/) { $warnings++; }
  384:     if ($line=~/FAILED/) { $errors++; }
  385: };
  386: close (DFH);
  387: }
  388: print $fh "</pre><h3>Perm Log</h3>";
  389: 
  390: if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
  391:     open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
  392: while ($line=<DFH>) { 
  393:    print $fh "$line";
  394: };
  395: close (DFH);
  396: } else { print $fh "No perm log\n" }
  397: 
  398: $fname="$perlvar{'lonDaemons'}/logs/lonnet.log";
  399: 
  400:                           my ($dev,$ino,$mode,$nlink,
  401:                               $uid,$gid,$rdev,$size,
  402:                               $atime,$mtime,$ctime,
  403:                               $blksize,$blocks)=stat($fname);
  404: 
  405: if ($size>40000) {
  406:     print $fh "Rotating logs ...<p>";
  407:     rename("$fname.2","$fname.3");
  408:     rename("$fname.1","$fname.2");
  409:     rename("$fname","$fname.1");
  410: }
  411: 
  412: print $fh "</pre>";
  413: &errout($fh);
  414: # ----------------------------------------------------------------- Connections
  415: 
  416: print $fh '<hr><a name="connections"><h2>Connections</h2>';
  417: 
  418: print $fh "<table border=2>";
  419: foreach $tryserver (keys %hostname) {
  420: 
  421:     $answer=reply("pong",$tryserver);
  422:     if ($answer eq "$tryserver:$perlvar{'lonHostID'}") {
  423: 	$result="<b>ok</b>";
  424:     } else {
  425:         $result=$answer;
  426:         $warnings++;
  427:         if ($answer eq 'con_lost') { $warnings++; }
  428:     }
  429:     print $fh "<tr><td>$tryserver</td><td>$result</td></tr>\n";
  430: 
  431: }
  432: print $fh "</table>";
  433: 
  434: &errout($fh);
  435: # ------------------------------------------------------------ Delayed messages
  436: 
  437: print $fh '<hr><a name="delayed"><h2>Delayed Messages</h2>';
  438: 
  439: &senddelayed($fh);
  440: 
  441: print $fh '<h3>Scanning Permanent Log</h3>';
  442: 
  443: $unsend=0;
  444: {
  445:     my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log");
  446:     while ($line=<$dfh>) {
  447: 	($time,$sdf,$dserv,$dcmd)=split(/:/,$line);
  448:         if ($sdf eq 'F') { 
  449: 	    $local=localtime($time);
  450:             print "<b>Failed: $time, $dserv, $dcmd</b><br>";
  451:             $warnings++;
  452:         }
  453:         if ($sdf eq 'S') { $unsend--; }
  454:         if ($sdf eq 'D') { $unsend++; }
  455:     }
  456: }
  457: print $fh "Total unsend messages: <b>$unsend</b><p>\n";
  458: $warnings=$warnings+5*$unsend;
  459: 
  460: print $fh "<h3>Outgoing Buffer</h3>";
  461: 
  462: open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
  463: while ($line=<DFH>) { 
  464:     print $fh "$line<br>";
  465: };
  466: close (DFH);
  467: 
  468: # ------------------------------------------------------------------------- End
  469: print $fh "<a name=errcount>\n";
  470: $totalcount=$notices+4*$warnings+100*$errors;
  471: &errout($fh);
  472: print $fh "<h1>Total Error Count: $totalcount</h1>";
  473: $now=time;
  474: $date=localtime($now);
  475: print $fh "<hr>$date ($now)</body></html>\n";
  476: 
  477: }
  478: 
  479: rename ("$statusdir/newstatus.html","$statusdir/index.html");
  480: 
  481: if ($totalcount>200) {
  482:    $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}";
  483:    $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices"; 
  484:    system(
  485:  "metasend -b -t $emailto -s '$subj' -f $statusdir/index.html -m text/html");
  486: }
  487: 1;
  488: 
  489: 
  490: 
  491: 
  492: 
  493: 
  494: 
  495: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>