--- loncom/cgi/takeoffline.pl 2003/09/11 20:54:11 1.2
+++ loncom/cgi/takeoffline.pl 2015/03/11 03:33:22 1.6.12.1
@@ -1,7 +1,8 @@
#!/usr/bin/perl
+$|=1;
# Take machine offline, reroute traffic
#
-# $Id: takeoffline.pl,v 1.2 2003/09/11 20:54:11 www Exp $
+# $Id: takeoffline.pl,v 1.6.12.1 2015/03/11 03:33:22 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,42 +27,211 @@
# http://www.lon-capa.org/
#
-print "Content-type: text/html\n\n".
- "
+//
+
+ENDJS
+ print &Apache::loncommon::start_page('Take Offline',$js,
+ {'no_inline_link' => 1,});
+ &phaseone();
+ }
+ print &Apache::loncommon::end_page();
+ return;
+}
+
+sub phaseone {
+ print ''.&Apache::lonlocal::mt('Take Offline').'
';
+ 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 ''.&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:").'
'.
+ '- '.&mt('A page which automatically performs a redirect to another server in your domain - the server must be specified below.').'
'.
+ '- '.&mt('A page which announces that this LON-CAPA server is offline.').'
';
+ print ''.&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.",'','').'
';
+ print ''.&mt("In common with other Domain Status pages the 'take online' script is accessible from certain IP addresses:").'
'.
+ '- '.&mt('The loopback device - 127.0.0.1 (localhost) - for times when you are web browsing from the server itself.').'
'.
+ '- '.&mt("Specified IP addresses set via the configuration for [_1]Access to Server Status Pages[_2] for domain(s) hosted on the server.",'','').'
'.
+ &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.").'
'.&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.","
/adm/switchserver?otherserver=$lonhost").'
';
+ if ($ip eq '127.0.0.1') {
+ print ''.&mt('You are accessing this page from the loopback device.').'
';
+ } elsif (!@okmachines) {
+ print ''.&mt("IP-based access to the 'take online' page is currently unavailable, as no IP addresses have been specified.").'
';
+ } elsif (!grep(/^\Q$ip\E$/,@okmachines)) {
+ print ''.&mt("Your current IP [_1] is not among those configured to have IP-based access to the 'take online' utility.",$ip).'
';
+ } else {
+ print ''.&mt("Your current IP [_1] is configured to have IP-based access to the 'take online' utility.",$ip).'
';
+ }
+ my (%allhosts,$otherserver,$domain);
+ if ($ENV{'QUERY_STRING'}) {
+ ($otherserver,$domain)=split(/\&/,$ENV{'QUERY_STRING'});
+ }
+ print '
'."\n";
+}
+
+sub phasetwo {
+ my ($reroute) = @_;
+ print ''.&Apache::lonlocal::mt('Take Offline').'
';
+ my $statusmsg;
+ if ($reroute ne '') {
+ my ($otherserver,$domain)=split(/\&/,$reroute);
+ my $otherhostname = &reroute($otherserver,$domain);
+ if ($otherhostname ne '') {
+ print &Apache::lonlocal::mt('Rerouting to [_1]',$otherhostname);
+ $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.','/home/httpd/html/lon-status/reroute.txt');
+ }
+ }
+}
sub dead {
- open (OUT,'>/home/httpd/html/index.html');
- print OUT 'This LON-CAPA server is currently offline.';
- close(OUT);
+ if (open (OUT,'>/home/httpd/html/index.html')) {
+ print OUT &Apache::lonlocal::mt('This LON-CAPA server is currently offline.');
+ close(OUT);
+ return 'ok';
+ }
+ return;
}
sub reroute {
- open (OUT,'>/home/httpd/html/index.html');
- print OUT (<
+ my ($otherserver,$domain) = @_;
+ my $otherhostname = &Apache::lonnet::hostname($otherserver);
+ my $protocol = $Apache::lonnet::protocol{$otherserver};
+ $protocol = 'http' if ($protocol ne 'https');
+ if ($otherhostname ne '') {
+ if (open (OUT,'>/home/httpd/html/index.html')) {
+ print OUT (<
+
Welcome to the LearningOnline Network with CAPA
-
+
+
+
-
-
-Connecting to
-http://$otherserver/
+
+
+Connecting to
+$protocol://$otherhostname/
ENDNEWINDEX
- close(OUT);
+ close(OUT);
+ return $otherhostname;
+ }
+ }
+ return;
}