[LON-CAPA-cvs] cvs: loncom /cgi clusterstatus.pl
www
lon-capa-cvs@mail.lon-capa.org
Tue, 05 Aug 2003 18:33:08 -0000
This is a MIME encoded message
--www1060108388
Content-Type: text/plain
www Tue Aug 5 14:33:08 2003 EDT
Modified files:
/loncom/cgi clusterstatus.pl
Log:
* per Guy's suggestion, change order of display versus further tests, now
almost always displaying something
* use strict
* reduce number of bytes sent to browser (eliminating unused hidden vars)
* keep stats
--www1060108388
Content-Type: text/plain
Content-Disposition: attachment; filename="www-20030805143308.txt"
Index: loncom/cgi/clusterstatus.pl
diff -u loncom/cgi/clusterstatus.pl:1.15 loncom/cgi/clusterstatus.pl:1.16
--- loncom/cgi/clusterstatus.pl:1.15 Tue Aug 5 08:52:23 2003
+++ loncom/cgi/clusterstatus.pl Tue Aug 5 14:33:08 2003
@@ -3,10 +3,11 @@
# The LearningOnline Network with CAPA
# Cluster Status
#
-# $Id: clusterstatus.pl,v 1.15 2003/08/05 12:52:23 www Exp $
+# $Id: clusterstatus.pl,v 1.16 2003/08/05 18:33:08 www Exp $
use lib '/home/httpd/lib/perl/';
use LONCAPA::Configuration;
+use strict;
use LWP::UserAgent();
use HTTP::Headers;
@@ -20,6 +21,27 @@
my $mode;
my $concount=0;
+my $fromcache;
+
+my %domaindescription = ();
+my %domain_auth_def = ();
+my %domain_auth_arg_def = ();
+
+my %hostname=();
+my %hostip=();
+my %hostdom=();
+my %hostrole=();
+my %libserv=();
+
+my $maxusers=0;
+my $maxload=0;
+my $totalusers=0;
+
+my %FORM=();
+
+my $stat_total=0;
+my $stat_notyet=0;
+my $stat_fromcache=0;
sub select_form {
my ($def,$name,%hash) = @_;
@@ -51,11 +73,23 @@
$cachetime*=(0.5+rand);
my $key=&key($local,$url);
my $reply='';
+ $stat_total++;
+# if fromcache flag is set, only return cached values
+ if ($fromcache) {
+ if ($FORM{$key.'_time'}) {
+ return $FORM{$key};
+ $stat_fromcache++;
+ } else {
+ return 'not_yet';
+ $stat_notyet++;
+ }
+ }
+# normal mode, refresh when expired or not yet present
if ($FORM{$key.'_time'}) {
if ((time-$FORM{$key.'_time'})<$cachetime) {
$reply=$FORM{$key};
&hidden($key.'_time',$FORM{$key.'_time'});
- &hidden($key.'_fromcache',1);
+ $stat_fromcache++;
}
}
unless ($reply) {
@@ -97,7 +131,9 @@
# but always do the first five.
#
unless ($FORM{&key($local,$url)}) {
- unless (($concount<=5) || (rand>0.95)) {
+ unless (($concount<=5) || (rand>0.95)) {
+ $stat_total++;
+ $stat_notyet++;
return 'not_yet';
} else {
$concount++;
@@ -260,125 +296,23 @@
return sort { $alldoomed{$b} <=> $alldoomed{$a} } @allhosts;
}
-# ====================================================================== Status
-sub statuslist {
- my ($local,$what)=@_;
- print
-"<script>document.prgstat.progress.value='Testing $local ($hostname{$local}): $what';</script>\n";
-}
-
-#
-# Main program
-#
-# ========================================================= Get form parameters
-my $buffer;
-
-read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
-my @pairs=split(/&/,$buffer);
-my $pair; my $name; my $value;
-undef %FORM;
-%FORM=();
-foreach $pair (@pairs) {
- ($name,$value) = split(/=/,$pair);
- $value =~ tr/+/ /;
- $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- $FORM{$name}=$value;
-}
-
-$buffer=$ENV{'QUERY_STRING'};
-@pairs=split(/&/,$buffer);
-foreach $pair (@pairs) {
- ($name,$value) = split(/=/,$pair);
- $value =~ tr/+/ /;
- $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- $FORM{$name}=$value;
-}
-
-# ====================================================== Determine refresh rate
-
-my $refresh=(($FORM{'refresh'}=~/^\d+$/)?$FORM{'refresh'}:120);
-if ($refresh<30) { $refresh=30; }
-my $starttime=time;
-
-# ============================================================== Determine mode
-
-my %modes=('trouble' => 'Trouble',
- 'users_doomed' => 'Doomed: Users',
- 'loncron_doomed' => 'Doomed: General (loncron)',
- 'mysql_doomed' => 'Doomed: Database (mysql)',
- 'notconnected_doomed' => 'Doomed: Connections',
- 'checkrpms_doomed' => 'Doomed: RPMs',
- 'load_doomed' => 'Doomed: Load',
- 'unresponsive_doomed' => 'Doomed: Status could not be determined',
- 'users' => 'User Report',
- 'load' => 'Load Report',
- 'connections' => 'Connections Matrix');
-
-$mode=$FORM{'mode'};
-unless ($modes{$mode}) { $mode='trouble'; }
-# ================================================================ Send Headers
-print "Content-type: text/html\n\n".
- "<html><body bgcolor='#FFFFFF'>\n";
-# -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
-my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
-%perlvar=%{$perlvarref};
-undef $perlvarref; # remove since sensitive and not needed
-delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed
-delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed
+sub resetvars {
+ $maxusers=0;
+ $maxload=0;
+ $totalusers=0;
+ $stat_total=0;
+ $stat_notyet=0;
+ $stat_fromcache=0;
-# ------------------------------------------------------------- Read hosts file
-{
- my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab");
-
- $total=0;
- while (my $configline=<$config>) {
- $configline=~s/#.*$//;
- unless ($configline=~/\w/) { next; }
- my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
- $hostname{$id}=$name;
- $hostdom{$id}=$domain;
- $hostrole{$id}=$role;
- $hostip{$id}=$ip;
- $total++;
- if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) {
- $libserv{$id}=$name;
- }
- }
+ undef %host;
+ %host=();
}
-# ------------------------------------------------------------ Read domain file
-{
- my $fh=IO::File->new($perlvar{'lonTabDir'}.'/domain.tab');
- %domaindescription = ();
- %domain_auth_def = ();
- %domain_auth_arg_def = ();
- if ($fh) {
- while (<$fh>) {
- next if (/^(\#|\s*$)/);
- chomp;
- my ($domain, $domain_description, $def_auth, $def_auth_arg)
- = split(/:/,$_,4);
- $domain_auth_def{$domain}=$def_auth;
- $domain_auth_arg_def{$domain}=$def_auth_arg;
- $domaindescription{$domain}=$domain_description;
- }
- }
-}
-
-print "<img src='/adm/lonIcons/lonlogos.gif' align='right' /><h1>LON-CAPA Cluster Status ".localtime()."</h1>";
-print "<form name='prgstat'>\n".
-"<input type='text' name='progress' value='Starting ...' size='100' /><br />".
-"</form>\n";;
-print "<form name='status' method='post'>\n";
-print 'Choose next report: '.&select_form($mode,'mode',%modes).'<hr />';
-&hidden('refresh',$refresh);
+sub mainloop {
+ &resetvars();
# ==================================================== Main Loop over all Hosts
-my $maxusers=0;
-my $maxload=0;
-my $totalusers=0;
-
-foreach $local (sort keys %hostname) {
+foreach my $local (sort keys %hostname) {
$host{$local.'_unresponsive_doomed'}=0;
# -- Check general status
&statuslist($local,'General');
@@ -472,7 +406,7 @@
&statuslist($local,'Connections');
$host{$local.'_notconnected'}='';
$host{$local.'_notconnected_doomed'}=0;
- foreach $remote (sort keys %hostname) {
+ foreach my $remote (sort keys %hostname) {
my $status=&connected($local,$remote);
$connectionstatus{$local.'_TO_'.$remote}=$status;
unless (($status eq 'ok') || ($status eq 'not_yet')) {
@@ -480,9 +414,12 @@
$host{$local.'_notconnected_doomed'}++;
}
}
-# =============================================================== End Mail Loop
+# =============================================================== End Main Loop
+}
+
}
-&statuslist('Done.');
+
+sub reports {
# ====================================================================== Output
if ($mode=~/\_doomed$/) {
# Output by doomedness
@@ -538,11 +475,13 @@
print "<h3>Total active user(s): $totalusers</h3>".
"<table cellspacing='3' cellpadding='3' border='0' bgcolor='#225522'>";
- foreach $local (sort keys %hostname) {
+ foreach my $local (sort keys %hostname) {
if (defined($host{$local.'_users'})) {
print
-'<tr><th bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.$local.
- '</font></th><td bgcolor="#DDDDBB">';
+'<tr><td bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.$local.
+ '</font><br /><font size="-2">'.
+ $domaindescription{$hostdom{$local}}.
+ '</font></td><td bgcolor="#DDDDBB">';
&users($local);
print
'</td><td bgcolor="#DDDDBB"><font face="arial" color="#225522">'.
@@ -561,12 +500,14 @@
my $factor=50/$maxload;
print
"<table cellspacing='3' cellpadding='3' border='0' bgcolor='#225522'>";
- foreach $local (sort keys %hostname) {
+ foreach my $local (sort keys %hostname) {
if (defined($host{$local.'_load_doomed'})) {
print
-'<tr><th bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.
+'<tr><td bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.
$local.
- '</font></th><td bgcolor="#DDDDBB">';
+ '</font><br /><font size="-2">'.
+ $domaindescription{$hostdom{$local}}.
+ '</font></td><td bgcolor="#DDDDBB">';
&server($local);
print
'</td><td bgcolor="#DDDDBB"><font face="arial" color="#225522">'.
@@ -581,7 +522,7 @@
}
} elsif ($mode eq 'trouble') {
my $count=0;
- foreach $local (sort keys %hostname) {
+ foreach my $local (sort keys %hostname) {
my $trouble='';
if ($host{$local.'_unresponsive_doomed'}>3) {
$trouble='Does not respond to several queries.<br />';
@@ -607,14 +548,145 @@
}
unless ($count) { print "No mayor trouble."; }
}
+}
+
+# ====================================================================== Status
+sub statuslist {
+ my ($local,$what)=@_;
+ print
+"<script>document.prgstat.progress.value='Testing $local ($hostname{$local}): $what';</script>\n";
+}
+
+# =============================================================================
+# =============================================================================
+# Main program
+#
+# ========================================================= Get form parameters
+my $buffer;
+
+read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
+my @pairs=split(/&/,$buffer);
+my $pair; my $name; my $value;
+undef %FORM;
+%FORM=();
+foreach $pair (@pairs) {
+ ($name,$value) = split(/=/,$pair);
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+ $FORM{$name}=$value;
+}
+
+$buffer=$ENV{'QUERY_STRING'};
+@pairs=split(/&/,$buffer);
+foreach $pair (@pairs) {
+ ($name,$value) = split(/=/,$pair);
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+ $FORM{$name}=$value;
+}
+
+# ====================================================== Determine refresh rate
+
+my $refresh=(($FORM{'refresh'}=~/^\d+$/)?$FORM{'refresh'}:30);
+if ($refresh<30) { $refresh=30; }
+my $starttime=time;
+
+# ============================================================== Determine mode
+
+my %modes=('trouble' => 'Trouble',
+ 'users_doomed' => 'Doomed: Users',
+ 'loncron_doomed' => 'Doomed: General (loncron)',
+ 'mysql_doomed' => 'Doomed: Database (mysql)',
+ 'notconnected_doomed' => 'Doomed: Connections',
+ 'checkrpms_doomed' => 'Doomed: RPMs',
+ 'load_doomed' => 'Doomed: Load',
+ 'unresponsive_doomed' => 'Doomed: Status could not be determined',
+ 'users' => 'User Report',
+ 'load' => 'Load Report',
+ 'connections' => 'Connections Matrix');
+
+$mode=$FORM{'mode'};
+unless ($modes{$mode}) { $mode='trouble'; }
+# ================================================================ Send Headers
+print "Content-type: text/html\n\n".
+ "<html><body bgcolor='#FFFFFF'>\n";
+# -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
+my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
+%perlvar=%{$perlvarref};
+undef $perlvarref; # remove since sensitive and not needed
+delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed
+delete $perlvar{'lonSqlAccess'}; # remove since sensitive and not needed
+
+# ------------------------------------------------------------- Read hosts file
+{
+ my $config=IO::File->new("$perlvar{'lonTabDir'}/hosts.tab");
+
+ while (my $configline=<$config>) {
+ $configline=~s/#.*$//;
+ unless ($configline=~/\w/) { next; }
+ my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
+ $hostname{$id}=$name;
+ $hostdom{$id}=$domain;
+ $hostrole{$id}=$role;
+ $hostip{$id}=$ip;
+ if (($role eq 'library') && ($id ne $perlvar{'lonHostID'})) {
+ $libserv{$id}=$name;
+ }
+ }
+}
+# ------------------------------------------------------------ Read domain file
+{
+ my $fh=IO::File->new($perlvar{'lonTabDir'}.'/domain.tab');
+ if ($fh) {
+ while (<$fh>) {
+ next if (/^(\#|\s*$)/);
+ chomp;
+ my ($domain, $domain_description, $def_auth, $def_auth_arg)
+ = split(/:/,$_,4);
+ $domain_auth_def{$domain}=$def_auth;
+ $domain_auth_arg_def{$domain}=$def_auth_arg;
+ $domaindescription{$domain}=$domain_description;
+ }
+ }
+}
+
+print "<img src='/adm/lonIcons/lonlogos.gif' align='right' /><h1>LON-CAPA Cluster Status ".localtime()."</h1>";
+print "<form name='prgstat'>\n".
+"<input type='text' name='progress' value='Starting ...' size='100' /><br />".
+"</form>\n";;
+print "<form name='status' method='post'>\n";
+print 'Choose next report: '.&select_form($mode,'mode',%modes).'<hr />';
+&hidden('refresh',$refresh);
+
+ if (!$FORM{'runonetime'}) {
+ print
+ "<h3>Gathering initial cluster data</h3>This may take some time ...<br />";
+ $fromcache=0;
+ &mainloop();
+ &statuslist('Done initial run.');
+ &reports();
+ } else {
+ $fromcache=1;
+ &mainloop();
+ &statuslist('Done gathering cached data');
+ &reports();
+ $fromcache=0;
+ &mainloop();
+ }
+ &hidden('runonetime',1);
+print '<tt><br />Total number of queries: '.$stat_total.
+ '<br />Percent complete: '.
+ int(($stat_total-$stat_notyet)/$stat_total*100.).
+ '<br />Percent from cache: '.
+ int($stat_fromcache/$stat_total*100.).'</tt>';
+
# ============================================================== Close, refresh
print "</form><script>";
-$runtime=time-$starttime;
-if (($refresh-$runtime)<30) {
- print "setTimeout('document.status.submit()',30000);\n".
- "document.prgstat.progress.value='Will automatically refresh.'";
+my $runtime=time-$starttime;
+if (($refresh-$runtime)<0) {
+ print "document.status.submit();";
} else {
- $refreshtime=int(1000*($refresh-$runtime));
+ my $refreshtime=int(1000*($refresh-$runtime));
print "setTimeout('document.status.submit()',$refreshtime);\n".
"document.prgstat.progress.value='Will automatically refresh ($refresh secs refresh cycle)'";
}
--www1060108388--