version 1.1, 2003/09/11 19:47:30
|
version 1.5, 2009/01/06 08:08:44
|
Line 1
|
Line 1
|
#!/usr/bin/perl |
#!/usr/bin/perl |
|
$|=1; |
# Take machine offline, reroute traffic |
# Take machine offline, reroute traffic |
# |
# |
# $Id$ |
# $Id$ |
Line 26
|
Line 27
|
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
|
|
print "Content-type: text/html\n\n". |
use strict; |
"<html><body bgcolor=#FFFFFF><h1>Take Offline</h1>"; |
use lib '/home/httpd/lib/perl/'; |
unless ($ENV{'QUERY_STRING'}) { |
use Apache::lonlocal; |
print 'No reroute server given, taking completely offline.'; |
use Apache::loncommon; |
&dead(); |
use LONCAPA::loncgi; |
} else { |
use LONCAPA::lonauthcgi; |
$otherserver=$ENV{'QUERY_STRING'}; |
|
print 'Rerouting to '.$otherserver; |
print "Content-type: text/html\n\n"; |
&reroute(); |
|
|
&main(); |
|
|
|
sub main { |
|
if (!&LONCAPA::lonauthcgi::check_ipbased_access('takeoffline')) { |
|
if (!&LONCAPA::loncgi::check_cookie_and_load_env()) { |
|
&Apache::lonlocal::get_language_handle(); |
|
print(&LONCAPA::loncgi::missing_cookie_msg()); |
|
return; |
|
} |
|
|
|
if (!&LONCAPA::lonauthcgi::can_view('takeoffline')) { |
|
&Apache::lonlocal::get_language_handle(); |
|
print(&LONCAPA::lonauthcgi::unauthorized_msg('takeoffline')); |
|
return; |
|
} |
|
} |
|
&Apache::lonlocal::get_language_handle(); |
|
|
|
if ($ENV{'QUERY_STRING'} =~ /^phase\=two\&?(.*)$/) { |
|
my $reroute = $1; |
|
print &Apache::loncommon::start_page('Take Offline','', |
|
{'no_inline_link' => 1,}); |
|
&phasetwo($reroute); |
|
} else { |
|
my $js = <<ENDJS; |
|
<script type="text/javascript"> |
|
|
|
function setphase(form) { |
|
var subaction = '/cgi-bin/takeoffline.pl?phase=two'; |
|
form.action = subaction+'&'+form.rerouteto.options[form.rerouteto.selectedIndex].value; |
|
form.submit(); |
} |
} |
|
|
print "</body></html>"; |
</script> |
|
ENDJS |
|
print &Apache::loncommon::start_page('Take Offline',$js, |
|
{'no_inline_link' => 1,}); |
|
&phaseone(); |
|
} |
|
print &Apache::loncommon::end_page(); |
|
return; |
|
} |
|
|
|
sub phaseone { |
|
# print '<html><body bgcolor="#FFFFFF"> |
|
print '<h2>'.&Apache::lonlocal::mt('Take Offline').'</h2>'; |
|
my ($is_dc,@okmachines,%servers); |
|
my @poss_domains = &Apache::lonnet::current_machine_domains(); |
|
foreach my $dom (@poss_domains) { |
|
if ($Apache::lonnet::env{'request.role'} eq "dc./$dom/") { |
|
$is_dc = 1; |
|
} |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['serverstatuses'],$dom); |
|
if (ref($domconfig{'serverstatuses'}) eq 'HASH') { |
|
if (ref($domconfig{'serverstatuses'}{'takeonline'}) eq 'HASH') { |
|
if ($domconfig{'serverstatuses'}{'takeonline'}{'machines'} ne '') { |
|
@okmachines = split(/,/,$domconfig{'serverstatuses'}{'takeonline'}{'machines'}); |
|
} |
|
} |
|
} |
|
%{$servers{$dom}} = &Apache::lonnet::get_servers($dom); |
|
} |
|
my $ip = $ENV{'REMOTE_ADDR'}; |
|
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
|
print '<p>'.&mt("When a LON-CAPA server is 'taken offline' using this utility, the standard log-in page will be replaced with one of the following:"). |
|
'<ul><li>'.&mt('A page which automatically performs a redirect to another server in your domain - the server must be specified below.').'</li>'. |
|
'<li>'.&mt('A page which announces that this LON-CAPA server is offline.').'</li></ul></p>'; |
|
print '<p>'.&mt("Once a server is offline, the [_1]'take online'[_2] utility can be used to reverse this, but you should verify that you will still be able to access that script once the server is in an offline state.",'<a href="/cgi-bin/takeonline.pl">','</a>').'</p>'; |
|
print '<p>'.&mt("In common with other Domain Status pages the 'take online' script is accessible from certain IP addresses:").'<ul>'. |
|
'<li>'.&mt('The loopback device - 127.0.0.1 (localhost) - for times when you are web browsing from the server itself.').'</li>'. |
|
'<li>'.&mt("Specified IP addresses set via the configuration for [_1]Access to Server Status Pages[_2] for domain(s) hosted on the server.",'<a href="/adm/domainprefs?phase=display&actions=serverstatuses">','</a>').'</li></ul><p>'. |
|
&mt("Once the server is offline you will not be able to log-in directly to select a Domain Coordinator role to use the 'Take online' script, unless IP-based controls provide your access.").'<br />'.&mt("However, you will be able to log-in to a different server in the LON-CAPA network, select a Domain Coordinator role in this server's domain, and then use: [_1] to migrate you session to this machine.","<br /><tt>/adm/switchserver?otherserver=$lonhost</tt>").'<br /></p><p><hr /></p>'; |
|
if ($ip eq '127.0.0.1') { |
|
print '<div class="LC_info">'.&mt('You are accessing this page from the loopback device.').'</div>'; |
|
} elsif (!@okmachines) { |
|
print '<div class="LC_warning">'.&mt("IP-based access to the 'take online' page is currently unavailable, as no IP addresses have been specified.").'</div>'; |
|
} elsif (!grep(/^\Q$ip\E$/,@okmachines)) { |
|
print '<div class="LC_warning">'.&mt("Your current IP [_1] is not among those configured to have IP-based access to the 'take online' utility.",$ip).'</div>'; |
|
} else { |
|
print '<div class="LC_info">'.&mt("Your current IP [_1] is configured to have IP-based access to the 'take online' utility.",$ip).'</div>'; |
|
} |
|
my (%allhosts,$otherserver,$domain); |
|
if ($ENV{'QUERY_STRING'}) { |
|
($otherserver,$domain)=split(/\&/,$ENV{'QUERY_STRING'}); |
|
} |
|
print '<p><hr /></p><p><form method="post" name="takeoffline" onSubmit="javascript:setphase(this);">'; |
|
|
|
my $options; |
|
if ($domain) { |
|
if (grep(/^\Q$domain\E$/,keys(%servers))) { |
|
if (ref($servers{$domain}) eq 'HASH') { |
|
foreach my $hostid (sort(keys(%{$servers{$domain}}))) { |
|
next if ($hostid eq $lonhost); |
|
my $selchk = ''; |
|
if ($otherserver eq $hostid) { |
|
$selchk = 'selected="selected"'; |
|
} |
|
$options .= |
|
"<option value=\"$hostid&$domain\" $selchk>"."\n". |
|
"$hostid ".&mt('Domain: [_1], Hostname: [_2]',$domain,$servers{$domain}{$hostid}).'</option>'."\n"; |
|
} |
|
} |
|
} |
|
} |
|
foreach my $dom (sort(keys(%servers))) { |
|
next if (($domain) && ($dom eq $domain)); |
|
if (ref($servers{$dom}) eq 'HASH') { |
|
foreach my $hostid (sort(keys(%{$servers{$dom}}))) { |
|
next if ($hostid eq $lonhost); |
|
next if(defined($allhosts{$hostid})); |
|
$allhosts{$hostid} = 1; |
|
my $selchk = ''; |
|
if ($otherserver eq $hostid) { |
|
$selchk = 'selected="selected"'; |
|
} |
|
$options .= |
|
"<option value=\"$hostid&$dom\" $selchk>". |
|
$hostid.'</option>'; |
|
} |
|
} |
|
} |
|
if ($options) { |
|
print &mt('Optional: choose another server in your domain, to which to redirect log-ins: '). |
|
'<select name="rerouteto">'."\n". |
|
' <option value="">'.&mt('Please select').'</option>'."\n". |
|
$options.'</select>'."\n"; |
|
} else { |
|
print &mt('There are no other servers in your domain to which to redirect logins.'); |
|
} |
|
print '<br /><br /><input type="submit" name="offline" value="Take Offline" />'."\n". |
|
'</form>'."\n"; |
|
} |
|
|
|
sub phasetwo { |
|
my ($reroute) = @_; |
|
print '<h2>'.&Apache::lonlocal::mt('Take Offline').'</h2>'; |
|
my $statusmsg; |
|
if ($reroute) { |
|
my ($otherserver,$domain)=split(/\&/,$reroute); |
|
if (&reroute($otherserver,$domain)) { |
|
print &Apache::lonlocal::mt('Rerouting to [_1]',$otherserver); |
|
$statusmsg = "status=rerouting&server=$otherserver&domain=$domain&time=".time. |
|
"by=$Apache::lonnet::env{'user.name'}:$Apache::lonnet::env{'user.domain'}"; |
|
} |
|
} else { |
|
if (&dead()) { |
|
print &Apache::lonlocal::mt('No reroute server given, taking completely offline.'); |
|
$statusmsg = 'status=offline&time='.time."by=$Apache::lonnet::env{'user.name'}:$Apache::lonnet::env{'user.domain'}" |
|
} |
|
} |
|
if ($statusmsg) { |
|
if (open (STATUS,'>/home/httpd/html/lon-status/reroute.txt')) { |
|
print STATUS "$statusmsg\n"; |
|
close(STATUS); |
|
} else { |
|
print &Apache::lonlocal::mt('Logging of status change to [_1] failed.','<tt>/home/httpd/html/lon-status/reroute.txt</tt>'); |
|
} |
|
} |
|
} |
|
|
sub dead { |
sub dead { |
open (OUT,'>/home/httpd/html/index.html'); |
if (open (OUT,'>/home/httpd/html/index.html')) { |
print OUT 'This LON-CAPA server is currently offline.'; |
print OUT &Apache::lonlocal::mt('This LON-CAPA server is currently offline.'); |
close(OUT); |
close(OUT); |
|
return 'ok'; |
|
} |
|
return; |
} |
} |
|
|
sub reroute { |
sub reroute { |
open (OUT,'>/home/httpd/html/index.html'); |
my ($otherserver,$domain) = @_; |
print OUT (<<ENDNEWINDEX); |
if (open (OUT,'>/home/httpd/html/index.html')) { |
|
print OUT (<<ENDNEWINDEX); |
<html> |
<html> |
<head> |
<head> |
<title>Welcome to the LearningOnline Network with CAPA</title> |
<title>Welcome to the LearningOnline Network with CAPA</title> |
<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url=http://$otherserver/adm/roles"> |
<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url=http://$otherserver/adm/login?domain=$domain"> |
</head> |
</head> |
<body bgcolor="#004400" topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> |
<body bgcolor="#004400" topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> |
<img src="/adm/lonIcons/header.gif" /> |
<img src="/adm/lonIcons/header.gif" /> |
<p><font color="#FFFFFF">Connecting to |
<p><font color="#FFFFFF">Connecting to |
<a href="http://$otherserver/adm/roles"><font color="#FFFFFF">http://$otherserver/</font></a></font></p> |
<a href="http://$otherserver/adm/login?domain=$domain"><font color="#FFFFFF">http://$otherserver/</font></a></font></p> |
</body> |
</body> |
</html> |
</html> |
ENDNEWINDEX |
ENDNEWINDEX |
close(OUT); |
close(OUT); |
|
return 'ok'; |
|
} |
|
return; |
} |
} |