#!/sbin/openrc-run
#
# OpenRC init script for the Apache httpd web server.
#

description="Apache httpd web server"

NAME=apache2
DAEMON=/usr/sbin/$NAME

SCRIPTNAME="${RC_SVCNAME:-apache2}"
SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}"
if [ -n "$APACHE_CONFDIR" ] ; then
	if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
		DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}"
	else
		DIR_SUFFIX=
	fi
elif [ "${SCRIPTNAME##apache2-}" != "$SCRIPTNAME" ] ; then
	DIR_SUFFIX="-${SCRIPTNAME##apache2-}"
	APACHE_CONFDIR=/etc/apache2$DIR_SUFFIX
else
	DIR_SUFFIX=
	APACHE_CONFDIR=/etc/apache2
fi
if [ -z "$APACHE_ENVVARS" ] ; then
	APACHE_ENVVARS=$APACHE_CONFDIR/envvars
fi
export APACHE_CONFDIR APACHE_ENVVARS

ENV="env -i LANG=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
if [ "$APACHE_CONFDIR" != /etc/apache2 ] ; then
	ENV="$ENV APACHE_CONFDIR=$APACHE_CONFDIR"
fi
if [ "$APACHE_ENVVARS" != "$APACHE_CONFDIR/envvars" ] ; then
	ENV="$ENV APACHE_ENVVARS=$APACHE_ENVVARS"
fi

PIDFILE=$(. "$APACHE_ENVVARS" && echo "$APACHE_PID_FILE")

APACHE2CTL="$ENV apache2ctl"
APACHE2_INIT_MESSAGE=""

CONFTEST_OUTFILE=
cleanup() {
	if [ -n "$CONFTEST_OUTFILE" ] ; then
		rm -f "$CONFTEST_OUTFILE"
	fi
}
trap cleanup 0

. /lib/lsb/init-functions 2>/dev/null || true

depend() {
	need net localmount
	use dns logger
	after bootmisc
}

apache_conftest() {
	[ -z "$CONFTEST_OUTFILE" ] || rm -f "$CONFTEST_OUTFILE"
	CONFTEST_OUTFILE=$(mktemp)
	if ! $APACHE2CTL configtest > "$CONFTEST_OUTFILE" 2>&1 ; then
		return 1
	else
		rm -f "$CONFTEST_OUTFILE"
		CONFTEST_OUTFILE=
		return 0
	fi
}

clear_error_msg() {
	[ -z "$CONFTEST_OUTFILE" ] || rm -f "$CONFTEST_OUTFILE"
	CONFTEST_OUTFILE=
	APACHE2_INIT_MESSAGE=
}

print_error_msg() {
	[ -z "$APACHE2_INIT_MESSAGE" ] || ewarn "$APACHE2_INIT_MESSAGE"
	if [ -n "$CONFTEST_OUTFILE" ] ; then
		eerror "Output of config test was:"
		cat "$CONFTEST_OUTFILE" >&2
		rm -f "$CONFTEST_OUTFILE"
		CONFTEST_OUTFILE=
	fi
}

apache_wait_start() {
	local STATUS=$1
	local i=0

	if [ $STATUS != 0 ] ; then
		return $STATUS
	fi
	while : ; do
		PIDTMP=$(pidofproc -p "$PIDFILE" "$DAEMON")
		if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then
			return $STATUS
		fi

		if [ $i = "20" ] ; then
			APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX instance did not start within 20 seconds. Please read the log files to discover problems"
			return 2
		fi

		sleep 1
		i=$(($i+1))
	done
}

apache_wait_stop() {
	local STATUS=$1
	local METH=$2

	if [ $STATUS != 0 ] ; then
		return $STATUS
	fi

	PIDTMP=$(pidofproc -p "$PIDFILE" "$DAEMON")
	if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then
		if [ "$METH" = "kill" ]; then
			killproc -p "$PIDFILE" "$DAEMON"
		else
			$APACHE2CTL "$METH" > /dev/null 2>&1
		fi

		local i=0
		while kill -0 "${PIDTMP:-}" 2> /dev/null;  do
			if [ $i = '60' ]; then
				STATUS=2
				break
			fi
			sleep 1
			i=$(($i+1))
		done
		return $STATUS
	else
		return $STATUS
	fi
}

do_start()
{
	if pidofproc -p "$PIDFILE" "$DAEMON" > /dev/null 2>&1 ; then
		return 1
	fi

	if apache_conftest ; then
		$APACHE2CTL start
		apache_wait_start $?
		return $?
	else
		APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed."
		return 2
	fi
}

do_stop()
{
	local STOP=$1
	local AP_RET=0

	if pidof "$DAEMON" > /dev/null 2>&1 ; then
		if [ -e "$PIDFILE" ] && pidof "$DAEMON" | tr ' ' '\n' | grep -w "$(cat "$PIDFILE")" > /dev/null 2>&1 ; then
			AP_RET=2
		else
			AP_RET=1
		fi
	else
		AP_RET=0
	fi

	if [ $AP_RET = 0 ] ; then
		return 1
	fi

	if [ $AP_RET = 2 ] && apache_conftest ; then
		apache_wait_stop $? "$STOP"
		return $?
	else
		if [ $AP_RET = 2 ]; then
			clear_error_msg
			APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed, so we are trying to kill it manually. This is almost certainly suboptimal, so please make sure your system is working as you'd expect now!"
			apache_wait_stop $? "kill"
			return $?
		elif [ $AP_RET = 1 ] ; then
			APACHE2_INIT_MESSAGE="There are processes named 'apache2' running which do not match your pid file which are left untouched in the name of safety, Please review the situation by hand"
			return 2
		fi
	fi
}

do_reload() {
	if apache_conftest; then
		if ! pidofproc -p "$PIDFILE" "$DAEMON" > /dev/null 2>&1 ; then
			APACHE2_INIT_MESSAGE="Apache2 is not running"
			return 2
		fi
		$APACHE2CTL graceful > /dev/null 2>&1
		return $?
	else
		APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed. Not doing anything."
		return 2
	fi
}

extra_commands="graceful_stop"
extra_started_commands="graceful_stop"

start() {
	[ -x "$DAEMON" ] || return 0
	if [ -z "$PIDFILE" ] ; then
		eerror "APACHE_PID_FILE needs to be defined in $APACHE_ENVVARS"
		return 2
	fi

	ebegin "Starting $description"
	do_start
	case $? in
		0|1)
			eend 0
			;;
		2)
			print_error_msg
			eend 1
			return 1
			;;
	esac
}

stop() {
	ebegin "Stopping $description"
	do_stop stop
	case $? in
		0|1)
			eend 0
			;;
		2)
			print_error_msg
			eend 1
			return 1
			;;
	esac
	print_error_msg
}

graceful_stop() {
	ebegin "Gracefully stopping $description"
	do_stop graceful-stop
	case $? in
		0|1)
			eend 0
			;;
		2)
			print_error_msg
			eend 1
			return 1
			;;
	esac
	print_error_msg
}

reload() {
	ebegin "Reloading $description"
	do_reload
	case $? in
		0|1)
			eend 0
			;;
		2)
			print_error_msg
			eend 1
			return 1
			;;
	esac
	print_error_msg
}

restart() {
	ebegin "Restarting $description"
	do_stop stop
	case $? in
		0|1) ;;
		*)
			print_error_msg
			eend 1
			return 1
			;;
	esac
	do_start
	case $? in
		0|1)
			eend 0
			;;
		2)
			print_error_msg
			eend 1
			return 1
			;;
	esac
}

status() {
	status_of_proc -p "$PIDFILE" "apache2" "$NAME"
}
