File:
[LON-CAPA] /
loncom /
cgi /
clusterstatus.pl
Revision
1.28:
download - view:
text,
annotated -
select for diffs
Wed May 28 18:16:09 2014 UTC (10 years, 7 months ago) by
bisitz
Branches:
MAIN
CVS tags:
version_2_12_X,
version_2_11_X,
version_2_11_5_msu,
version_2_11_5,
version_2_11_4_uiuc,
version_2_11_4_msu,
version_2_11_4,
version_2_11_3_uiuc,
version_2_11_3_msu,
version_2_11_3,
version_2_11_2_uiuc,
version_2_11_2_msu,
version_2_11_2_educog,
version_2_11_2,
version_2_11_1,
version_2_11_0,
HEAD
- Internationalization
- Improve: do not translate individual machine id
- Re-use existing phrases
- Consistent punctuation and spacing
#!/usr/bin/perl
$|=1;
# 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
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
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;
my %connectionstatus=();
my %perlvar=();
my $mode;
my $concount=0;
my $fromcache;
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;
my $totalusers=0;
my %FORM=();
my $stat_total=0;
my $stat_notyet=0;
my $stat_fromcache=0;
sub select_form {
my ($def,$name,%hash) = @_;
my $selectform = "<select name=\"$name\" size=\"1\">\n";
foreach my $key (sort(keys(%hash))) {
$selectform.="<option value=\"$key\" ".
($key eq $def? 'selected' : '').
">".$hash{$key}."</option>\n";
}
$selectform.="</select>";
return $selectform;
}
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' />");
}
sub request {
my ($local,$url,$cachetime)=@_;
$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'}) {
$stat_fromcache++;
return $FORM{$key};
} else {
$stat_notyet++;
return 'not_yet';
}
}
# 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'});
$stat_fromcache++;
}
}
unless ($reply) {
if ($hostname{$local}) {
my $ua=new LWP::UserAgent(timeout => 20);
my $request=new HTTP::Request('GET',
"http://".$hostname{$local}.$url);
my $response=$ua->request($request);
if ($response->is_success) {
$reply=$response->content;
chomp($reply);
} else {
$reply='local_error';
}
} else {
$reply='local_unknown';
}
&hidden($key.'_time',time);
}
&hidden($key,$reply);
return $reply;
}
# ============================================= Are local and remote connected?
sub connected {
my ($local,$remote)=@_;
$local=~s/\W//g;
$remote=~s/\W//g;
unless ($hostname{$remote}) { return 'remote_unknown'; }
my $url='/cgi-bin/ping.pl?'.$remote;
#
# 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 (($concount<=5) || (rand>0.95)) {
$stat_total++;
$stat_notyet++;
return 'not_yet';
} else {
$concount++;
}
}
#
# Actually do the query
#
&statuslist($local,&mt('connecting [_1]',$remote),1);
my $reply=&request($local,$url,3600);
$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;
}
# ================================================================ Link to host
sub otherwindow {
my ($local,$url,$label)=@_;
return
" <a href='http://$hostname{$local}$url' target='newwin$local'>$label</a> ";
}
sub login {
my $local=shift;
print(&otherwindow($local,'/adm/login?domain='.$perlvar{'lonDefDomain'},
'Login'));
}
sub runloncron {
my $local=shift;
print(&otherwindow($local,'/cgi-bin/loncron.pl',&Apache::lonlocal::mt('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',&Apache::lonlocal::mt('Users')));
}
sub versions {
my $local=shift;
print(&otherwindow($local,'/cgi-bin/lonversions.pl',&Apache::lonlocal::mt('Versions')));
}
sub server {
my $local=shift;
print(&otherwindow($local,'/server-status',&Apache::lonlocal::mt('Server Status')));
}
sub announcement {
my $local=shift;
print(&otherwindow($local,'/announcement.txt',&Apache::lonlocal::mt('Announcement')));
}
sub takeonline {
my $local=shift;
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:').' <font size="1">'.$reroute.'</font>');
}
}
# ========================================================= Produce a green bar
sub bar {
my $parm=shift;
my $number=int($parm+0.5);
print('<table><tr><td bgcolor="#225522"><font color="#225522">');
for (my $i=0;$i<$number;$i++) {
print "+";
}
print("</font></table>");
}
# ========================================================== Show server status
sub serverstatus {
my ($local,$trouble)=@_;
my $hostrole;
if (exists($libserv{$local})) {
$hostrole = 'library';
} else {
$hostrole = 'access';
}
my %lt = &Apache::lonlocal::texthash(
rero => 'Reroute:',
vers => 'Version:',
load => 'Load:',
acti => 'Active Users:',
rpms => 'RPMs:',
mysq => 'MySQL Database:',
notc => 'Not connected',
lonc => 'loncron errors',
);
print(<<ENDHEADER);
<a name="$local" />
<table width="100%" bgcolor="#225522" cellspacing="2" cellpadding="2" border="0">
<tr><td bgcolor="#BBDDBB"><font color="#225522" face="arial"><b>
$local $hostdom{$local}</b> <tt>($hostname{$local}); $hostrole</tt>
<br />$domaininfo{$hostdom{$local}}{'description'}
$domaininfo{$hostdom{$local}}{'city'}
</font></th></tr><tr><td bgcolor="#DDDDBB"><font color="#225522">
ENDHEADER
&login($local);&server($local);&users($local);&versions($local);
&announcement($local);
&loncron($local);&lond($local);&lonc($local);&runloncron($local);
print("</font></td></tr>");
if ($trouble) {
print("<tr><td bgcolor='#DDBBBB'><font color='#552222' size='+2'>$trouble</font></td></tr>");
}
print("<tr><td bgcolor='#BBBBBB'>");
# re-routing
if ($host{$local.'_reroute'}) {
print('<br />'.$lt{'rero'}.' '.$host{$local.'_reroute'});
&takeonline($local);
}
# version
if ($host{$local.'_version'}) {
print('<br />'.$lt{'vers'}.' '.$host{$local.'_version'});
}
# load
if (($host{$local.'_load_doomed'}>0.5) || ($mode eq 'load_doomed')) {
print('<br />'.$lt{'load'}.' '.$host{$local.'_load'});
}
# users
if (($host{$local.'_users_doomed'}>10) || ($mode eq 'users_doomed')) {
print('<br />'.$lt{'acti'}.' '.$host{$local.'_users'});
}
# checkrpms
if ($host{$local.'_checkrpms'}) {
print('<br />'.$lt{'rpms'}.' '.$host{$local.'_checkrpms'});
}
# mysql
if ($host{$local.'_mysql'}) {
print('<br />'.$lt{'mysq'}.' '.$host{$local.'_mysql'});
}
# connections
if ($host{$local.'_notconnected'}) {
print('<br />'.$lt{'notc'}.' ');
foreach my $item (split(/ /,$host{$local.'_notconnected'})) {
if ($item) {
print(' <a href="#$item">'.$item.'</a>');
}
}
}
# errors
if ($host{$local.'_errors'}) {
print('<br />'.$lt{'lonc'}.' '.$host{$local.'_errors'});
}
print "</td></tr><tr><td bgcolor='#DDDDDD'>";
&allreroutes($local);
print "</td></tr></table><br />";
}
# =========================================================== 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;
}
sub resetvars {
$maxusers=0;
$maxload=0;
$totalusers=0;
$stat_total=0;
$stat_notyet=0;
$stat_fromcache=0;
$concount=0;
undef %host;
%host=();
}
sub mainloop {
&resetvars();
# ==================================================== Main Loop over all Hosts
foreach my $local (sort(keys(%hostname))) {
$host{$local.'_unresponsive_doomed'}=0;
# -- 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.';
$host{$local.'_unresponsive_doomed'}++;
} else {
if ((time-$loncron{'time'})>$oneday) {
$host{$local.'_loncron'}='Stale.';
$host{$local.'_unresponsive_doomed'}++;
} else {
$host{$local.'_loncron_doomed'}=$loncron{'notices'}
+4*$loncron{'warnings'}
+100*$loncron{'errors'};
$host{$local.'_errors'}=$loncron{'errors'};
}
}
# -- Check version
&statuslist($local,'Version');
my $version=&request($local,'/lon-status/version.txt',7200);
if ($version eq 'local_error') {
$host{$local.'_version'}='Could not determine.';
$host{$local.'_unresponsive_doomed'}++;
} else {
$host{$local.'_version'}=$version;
}
# -- 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.';
$host{$local.'_unresponsive_doomed'}++;
} else {
$host{$local.'_users_doomed'}=$userstatus{'Active'};
$host{$local.'_users'}=$userstatus{'Active'};
unless ($host{$local.'_users'}) { $host{$local.'_users'}=0; }
if ($host{$local.'_users'}>$maxusers) {
$maxusers=$host{$local.'_users'};
}
$totalusers+=$host{$local.'_users'};
my ($sload,$mload,$lload)=split(/ /,$userstatus{'loadavg'});
$host{$local.'_load_doomed'}=$mload;
if ($mload>$maxload) {
$maxload=$mload;
}
$host{$local.'_load'}=$userstatus{'loadavg'};
}
# -- Check reroute status
&statuslist($local,'Reroute');
my %reroute=&replyhash($local,'/lon-status/reroute.txt',1800);
if ($reroute{'status'} eq 'rerouting') {
if ($reroute{'server'}) {
$host{$local.'_reroute'}=
'Rerouting to <tt>'.$reroute{'server'}.
'</tt>, domain: '.$reroute{'domain'}.
' (since '.localtime($reroute{'time'}).')';
} else {
$host{$local.'_reroute'}='offline';
}
}
# -- Check mysql status
&statuslist($local,'Database');
my %mysql=&replyhash($local,'/lon-status/mysql.txt',3600);
if (defined($mysql{'local_error'})) {
$host{$local.'_mysql'}='Could not determine.';
$host{$local.'_unresponsive_doomed'}++;
} else {
if ((time-$mysql{'time'})>(7*$oneday)) {
if (exists($libserv{$local})) {
$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',7200);
if (defined($checkrpms{'local_error'})) {
$host{$local.'_checkrpms'}='Could not determine.';
$host{$local.'_unresponsive_doomed'}++;
} else {
if ((time-$checkrpms{'time'})>(4*$oneday)) {
$host{$local.'_checkrpms'}='Stale.';
$host{$local.'_checkrpms_doomed'}=50;
$host{$local.'_unresponsive_doomed'}++;
} 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 my $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'}++;
}
}
# =============================================================== End Main Loop
}
}
sub reports {
# ====================================================================== Output
if ($mode=~/\_doomed$/) {
# Output by doomedness
foreach (&doomedness($mode)) {
&serverstatus($_);
}
} elsif ($mode eq 'connections') {
print
"<table cellspacing='3' cellpadding='3' border='0' bgcolor='#225522'>".
"<tr><td bgcolor='#225522'> </td>";
foreach my $remote (sort keys %hostname) {
print '<td bgcolor="#DDDDBB">'.$remote.'</td>';
}
print "</tr>\n";
# connection matrix
foreach my $local (sort keys %hostname) {
print '<tr><td bgcolor="#DDDDBB">'.$local.'</td>';
foreach my $remote (sort keys %hostname) {
if ($connectionstatus{$local.'_TO_'.$remote} eq 'not_yet') {
my $cellcolor='#FFFFFF';
if ($local eq $remote) { $cellcolor='#DDDDDD'; }
print '<td bgcolor="'.$cellcolor.'"><font color="#555522" size="-2">not yet tested</font></td>';
} elsif ($connectionstatus{$local.'_TO_'.$remote} eq 'ok') {
my $cellcolor='#BBDDBB';
if ($local eq $remote) { $cellcolor='#99DD99'; }
print
'<td bgcolor="'.$cellcolor.'"><font color="#225522" face="arial"><b>'.&Apache::lonlocal::mt('ok').'</b></td>';
} else {
my $cellcolor='#DDCCAA';
if ($connectionstatus{$local.'_TO_'.$remote} eq 'local_error') {
if ($local eq $remote) {
$cellcolor='#DD88AA';
} else {
$cellcolor='#DDAACC';
}
} else {
if ($local eq $remote) { $cellcolor='#DDBB77'; }
}
print
'<td bgcolor="'.$cellcolor.'"><font color="#552222" size="-2">'.
$connectionstatus{$local.'_TO_'.$remote}.'<br />';
&lonc($local); &lond($remote);
print '</td>';
}
}
print "</tr>\n";
}
print "</table>";
} elsif ($mode eq 'users') {
# Users
if ($maxusers) {
my $factor=50/$maxusers;
print '<h3>'.&Apache::lonlocal::mt('Total active user(s)').': '.$totalusers.'</h3>'.
'<table cellspacing="3" cellpadding="3" border="0" bgcolor="#225522">';
foreach my $local (sort keys %hostname) {
if (defined($host{$local.'_users'})) {
print
'<tr><td bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.$local.
'</font><br /><font size="-2">'.
$domaininfo{$hostdom{$local}}{'description'}.
'</font></td><td bgcolor="#DDDDBB">';
&users($local);
print
'</td><td bgcolor="#DDDDBB"><font face="arial" color="#225522">'.
$host{$local.'_users'}.'</font></td><td bgcolor="#DDDDBB"';
&bar($factor*$host{$local.'_users'});
print '</td></tr>'."\n";
}
}
print '</table>';
} else {
print &Apache::lonlocal::mt('No active users logged in.');
}
} elsif ($mode eq 'load') {
# Load
if ($maxload) {
my $factor=50/$maxload;
print
"<table cellspacing='3' cellpadding='3' border='0' bgcolor='#225522'>";
foreach my $local (sort keys %hostname) {
if (defined($host{$local.'_load_doomed'})) {
print
'<tr><td bgcolor="#BBDDBB"><font face="arial" color="#225522" size="+1">'.
$local.
'</font><br /><font size="-2">'.
$Apache::lonnet::domain{$hostdom{$local}}{'description'}.
'</font></td><td bgcolor="#DDDDBB">';
&server($local);
print
'</td><td bgcolor="#DDDDBB"><font face="arial" color="#225522">'.
$host{$local.'_load_doomed'}.'</font></td><td bgcolor="#DDDDBB"';
&bar($factor*$host{$local.'_load_doomed'});
print "</td></tr>\n";
}
}
print "</table>";
} else {
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=&Apache::lonlocal::mt('Does not respond to several queries.').
'<br />';
}
if ($host{$local.'_errors'}) {
$trouble=&Apache::lonlocal::mt('Has loncron errors').'<br />';
} elsif ($host{$local.'_loncron_doomed'}>2500) {
$trouble=&Apache::lonlocal::mt('High loncron count.').'<br />';
}
if ($host{$local.'_load_doomed'}>5) {
$trouble=&Apache::lonlocal::mt('High load.').'<br />';
}
if ($host{$local.'_users_doomed'}>200) {
$trouble=&Apache::lonlocal::mt('High user volume.').'<br />';
}
if ($host{$local.'_mysql_doomed'}>1) {
$trouble=&Apache::lonlocal::mt('MySQL database apparently offline.').'<br />';
}
if ($host{$local.'_checkrpms_doomed'}>100) {
$trouble=&Apache::lonlocal::mt('RPMs outdated.').'<br />';
}
if ($host{$local.'_reroute'}) {
$trouble=&Apache::lonlocal::&mt('Rerouting').'<br >';
}
if ($trouble) { $count++; &serverstatus($local,$trouble); }
}
unless ($count) { print &Apache::lonlocal::mt('No major trouble.'); }
}
}
# ====================================================================== Status
sub statuslist {
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 '<script>document.prgstat.progress.value="'.$output.'";</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= &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".
'<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
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 '<br /><span class="LC_warning">'.&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).'</span><br />';
if ($home) {
print '<span class="LC_warning">'.&mt("Alternatively, you'll need to [_1]switch server[_2] to display domain status for servers in the domain of your current role ([_3]).",'<a href="/adm/switchserver?otherserver='.$home.'&role='.$env{'request.role'}.'">','</a>',$roledom).'/span>';
}
exit;
}
foreach my $host (keys(%allhostname)) {
if (grep(/^\Q$hostdom{$host}\E$/,@poss_domains)) {
$hostname{$host} = $allhostname{$host};
}
}
}
print '<img src="/adm/lonIcons/lonlogos.gif" align="right" /><h1>'.&Apache::lonlocal::mt("LON-CAPA $scope Status").' '.localtime()."</h1>";
print "<form name='prgstat'>\n".
'<input type="text" name="progress" value="'."'".&Apache::lonlocal::mt('Starting ...')."'".'" size="100" /><br />'.
"</form>\n";
print "<form name='status' method='post'>\n";
print &Apache::lonlocal::mt('Choose next report:').' '.&select_form($mode,'mode',%modes).'<input type="submit" name="getreport" value="'.&Apache::lonlocal::mt('Go').'" /><hr />';
&hidden('refresh',$refresh);
if (!$FORM{'runonetime'}) {
my $lcscope = lc($scope);
print '<h3>'.&Apache::lonlocal::mt("Gathering initial $lcscope data").'</h3>'.
&Apache::lonlocal::mt('This may take some time ...').'<br />';
$fromcache=0;
&mainloop();
&statuslist(undef,'Done initial run');
&reports();
} else {
$fromcache=1;
&mainloop();
&statuslist(undef,'Done gathering cached data');
&reports();
$fromcache=0;
&mainloop();
}
&hidden('runonetime',1);
print '<tt><br />'.&Apache::lonlocal::mt('Total number of queries: [_1]',$stat_total);
if ($stat_total != 0) {
print '<br />'.&Apache::lonlocal::mt('Percent complete:').' '.
int(($stat_total-$stat_notyet)/$stat_total*100.).
'<br />'.&Apache::lonlocal::mt('Percent from cache:').' '.
int($stat_fromcache/$stat_total*100.).'</tt>';
}
# ============================================================== Close, refresh
print "</form><script>";
my $runtime=time-$starttime;
if (($refresh-$runtime)<0) {
print "document.status.submit();";
} else {
my $refreshtime=int(1000*($refresh-$runtime));
my $refreshmsg = &Apache::lonlocal::mt('Will automatically refresh ([_1] secs refresh cycle)',$refresh);
print "setTimeout('document.status.submit()',$refreshtime);\n".
"document.prgstat.progress.value='$refreshmsg'";
}
print "</script></body></html>";
exit 0;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>