--- loncom/cgi/clusterstatus.pl 2003/09/14 19:00:03 1.23 +++ loncom/cgi/clusterstatus.pl 2009/01/15 22:34:18 1.27 @@ -1,7 +1,7 @@ #!/usr/bin/perl $|=1; -# Generates a html page showing various sataus reports about the cluster -# $Id: clusterstatus.pl,v 1.23 2003/09/14 19:00:03 www Exp $ +# Generates a html page showing various status reports about the domain or cluster +# $Id: clusterstatus.pl,v 1.27 2009/01/15 22:34:18 raeburn 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); @@ -198,149 +196,168 @@ 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','Take offline'); + print(&otherwindow($local,'/cgi-bin/takeoffline.pl',&Apache::lonlocal::mt('Take offline'))); } sub reroute { my ($local,$remote)=@_; - print &otherwindow($local,'/cgi-bin/takeoffline.pl?'. + print(&otherwindow($local,'/cgi-bin/takeoffline.pl?'. $hostname{$remote}.'&'.$hostdom{$local} - ,$remote)."\n"; + ,$remote)."\n"); } sub allreroutes { my $local=shift; &takeoffline($local); - print ' Reroute to: '; - foreach my $remote (sort keys %hostname) { + my $reroute; + foreach my $remote (sort(keys(%hostname))) { unless ($local eq $remote) { - &reroute($local,$remote); + $reroute .= &reroute($local,$remote); } } - print ''; + 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(< "; + print(""); if ($trouble) { - print (""); + print(""); } - print "'; +''; } else { my $cellcolor='#DDCCAA'; if ($connectionstatus{$local.'_TO_'.$remote} eq 'local_error') { @@ -553,27 +570,27 @@ sub reports { # Users if ($maxusers) { my $factor=50/$maxusers; - print "

Total active user(s): $totalusers

". - "
-$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 "
$trouble
$trouble
"; + 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); @@ -380,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'); @@ -450,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; } @@ -527,7 +544,7 @@ sub reports { my $cellcolor='#BBDDBB'; if ($local eq $remote) { $cellcolor='#99DD99'; } print -'ok'.&Apache::lonlocal::mt('ok').'
"; + print '

'.&Apache::lonlocal::mt('Total active user(s)').': '.$totalusers.'

'. + '
'; foreach my $local (sort keys %hostname) { if (defined($host{$local.'_users'})) { print '\n"; + print ''."\n"; } } - print "
'.$local. '
'. - $domaindescription{$hostdom{$local}}. + $domaininfo{$hostdom{$local}}{'description'}. '
'; &users($local); print ''. $host{$local.'_users'}.'
"; + print ''; } else { - print "No active users logged in."; + print &Apache::lonlocal::mt('No active users logged in.'); } } elsif ($mode eq 'load') { # Load @@ -587,7 +604,7 @@ sub reports { ''. $local. '
'. - $domaindescription{$hostdom{$local}}. + $Apache::lonnet::domain{$hostdom{$local}}{'description'}. ''; &server($local); print @@ -599,46 +616,51 @@ 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='Rerouting
'; + $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 $displaylocal; + if (defined($local)) { + $displaylocal = " $local ($hostname{$local})"; + } + print ''."\n"; } # ============================================================================= @@ -677,23 +699,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}; @@ -701,72 +723,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";; +'
'. +"\n"; print "
\n"; -print 'Choose next report: '.&select_form($mode,'mode',%modes).'
'; +print &Apache::lonlocal::mt('Choose next report:').' '.&select_form($mode,'mode',%modes).'
'; &hidden('refresh',$refresh); if (!$FORM{'runonetime'}) { - print - "

Gathering initial cluster data

This may take some time ...
"; + my $lcscope = lc($scope); + print '

'.&Apache::lonlocal::mt("Gathering initial $lcscope data").'

'. + &Apache::lonlocal::mt('This may take some time ..').'
'; $fromcache=0; &mainloop(); - &statuslist('Done initial run.'); + &statuslist(undef,'Done initial run.'); &reports(); } else { $fromcache=1; &mainloop(); - &statuslist('Done gathering cached data'); + &statuslist(undef,'Done gathering cached data'); &reports(); $fromcache=0; &mainloop(); } &hidden('runonetime',1); -print '
Total number of queries: '.$stat_total. - '
Percent complete: '. - int(($stat_total-$stat_notyet)/$stat_total*100.). - '
Percent from cache: '. - int($stat_fromcache/$stat_total*100.).'
'; + print '
'.&Apache::lonlocal::mt('Total number of queries: [_1]',$stat_total); + if ($stat_total != 0) { + print '
'.&Apache::lonlocal::mt('Percent complete:').''. + int(($stat_total-$stat_notyet)/$stat_total*100.). + '
'.&Apache::lonlocal::mt('Percent from cache:').' '. + int($stat_fromcache/$stat_total*100.).'
'; + } # ============================================================== Close, refresh print "
"; exit 0;