#!/usr/bin/perl # Housekeeping program, started by cron, loncontrol and loncron.pl # # $Id: loncron,v 1.99 2013/05/29 18:10:54 raeburn 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 LONCAPA::Checksumming; use LONCAPA; use Apache::lonnet; use Apache::loncommon; 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,(< Notices$notices Warnings$warnings Errors$errors

Top

ENDERROUT } sub rotate_logfile { my ($file,$fh,$description) = @_; my $size=(stat($file))[7]; if ($size>40000) { &log($fh,"

Rotating $description ...

"); rename("$file.2","$file.3"); rename("$file.1","$file.2"); rename("$file","$file.1"); } } sub start_daemon { my ($fh,$daemon,$pidfile,$args) = @_; my $progname=$daemon; if ($daemon eq 'lonc') { $progname='loncnew'; } my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors"; &rotate_logfile($error_fname,$fh,'error logs'); if ($daemon eq 'lonc') { &clean_sockets($fh); } system("$perlvar{'lonDaemons'}/$progname 2>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); sleep 1; if (-e $pidfile) { &log($fh,"

Seems like it started ...

"); my $lfh=IO::File->new("$pidfile"); my $daemonpid=<$lfh>; chomp($daemonpid); if ($daemonpid =~ /^\d+$/ && kill 0 => $daemonpid) { return 1; } else { return 0; } } &log($fh,"

Seems like that did not work!

"); $errors++; return 0; } sub checkon_daemon { my ($fh,$daemon,$maxsize,$send,$args)=@_; my $result; &log($fh,'

'.$daemon.'

Log

'); printf("%-15s ",$daemon); if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){ open (DFH,"tail -n25 $perlvar{'lonDaemons'}/logs/$daemon.log|"); while (my $line=) { &log($fh,"$line"); if ($line=~/INFO/) { $notices++; } if ($line=~/WARNING/) { $notices++; } if ($line=~/CRITICAL/) { $warnings++; } }; close (DFH); } &log($fh,"

"); 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 ($daemonpid =~ /^\d+$/ && kill 0 => $daemonpid) { &log($fh,"

$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,"

Give it one more try ...

"); print " "; if (&start_daemon($fh,$daemon,$pidfile,$args)) { &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,"

Unable to start $daemon

"); } } if (-e "$perlvar{'lonDaemons'}/logs/$daemon.log"){ &log($fh,"

");
	    open (DFH,"tail -n100 $perlvar{'lonDaemons'}/logs/$daemon.log|");
	    while (my $line=) { 
		&log($fh,"$line");
		if ($line=~/WARNING/) { $notices++; }
		if ($line=~/CRITICAL/) { $notices++; }
	    };
	    close (DFH);
	    &log($fh,"

"); } } my $fname="$perlvar{'lonDaemons'}/logs/$daemon.log"; &rotate_logfile($fname,$fh,'logs'); &errout($fh); return $result; } # --------------------------------------------------------------------- Machine sub log_machine_info { my ($fh)=@_; &log($fh,'

Machine Information

'); &log($fh,"

loadavg

"); open (LOADAVGH,"/proc/loadavg"); my $loadavg=; close (LOADAVGH); &log($fh,"$loadavg"); my @parts=split(/\s+/,$loadavg); if ($parts[1]>4.0) { $errors++; } elsif ($parts[1]>2.0) { $warnings++; } elsif ($parts[1]>1.0) { $notices++; } &log($fh,"

df

"); &log($fh,"
");

    open (DFH,"df|");
    while (my $line=) { 
	&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,"
"); &log($fh,"

ps

"); &log($fh,"
");
    my $psproc=0;

    open (PSH,"ps aux --cols 140 |");
    while (my $line=) { 
	&log($fh,&encode_entities($line,'<>&"')); 
	$psproc++;
    }
    close (PSH);
    &log($fh,"
"); if ($psproc>200) { $notices++; } if ($psproc>250) { $notices++; } &log($fh,"

distprobe

"); &log($fh,"
");
    &log($fh,&encode_entities(&LONCAPA::distro(),'<>&"'));
    &log($fh,"
"); &errout($fh); } sub start_logging { my $fh=IO::File->new(">$statusdir/newstatus.html"); my %simplestatus=(); my $now=time; my $date=localtime($now); &log($fh,(< LON Status Report $perlvar{'lonHostID'}

LON Status Report $perlvar{'lonHostID'}

$date ($now)

  1. Configuration
  2. Machine Information
  3. Temporary Files
  4. Session Tokens
  5. httpd
  6. lonsql
  7. lond
  8. lonc
  9. lonnet
  10. Connections
  11. Delayed Messages
  12. Error Count

Configuration

PerlVars

ENDHEADERS foreach my $varname (sort(keys(%perlvar))) { &log($fh,"\n"); } &log($fh,"
$varname". &encode_entities($perlvar{$varname},'<>&"')."

Hosts

"); my %hostname = &Apache::lonnet::all_hostnames(); foreach my $id (sort(keys(%hostname))) { my $role = (&Apache::lonnet::is_library($id) ? 'library' : 'access'); &log($fh, "\n"); } &log($fh,"
$id".&Apache::lonnet::host_domain($id). "".$role. "".&Apache::lonnet::hostname($id)."

Spare Hosts

\n"); return $fh; } # --------------------------------------------------------------- clean out tmp sub clean_tmp { my ($fh)=@_; &log($fh,'

Temporary Files

'); my ($cleaned,$old,$removed) = (0,0,0); my %errors = ( dir => [], file => [], failopen => [], ); my %error_titles = ( dir => 'failed to remove empty directory:', file => 'failed to unlike stale file', failopen => 'failed to open file or directory' ); ($cleaned,$old,$removed) = &recursive_clean_tmp('',$cleaned,$old,$removed,\%errors); &log($fh,"Cleaned up: ".$cleaned." files; removed: $removed empty directories; (found: $old old checkout tokens)"); foreach my $key (sort(keys(%errors))) { if (ref($errors{$key}) eq 'ARRAY') { if (@{$errors{$key}} > 0) { &log($fh,"Error during cleanup ($error_titles{$key}):
'); } } } } sub recursive_clean_tmp { my ($subdir,$cleaned,$old,$removed,$errors) = @_; my $base = "$perlvar{'lonDaemons'}/tmp"; my $path = $base; next if ($subdir =~ m{\.\./}); next unless (ref($errors) eq 'HASH'); unless ($subdir eq '') { $path .= '/'.$subdir; } if (opendir(my $dh,"$path")) { while (my $file = readdir($dh)) { next if ($file =~ /^\.\.?$/); my $fname = "$path/$file"; if (-d $fname) { my $innerdir; if ($subdir eq '') { $innerdir = $file; } else { $innerdir = $subdir.'/'.$file; } ($cleaned,$old,$removed) = &recursive_clean_tmp($innerdir,$cleaned,$old,$removed,$errors); my @doms = &Apache::lonnet::current_machine_domains(); if (open(my $dirhandle,$fname)) { unless (($innerdir eq 'helprequests') || (($innerdir =~ /^addcourse/) && ($innerdir !~ m{/\d+$}))) { my @contents = grep {!/^\.\.?$/} readdir($dirhandle); join('&&',@contents)."\n"; if (scalar(grep {!/^\.\.?$/} readdir($dirhandle)) == 0) { closedir($dirhandle); if ($fname =~ m{^\Q$perlvar{'lonDaemons'}\E/tmp/}) { if (rmdir($fname)) { $removed ++; } elsif (ref($errors->{dir}) eq 'ARRAY') { push(@{$errors->{dir}},$fname); } } } } else { closedir($dirhandle); } } } else { 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'}) { if ($subdir eq '') { my $line=''; if ($fname =~ /\.db$/) { if (unlink($fname)) { $cleaned++; } elsif (ref($errors->{file}) eq 'ARRAY') { push(@{$errors->{file}},$fname); } } elsif (open(PROBE,$fname)) { my $line=''; $line=; close(PROBE); if ($line=~/^CHECKOUTTOKEN\&/) { if ($since>365*$perlvar{'lonExpire'}) { if (unlink($fname)) { $cleaned++; } elsif (ref($errors->{file}) eq 'ARRAY') { push(@{$errors->{file}},$fname); } } else { $old++; } } else { if (unlink($fname)) { $cleaned++; } elsif (ref($errors->{file}) eq 'ARRAY') { push(@{$errors->{file}},$fname); } } } elsif (ref($errors->{failopen}) eq 'ARRAY') { push(@{$errors->{failopen}},$fname); } } else { if (unlink($fname)) { $cleaned++; } elsif (ref($errors->{file}) eq 'ARRAY') { push(@{$errors->{file}},$fname); } } } } } closedir($dh); } elsif (ref($errors->{failopen}) eq 'ARRAY') { push(@{$errors->{failopen}},$path); } return ($cleaned,$old,$removed); } # ------------------------------------------------------------ clean out lonIDs sub clean_lonIDs { my ($fh)=@_; &log($fh,'

Session Tokens

'); 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
"); unlink("$fname"); } else { $active++; } } &log($fh,"

Cleaned up ".$cleaned." stale session token(s).

"); &log($fh,"

$active open session(s)

"); } # ----------------------------------------------------------- clean out sockets sub clean_sockets { my ($fh)=@_; my $cleaned=0; opendir(SOCKETS,$perlvar{'lonSockDir'}); while (my $fname=readdir(SOCKETS)) { next if (-d $fname || $fname=~/(mysqlsock|maximasock|rsock|\Q$perlvar{'lonSockDir'}\E)/); $cleaned++; &log($fh,"Unlinking $fname
"); unlink("/home/httpd/sockets/$fname"); } &log($fh,"

Cleaned up ".$cleaned." stale sockets.

"); } # ----------------------------------------------------------------------- httpd sub check_httpd_logs { my ($fh)=@_; if (open(PIPE,"./lchttpdlogs|")) { while (my $line=) { &log($fh,$line); if ($line=~/\[error\]/) { $notices++; } } close(PIPE); } &errout($fh); } # ---------------------------------------------------------------------- lonnet sub rotate_lonnet_logs { my ($fh)=@_; &log($fh,'

lonnet

Temp Log

');
    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,"

Perm Log

");
    
    if (-e "$perlvar{'lonDaemons'}/logs/lonnet.perm.log") {
	open(DFH,"tail -n10 $perlvar{'lonDaemons'}/logs/lonnet.perm.log|");
	while (my $line=) { 
	    &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,"
"); &errout($fh); } sub rotate_other_logs { my ($fh) = @_; my %logs = ( autoenroll => 'Auto Enroll log', autocreate => 'Create Course log', searchcat => 'Search Cataloguing log', autoupdate => 'Auto Update log', refreshcourseids_db => 'Refresh CourseIDs db log', ); foreach my $item (keys(%logs)) { my $fname=$perlvar{'lonDaemons'}.'/logs/'.$item.'.log'; &rotate_logfile($fname,$fh,$logs{$item}); } } # ----------------------------------------------------------------- Connections sub test_connections { my ($fh)=@_; &log($fh,'

Connections

'); print "testing connections\n"; &log($fh,""); my ($good,$bad)=(0,0); my %hostname = &Apache::lonnet::all_hostnames(); foreach my $tryserver (sort(keys(%hostname))) { print("."); my $result; my $answer=&Apache::lonnet::reply("ping",$tryserver); if ($answer eq "$tryserver:$perlvar{'lonHostID'}") { $result="ok"; $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,"\n"); } &log($fh,"
$tryserver$result
"); print "\n$good good, $bad bad connections\n"; &errout($fh); } # ------------------------------------------------------------ Delayed messages sub check_delayed_msg { my ($fh)=@_; &log($fh,'

Delayed Messages

'); print "checking buffers\n"; &log($fh,'

Scanning Permanent Log

'); my $unsend=0; my $dfh=IO::File->new("$perlvar{'lonDaemons'}/logs/lonnet.perm.log"); while (my $line=<$dfh>) { my ($time,$sdf,$dserv,$dcmd)=split(/:/,$line); if ($sdf eq 'F') { my $local=localtime($time); &log($fh,"Failed: $time, $dserv, $dcmd
"); $warnings++; } if ($sdf eq 'S') { $unsend--; } if ($sdf eq 'D') { $unsend++; } } &log($fh,"

Total unsend messages: $unsend

\n"); if ($unsend > 0) { $warnings=$warnings+5*$unsend; } if ($unsend) { $simplestatus{'unsend'}=$unsend; } &log($fh,"

Outgoing Buffer

\n
");
# list directory with delayed messages and remember offline servers
    my %servers=();
    open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|");
    while (my $line=) {
        my ($server)=($line=~/\.(\w+)$/);
        if ($server) { $servers{$server}=1; }
	&log($fh,&encode_entities($line,'<>&"'));
    }
    &log($fh,"
\n"); close (DFH); my %hostname = &Apache::lonnet::all_hostnames(); my $numhosts = scalar(keys(%hostname)); # pong to all servers that have delayed messages # this will trigger a reverse connection, which should flush the buffers foreach my $tryserver (sort(keys(%servers))) { if ($hostname{$tryserver} || !$numhosts) { my $answer; eval { local $SIG{ ALRM } = sub { die "TIMEOUT" }; alarm(20); $answer = &Apache::lonnet::reply("pong",$tryserver); alarm(0); }; if ($@ && $@ =~ m/TIMEOUT/) { &log($fh,"Attempted pong to $tryserver timed out
"); print "time out while contacting: $tryserver for pong\n"; } else { &log($fh,"Pong to $tryserver: $answer
"); } } else { &log($fh,"$tryserver has delayed messages, but is not part of the cluster -- skipping 'Pong'.
"); } } } sub finish_logging { my ($fh)=@_; &log($fh,"
\n"); $totalcount=$notices+4*$warnings+100*$errors; &errout($fh); &log($fh,"

Total Error Count: $totalcount

"); my $now=time; my $date=localtime($now); &log($fh,"
$date ($now)\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(); } sub write_loncaparevs { print "Retrieving LON-CAPA version information\n"; my %hostname = &Apache::lonnet::all_hostnames(); my $output; foreach my $id (sort(keys(%hostname))) { if ($id ne '') { my $loncaparev; eval { local $SIG{ ALRM } = sub { die "TIMEOUT" }; alarm(10); $loncaparev = &Apache::lonnet::get_server_loncaparev('',$id,1,'loncron'); alarm(0); }; if ($@ && $@ =~ m/TIMEOUT/) { print "time out while contacting lonHost: $id for version\n"; } if ($loncaparev =~ /^[\w.\-]+$/) { $output .= $id.':'.$loncaparev."\n"; } } } if ($output) { if (open(my $fh,">$perlvar{'lonTabDir'}/loncaparevs.tab")) { print $fh $output; close($fh); &Apache::lonnet::load_loncaparevs(); } } return; } sub write_serverhomeIDs { print "Retrieving LON-CAPA lonHostID information\n"; my %name_to_host = &Apache::lonnet::all_names(); my $output; foreach my $name (sort(keys(%name_to_host))) { if ($name ne '') { if (ref($name_to_host{$name}) eq 'ARRAY') { my $serverhomeID; eval { local $SIG{ ALRM } = sub { die "TIMEOUT" }; alarm(10); $serverhomeID = &Apache::lonnet::get_server_homeID($name,1,'loncron'); alarm(0); }; if ($@ && $@ =~ m/TIMEOUT/) { print "Time out while contacting server: $name\n"; } if ($serverhomeID ne '') { $output .= $name.':'.$serverhomeID."\n"; } else { $output .= $name.':'.$name_to_host{$name}->[0]."\n"; } } } } if ($output) { if (open(my $fh,">$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { print $fh $output; close($fh); &Apache::lonnet::load_serverhomeIDs(); } } return; } sub write_checksums { my $distro = &LONCAPA::distro(); if ($distro) { print "Retrieving file version and checksumming.\n"; my $numchksums = 0; my ($chksumsref,$versionsref) = &LONCAPA::Checksumming::get_checksums($distro,$perlvar{'lonDaemons'}, $perlvar{'lonLib'}, $perlvar{'lonIncludes'}, $perlvar{'lonTabDir'}); if (ref($chksumsref) eq 'HASH') { $numchksums = scalar(keys(%{$chksumsref})); } print "File version retrieved and checksumming completed for $numchksums files.\n"; } else { print "File version retrieval and checksumming skipped - could not determine Linux distro.\n"; } return; } sub send_mail { print "sending mail\n"; my $defdom = $perlvar{'lonDefDomain'}; my $origmail = $perlvar{'lonAdmEMail'}; my $emailto = &Apache::loncommon::build_recipient_list(undef, 'lonstatusmail',$defdom,$origmail); if ($totalcount>2500) { $emailto.=",$perlvar{'lonSysEMail'}"; } my $subj="LON: $perlvar{'lonHostID'} E:$errors W:$warnings N:$notices"; my $result=system("metasend -b -S 4000000 -t $emailto -s '$subj' -f $statusdir/index.html -m text/html >& /dev/null"); if ($result != 0) { $result=system("mail -s '$subj' $emailto < $statusdir/index.html"); } } sub usage { print(< \$help, "justcheckdaemons" => \$justcheckdaemons, "noemail" => \$noemail, "justcheckconnections" => \$justcheckconnections, "justreload" => \$justreload ); 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 chdir($perlvar{'lonDaemons'}); # --------------------------------------- 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; } # -------------------------------------------- Force reload of host information &Apache::lonnet::load_hosts_tab(1); &Apache::lonnet::load_domain_tab(1); &Apache::lonnet::get_iphost(1); # ----------------------------------------- Force firewall update for lond port if ((!$justcheckdaemons) && (!$justreload)) { my $now = time; my $tmpfile = $perlvar{'lonDaemons'}.'/tmp/lciptables_iphost_'. $now.$$.int(rand(10000)); if (open(my $fh,">$tmpfile")) { my %iphosts = &Apache::lonnet::get_iphost(); foreach my $key (keys(%iphosts)) { print $fh "$key\n"; } close($fh); if (&LONCAPA::try_to_lock('/tmp/lock_lciptables')) { my $execpath = $perlvar{'lonDaemons'}.'/lciptables'; system("$execpath $tmpfile"); unlink('/tmp/lock_lciptables'); # Remove the lock file. } unlink($tmpfile); } } # ---------------------------------------------------------------- Start report $errors=0; $warnings=0; $notices=0; my $fh; if (!$justcheckdaemons && !$justcheckconnections && !$justreload) { $fh=&start_logging(); &log_machine_info($fh); &clean_tmp($fh); &clean_lonIDs($fh); &check_httpd_logs($fh); &rotate_lonnet_logs($fh); &rotate_other_logs($fh); } if (!$justcheckconnections && !$justreload) { &checkon_daemon($fh,'lonmemcached',40000); &checkon_daemon($fh,'lonsql',200000); if ( &checkon_daemon($fh,'lond',40000,'USR1') eq 'running') { &checkon_daemon($fh,'lond',40000,'USR2'); } &checkon_daemon($fh,'lonc',40000,'USR1'); &checkon_daemon($fh,'lonmaxima',40000); &checkon_daemon($fh,'lonr',40000); } if ($justreload) { &checkon_daemon($fh,'lond',40000,'USR2'); &checkon_daemon($fh,'lonc',40000,'USR2'); } if ($justcheckconnections) { &test_connections($fh); } if (!$justcheckdaemons && !$justcheckconnections && !$justreload) { &check_delayed_msg($fh); &finish_logging($fh); &log_simplestatus(); &write_loncaparevs(); &write_serverhomeIDs(); &write_checksums(); if ($totalcount>200 && !$noemail) { &send_mail(); } } } &main(); 1;