[LON-CAPA-cvs] cvs: loncom /cgi clusterstatus.pl

www lon-capa-cvs@mail.lon-capa.org
Wed, 30 Jul 2003 21:20:16 -0000


This is a MIME encoded message

--www1059600016
Content-Type: text/plain

www		Wed Jul 30 17:20:16 2003 EDT

  Modified files:              
    /loncom/cgi	clusterstatus.pl 
  Log:
  Saving my work: comprehensive clusterstatus
  
  
--www1059600016
Content-Type: text/plain
Content-Disposition: attachment; filename="www-20030730172016.txt"

Index: loncom/cgi/clusterstatus.pl
diff -u loncom/cgi/clusterstatus.pl:1.7 loncom/cgi/clusterstatus.pl:1.8
--- loncom/cgi/clusterstatus.pl:1.7	Tue Feb 25 16:56:48 2003
+++ loncom/cgi/clusterstatus.pl	Wed Jul 30 17:20:16 2003
@@ -14,33 +14,161 @@
 use HTTP::Headers;
 use IO::File;
 
-sub connected {
-    my ($local,$remote)=@_;
-    $local=~s/\W//g;
-    $remote=~s/\W//g;
+my %host=();
+my $oneday=60*60*24;
 
-    unless ($hostname{$local}) { return 'local_unknown'; }
-    unless ($hostname{$remote}) { return 'remote_unknown'; }
+my %connectionstatus=();
+
+sub key {
+    my ($local,$url)=@_;
+    my $key=$local.'_'.$url;
+    $key=~s/\W/\_/gs;
+    return $key;
+}
+
+sub hidden {
+    my ($name,$value)=@_;
+    print "\n<input type='hidden' name='$name' value='$value' />";
+}
 
-    my $ua=new LWP::UserAgent;
+sub request {
+    my ($local,$url,$cachetime)=@_;
+    my $key=&key($local,$url);
+    my $reply='';
+    if ($FORM{$key.'_time'}) {
+	if ((time-$FORM{$key.'_time'})<$cachetime) {
+	    $reply=$FORM{$key};
+	    &hidden($key.'_time',$FORM{$key.'_time'});
+	    &hidden($key.'_fromcache',1);
+	}
+    }
+    unless ($reply) {
+	unless ($hostname{$local}) { 
+	    $reply='local_unknown'; 
+	} else {
+
+	    my $ua=new LWP::UserAgent(timeout => 20);
     
-    my $request=new HTTP::Request('GET',
-      "http://".$hostname{$local}.'/cgi-bin/ping.pl?'.$remote);
+	    my $request=new HTTP::Request('GET',
+					  "http://".$hostname{$local}.$url);
+	    $request->authorization_basic('lonadm','litelite');
+
+	    my $response=$ua->request($request);
 
-    my $response=$ua->request($request);
+	    unless ($response->is_success) { 
+		$reply='local_error'; 
+	    } else {
+		$reply=$response->content;
+		chomp($reply);
+	    }
+	}
+	&hidden($key.'_time',time);
+    }
+    &hidden($key,$reply);
+    return $reply;
+}
 
-    unless ($response->is_success) { return 'local_error'; }
+# ============================================= Are local and remote connected?
+sub connected {
+    my ($local,$remote)=@_;
+    $local=~s/\W//g;
+    $remote=~s/\W//g;
 
-    my $reply=$response->content;
+    unless ($hostname{$remote}) { return 'remote_unknown'; }
+    my $url='/cgi-bin/ping.pl?'.$remote;
+#
+# Slowly phase this in: if not cached, only do 10 percent of the cases 
+#
+    unless ($FORM{&key($local,$url)}) {
+	unless (rand>0.9) { return 'not_yet'; }
+    }
+#
+# Actually do the query
+#
+    &statuslist($local,'connecting '.$remote);
+    my $reply=&request($local,$url,1800);
     $reply=(split("\n",$reply))[0];
     $reply=~s/\W//g;
     if ($reply ne $remote) { return $reply; }
     return 'ok';
 }
+# ============================================================ Get a reply hash
+
+sub replyhash {
+    my %returnhash=();
+    foreach (split(/\&/,&request(@_))) {
+	my ($name,$value)=split(/\=/,$_);
+	if ($name) {
+	    unless ($value) { $value=''; }
+	    $returnhash{$name}=$value;
+	}
+    }
+    return %returnhash;
+}
+
+# ========================================================== Show server status
+
+sub otherwindow {
+    my ($local,$url,$label)=@_;
+    return
+  "<a href='http://$hostname{$local}$url' target='newwin$local'>$label</a>";
+}
+
+sub serverstatus {
+    my $local=shift;
+    print "\n<hr /><h3>$local $hostdom{$local} ($hostname{$local}; $hostrole{$local})</h3>\n";
+# checkrpms
+    if ($host{$local.'_checkrpms'}) {
+	print "<br />RPMs: ".$host{$local.'_checkrpms'}
+    }
+# mysql
+    if ($host{$local.'_mysql'}) {
+	print "<br />MySQL Database: ".$host{$local.'_mysql'}
+    }
+}
+
+# ====================================================================== 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'}:60);
+if ($refresh<30) { $refresh=30; }
+my $starttime=time;
+# ================================================================ Send Headers
 print "Content-type: text/html\n\n".
-      "<html><body bgcolor=#FFFFFF>\n";
+    "<html><body bgcolor=#FFFFFF>\n";
 # -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
 my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
 my %perlvar=%{$perlvarref};
@@ -68,67 +196,96 @@
     }
 }
 
-print 
-"<h1>Cluster Status</h1>";
-print "Please be patient while building cluster status ...<p>\n";
-$table='';
-
-$table.="<table border=2><tr><th rowspan=2>From (local)</th>".
-"<th colspan=$total>To (remote)</th></tr><tr>";
-foreach $remote (sort keys %hostname) {
-   $table.="<th";
-   if ($remote eq $perlvar{'lonHostID'}) {
-       $table.=" bgcolor=#CCFFBB";
-   } else {
-       if ($libserv{$remote}) { $table.=" bgcolor=#FFFF99"; }
-   }
-   $table.=
- "><a href=http://".$hostname{$remote}."/lon-status/>$remote</a></th>";
-}
-$table.="</tr>";
+print "<h1>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";
+&hidden('refresh',$refresh);
+
+# ==================================================== Main Loop over all Hosts
+
 foreach $local (sort keys %hostname) {
-   print "Checking $local: ";
-   $table.="<tr><td";
-   if ($local eq $perlvar{'lonHostID'}) {
-       $table.=" bgcolor=#CCFFBB";
-   } else {
-       if ($libserv{$local}) { $table.=" bgcolor=#FFFF99"; }
-   }
-   $table.=
- "><b><a href=http://".$hostname{$local}."/lon-status/>$local</a></b><br>".
-     $hostrole{$local}.' '.$hostdom{$local}.'<br>'.
-     "<tt><a href=http://".$hostname{$local}."/server-status/>".
-      $hostname{$local}."</a></tt><br>".
-     "<a href=http://".$hostname{$local}."/cgi-bin/loncron.pl>New Report</a>".
-     "</td>";
-   foreach $remote (sort keys %hostname) {
-       $status=&connected($local,$remote);
-       if ($status eq 'ok') {
-	   $table.="<td";
-           if ($libserv{$remote}) {
-	       if ($libserv{$local}) {
-		   $table.=" bgcolor=#FFFF44";
-               } else {
-                   $table.=" bgcolor=#FFFF99";
-               }
-           } elsif ($libserv{$local}) {
-               $table.=" bgcolor=#FFFF99";
-           }
-           $table.="><b><font color=#00FF00>OK</font></b></td>";
-           print ".";
-       } else {
-           print "X";
-           $table.="<td><b><font color=#FF0000>".$status."</font></b><br>".
-     "<a href=http://".$hostname{$local}.
-	 "/lon-status/loncstatus.txt>lonc</a>".
-    " <a href=http://".$hostname{$remote}.
-      "/lon-status/londstatus.txt>lond</a>".
-            "</td>";
-       }
-   }
-   $table.="</tr>\n";
-    print "<br>\n";
-}
-$table.="</table>";
-print $table;
-print "</body></html>";
+# -- Check general status
+    &statuslist($local,'General');
+    my %loncron=&replyhash($local,'/lon-status/loncron_simple.txt',1200);
+    if (defined($loncron{'local_error'})) {
+	$host{$local.'_loncron'}='Could not determine.';
+    } else {
+	if ((time-$loncron{'time'})>$oneday) {
+	    $host{$local.'_loncron'}='Stale.';
+	} else {
+	}
+    }
+# -- Check user status
+    &statuslist($local,'Users');
+    my %userstatus=&replyhash($local,'/cgi-bin/userstatus.pl?simple',600);
+    if (defined($userstatus{'local_error'})) {
+	$host{$local.'_userstatus'}='Could not determine.';
+    } else {
+    }
+# -- Check mysql status
+    &statuslist($local,'Database');
+    my %mysql=&replyhash($local,'/lon-status/mysql.txt',1200);
+    if (defined($mysql{'local_error'})) {
+	$host{$local.'_mysql'}='Could not determine.';
+    } else {
+	if ((time-$mysql{'time'})>(7*$oneday)) {
+	    if ($hostrole{$local} eq 'library') {
+		$host{$local.'_mysql'}='Stale.';
+		$host{$local.'_mysql_doomed'}=1;
+	    }
+	    if ($mysql{'mysql'} eq 'defunct') {
+		$host{$local.'_mysql'}='Defunct (maybe stale).';
+		$host{$local.'_mysql_doomed'}=2;
+	    }
+	} elsif ($mysql{'mysql'} eq 'defunct') {
+	    $host{$local.'_mysql'}='Defunct.';
+	    $host{$local.'_mysql_doomed'}=3;
+	}
+    }
+# -- Check rpm status
+    &statuslist($local,'RPMs');
+    my %checkrpms=&replyhash($local,'/lon-status/checkrpms.txt',2400);
+    if (defined($checkrpms{'local_error'})) {
+	$host{$local.'_checkrpms'}='Could not determine.';
+    } else {
+	if ((time-$checkrpms{'time'})>(4*$oneday)) {
+	    $host{$local.'_checkrpms'}='Stale.';
+	    $host{$local.'_checkrpms_doomed'}=50;
+	} elsif ($checkrpms{'status'} eq 'fail') {
+	    $host{$local.'_checkrpms'}='Could not checked RPMs.';
+	    $host{$local.'_checkrpms_doomed'}=100;
+	} elsif ($checkrpms{'rpmcount'}) {
+	    $host{$local.'_checkrpms'}='Outdated RPMs: '.
+		$checkrpms{'rpmcount'};
+	    $host{$local.'_checkrpms_doomed'}=$checkrpms{'rpmcount'};
+	}
+    }
+# -- Check connections
+    &statuslist($local,'Connections');
+    $host{$local.'_notconnected'}='';
+    $host{$local.'_notconnected_doomed'}=0;
+    foreach $remote (sort keys %hostname) {
+	my $status=&connected($local,$remote);
+	$connectionstatus{$local.'_TO_'.$remote}=$status;
+	unless (($status eq 'ok') || ($status eq 'not_yet')) {
+	    $host{$local.'_notconnected'}.=' '.$remote;
+	    $host{$local.'_notconnected_doomed'}++;
+	}
+    }
+# Eventually, use doomed count
+    &serverstatus($local);
+}
+
+# =============================================================== End Mail Loop
+print "</form><script>";
+$runtime=time-$starttime;
+if ($runtime>=$refresh) {
+    print 'document.status.submit();';
+} else {
+    $refreshtime=int(1000*($refresh-$runtime));
+    print "setTimeout('document.status.submit()',$refreshtime);";
+}
+print "</script></body></html>";
+exit 0;

--www1059600016--