Diff for /loncom/cgi/takeoffline.pl between versions 1.2 and 1.6

version 1.2, 2003/09/11 20:54:11 version 1.6, 2009/04/23 17:29:58
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,$domain)=split(/\&/,$ENV{'QUERY_STRING'});  
     print 'Rerouting to '.$otherserver;  
     &reroute();  
 }  
 open (STATUS,'>/home/httpd/html/lon-status/reroute.txt');  
 print STATUS "status=rerouting&server=$otherserver&domain=$domain&time=".time."\n";  
 close(STATUS);  
   
 print "</body></html>";  print "Content-type: text/html\n\n";
   
   &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();
   }
   
   </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/login?domain=$domain">    <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 style="background-color:"#004400"; margin: 0px;">
   <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/login?domain=$domain"><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;
 }  }

Removed from v.1.2  
changed lines
  Added in v.1.6


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