version 1.50, 2004/05/11 21:14:23
|
version 1.71, 2007/04/03 00:47:26
|
Line 45 my $statusdir="/home/httpd/html/lon-stat
|
Line 45 my $statusdir="/home/httpd/html/lon-stat
|
|
|
# -------------------------------------------------- Non-critical communication |
# -------------------------------------------------- Non-critical communication |
sub reply { |
sub reply { |
my ($cmd,$server)=@_; |
my ($cmd,$server,$hostname)=@_; |
my $peerfile="$perlvar{'lonSockDir'}/$server"; |
my $peerfile="$perlvar{'lonSockDir'}/".$hostname->{$server}; |
my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
Type => SOCK_STREAM, |
Type => SOCK_STREAM, |
Timeout => 10) |
Timeout => 10) |
or return "con_lost"; |
or return "con_lost"; |
print $client "$cmd\n"; |
print $client "sethost:$server:$cmd\n"; |
my $answer=<$client>; |
my $answer=<$client>; |
chomp($answer); |
chomp($answer); |
if (!$answer) { $answer="con_lost"; } |
if (!$answer) { $answer="con_lost"; } |
Line 79 ENDERROUT
|
Line 79 ENDERROUT
|
sub start_daemon { |
sub start_daemon { |
my ($fh,$daemon,$pidfile,$args) = @_; |
my ($fh,$daemon,$pidfile,$args) = @_; |
my $progname=$daemon; |
my $progname=$daemon; |
if ($daemon eq 'lonc' && $args eq 'new') { |
if ($daemon eq 'lonc') { |
$progname='loncnew'; |
$progname='loncnew'; |
print "new "; |
|
} |
} |
system("$perlvar{'lonDaemons'}/$progname 2>>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); |
my $error_fname="$perlvar{'lonDaemons'}/logs/${daemon}_errors"; |
sleep 2; |
my $size=(stat($error_fname))[7]; |
|
if ($size>40000) { |
|
&log($fh,"<p>Rotating error logs ...</p>"); |
|
rename("$error_fname.2","$error_fname.3"); |
|
rename("$error_fname.1","$error_fname.2"); |
|
rename("$error_fname","$error_fname.1"); |
|
} |
|
system("$perlvar{'lonDaemons'}/$progname 2>$perlvar{'lonDaemons'}/logs/${daemon}_errors"); |
|
sleep 1; |
if (-e $pidfile) { |
if (-e $pidfile) { |
&log($fh,"<p>Seems like it started ...</p>"); |
&log($fh,"<p>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); |
sleep 2; |
if ($daemonpid =~ /^\d+$/ && kill 0 => $daemonpid) { |
if (kill 0 => $daemonpid) { |
|
return 1; |
return 1; |
} else { |
} else { |
return 0; |
return 0; |
Line 103 sub start_daemon {
|
Line 109 sub start_daemon {
|
} |
} |
|
|
sub checkon_daemon { |
sub checkon_daemon { |
my ($fh,$daemon,$maxsize,$sendusr1,$args)=@_; |
my ($fh,$daemon,$maxsize,$send,$args)=@_; |
|
|
|
my $result; |
&log($fh,'<hr /><a name="'.$daemon.'" /><h2>'.$daemon.'</h2><h3>Log</h3><p style="white-space: pre;"><tt>'); |
&log($fh,'<hr /><a name="'.$daemon.'" /><h2>'.$daemon.'</h2><h3>Log</h3><p style="white-space: pre;"><tt>'); |
printf("%-10s ",$daemon); |
printf("%-15s ",$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 (my $line=<DFH>) { |
while (my $line=<DFH>) { |
Line 127 sub checkon_daemon {
|
Line 134 sub checkon_daemon {
|
my $lfh=IO::File->new("$pidfile"); |
my $lfh=IO::File->new("$pidfile"); |
$daemonpid=<$lfh>; |
$daemonpid=<$lfh>; |
chomp($daemonpid); |
chomp($daemonpid); |
if (kill 0 => $daemonpid) { |
if ($daemonpid =~ /^\d+$/ && kill 0 => $daemonpid) { |
&log($fh,"<h3>$daemon at pid $daemonpid responding"); |
&log($fh,"<h3>$daemon at pid $daemonpid responding"); |
if ($sendusr1) { &log($fh,", sending USR1"); } |
if ($send) { &log($fh,", sending $send"); } |
&log($fh,"</h3>"); |
&log($fh,"</h3>"); |
if ($sendusr1) { kill USR1 => $daemonpid; } |
if ($send eq 'USR1') { kill USR1 => $daemonpid; } |
|
if ($send eq 'USR2') { kill USR2 => $daemonpid; } |
$restartflag=0; |
$restartflag=0; |
print "running\n"; |
if ($send eq 'USR2') { |
|
$result = 'reloaded'; |
|
print "reloaded\n"; |
|
} else { |
|
$result = 'running'; |
|
print "running\n"; |
|
} |
} else { |
} else { |
$errors++; |
$errors++; |
&log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>"); |
&log($fh,"<h3>$daemon at pid $daemonpid not responding</h3>"); |
Line 144 sub checkon_daemon {
|
Line 158 sub checkon_daemon {
|
if ($restartflag==1) { |
if ($restartflag==1) { |
$simplestatus{$daemon}='off'; |
$simplestatus{$daemon}='off'; |
$errors++; |
$errors++; |
|
my $kadaemon=$daemon; |
|
if ($kadaemon eq 'lonmemcached') { $kadaemon='memcached'; } |
&log($fh,'<br><font color="red">Killall '.$daemon.': '. |
&log($fh,'<br><font color="red">Killall '.$daemon.': '. |
`killall $daemon 2>&1`.' - '); |
`killall $kadaemon 2>&1`.' - '); |
sleep 2; |
sleep 1; |
&log($fh,unlink($pidfile).' - '. |
&log($fh,unlink($pidfile).' - '. |
`killall -9 $daemon 2>&1`. |
`killall -9 $kadaemon 2>&1`. |
'</font><br>'); |
'</font><br>'); |
&log($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,$args)) { |
if (&start_daemon($fh,$daemon,$pidfile,$args)) { |
&log($fh,"<h3>$daemon at pid $daemonpid responding</h3>"); |
&log($fh,"<h3>$daemon at pid $daemonpid responding</h3>"); |
$simplestatus{$daemon}='restarted'; |
$simplestatus{$daemon}='restarted'; |
|
$result = 'started'; |
print "started\n"; |
print "started\n"; |
} else { |
} else { |
$errors++; |
$errors++; |
Line 164 sub checkon_daemon {
|
Line 181 sub checkon_daemon {
|
if (&start_daemon($fh,$daemon,$pidfile,$args)) { |
if (&start_daemon($fh,$daemon,$pidfile,$args)) { |
&log($fh,"<h3>$daemon at pid $daemonpid responding</h3>"); |
&log($fh,"<h3>$daemon at pid $daemonpid responding</h3>"); |
$simplestatus{$daemon}='restarted'; |
$simplestatus{$daemon}='restarted'; |
|
$result = 'started'; |
print "started\n"; |
print "started\n"; |
} else { |
} else { |
|
$result = 'failed'; |
print " failed\n"; |
print " failed\n"; |
$simplestatus{$daemon}='failed'; |
$simplestatus{$daemon}='failed'; |
$errors++; $errors++; |
$errors++; $errors++; |
Line 202 sub checkon_daemon {
|
Line 221 sub checkon_daemon {
|
} |
} |
|
|
&errout($fh); |
&errout($fh); |
|
return $result; |
} |
} |
|
|
# --------------------------------------------------------------------- Machine |
# --------------------------------------------------------------------- Machine |
Line 252 sub log_machine_info {
|
Line 272 sub log_machine_info {
|
&log($fh,"<pre>"); |
&log($fh,"<pre>"); |
my $psproc=0; |
my $psproc=0; |
|
|
open (PSH,"ps -aux --cols 140 |"); |
open (PSH,"ps aux --cols 140 |"); |
while (my $line=<PSH>) { |
while (my $line=<PSH>) { |
&log($fh,&encode_entities($line,'<>&"')); |
&log($fh,&encode_entities($line,'<>&"')); |
$psproc++; |
$psproc++; |
Line 263 sub log_machine_info {
|
Line 283 sub log_machine_info {
|
if ($psproc>200) { $notices++; } |
if ($psproc>200) { $notices++; } |
if ($psproc>250) { $notices++; } |
if ($psproc>250) { $notices++; } |
|
|
|
&log($fh,"<h3>distprobe</h3>"); |
|
&log($fh,"<pre>"); |
|
open(DSH,"$perlvar{'lonDaemons'}/distprobe |"); |
|
while (my $line=<DSH>) { |
|
&log($fh,&encode_entities($line,'<>&"')); |
|
$psproc++; |
|
} |
|
close(DSH); |
|
&log($fh,"</pre>"); |
|
|
&errout($fh); |
&errout($fh); |
} |
} |
|
|
Line 455 sub test_connections {
|
Line 485 sub test_connections {
|
foreach my $tryserver (sort(keys(%{$hostname}))) { |
foreach my $tryserver (sort(keys(%{$hostname}))) { |
print("."); |
print("."); |
my $result; |
my $result; |
my $answer=reply("pong",$tryserver); |
my $answer=&reply("ping",$tryserver,$hostname); |
if ($answer eq "$tryserver:$perlvar{'lonHostID'}") { |
if ($answer eq "$tryserver:$perlvar{'lonHostID'}") { |
$result="<b>ok</b>"; |
$result="<b>ok</b>"; |
$good++; |
$good++; |
Line 480 sub test_connections {
|
Line 510 sub test_connections {
|
|
|
# ------------------------------------------------------------ Delayed messages |
# ------------------------------------------------------------ Delayed messages |
sub check_delayed_msg { |
sub check_delayed_msg { |
my ($fh)=@_; |
my ($fh,$hostname)=@_; |
&log($fh,'<hr /><a name="delayed" /><h2>Delayed Messages</h2>'); |
&log($fh,'<hr /><a name="delayed" /><h2>Delayed Messages</h2>'); |
print "checking buffers\n"; |
print "checking buffers\n"; |
|
|
Line 505 sub check_delayed_msg {
|
Line 535 sub check_delayed_msg {
|
|
|
if ($unsend) { $simplestatus{'unsend'}=$unsend; } |
if ($unsend) { $simplestatus{'unsend'}=$unsend; } |
&log($fh,"<h3>Outgoing Buffer</h3>\n<pre>"); |
&log($fh,"<h3>Outgoing Buffer</h3>\n<pre>"); |
|
# list directory with delayed messages and remember offline servers |
|
my %servers=(); |
open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|"); |
open (DFH,"ls -lF $perlvar{'lonSockDir'}/delayed|"); |
while (my $line=<DFH>) { |
while (my $line=<DFH>) { |
|
my ($server)=($line=~/\.(\w+)$/); |
|
if ($server) { $servers{$server}=1; } |
&log($fh,&encode_entities($line,'<>&"')); |
&log($fh,&encode_entities($line,'<>&"')); |
} |
} |
&log($fh,"</pre>\n"); |
&log($fh,"</pre>\n"); |
close (DFH); |
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=&reply("pong",$tryserver,$hostname); |
|
&log($fh,"Pong to $tryserver: $answer<br />"); |
|
} |
} |
} |
|
|
sub finish_logging { |
sub finish_logging { |
Line 546 sub log_simplestatus {
|
Line 585 sub log_simplestatus {
|
sub send_mail { |
sub send_mail { |
print "sending mail\n"; |
print "sending mail\n"; |
my $emailto="$perlvar{'lonAdmEMail'}"; |
my $emailto="$perlvar{'lonAdmEMail'}"; |
if ($totalcount>1000) { |
if ($totalcount>2500) { |
$emailto.=",$perlvar{'lonSysEMail'}"; |
$emailto.=",$perlvar{'lonSysEMail'}"; |
} |
} |
my $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"); |
|
|
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 { |
sub usage { |
Line 558 sub usage {
|
Line 601 sub usage {
|
loncron - housekeeping program that checks up on various parts of Lon-CAPA |
loncron - housekeeping program that checks up on various parts of Lon-CAPA |
|
|
Options: |
Options: |
--help Display help |
--help Display |
--oldlonc When starting the lonc daemon use 'lonc' not 'loncnew' |
|
--noemail Do not send the status email |
--noemail Do not send the status email |
--justcheckconnections Only check the current status of the lonc/d |
--justcheckconnections Only check the current status of the lonc/d |
connections, do not send emails do not |
connections, do not send emails do not |
Line 569 Options:
|
Line 611 Options:
|
running, do not send emails do not |
running, do not send emails do not |
check the lonc/d connections, do not |
check the lonc/d connections, do not |
generate lon-status |
generate lon-status |
|
--justreload Only tell the daemons to reload the config files, |
|
do not send emails do not |
|
check if the daemons are running, do not |
|
generate lon-status |
|
|
USAGE |
USAGE |
} |
} |
|
|
# ================================================================ Main Program |
# ================================================================ Main Program |
sub main () { |
sub main () { |
my ($oldlonc,$help,$justcheckdaemons,$noemail,$justcheckconnections); |
my ($help,$justcheckdaemons,$noemail,$justcheckconnections, |
|
$justreload); |
&GetOptions("help" => \$help, |
&GetOptions("help" => \$help, |
"oldlonc" => \$oldlonc, |
|
"justcheckdaemons" => \$justcheckdaemons, |
"justcheckdaemons" => \$justcheckdaemons, |
"noemail" => \$noemail, |
"noemail" => \$noemail, |
"justcheckconnections" => \$justcheckconnections |
"justcheckconnections" => \$justcheckconnections, |
|
"justreload" => \$justreload |
); |
); |
if ($help) { &usage(); return; } |
if ($help) { &usage(); return; } |
# --------------------------------- Read loncapa_apache.conf and loncapa.conf |
# --------------------------------- Read loncapa_apache.conf and loncapa.conf |
Line 621 sub main () {
|
Line 668 sub main () {
|
my (%hostname,%hostdom,%hostrole,%spareid); |
my (%hostname,%hostdom,%hostrole,%spareid); |
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
next if ($configline =~ /^(\#|\s*\$)/); |
next if ($configline =~ /^(\#|\s*\$)/); |
my ($id,$domain,$role,$name,$ip,$domdescr)=split(/:/,$configline); |
my ($id,$domain,$role,$name)=split(/:/,$configline); |
if ($id && $domain && $role && $name && $ip) { |
if ($id && $domain && $role && $name) { |
|
$name=~s/\s//g; |
$hostname{$id}=$name; |
$hostname{$id}=$name; |
$hostdom{$id}=$domain; |
$hostdom{$id}=$domain; |
$hostrole{$id}=$role; |
$hostrole{$id}=$role; |
Line 649 sub main () {
|
Line 697 sub main () {
|
|
|
|
|
my $fh; |
my $fh; |
if (!$justcheckdaemons && !$justcheckconnections) { |
if (!$justcheckdaemons && !$justcheckconnections && !$justreload) { |
$fh=&start_logging(\%hostdom,\%hostrole,\%hostname,\%spareid); |
$fh=&start_logging(\%hostdom,\%hostrole,\%hostname,\%spareid); |
|
|
&log_machine_info($fh); |
&log_machine_info($fh); |
Line 658 sub main () {
|
Line 706 sub main () {
|
&check_httpd_logs($fh); |
&check_httpd_logs($fh); |
&rotate_lonnet_logs($fh); |
&rotate_lonnet_logs($fh); |
} |
} |
if (!$justcheckconnections) { |
if (!$justcheckconnections && !$justreload) { |
&checkon_daemon($fh,'lonsql',200000); |
&checkon_daemon($fh,'lonsql',200000); |
&checkon_daemon($fh,'lond',40000,1); |
if ( &checkon_daemon($fh,'lond',40000,'USR1') eq 'running') { |
my $args='new'; |
&checkon_daemon($fh,'lond',40000,'USR2'); |
if ($oldlonc) { $args = ''; } |
} |
&checkon_daemon($fh,'lonc',40000,1,$args); |
&checkon_daemon($fh,'lonc',40000,'USR1'); |
&checkon_daemon($fh,'lonhttpd',40000); |
&checkon_daemon($fh,'lonhttpd',40000); |
|
&checkon_daemon($fh,'lonmemcached',40000); |
|
&checkon_daemon($fh,'lonmaxima',40000); |
|
} |
|
if ($justreload) { |
|
&checkon_daemon($fh,'lond',40000,'USR2'); |
|
&checkon_daemon($fh,'lonc',40000,'USR2'); |
} |
} |
if (!$justcheckdaemons) { |
if ($justcheckconnections) { |
&test_connections($fh,\%hostname); |
&test_connections($fh,\%hostname); |
} |
} |
if (!$justcheckdaemons && !$justcheckconnections) { |
if (!$justcheckdaemons && !$justcheckconnections && !$justreload) { |
&check_delayed_msg($fh); |
&check_delayed_msg($fh,\%hostname); |
&finish_logging($fh); |
&finish_logging($fh); |
&log_simplestatus(); |
&log_simplestatus(); |
|
|