#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Apache control script designed to allow an easy command line interface
# to controlling Apache.  Written by Marc Slemko, 1997/08/23
#
# Heavily modified for Debian by Stefan Fritsch 2007-2010
#
# The exit codes returned are:
#   XXX this doc is no longer correct now that the interesting
#   XXX functions are handled by httpd
# 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 - configuration syntax error
#
# When multiple arguments are given, only the error from the _last_
# one is reported.  Run "apachectl help" for usage info
#
ARGV=( "$@" )
#
# |||||||||||||||||||| START CONFIGURATION SECTION  ||||||||||||||||||||
# --------------------                              --------------------
#
# Main configuration directory.
if [[ -z "${APACHE_CONFDIR}" ]]; then
  if [[ "${0##*apache2ctl-}" != "${0}" ]]; then
    APACHE_CONFDIR="/etc/apache2-${0##*apache2ctl-}"
  else
    APACHE_CONFDIR="/etc/apache2"
  fi
fi

SUFFIX="${APACHE_CONFDIR##/etc/apache2-}"
case "${SUFFIX}" in
  /etc/apache2)
    SUFFIX=""
    ;;
  *)
    SUFFIX="@${SUFFIX}"
    ;;
esac
APACHE_SYSTEMD_SERVICE="apache2${SUFFIX}"

# The path to the environment variable file.
[[ -z "${APACHE_ENVVARS}" ]] && APACHE_ENVVARS="${APACHE_CONFDIR}/envvars"
# Pick up any necessary environment variables.
[[ -f "${APACHE_ENVVARS}" ]] && . ${APACHE_ENVVARS}

[[ "${APACHE_CONFDIR}" != "/etc/apache2" ]] && APACHE_ARGUMENTS="-d ${APACHE_CONFDIR} ${APACHE_ARGUMENTS}"

# The following "APACHE_*" variables should be set in "/etc/apache2/envvars".
#
# The path to your httpd binary, including options if necessary.
HTTPD="${APACHE_HTTPD:-/usr/sbin/apache2}"
#
# A command that outputs a formatted text version of the HTML at the
# url given on the command line.  Designed for lynx, however other
# programs may work.
LYNX="${APACHE_LYNX:-www-browser -dump}"
#
# The URL to your server's mod_status status page.  If you do not
# have one, then status and fullstatus will not work.
STATUSURL="${APACHE_STATUSURL:-http://localhost:80/server-status}"
#
# Set this variable to a command that increases the maximum
# number of file descriptors allowed per child process. This is
# critical for configurations that use many file descriptors,
# such as mass vhosting, or a multithreaded server.
ULIMIT_MAX_FILES="${APACHE_ULIMIT_MAX_FILES:-ulimit -n 8192}"
# --------------------                              --------------------
# ||||||||||||||||||||   END CONFIGURATION SECTION  ||||||||||||||||||||

# Set the maximum number of file descriptors allowed per child process.
if [[ "x${ULIMIT_MAX_FILES}" != "x" ]] && [[ $( id -u ) == 0 ]]; then
  if [[ ! ${ULIMIT_MAX_FILES} ]]; then
    echo "Setting ulimit failed. See README.Debian for more information." >&2
  fi
fi

ERROR=0
if [[ "${ARGV[*]}" == "" ]] || [[ "${ARGV[*]}" == "usage" ]] || [[ "${ARGV[*]}" == "help" ]] || [[ "${ARGV[*]}" == "--help" ]]; then
  echo "Usage:  ${0} start|stop|restart|graceful|graceful-stop|configtest|status|fullstatus|help" >&2
  echo "        ${0} <apache2 args>" >&2
  echo "        ${0} -h (for help on <apache2 args>)" >&2
  exit 1
fi

get_status() {
  if ! ${LYNX} "${STATUSURL}"; then
    echo "'${LYNX} ${STATUSURL}' failed." >&2
    echo "Maybe you need to install a package providing www-browser or you" >&2
    echo "need to adjust the APACHE_LYNX variable in /etc/apache2/envvars" >&2
    exit 1
  fi
}

mkdir_chown() {
  local OWNER="${1}"
  local DIR="${2}"
  local STAT; STAT="$( LC_ALL=C stat -c %F:%U ${DIR} 2> /dev/null || true )"
  if [[ "${STAT}" == "" ]]; then
    local TMPNAME; TMPNAME=$( mktemp -d "${DIR}.XXXXXXXXXX" ) || exit 1
    chmod 755 "${TMPNAME}" || exit 1
    chown "${OWNER}" "${TMPNAME}" || exit 1
    if ! mv -T "${TMPNAME}" "${DIR}" 2> /dev/null; then
      rmdir "${TMPNAME}"
      # check for race with other apachectl
      if [[ "$( LC_ALL=C stat -c %F:%U "${DIR}" 2>/dev/null )" != "directory:${OWNER}" ]]; then
        echo "Cannot create '${DIR}' with owner '${OWNER}'."
        echo "Please fix manually. Aborting."
        exit 1
      fi
    fi
  elif [[ "${STAT}" != "directory:${OWNER}" ]]; then
    echo "'$DIR' already exists but is not a directory owned by '${OWNER}'."
    echo "Please fix manually. Aborting."
    exit 1
  fi
}


[[ ! -d "${APACHE_RUN_DIR:-/var/run/apache2}" ]] && mkdir -p "${APACHE_RUN_DIR:-/var/run/apache2}"
[[ ! -d "${APACHE_LOCK_DIR:-/var/lock/apache2}" ]] && mkdir_chown "${APACHE_RUN_USER:-www-data}" "${APACHE_LOCK_DIR:-/var/lock/apache2}"

case "${ARGV[@]}" in
  start)
    # "ssl_scache" shouldn't be here if we're just starting up.
    # (This is bad if there are several apache2 instances running)
    rm -f "${APACHE_RUN_DIR:-/var/run/apache2}"/*ssl_scache*

    need_systemd=false
    if [[ -z "${APACHE_STARTED_BY_SYSTEMD}" ]]; then
      case "$( readlink -f /proc/1/exe )" in
        *systemd*)
          need_systemd=true
          ;;
        *)
          ;;
      esac
    fi

    if ${need_systemd}; then
      # If running on systemd we should not start httpd without systemd
      # or systemd will get confused about the status of httpd.
      echo "Invoking 'systemctl start ${APACHE_SYSTEMD_SERVICE}'."
      echo "Use 'systemctl status ${APACHE_SYSTEMD_SERVICE}' for more info."
      systemctl start "${APACHE_SYSTEMD_SERVICE}"
    else
      unset APACHE_STARTED_BY_SYSTEMD
      ${HTTPD} "${APACHE_ARGUMENTS}" -k "${ARGV[@]}"
    fi

    ERROR=$?
    ;;
  stop|graceful-stop)
    ${HTTPD} "${APACHE_ARGUMENTS}" -k "${ARGV[@]}"
    ERROR=$?
    ;;
  restart|graceful)
    if ${HTTPD} "${APACHE_ARGUMENTS}" -t 2> /dev/null; then
      ${HTTPD} "${APACHE_ARGUMENTS}" -k "${ARGV[@]}"
    else
      ${HTTPD} "${APACHE_ARGUMENTS}" -t
    fi
    ERROR=$?
    ;;
  startssl|sslstart|start-SSL)
    echo "The startssl option is no longer supported."
    echo "Please edit httpd.conf to include the SSL configuration settings"
    echo "and then use 'apachectl start'."
    ERROR=2
    ;;
  configtest)
    ${HTTPD} "${APACHE_ARGUMENTS}" -t
    ERROR=$?
    ;;
  status)
    get_status | awk ' /process$/ { print; exit } { print } '
    ;;
  fullstatus)
    get_status
    ;;
  *)
    ${HTTPD} "${APACHE_ARGUMENTS}" "$@"
    ERROR=$?
esac

if [[ "${ERROR}" != 0 ]]; then
  echo "Action '$*' failed."
  echo "The Apache error log may have more information."
fi

exit ${ERROR}
