--- loncom/cgi/clusterstatus.pl 2003/07/30 21:20:16 1.8
+++ loncom/cgi/clusterstatus.pl 2003/08/01 19:20:26 1.14
@@ -2,10 +2,8 @@
$|=1;
# The LearningOnline Network with CAPA
# Cluster Status
-# (Versions
-# (Running loncron
-# 09/06/01 Gerd Kortemeyer)
-# 02/18/02,02/19/02 Gerd Kortemeyer)
+#
+# $Id: clusterstatus.pl,v 1.14 2003/08/01 19:20:26 www Exp $
use lib '/home/httpd/lib/perl/';
use LONCAPA::Configuration;
@@ -18,6 +16,23 @@ my %host=();
my $oneday=60*60*24;
my %connectionstatus=();
+my %perlvar=();
+
+my $mode;
+my $concount=0;
+
+sub select_form {
+ my ($def,$name,%hash) = @_;
+ my $selectform = "";
+ return $selectform;
+}
+
sub key {
my ($local,$url)=@_;
@@ -33,6 +48,7 @@ sub hidden {
sub request {
my ($local,$url,$cachetime)=@_;
+ $cachetime*=(0.5+rand);
my $key=&key($local,$url);
my $reply='';
if ($FORM{$key.'_time'}) {
@@ -47,7 +63,7 @@ sub request {
$reply='local_unknown';
} else {
- my $ua=new LWP::UserAgent(timeout => 20);
+ my $ua=new LWP::UserAgent(timeout => 10);
my $request=new HTTP::Request('GET',
"http://".$hostname{$local}.$url);
@@ -77,16 +93,21 @@ sub connected {
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
+# Slowly phase this in: if not cached, only do 5 percent of the cases,
+# but always do the first five.
#
unless ($FORM{&key($local,$url)}) {
- unless (rand>0.9) { return 'not_yet'; }
+ unless (($concount<=5) || (rand>0.95)) {
+ return 'not_yet';
+ } else {
+ $concount++;
+ }
}
#
# Actually do the query
#
&statuslist($local,'connecting '.$remote);
- my $reply=&request($local,$url,1800);
+ my $reply=&request($local,$url,3600);
$reply=(split("\n",$reply))[0];
$reply=~s/\W//g;
if ($reply ne $remote) { return $reply; }
@@ -106,17 +127,94 @@ sub replyhash {
return %returnhash;
}
-# ========================================================== Show server status
+# ================================================================ Link to host
sub otherwindow {
my ($local,$url,$label)=@_;
return
- "$label";
+ " $label ";
}
-sub serverstatus {
+sub login {
my $local=shift;
- print "\n
$local $hostdom{$local} ($hostname{$local}; $hostrole{$local})
\n";
+ print &otherwindow($local,'/adm/login?domain='.$perlvar{'lonDefDomain'},
+ 'Login');
+}
+
+sub runloncron {
+ my $local=shift;
+ print &otherwindow($local,'/cgi-bin/loncron.pl','Run loncron');
+}
+
+sub loncron {
+ my $local=shift;
+ print &otherwindow($local,'/lon-status','loncron');
+}
+
+sub lonc {
+ my $local=shift;
+ print &otherwindow($local,'/lon-status/loncstatus.txt','lonc');
+}
+
+sub lond {
+ my $local=shift;
+ print &otherwindow($local,'/lon-status/londstatus.txt','lond');
+}
+
+sub users {
+ my $local=shift;
+ print &otherwindow($local,'/cgi-bin/userstatus.pl','Users');
+}
+
+sub versions {
+ my $local=shift;
+ print &otherwindow($local,'/cgi-bin/lonversions.pl','Versions');
+}
+
+sub server {
+ my $local=shift;
+ print &otherwindow($local,'/server-status','Server Status');
+}
+
+# ========================================================= Produce a green bar
+sub bar {
+ my $parm=shift;
+ my $number=int($parm+0.5);
+ print "";
+ for (my $i=0;$i<$number;$i++) {
+ print "+";
+ }
+ print " |
";
+}
+
+# ========================================================== Show server status
+
+sub serverstatus {
+ my ($local,$trouble)=@_;
+ print (<
+
+
+$local $hostdom{$local} ($hostname{$local}; $hostrole{$local})
+ $domaindescription{$hostdom{$local}}
+ |
+ENDHEADER
+ &login($local);&server($local);&users($local);&versions($local);
+ &loncron($local);&lond($local);&lonc($local);&runloncron($local);
+ print " |
";
+ if ($trouble) {
+ print ("$trouble |
");
+ }
+ print "";
+# load
+ if (($host{$local.'_load_doomed'}>0.5) || ($mode eq 'load_doomed')) {
+ print " Load: ".$host{$local.'_load'}
+ }
+# users
+ if (($host{$local.'_users_doomed'}>10) || ($mode eq 'users_doomed')) {
+ print " Active Users: ".$host{$local.'_users'}
+ }
+
# checkrpms
if ($host{$local.'_checkrpms'}) {
print " RPMs: ".$host{$local.'_checkrpms'}
@@ -125,6 +223,37 @@ sub serverstatus {
if ($host{$local.'_mysql'}) {
print " MySQL Database: ".$host{$local.'_mysql'}
}
+# connections
+ if ($host{$local.'_notconnected'}) {
+ print " Not connected: ";
+ foreach (split(/ /,$host{$local.'_notconnected'})) {
+ if ($_) {
+ print " $_";
+ }
+ }
+ }
+# errors
+ if ($host{$local.'_errors'}) {
+ print " loncron errors: ".$host{$local.'_errors'};
+ }
+ print " |
";
+}
+
+# =========================================================== Doomedness sorted
+
+sub doomedness {
+ my $crit=shift;
+ my %alldoomed=();
+ my @allhosts=();
+ foreach (keys %host) {
+ if ($_=~/^(\w+)\_$crit$/) {
+ if ($host{$_}) {
+ push (@allhosts,$1);
+ $alldoomed{$1}=$host{$_};
+ }
+ }
+ }
+ return sort { $alldoomed{$b} <=> $alldoomed{$a} } @allhosts;
}
# ====================================================================== Status
@@ -163,15 +292,32 @@ foreach $pair (@pairs) {
# ====================================================== Determine refresh rate
-my $refresh=(($FORM{'refresh'}=~/^\d+$/)?$FORM{'refresh'}:60);
+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".
- "\n";
+ "\n";
# -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
-my %perlvar=%{$perlvarref};
+%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
@@ -195,26 +341,56 @@ delete $perlvar{'lonSqlAccess'}; # remov
}
}
}
+# ------------------------------------------------------------ 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 "Cluster Status ".localtime()."
";
+print "LON-CAPA Cluster Status ".localtime()."
";
print "\n";;
print "";
exit 0;