File:  [LON-CAPA] / loncom / cgi / takeoffline.pl
Revision 1.6: download - view: text, annotated - select for diffs
Thu Apr 23 17:29:58 2009 UTC (15 years ago) by bisitz
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_99_1, version_2_8_99_0, version_2_11_X, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, loncapaMITrelate_1, bz6209-base, bz6209, bz5969, bz2851, HEAD, GCI_3, GCI_2, BZ5971-printing-apage, BZ5434-fox
XHTML:
- Added quotation marks to HTML attribute values
- Replaced HTML attribute styles by CSS (style="...")

    1: #!/usr/bin/perl
    2: $|=1;
    3: # Take machine offline, reroute traffic
    4: #
    5: # $Id: takeoffline.pl,v 1.6 2009/04/23 17:29:58 bisitz Exp $
    6: #
    7: # Copyright Michigan State University Board of Trustees
    8: #
    9: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   10: #
   11: # LON-CAPA is free software; you can redistribute it and/or modify
   12: # it under the terms of the GNU General Public License as published by
   13: # the Free Software Foundation; either version 2 of the License, or
   14: # (at your option) any later version.
   15: #
   16: # LON-CAPA is distributed in the hope that it will be useful,
   17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   19: # GNU General Public License for more details.
   20: #
   21: # You should have received a copy of the GNU General Public License
   22: # along with LON-CAPA; if not, write to the Free Software
   23: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   24: #
   25: # /home/httpd/html/adm/gpl.txt
   26: #
   27: # http://www.lon-capa.org/
   28: #
   29: 
   30: use strict;
   31: use lib '/home/httpd/lib/perl/';
   32: use Apache::lonlocal;
   33: use Apache::loncommon;
   34: use LONCAPA::loncgi;
   35: use LONCAPA::lonauthcgi;
   36: 
   37: print "Content-type: text/html\n\n";
   38: 
   39: &main();
   40: 
   41: sub main {
   42:     if (!&LONCAPA::lonauthcgi::check_ipbased_access('takeoffline')) {
   43:         if (!&LONCAPA::loncgi::check_cookie_and_load_env()) {
   44:             &Apache::lonlocal::get_language_handle();
   45:             print(&LONCAPA::loncgi::missing_cookie_msg());
   46:             return;
   47:         }
   48: 
   49:         if (!&LONCAPA::lonauthcgi::can_view('takeoffline')) {
   50:             &Apache::lonlocal::get_language_handle();
   51:             print(&LONCAPA::lonauthcgi::unauthorized_msg('takeoffline'));
   52:             return;
   53:         }
   54:     }
   55:     &Apache::lonlocal::get_language_handle();
   56: 
   57:     if ($ENV{'QUERY_STRING'} =~ /^phase\=two\&?(.*)$/) {
   58:         my $reroute = $1;
   59:         print &Apache::loncommon::start_page('Take Offline','',
   60:                                              {'no_inline_link'   => 1,});
   61:         &phasetwo($reroute);
   62:     } else {
   63:         my $js = <<ENDJS;
   64: <script type="text/javascript">
   65: 
   66: function setphase(form) {
   67:     var subaction = '/cgi-bin/takeoffline.pl?phase=two';
   68:     form.action = subaction+'&'+form.rerouteto.options[form.rerouteto.selectedIndex].value;
   69:     form.submit();
   70: }
   71: 
   72: </script>
   73: ENDJS
   74:         print &Apache::loncommon::start_page('Take Offline',$js,
   75:                                              {'no_inline_link'   => 1,});
   76:         &phaseone();
   77:     }
   78:     print &Apache::loncommon::end_page();
   79:     return;
   80: }
   81: 
   82: sub phaseone {
   83: #    print '<html><body bgcolor="#FFFFFF">
   84:     print '<h2>'.&Apache::lonlocal::mt('Take Offline').'</h2>';
   85:     my ($is_dc,@okmachines,%servers);
   86:     my @poss_domains = &Apache::lonnet::current_machine_domains();
   87:     foreach my $dom (@poss_domains) {
   88:         if ($Apache::lonnet::env{'request.role'} eq "dc./$dom/") {
   89:             $is_dc = 1;
   90:         }
   91:         my %domconfig = &Apache::lonnet::get_dom('configuration',['serverstatuses'],$dom);
   92:         if (ref($domconfig{'serverstatuses'}) eq 'HASH') {
   93:             if (ref($domconfig{'serverstatuses'}{'takeonline'}) eq 'HASH') {
   94:                 if ($domconfig{'serverstatuses'}{'takeonline'}{'machines'} ne '') {
   95:                     @okmachines = split(/,/,$domconfig{'serverstatuses'}{'takeonline'}{'machines'});
   96:                 }
   97:             }
   98:         }
   99:         %{$servers{$dom}} = &Apache::lonnet::get_servers($dom);
  100:     }
  101:     my $ip = $ENV{'REMOTE_ADDR'};
  102:     my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
  103:     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:").
  104:           '<ul><li>'.&mt('A page which automatically performs a redirect to another server in your domain - the server must be specified below.').'</li>'.
  105:               '<li>'.&mt('A page which announces that this LON-CAPA server is offline.').'</li></ul></p>';
  106:     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>';
  107:     print '<p>'.&mt("In common with other Domain Status pages the 'take online' script is accessible from certain IP addresses:").'<ul>'.
  108:           '<li>'.&mt('The loopback device - 127.0.0.1 (localhost) - for times when you are web browsing from the server itself.').'</li>'.
  109:           '<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>'.
  110:           &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>';
  111:     if ($ip eq '127.0.0.1') {
  112:         print '<div class="LC_info">'.&mt('You are accessing this page from the loopback device.').'</div>';
  113:     } elsif (!@okmachines) {
  114:         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>';
  115:     } elsif (!grep(/^\Q$ip\E$/,@okmachines)) {
  116:         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>';
  117:     } else {
  118:         print '<div class="LC_info">'.&mt("Your current IP [_1] is configured to have IP-based access to the 'take online' utility.",$ip).'</div>';
  119:     }
  120:     my (%allhosts,$otherserver,$domain);
  121:     if ($ENV{'QUERY_STRING'}) {
  122:         ($otherserver,$domain)=split(/\&/,$ENV{'QUERY_STRING'});
  123:     }
  124:     print '<p><hr /></p><p><form method="post" name="takeoffline" onSubmit="javascript:setphase(this);">';
  125: 
  126:     my $options;
  127:     if ($domain) {
  128:         if (grep(/^\Q$domain\E$/,keys(%servers))) {
  129:             if (ref($servers{$domain}) eq 'HASH') {
  130:                 foreach my $hostid (sort(keys(%{$servers{$domain}}))) {
  131:                     next if ($hostid eq $lonhost);
  132:                     my $selchk = '';
  133:                     if ($otherserver eq $hostid) {
  134:                         $selchk = 'selected="selected"';
  135:                     }
  136:                     $options .=
  137:    "<option value=\"$hostid&$domain\" $selchk>"."\n".
  138:    "$hostid ".&mt('Domain: [_1], Hostname: [_2]',$domain,$servers{$domain}{$hostid}).'</option>'."\n";
  139:                 }
  140:             }
  141:         }
  142:     }
  143:     foreach my $dom (sort(keys(%servers))) {
  144:         next if (($domain) && ($dom eq $domain));
  145:         if (ref($servers{$dom}) eq 'HASH') {
  146:             foreach my $hostid (sort(keys(%{$servers{$dom}}))) {
  147:                 next if ($hostid eq $lonhost);
  148:                 next if(defined($allhosts{$hostid}));
  149:                 $allhosts{$hostid} = 1;
  150:                 my $selchk = '';
  151:                 if ($otherserver eq $hostid) {
  152:                     $selchk = 'selected="selected"';
  153:                 }
  154:                 $options .=  
  155:                "<option value=\"$hostid&$dom\" $selchk>".
  156:                $hostid.'</option>';
  157:             }
  158:         }
  159:     }
  160:     if ($options) {
  161:         print &mt('Optional: choose another server in your domain, to which to redirect log-ins: ').
  162:               '<select name="rerouteto">'."\n".
  163:               ' <option value="">'.&mt('Please select').'</option>'."\n".
  164:               $options.'</select>'."\n";
  165:     } else {
  166:         print &mt('There are no other servers in your domain to which to redirect logins.');
  167:     }
  168:     print '<br /><br /><input type="submit" name="offline" value="Take Offline" />'."\n".
  169:           '</form>'."\n";
  170: }
  171: 
  172: sub phasetwo {
  173:     my ($reroute) = @_;
  174:     print '<h2>'.&Apache::lonlocal::mt('Take Offline').'</h2>';
  175:     my $statusmsg;
  176:     if ($reroute) {
  177:         my ($otherserver,$domain)=split(/\&/,$reroute);
  178:         if (&reroute($otherserver,$domain)) {
  179:             print &Apache::lonlocal::mt('Rerouting to [_1]',$otherserver);
  180:             $statusmsg = "status=rerouting&server=$otherserver&domain=$domain&time=".time.
  181:                          "by=$Apache::lonnet::env{'user.name'}:$Apache::lonnet::env{'user.domain'}";
  182:         }
  183:     } else {
  184:         if (&dead()) {
  185:             print &Apache::lonlocal::mt('No reroute server given, taking completely offline.');
  186:             $statusmsg = 'status=offline&time='.time."by=$Apache::lonnet::env{'user.name'}:$Apache::lonnet::env{'user.domain'}"
  187:         }
  188:     }
  189:     if ($statusmsg) {
  190:         if (open (STATUS,'>/home/httpd/html/lon-status/reroute.txt')) {
  191:             print STATUS "$statusmsg\n";
  192:             close(STATUS);
  193:         } else {
  194:             print &Apache::lonlocal::mt('Logging of status change to [_1] failed.','<tt>/home/httpd/html/lon-status/reroute.txt</tt>'); 
  195:         }
  196:     }
  197: }
  198: 
  199: sub dead {
  200:     if (open (OUT,'>/home/httpd/html/index.html')) {
  201:         print OUT &Apache::lonlocal::mt('This LON-CAPA server is currently offline.');
  202:         close(OUT);
  203:         return 'ok';
  204:     }
  205:     return;
  206: }
  207: 
  208: sub reroute {
  209:     my ($otherserver,$domain) = @_;
  210:     if (open (OUT,'>/home/httpd/html/index.html')) {
  211:         print OUT (<<ENDNEWINDEX);
  212: <html>
  213:  <head>
  214:   <title>Welcome to the LearningOnline Network with CAPA</title>
  215:   <meta HTTP-EQUIV="Refresh" CONTENT="0.5; url=http://$otherserver/adm/login?domain=$domain">
  216:  </head>
  217:  <body style="background-color:"#004400"; margin: 0px;">
  218:   <img src="/adm/lonIcons/header.gif" />
  219: <p><font color="#FFFFFF">Connecting to
  220: <a href="http://$otherserver/adm/login?domain=$domain"><font color="#FFFFFF">http://$otherserver/</font></a></font></p>
  221: </body>
  222: </html>
  223: ENDNEWINDEX
  224:        close(OUT);
  225:        return 'ok';
  226:     }
  227:     return;
  228: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>