[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--