#!/bin/sh
#
# 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
#

set -e

ARGV="$@"
#
# |||||||||||||||||||| START CONFIGURATION SECTION  ||||||||||||||||||||
# --------------------                              --------------------
#
# main configuration directory
if test -z "$APACHE_CONFDIR" ; then
	if test "${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
test -z "$APACHE_ENVVARS" && APACHE_ENVVARS="$APACHE_CONFDIR/envvars"
# pick up any necessary environment variables
if test -f $APACHE_ENVVARS; then
  . $APACHE_ENVVARS
fi

if test "$APACHE_CONFDIR" != /etc/apache2 ; then
	APACHE_ARGUMENTS="-d $APACHE_CONFDIR $APACHE_ARGUMENTS"
fi
# 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` -eq 0 ] ; then
    if ! $ULIMIT_MAX_FILES ; then
        echo Setting ulimit failed. See README.Debian for more information. >&2
    fi
fi

ERROR=0
if [ "x$ARGV" = "x" ] || [ "x$ARGV" = "xusage" ] || [ "x$ARGV" = "xhelp" ] || [ "x$ARGV" = "x--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="$(LC_ALL=C stat -c %F:%U $DIR 2> /dev/null || true)"
    if [ "$STAT" = "" ] ; then
        local 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_RUN_DIR:-/var/run/apache2}/socks ] && mkdir_chown ${APACHE_RUN_USER:-www-data} ${APACHE_RUN_DIR:-/var/run/apache2}/socks
[ ! -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)
    [ -e ${APACHE_RUN_DIR:-/var/run/apache2}/*ssl_scache* ] && 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
