#!/sbin/openrc-run
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

extra_commands="configtest modules virtualhosts"
extra_started_commands="configdump fullstatus graceful gracefulstop reload"

description_configdump="Dumps the configuration of the runing apache server. Requires server-info to be enabled and www-client/lynx."
description_configtest="Run syntax tests for configuration files."
description_fullstatus="Gives the full status of the server. Requires lynx and server-status to be enabled."
description_graceful="A graceful restart advises the children to exit after the current request and reloads the configuration."
description_gracefulstop="A graceful stop advises the children to exit after the current request and stops the server."
description_modules="Dump a list of loaded Static and Shared Modules."
description_reload="Kills all children and reloads the configuration."
description_virtualhosts="Show the settings as parsed from the config file (currently only shows the virtualhost settings)."
description_stop="Kills all children and stops the server."

# Apply default values for some conf.d variables.
PIDFILE="${PIDFILE:-/var/run/apache2.pid}"
TIMEOUT=${TIMEOUT:-15}
SERVERROOT="${SERVERROOT:-/usr/lib/apache2}"
CONFIGFILE="${CONFIGFILE:-/etc/apache2/httpd.conf}"
LYNX="${LYNX:-lynx -dump}"
STATUSURL="${STATUSURL:-http://localhost/server-status}"
RELOAD_TYPE="${RELOAD_TYPE:-graceful}"

# Append the server root and configuration file parameters to the
# user's APACHE2_OPTS.
APACHE2_OPTS="${APACHE2_OPTS} -d ${SERVERROOT}"
APACHE2_OPTS="${APACHE2_OPTS} -f ${CONFIGFILE}"

# The path to the apache2 binary.
APACHE2="/usr/sbin/apache2"

depend() {
	use dns entropy logger mysql netmount postgresql
	after sshd
	if ! echo ${rc_need} | grep -Fq "net." ; then
		local warn_addr
		warn_addr="$(virtualhosts 2>/dev/null | sed -nre 's/^([^ *]+:[0-9]+)[[:space:]].*/\1/p' | tr '\n' ' ')"
		if [ -n "${warn_addr}" ] ; then
			need net
			ewarn "You are binding an interface in your virtual hosts."
			ewarn "You must add rc_need=\"net.FOO\" to your ${RC_PREFIX%/}/etc/conf.d/apache2"
			ewarn "where FOO is the interface(s) providing the following address(es):"
			ewarn "${warn_addr}"
		fi
	fi
}

configtest() {
	ebegin "Checking ${SVCNAME} configuration"
	checkconfig
	eend $?
}

checkconfd() {
	if [ ! -d ${SERVERROOT} ]; then
		eerror "SERVERROOT does not exist: ${SERVERROOT}"
		return 1
	fi
}

checkconfig() {
	checkpath --directory /run/apache_ssl_mutex
	checkconfd || return 1

	OUTPUT=$( ${APACHE2} ${APACHE2_OPTS} -t 2>&1 )
	ret=$?
	if [ ${ret} -ne 0 ]; then
		eerror "${SVCNAME} has detected an error in your setup:"
		printf "%s\n" "${OUTPUT}"
	fi

	return ${ret}
}

start() {
	checkconfig || return 1

	if [ -n "${STARTUPERRORLOG}" ] ; then
		# We must make sure that we only append to APACHE2_OPTS
		# in start() and not in stop() or anywhere else that may
		# be executed along with start(), see bug #566726.
		APACHE2_OPTS="${APACHE2_OPTS} -E ${STARTUPERRORLOG}"
	fi

	ebegin "Starting ${SVCNAME}"
	# Use start stop daemon to apply system limits #347301 
	start-stop-daemon --start --pidfile "${PIDFILE}" -- \
		${APACHE2} ${APACHE2_OPTS} -k start

	local i=0 retval=1
	while [ ${i} -lt ${TIMEOUT} ] ; do
		if [ -e "${PIDFILE}" ] ; then
			retval=0
			break
		fi
		sleep 1 && i=$(expr ${i} + 1)
	done

	eend ${retval}
}

stop() {
	if [ "${RC_CMD}" = "restart" ]; then
		checkconfig || return 1
	fi

	PID=$(cat "${PIDFILE}" 2>/dev/null)
	if [ -z "${PID}" ]; then
		einfo "${SVCNAME} not running (no pid file)"
		return 0
	fi

	ebegin "Stopping ${SVCNAME}"
	${APACHE2} ${APACHE2_OPTS} -k stop

	local i=0 retval=0
	while ( test -f "${PIDFILE}" || pgrep -P ${PID} apache2 >/dev/null ) \
		&& [ ${i} -lt ${TIMEOUT} ]; do
		sleep 1 && i=$(expr ${i} + 1)
	done
	[ -e "${PIDFILE}" ] && retval=1

	eend ${retval}
}

reload() {
	checkconfig || return 1

	if [ "${RELOAD_TYPE}" = "restart" ]; then
		ebegin "Restarting ${SVCNAME}"
		${APACHE2} ${APACHE2_OPTS} -k restart
		eend $?
	elif [ "${RELOAD_TYPE}" = "graceful" ]; then
		ebegin "Gracefully restarting ${SVCNAME}"
		${APACHE2} ${APACHE2_OPTS} -k graceful
		eend $?
	else
		eerror "${RELOAD_TYPE} is not a valid RELOAD_TYPE. Please edit /etc/conf.d/${SVCNAME}"
	fi
}

graceful() {
	checkconfig || return 1
	ebegin "Gracefully restarting ${SVCNAME}"
	${APACHE2} ${APACHE2_OPTS} -k graceful
	eend $?
}

gracefulstop() {
	checkconfig || return 1
	ebegin "Gracefully stopping ${SVCNAME}"
	${APACHE2} ${APACHE2_OPTS} -k graceful-stop
	eend $?
}

modules() {
	checkconfig || return 1
	${APACHE2} ${APACHE2_OPTS} -M 2>&1
}

fullstatus() {
	if ! command -v $(set -- ${LYNX}; echo $1) 2>&1 >/dev/null; then
		eerror "lynx not found! you need to emerge www-client/lynx"
	else
		${LYNX} ${STATUSURL}
	fi
}

virtualhosts() {
	checkconfig || return 1
	${APACHE2} ${APACHE2_OPTS} -S
}

configdump() {
	INFOURL="${INFOURL:-http://localhost/server-info}"

	checkconfd || return 1

	if ! command -v $(set -- ${LYNX}; echo $1) 2>&1 >/dev/null; then
		eerror "lynx not found! you need to emerge www-client/lynx"
	else
		echo "${APACHE2} started with '${APACHE2_OPTS}'"
		for i in config server list; do
			${LYNX} "${INFOURL}/?${i}" | sed '/Apache Server Information/d;/^[[:space:]]\+[_]\+$/Q'
		done
	fi
}

# vim: ts=4 filetype=gentoo-init-d
