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