--- loncom/cgi/clusterstatus.pl 2003/09/14 18:24:34 1.22
+++ loncom/cgi/clusterstatus.pl 2014/05/28 18:16:09 1.28
@@ -1,7 +1,7 @@
#!/usr/bin/perl
$|=1;
-# Generates a html page showing various sataus reports about the cluster
-# $Id: clusterstatus.pl,v 1.22 2003/09/14 18:24:34 www Exp $
+# Generates a html page showing various status reports about the domain or cluster
+# $Id: clusterstatus.pl,v 1.28 2014/05/28 18:16:09 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,14 +26,20 @@ $|=1;
# http://www.lon-capa.org/
#
-use lib '/home/httpd/lib/perl/';
-use LONCAPA::Configuration;
use strict;
+use lib '/home/httpd/lib/perl/';
+use Apache::lonnet;
+use Apache::lonlocal;
+use LONCAPA::Configuration;
+use LONCAPA::loncgi;
+use LONCAPA::lonauthcgi;
use LWP::UserAgent();
use HTTP::Headers;
use IO::File;
+my $perlvar=&LONCAPA::Configuration::read_conf('loncapa.conf');
+
my %host=();
my $oneday=60*60*24;
@@ -44,19 +50,16 @@ my $mode;
my $concount=0;
my $fromcache;
-my %domaindescription = ();
-my %domain_auth_def = ();
-my %domain_auth_arg_def = ();
-my %domain_lang_def=();
-my %domain_city=();
-my %domain_longi=();
-my %domain_lati=();
-
-my %hostname=();
-my %hostip=();
-my %hostdom=();
-my %hostrole=();
-my %libserv=();
+my %domaininfo = &Apache::lonnet::domain_info();
+my %allhostname = &Apache::lonnet::all_hostnames();
+my (%hostname,%hostip);
+my %hostdom = &Apache::lonnet::all_host_domain();
+my %iphost = &Apache::lonnet::get_iphost();
+my %libserv= &Apache::lonnet::all_library();
+
+foreach my $ip (keys(%iphost)) {
+ $hostip{$iphost{$ip}} = $ip;
+}
my $maxusers=0;
my $maxload=0;
@@ -71,10 +74,10 @@ my $stat_fromcache=0;
sub select_form {
my ($def,$name,%hash) = @_;
my $selectform = "";
return $selectform;
@@ -90,7 +93,7 @@ sub key {
sub hidden {
my ($name,$value)=@_;
- print "\n";
+ print("\n");
}
sub request {
@@ -102,11 +105,11 @@ sub request {
# if fromcache flag is set, only return cached values
if ($fromcache) {
if ($FORM{$key.'_time'}) {
+ $stat_fromcache++;
return $FORM{$key};
- $stat_fromcache++;
} else {
+ $stat_notyet++;
return 'not_yet';
- $stat_notyet++;
}
}
# normal mode, refresh when expired or not yet present
@@ -118,25 +121,20 @@ sub request {
}
}
unless ($reply) {
- unless ($hostname{$local}) {
- $reply='local_unknown';
- } else {
-
- my $ua=new LWP::UserAgent(timeout => 10);
-
+ if ($hostname{$local}) {
+ my $ua=new LWP::UserAgent(timeout => 20);
my $request=new HTTP::Request('GET',
"http://".$hostname{$local}.$url);
- $request->authorization_basic('lonadm','litelite');
-
my $response=$ua->request($request);
-
- unless ($response->is_success) {
+ if ($response->is_success) {
+ $reply=$response->content;
+ chomp($reply);
+ } else {
$reply='local_error';
- } else {
- $reply=$response->content;
- chomp($reply);
}
- }
+ } else {
+ $reply='local_unknown';
+ }
&hidden($key.'_time',time);
}
&hidden($key,$reply);
@@ -167,7 +165,7 @@ sub connected {
#
# Actually do the query
#
- &statuslist($local,'connecting '.$remote);
+ &statuslist($local,&mt('connecting [_1]',$remote),1);
my $reply=&request($local,$url,3600);
$reply=(split("\n",$reply))[0];
$reply=~s/\W//g;
@@ -198,126 +196,171 @@ sub otherwindow {
sub login {
my $local=shift;
- print &otherwindow($local,'/adm/login?domain='.$perlvar{'lonDefDomain'},
- 'Login');
+ print(&otherwindow($local,'/adm/login?domain='.$perlvar{'lonDefDomain'},
+ 'Login'));
}
sub runloncron {
my $local=shift;
- print &otherwindow($local,'/cgi-bin/loncron.pl','Run loncron');
+ print(&otherwindow($local,'/cgi-bin/loncron.pl',&Apache::lonlocal::mt('Run loncron')));
}
sub loncron {
my $local=shift;
- print &otherwindow($local,'/lon-status','loncron');
+ print(&otherwindow($local,'/lon-status','loncron'));
}
sub lonc {
my $local=shift;
- print &otherwindow($local,'/lon-status/loncstatus.txt','lonc');
+ print(&otherwindow($local,'/lon-status/loncstatus.txt','lonc'));
}
sub lond {
my $local=shift;
- print &otherwindow($local,'/lon-status/londstatus.txt','lond');
+ print(&otherwindow($local,'/lon-status/londstatus.txt','lond'));
}
sub users {
my $local=shift;
- print &otherwindow($local,'/cgi-bin/userstatus.pl','Users');
+ print(&otherwindow($local,'/cgi-bin/userstatus.pl',&Apache::lonlocal::mt('Users')));
}
sub versions {
my $local=shift;
- print &otherwindow($local,'/cgi-bin/lonversions.pl','Versions');
+ print(&otherwindow($local,'/cgi-bin/lonversions.pl',&Apache::lonlocal::mt('Versions')));
}
sub server {
my $local=shift;
- print &otherwindow($local,'/server-status','Server Status');
+ print(&otherwindow($local,'/server-status',&Apache::lonlocal::mt('Server Status')));
}
sub announcement {
my $local=shift;
- print &otherwindow($local,'/announcement.txt','Announcement');
+ print(&otherwindow($local,'/announcement.txt',&Apache::lonlocal::mt('Announcement')));
}
sub takeonline {
my $local=shift;
- print &otherwindow($local,'/cgi-bin/takeonline.pl','Take online');
+ print(&otherwindow($local,'/cgi-bin/takeonline.pl',&Apache::lonlocal::mt('Take online')));
+}
+
+sub takeoffline {
+ my $local=shift;
+ print(&otherwindow($local,'/cgi-bin/takeoffline.pl',&Apache::lonlocal::mt('Take offline')));
+}
+
+sub reroute {
+ my ($local,$remote)=@_;
+ print(&otherwindow($local,'/cgi-bin/takeoffline.pl?'.
+ $hostname{$remote}.'&'.$hostdom{$local}
+ ,$remote)."\n");
+}
+
+sub allreroutes {
+ my $local=shift;
+ &takeoffline($local);
+ my $reroute;
+ foreach my $remote (sort(keys(%hostname))) {
+ unless ($local eq $remote) {
+ $reroute .= &reroute($local,$remote);
+ }
+ }
+ if ($reroute) {
+ print(&Apache::lonlocal::mt('Reroute to:').' '.$reroute.'');
+ }
}
# ========================================================= Produce a green bar
sub bar {
my $parm=shift;
my $number=int($parm+0.5);
- print "
";
+ print('');
for (my $i=0;$i<$number;$i++) {
print "+";
}
- print " | ";
+ print(" |
");
}
# ========================================================== Show server status
sub serverstatus {
my ($local,$trouble)=@_;
- print (< 'Reroute:',
+ vers => 'Version:',
+ load => 'Load:',
+ acti => 'Active Users:',
+ rpms => 'RPMs:',
+ mysq => 'MySQL Database:',
+ notc => 'Not connected',
+ lonc => 'loncron errors',
+ );
+
+ print(<
-$local $hostdom{$local} ($hostname{$local}; $hostrole{$local})
- $domaindescription{$hostdom{$local}}
-$domain_city{$hostdom{$local}}
+$local $hostdom{$local} ($hostname{$local}); $hostrole
+ $domaininfo{$hostdom{$local}}{'description'}
+$domaininfo{$hostdom{$local}}{'city'}
|
ENDHEADER
&login($local);&server($local);&users($local);&versions($local);
&announcement($local);
&loncron($local);&lond($local);&lonc($local);&runloncron($local);
- print " |
";
+ print("");
if ($trouble) {
- print ("$trouble |
");
+ print("$trouble |
");
}
- print "";
+ print(" |
");
# re-routing
if ($host{$local.'_reroute'}) {
- print " Reroute: ".$host{$local.'_reroute'};
+ print(' '.$lt{'rero'}.' '.$host{$local.'_reroute'});
&takeonline($local);
}
# version
if ($host{$local.'_version'}) {
- print " Version: ".$host{$local.'_version'}
+ print(' '.$lt{'vers'}.' '.$host{$local.'_version'});
}
# load
if (($host{$local.'_load_doomed'}>0.5) || ($mode eq 'load_doomed')) {
- print " Load: ".$host{$local.'_load'}
+ print(' '.$lt{'load'}.' '.$host{$local.'_load'});
}
# users
if (($host{$local.'_users_doomed'}>10) || ($mode eq 'users_doomed')) {
- print " Active Users: ".$host{$local.'_users'}
+ print(' '.$lt{'acti'}.' '.$host{$local.'_users'});
}
# checkrpms
if ($host{$local.'_checkrpms'}) {
- print " RPMs: ".$host{$local.'_checkrpms'}
+ print(' '.$lt{'rpms'}.' '.$host{$local.'_checkrpms'});
}
# mysql
if ($host{$local.'_mysql'}) {
- print " MySQL Database: ".$host{$local.'_mysql'}
+ print(' '.$lt{'mysq'}.' '.$host{$local.'_mysql'});
}
# connections
if ($host{$local.'_notconnected'}) {
- print " Not connected: ";
- foreach (split(/ /,$host{$local.'_notconnected'})) {
- if ($_) {
- print " $_";
+ print(' '.$lt{'notc'}.' ');
+ foreach my $item (split(/ /,$host{$local.'_notconnected'})) {
+ if ($item) {
+ print(' '.$item.'');
}
}
}
# errors
if ($host{$local.'_errors'}) {
- print " loncron errors: ".$host{$local.'_errors'};
+ print(' '.$lt{'lonc'}.' '.$host{$local.'_errors'});
}
+ print " |
";
+ &allreroutes($local);
print " |
";
}
@@ -354,7 +397,7 @@ sub mainloop {
&resetvars();
# ==================================================== Main Loop over all Hosts
-foreach my $local (sort keys %hostname) {
+foreach my $local (sort(keys(%hostname))) {
$host{$local.'_unresponsive_doomed'}=0;
# -- Check general status
&statuslist($local,'General');
@@ -424,7 +467,7 @@ foreach my $local (sort keys %hostname)
$host{$local.'_unresponsive_doomed'}++;
} else {
if ((time-$mysql{'time'})>(7*$oneday)) {
- if ($hostrole{$local} eq 'library') {
+ if (exists($libserv{$local})) {
$host{$local.'_mysql'}='Stale.';
$host{$local.'_mysql_doomed'}=1;
}
@@ -501,7 +544,7 @@ sub reports {
my $cellcolor='#BBDDBB';
if ($local eq $remote) { $cellcolor='#99DD99'; }
print
-'ok | ';
+''.&Apache::lonlocal::mt('ok').' | ';
} else {
my $cellcolor='#DDCCAA';
if ($connectionstatus{$local.'_TO_'.$remote} eq 'local_error') {
@@ -527,27 +570,27 @@ sub reports {
# Users
if ($maxusers) {
my $factor=50/$maxusers;
- print "Total active user(s): $totalusers
".
- "";
+ print ''.&Apache::lonlocal::mt('Total active user(s)').': '.$totalusers.'
'.
+ '';
foreach my $local (sort keys %hostname) {
if (defined($host{$local.'_users'})) {
print
''.$local.
' '.
- $domaindescription{$hostdom{$local}}.
+ $domaininfo{$hostdom{$local}}{'description'}.
' | ';
&users($local);
print
' | '.
$host{$local.'_users'}.' | |
\n";
+ print ''."\n";
}
}
- print "
";
+ print '
';
} else {
- print "No active users logged in.";
+ print &Apache::lonlocal::mt('No active users logged in.');
}
} elsif ($mode eq 'load') {
# Load
@@ -561,7 +604,7 @@ sub reports {
''.
$local.
' '.
- $domaindescription{$hostdom{$local}}.
+ $Apache::lonnet::domain{$hostdom{$local}}{'description'}.
' | ';
&server($local);
print
@@ -573,46 +616,56 @@ sub reports {
}
print "";
} else {
- print "No workload.";
+ print &Apache::lonlocal::mt('No workload.');
}
} elsif ($mode eq 'trouble') {
my $count=0;
foreach my $local (sort keys %hostname) {
my $trouble='';
if ($host{$local.'_unresponsive_doomed'}>3) {
- $trouble='Does not respond to several queries. ';
+ $trouble=&Apache::lonlocal::mt('Does not respond to several queries.').
+ ' ';
}
if ($host{$local.'_errors'}) {
- $trouble='Has loncron errors. ';
- } elsif ($host{$local.'_loncron_doomed'}>600) {
- $trouble='High loncron count. ';
+ $trouble=&Apache::lonlocal::mt('Has loncron errors').' ';
+ } elsif ($host{$local.'_loncron_doomed'}>2500) {
+ $trouble=&Apache::lonlocal::mt('High loncron count.').' ';
}
if ($host{$local.'_load_doomed'}>5) {
- $trouble='High load. ';
+ $trouble=&Apache::lonlocal::mt('High load.').' ';
}
if ($host{$local.'_users_doomed'}>200) {
- $trouble='High user volume. ';
+ $trouble=&Apache::lonlocal::mt('High user volume.').' ';
}
if ($host{$local.'_mysql_doomed'}>1) {
- $trouble='MySQL database apparently offline. ';
+ $trouble=&Apache::lonlocal::mt('MySQL database apparently offline.').' ';
}
if ($host{$local.'_checkrpms_doomed'}>100) {
- $trouble='RPMs outdated. ';
+ $trouble=&Apache::lonlocal::mt('RPMs outdated.').' ';
}
if ($host{$local.'_reroute'}) {
- $trouble='Re-Routing ';
+ $trouble=&Apache::lonlocal::&mt('Rerouting').' ';
}
if ($trouble) { $count++; &serverstatus($local,$trouble); }
}
- unless ($count) { print "No mayor trouble."; }
+ unless ($count) { print &Apache::lonlocal::mt('No major trouble.'); }
}
}
# ====================================================================== Status
sub statuslist {
- my ($local,$what)=@_;
- print
-"\n";
+ my ($local,$what,$nomt)=@_;
+ my $displaylocal;
+ if (defined($local)) {
+ $displaylocal = " $local ($hostname{$local})";
+ }
+ my $output = &Apache::lonlocal::mt('Testing[_1]:',$displaylocal).' ';
+ if ($nomt) {
+ $output .= $what;
+ } else {
+ $output .= &Apache::lonlocal::mt($what);
+ }
+ print ''."\n";
}
# =============================================================================
@@ -651,23 +704,23 @@ 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');
-
+my %modes= &Apache::lonlocal::texthash (
+ '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";
+print("Content-type: text/html\n\n".
+ ''."\n");
# -------------------- Read loncapa.conf (and by default, loncapa_apache.conf).
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
%perlvar=%{$perlvarref};
@@ -675,72 +728,80 @@ undef $perlvarref; # remove since sensit
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,
- $def_lang, $city, $longi, $lati) = split(/:/,$_);
- $domain_auth_def{$domain}=$def_auth;
- $domain_auth_arg_def{$domain}=$def_auth_arg;
- $domaindescription{$domain}=$domain_description;
- $domain_lang_def{$domain}=$def_lang;
- $domain_city{$domain}=$city;
- $domain_longi{$domain}=$longi;
- $domain_lati{$domain}=$lati;
- }
+if (!&LONCAPA::loncgi::check_cookie_and_load_env()) {
+ &Apache::lonlocal::get_language_handle();
+ print(&LONCAPA::loncgi::missing_cookie_msg());
+ exit;
+}
+
+if (!&LONCAPA::lonauthcgi::can_view('clusterstatus')) {
+ &Apache::lonlocal::get_language_handle();
+ print &LONCAPA::lonauthcgi::unauthorized_msg('clusterstatus');
+ exit;
+}
+
+&Apache::lonlocal::get_language_handle();
+
+my $scope = 'Domain';
+if ($Apache::lonnet::env{'request.role'} =~ m{^su\./}) {
+ %hostname = %allhostname;
+ $scope = 'Cluster';
+} else {
+ my $roledom = $env{'request.role.domain'};
+ if ((!$roledom) || ($roledom eq 'public')) {
+ print &LONCAPA::lonauthcgi::unauthorized_msg('clusterstatus');
+ exit;
+ }
+ undef(%hostname);
+ my @poss_domains = &Apache::lonnet::current_machine_domains();
+ if (!grep(/^\Q$roledom\E$/,@poss_domains)) {
+ my $home = &Apache::lonnet::domain($roledom,'primary');
+ print &LONCAPA::lonauthcgi::unauthorized_msg('clusterstatus');
+ print ' '.&mt("You need to select a role in this server's domain ([_1]) to display domain status for this server and other servers in the domain.",$roledom).' ';
+ if ($home) {
+ print ''.&mt("Alternatively, you'll need to [_1]switch server[_2] to display domain status for servers in the domain of your current role ([_3]).",'','',$roledom).'/span>';
+ }
+ exit;
+ }
+ foreach my $host (keys(%allhostname)) {
+ if (grep(/^\Q$hostdom{$host}\E$/,@poss_domains)) {
+ $hostname{$host} = $allhostname{$host};
+ }
}
}
-print "LON-CAPA Cluster Status ".localtime()."";
+print ''.&Apache::lonlocal::mt("LON-CAPA $scope Status").' '.localtime()."";
print "\n";;
+' '.
+"\n";
print "";
exit 0;
|