#!/usr/bin/perl
# Housekeeping program, started by cron, loncontrol and loncron.pl
#
# $Id: loncron,v 1.49 2004/05/11 21:08:55 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
$|=1;
use strict;
use lib '/home/httpd/lib/perl/';
use LONCAPA::Configuration;
use IO::File;
use IO::Socket;
use HTML::Entities;
use Getopt::Long;
#globals
use vars qw (%perlvar %simplestatus $errors $warnings $notices $totalcount);
my $statusdir="/home/httpd/html/lon-status";
# -------------------------------------------------- Non-critical communication
sub reply {
my ($cmd,$server)=@_;
my $peerfile="$perlvar{'lonSockDir'}/$server";
my $client=IO::Socket::UNIX->new(Peer =>"$peerfile",
Type => SOCK_STREAM,
Timeout => 10)
or return "con_lost";
print $client "$cmd\n";
my $answer=<$client>;
chomp($answer);
if (!$answer) { $answer="con_lost"; }
return $answer;
}
# --------------------------------------------------------- Output error status
sub log {
my $fh=shift;
if ($fh) { print $fh @_ }
}
sub errout {
my $fh=shift;
&log($fh,(< Seems like it started ... Seems like that did not work! ');
printf("%-10s ",$daemon);
if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){
open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|");
while (my $line= Give it one more try ... Unable to start $daemonNotices $notices Warnings $warnings
ENDERROUT
}
sub start_daemon {
my ($fh,$daemon,$pidfile) = @_;
my $progname=$daemon;
if ($daemon eq 'lonc' && $ARGV[0] eq 'new') {
$progname='loncnew';
print "new ";
}
system("$perlvar{'lonDaemons'}/$progname 2>>$perlvar{'lonDaemons'}/logs/${daemon}_errors");
sleep 2;
if (-e $pidfile) {
&log($fh,"Errors $errors '.$daemon.'
Log
$daemon at pid $daemonpid responding");
if ($sendusr1) { &log($fh,", sending USR1"); }
&log($fh,"
");
if ($sendusr1) { kill USR1 => $daemonpid; }
$restartflag=0;
print "running\n";
} else {
$errors++;
&log($fh,"$daemon at pid $daemonpid not responding
");
$restartflag=1;
&log($fh,"Decided to clean up stale .pid file and restart $daemon
");
}
}
if ($restartflag==1) {
$simplestatus{$daemon}='off';
$errors++;
&log($fh,'
Killall '.$daemon.': '.
`killall $daemon 2>&1`.' - ');
sleep 2;
&log($fh,unlink($pidfile).' - '.
`killall -9 $daemon 2>&1`.
'
');
&log($fh,"$daemon not running, trying to start
");
if (&start_daemon($fh,$daemon,$pidfile)) {
&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,"$daemon at pid $daemonpid responding
");
$simplestatus{$daemon}='restarted';
print "started\n";
} else {
print " failed\n";
$simplestatus{$daemon}='failed';
$errors++; $errors++;
&log($fh,"$daemon at pid $daemonpid not responding
");
&log($fh,"");
open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");
while (my $line=
Rotating logs ...
"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); } &errout($fh); } # --------------------------------------------------------------------- Machine sub log_machine_info { my ($fh)=@_; &log($fh,'"); open (DFH,"df|"); while (my $line="); &log($fh,") { &log($fh,&encode_entities($line,'<>&"')); @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,"
"); my $psproc=0; open (PSH,"ps -aux --cols 140 |"); while (my $line="); if ($psproc>200) { $notices++; } if ($psproc>250) { $notices++; } &errout($fh); } sub start_logging { my ($hostdom,$hostrole,$hostname,$spareid)=@_; my $fh=IO::File->new(">$statusdir/newstatus.html"); my %simplestatus=(); my $now=time; my $date=localtime($now); &log($fh,(<) { &log($fh,&encode_entities($line,'<>&"')); $psproc++; } close (PSH); &log($fh,"
$varname | ". &encode_entities($perlvar{$varname},'<>&"')." |
$id | ".$hostdom->{$id}. " | ".$hostrole->{$id}. " | ".$hostname->{$id}." |
Cleaned up ".$cleaned." stale session token(s).
"); &log($fh,"'); open (DFH,"tail -n25 /etc/httpd/logs/access_log|"); while (my $line=) { &log($fh,&encode_entities($line,'<>&"')) }; close (DFH); &log($fh,"
"); open (DFH,"tail -n25 /etc/httpd/logs/error_log|"); while (my $line="); &errout($fh); } # ---------------------------------------------------------------------- lonnet sub rotate_lonnet_logs { my ($fh)=@_; &log($fh,') { &log($fh,"$line"); if ($line=~/\[error\]/) { $notices++; } } close (DFH); &log($fh,"
'); 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,&encode_entities($line,'<>&"')); } close (DFH); } &log($fh,"
"); if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") { open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|"); while (my $line="); &errout($fh); } # ----------------------------------------------------------------- Connections sub test_connections { my ($fh,$hostname)=@_; &log($fh,') { &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," Rotating logs ...
"); rename("$fname.2","$fname.3"); rename("$fname.1","$fname.2"); rename("$fname","$fname.1"); } &log($fh,"
$tryserver | $result |
Total unsend messages: $unsend
\n"); $warnings=$warnings+5*$unsend; if ($unsend) { $simplestatus{'unsend'}=$unsend; } &log($fh,""); open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|"); while (my $line=\n"); close (DFH); } sub finish_logging { my ($fh)=@_; &log($fh,"\n"); $totalcount=$notices+4*$warnings+100*$errors; &errout($fh); &log($fh,") { &log($fh,&encode_entities($line,'<>&"')); } &log($fh,"