#!/usr/bin/perl
# Housekeeping program, started by cron, loncontrol and loncron.pl
#
# $Id: loncron,v 1.74 2007/05/31 05:20:18 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 Apache::lonnet;
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";
# --------------------------------------------------------- Output error status
sub log {
my $fh=shift;
if ($fh) { print $fh @_ }
}
sub errout {
my $fh=shift;
&log($fh,(< Rotating $description ... Seems like it started ... Seems like that did not work! ');
printf("%-15s ",$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 rotate_logfile {
my ($file,$fh,$description) = @_;
my $size=(stat($file))[7];
if ($size>40000) {
&log($fh,"Errors $errors '.$daemon.'
Log
$daemon at pid $daemonpid responding");
if ($send) { &log($fh,", sending $send"); }
&log($fh,"
");
if ($send eq 'USR1') { kill USR1 => $daemonpid; }
if ($send eq 'USR2') { kill USR2 => $daemonpid; }
$restartflag=0;
if ($send eq 'USR2') {
$result = 'reloaded';
print "reloaded\n";
} else {
$result = 'running';
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++;
my $kadaemon=$daemon;
if ($kadaemon eq 'lonmemcached') { $kadaemon='memcached'; }
&log($fh,'
Killall '.$daemon.': '.
`killall $kadaemon 2>&1`.' - ');
sleep 1;
&log($fh,unlink($pidfile).' - '.
`killall -9 $kadaemon 2>&1`.
'
');
&log($fh,"$daemon not running, trying to start
");
if (&start_daemon($fh,$daemon,$pidfile,$args)) {
&log($fh,"$daemon at pid $daemonpid responding
");
$simplestatus{$daemon}='restarted';
$result = 'started';
print "started\n";
} else {
$errors++;
&log($fh,"$daemon at pid $daemonpid not responding
");
&log($fh,"$daemon at pid $daemonpid responding
");
$simplestatus{$daemon}='restarted';
$result = 'started';
print "started\n";
} else {
$result = 'failed';
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=
"); 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++; } &log($fh,") { &log($fh,&encode_entities($line,'<>&"')); $psproc++; } close (PSH); &log($fh,"
"); open(DSH,"$perlvar{'lonDaemons'}/distprobe |"); while (my $line="); &errout($fh); } sub start_logging { 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(DSH); &log($fh,"
$varname | ". &encode_entities($perlvar{$varname},'<>&"')." |
$id | ".&Apache::lonnet::host_domain($id). " | ".$role. " | ".&Apache::lonnet::hostname($id)." |
Cleaned up ".$cleaned." stale session token(s).
"); &log($fh,"Cleaned up ".$cleaned." stale sockets.
"); } # ----------------------------------------------------------------------- httpd sub check_httpd_logs { my ($fh)=@_; &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); } sub rotate_other_logs { my ($fh) = @_; my $fname="$perlvar{'lonDaemons'}/logs/autoenroll.log"; &rotate_logfile($fname,$fh,'Auto Enroll log'); $fname="$perlvar{'lonDaemons'}/logs/autocreate.log"; &rotate_logfile($fname,$fh,'Create Course log'); $fname="$perlvar{'lonDaemons'}/logs/searchcat.log"; &rotate_logfile($fname,$fh,'Search Cataloguing log'); } # ----------------------------------------------------------------- Connections sub test_connections { my ($fh)=@_; &log($fh,') { &log($fh,&encode_entities($line,'<>&"')); } close (DFH); } else { &log($fh,"No perm log\n") } my $fname="$perlvar{'lonDaemons'}/logs/lonnet.log"; &rotate_logfile($fname,$fh,'lonnet log'); &log($fh,"
$tryserver | $result |
Total unsend messages: $unsend
\n"); $warnings=$warnings+5*$unsend; if ($unsend) { $simplestatus{'unsend'}=$unsend; } &log($fh,""); # list directory with delayed messages and remember offline servers my %servers=(); open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|"); while (my $line=\n"); close (DFH); # pong to all servers that have delayed messages # this will trigger a reverse connection, which should flush the buffers foreach my $tryserver (keys %servers) { my $answer=&Apache::lonnet::reply("pong",$tryserver); &log($fh,"Pong to $tryserver: $answer) { my ($server)=($line=~/\.(\w+)$/); if ($server) { $servers{$server}=1; } &log($fh,&encode_entities($line,'<>&"')); } &log($fh,"