cvsuser     03/12/03 08:24:55

  Added:       App-Context/bin app-apache
  Log:
  new
  
  Revision  Changes    Path
  1.1                  p5ee/App-Context/bin/app-apache
  
  Index: app-apache
  ===================================================================
  #!/usr/local/bin/perl
  
  #############################################################################
  # $Id: app-apache,v 1.1 2003/12/03 16:24:55 spadkins Exp $
  #############################################################################
  
  # The exit codes returned are:
  #        0 - operation completed successfully
  #        1 - 
  #        2 - usage error
  #        3 - httpd could not be started
  #        4 - httpd could not be stopped
  #        5 - httpd could not be started during a restart
  #        6 - httpd could not be restarted during a restart
  #        7 - httpd could not be restarted during a graceful restart
  #        8 - conguration syntax error
  #
  # When multiple arguments are given, only the error from the _last_
  # one is reported.  Run "apachectl help" for usage info
  
  BEGIN {
      use App::Options;
      App::Options->init();
  }
  
  use strict;
  
  my $APACHEROOT  = $App::options{apache_root} || die "Variable [apache_root] not 
configured\n";
  my $PREFIX      = $App::options{prefix}      || $ENV{PREFIX} || die "Variable 
[prefix] not configured\n";
  my $PORT        = $App::options{app_server_apache_port}      || "80";
  my $SSLPORT     = $App::options{app_server_apache_ssl_port}  || "443";
  my $SERVERROOT  = $App::options{app_server_apache_root}      || 
"$PREFIX/apache/$PORT";
  my $LOGDIR      = $App::options{app_server_apache_logdir}    || "$SERVERROOT/logs";
  my $CONFDIR     = $App::options{app_server_apache_confdir}   || "$SERVERROOT/conf";
  
  mkdir("$PREFIX/apache")      if (! -d "$PREFIX/apache");
  mkdir("$PREFIX/apache/conf") if (! -f "$PREFIX/apache/conf");
  mkdir($SERVERROOT)           if (! -d $SERVERROOT);
  mkdir($CONFDIR)              if (! -d $CONFDIR);
  mkdir($LOGDIR)               if (! -d $LOGDIR);
  
  my $APACHECONF  = $App::options{apache_appserver_conf};
  if (!$APACHECONF) {
      my ($APACHEBASECONF, $baseconf_mtime, $conf_mtime, @stat);
      my ($APACHEBASELOG);
  
      $APACHEBASECONF = "$PREFIX/apache/conf/httpd.conf";
      $APACHEBASECONF = "$APACHEROOT/conf/httpd.conf" if (! -f $APACHEBASECONF);
      $baseconf_mtime = 0;
      if (-f $APACHEBASECONF) {
          @stat = stat($APACHEBASECONF);
          $baseconf_mtime = $stat[9];
      }
  
      $APACHECONF = "$CONFDIR/httpd.conf";
      $conf_mtime = 0;
      if (-f $APACHECONF) {
          @stat = stat($APACHECONF);
          $conf_mtime = $stat[9];
      }
  
      if ($baseconf_mtime && (!$conf_mtime || ($conf_mtime < $baseconf_mtime))) {
          my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = 
localtime($conf_mtime);
          my $mdatetime = sprintf("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, 
$mday, $hour, $min, $sec);
          system("mv $APACHECONF $APACHECONF.$mdatetime") if (-f $APACHECONF);
          $APACHEBASELOG = "$APACHEROOT/logs";
          local(*CONF, *BASECONF);
          open(main::BASECONF, "< $APACHEBASECONF") || die "Unable to open 
$APACHEBASECONF for reading: $!\n";
          open(main::CONF,     "> $APACHECONF")     || die "Unable to open $APACHECONF 
for writing: $!\n";
          while (<main::BASECONF>) {
              chomp;
              s/Port\s+80\s*/Port $PORT/;
              s/Listen\s+80\s*/Listen $PORT/;
              s/Listen\s+443\s*/Listen $SSLPORT/;
              s/Listen\s+(\S+):80\s*/Listen $1:$PORT/;
              s/Listen\s+(\S+):443\s*/Listen $1:$SSLPORT/;
              s/<VirtualHost _default_:443>/<VirtualHost _default_:$SSLPORT>/;
              s!$APACHEROOT/logs!$SERVERROOT/logs!g;
              s!ServerRoot\s+$APACHEROOT!ServerRoot $SERVERROOT!g;
              s! libexec/! $APACHEROOT/libexec/!g;
  
              # do substitutions for {:var:} or {:var=default:} to the value in 
%App::options
              s/\{:([a-zA-Z0-9_]+)(=?)([^:\{\}]*):\}/(defined $App::options{$1} ? 
$App::options{$1} : ($2 ? $3 : $1))/eg;
  
              print main::CONF $_, "\n";
          }
          close(main::BASECONF);
          close(main::CONF);
      }
  }
  
  my $PIDFILE     = "$LOGDIR/httpd.pid";
  my $HTTPD       = "$APACHEROOT/bin/httpd -f $APACHECONF -d $SERVERROOT";
  #$HTTPD         .= " -f $APACHECONF";
  #$HTTPD         .= " -d $SERVERROOT";  # this causes libmm to put shmem/sems in 
right place
  my $LYNX        = "lynx -dump";
  my $STATUSURL   = "http://localhost/server-status";;
  my $ERROR       = 0;
  
  my ($PID, $RUNNING, $STATUS);
  
  if ($#ARGV == -1) {
      unshift(@ARGV, "help");
  }
  
  if (!$ENV{LD_LIBRARY_PATH}) {
      $ENV{LD_LIBRARY_PATH} = "/usr/local/lib:$APACHEROOT/libexec";
  }
  else {
      $ENV{LD_LIBRARY_PATH} = 
"$ENV{LD_LIBRARY_PATH}:/usr/local/lib:$APACHEROOT/libexec";
  }
  
  foreach my $cmd (@ARGV) {
  
      if (-f $PIDFILE) {
          $PID = &read_file($PIDFILE);
          $PID =~ s/\n//g;
          if ($PID && kill(0, $PID)) {
              $STATUS = "httpd (pid $PID) running";
              $RUNNING = 1;
          }
          else {
              $STATUS = "httpd (pid $PID?) not running";
              $RUNNING = 0;
          }
      }
      else {
          $STATUS = "httpd (no pid file) not running";
          $RUNNING = 0;
      }
  
      if ($cmd eq "start") {
          if ($RUNNING == 1) {
              print "$0 $cmd: httpd (pid $PID) already running\n";
          }
          else {
              if (system($HTTPD) == 0) {
                  print "$0 $cmd: httpd started\n";
              }
              else {
                  print "$0 $cmd: httpd could not be started\n";
                  $ERROR = 3;
              }
          }
      }
      elsif ($cmd eq "startssl" || $cmd eq "sslstart" || $cmd eq "start-SSL") {
          if ($RUNNING == 1) {
              print "$0 $cmd: httpd (pid $PID) already running\n";
          }
          else {
              my $HTTPSD = $HTTPD;
              $HTTPSD =~ s/ / -DSSL /;
              if (system($HTTPSD) == 0) {
                  print "$0 $cmd: httpd started\n";
              }
              else {
                  print "$0 $cmd: httpd could not be started\n";
                  $ERROR = 3;
              }
          }
      }
      elsif ($cmd eq "stop") {
          if ($RUNNING == 0) {
              print "$0 $cmd: $STATUS\n";
          }
          else {
              if (kill(15,$PID)) {
                  print "$0 $cmd: httpd stopped\n";
              }
              else {
                  print "$0 $cmd: httpd could not be stopped\n";
                  $ERROR = 4;
              }
          }
      }
      elsif ($cmd eq "restart") {
          if ($RUNNING == 0) {
              print "$0 $cmd: httpd not running, trying to start\n";
              if (system($HTTPD) == 0) {
                  print "$0 $cmd: httpd started\n";
              }
              else {
                  print "$0 $cmd: httpd could not be started\n";
                  $ERROR = 5;
              }
          }
          else {
              if (system("$HTTPD -t > /dev/null 2>&1") == 0) {
                  if (kill(1,$PID) == 0) {    # SIGHUP
                      print "$0 $cmd: httpd restarted\n";
                  }
                  else {
                      print "$0 $cmd: httpd could not be restarted\n";
                      $ERROR = 6;
                  }
              }
              else {
                  print "$0 $cmd: configuration broken, ignoring restart\n";
                  print "$0 $cmd: (run 'apachectl configtest' for details)\n";
                  $ERROR = 6;
              }
          }
      }
      elsif ($cmd eq "graceful") {
          if ($RUNNING == 0) {
              print "$0 $cmd: httpd not running, trying to start\n";
              if (system($HTTPD) == 0) {
                  print "$0 $cmd: httpd started\n";
              }
              else {
                  print "$0 $cmd: httpd could not be started\n";
                  $ERROR = 5;
              }
          }
          else {
              if (system("$HTTPD -t > /dev/null 2>&1") == 0) {
                  if (kill(16,$PID) == 0) {  # SIGUSR1
                      print "$0 $cmd: httpd gracefully restarted\n";
                  }
                  else {
                      print "$0 $cmd: httpd could not be restarted\n";
                      $ERROR = 7;
                  }
              }
              else {
                  print "$0 $cmd: configuration broken, ignoring restart\n";
                  print "$0 $cmd: (run 'apachectl configtest' for details)\n";
                  $ERROR = 7;
              }
          }
      }
      elsif ($cmd eq "freshstart") {
          if ($RUNNING != 0) {
              if (kill(15,$PID)) {
                  print "$0 $cmd: httpd stopped\n";
              }
              else {
                  print "$0 $cmd: httpd could not be stopped\n";
                  $ERROR = 4;
              }
          }
          print "$0 $cmd: clearing logs, and pausing...\n";
          unlink(<$LOGDIR/*>);
          sleep(2);  # allow the port to become free again
          if (system($HTTPD) == 0) {
              print "$0 $cmd: httpd started\n";
          }
          else {
              print "$0 $cmd: httpd could not be started\n";
              $ERROR = 5;
          }
      }
      elsif ($cmd eq "status") {
          print "$0 $cmd: not implemented.\n";
          # $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
      }
      elsif ($cmd eq "fullstatus") {
          print "$0 $cmd: not implemented.\n";
          # $LYNX $STATUSURL
      }
      elsif ($cmd eq "configtest") {
          if (system("$HTTPD -t") == 0) {
          }
          else {
              $ERROR = 8;
          }
      }
      else {
          print "\n";
          print "usage: $0 
(start|stop|restart|fullstatus|status|graceful|configtest|help)\n";
          print <<EOF;
  
  start      - start httpd
  startssl   - start httpd with SSL enabled
  stop       - stop httpd
  restart    - restart httpd if running by sending a SIGHUP or start if 
               not running
  fullstatus - dump a full status screen; requires lynx and mod_status enabled
  status     - dump a short status screen; requires lynx and mod_status enabled
  graceful   - do a graceful restart by sending a SIGUSR1 or start if not running
  configtest - do a configuration syntax test
  help       - this screen
  
  EOF
          $ERROR = 2;
      }
  }
  
  exit($ERROR);
  
  #############################################################################
  # subroutines
  #############################################################################
  
  sub read_file {
     my ($file) = @_;
     local(*FILE);
     my (@file_txt, $file_txt);
  
     if (open(main::FILE, "< $file")) {
        @file_txt = <main::FILE>;
        $file_txt = join("",@file_txt);
        close(main::FILE);
     }
     $file_txt;
  }
  
  sub write_file {
     my ($file,$str) = @_;
     local(*FILE);
  
     if (open(main::FILE, "> $file")) {
        print main::FILE $str;
        close(main::FILE);
     }
  }
  
  
  
  

Reply via email to