#!/bin/bash -e
#
# apache2		This init.d script is used to start apache2.
#			It basically just calls apache2ctl.

#edit /etc/default/apache2 to change this.
NO_START=0

set -e
if [ -x /usr/sbin/apache2 ] ; then
	HAVE_APACHE2=1
else
	exit 0
fi

. /lib/lsb/init-functions

test -f /etc/default/rcS && . /etc/default/rcS
test -f /etc/default/apache2 && . /etc/default/apache2
if [ "$NO_START" != "0" -a "$1" != "stop" ]; then 
        [ "$VERBOSE" != "no" ] && log_warning_msg "Not starting apache2 - edit /etc/default/apache2 and change NO_START to be 0.";
        exit 0;
fi

AP_CONF="/etc/apache2/apache2.conf"
AP_CONF_LOG=""
if [ -n "$2" ] && [ -f "$AP_CONF" ]; then
  AP_CONF="$2"
  AP_CONF_LOG="(config $AP_CONF)"
fi

ENV="env -i HTTPD_ARGS='-f $AP_CONF' LANG=C PATH=/usr/local/bin:/usr/bin:/bin"

apache2f() {
  eval $ENV /usr/sbin/apache2 $@
}

apache2ctlf() {
  eval $ENV /usr/local/sbin/apache2ctl $@
}

apache_parsecfg() {
	# apache2 allows a configuration option to be redefined, butonly the
	# last found in the config is used; we attempt to follow includes
	# here, but only first-level includes are supported, not nested ones
	# TODO: Make this fully recursive, and honor conditional configuration
	#       like <IfDefine>
	DIRECTIVE="$1"

	for i in $AP_CONF $(awk '$1 ~ /^\s*[Ii]nclude$/ {print $2}' $AP_CONF); do
		if [ -e "$i" ]; then
			NRVAL=$(grep -i "^$DIRECTIVE[[:space:]]" $i | tail -n 1 | awk '{print $2}')
			if [ -n "$NRVAL" ]; then
				RVAL="$NRVAL"
			fi
		fi
	done
	echo $RVAL
	exit 0
}

apache_stop() {
	PID=""
	PIDFILE=""

	# apache2 allows more than PidFile entry in the config but only the
	# last found in the config is used. We attempt to follow includes
	# here, but only first-level includes are supported, not nested ones

        PIDFILE=`apache_parsecfg PidFile`
	if [ -e "$PIDFILE" ]; then
		PID=`cat $PIDFILE`
	fi
	
	errors=`apache2f -t -f $AP_CONF 2>&1`
	if [ $? = 0 ]; then
		# if the config is ok than we just stop normaly

		if [ -n "$PID" ]
		then
			apache2ctlf stop

			CNT=0
			while [ 1 ]
			do
				CNT=$(expr $CNT + 1)
		
				[ ! -d /proc/$PID ] && break

				if [ $CNT -gt 60 ]
				then
					if [ "$VERBOSE" != "no" ]; then
						echo " ... failed!"
						echo "Apache2 failed to honor the stop command, please investigate the situation by hand."
					fi
					return 1
				fi

				sleep 1
			done
		else
			if [ "$VERBOSE" != "no" ]; then
				echo -n " ... no pidfile found! not running?"
			fi
		fi

	else
		[ "$VERBOSE" != "no" ] && echo "$errors"

		# if we are here something is broken and we need to try
		# to exit as nice and clean as possible

		# if pidof is null for some reasons the script exits automagically
		# classified as good/unknown feature
		PIDS=`pidof apache2` || true

		REALPID=0
		# if there is a pid we need to verify that belongs to apache2
		# for real
		for i in $PIDS; do
			if [ "$i" = "$PID" ]; then
				# in this case the pid stored in the
				# pidfile matches one of the pidof apache
				# so a simple kill will make it
				REALPID=1
			fi
		done

		if [ $REALPID = 1 ]; then
			# in this case everything is nice and dandy
			# and we kill apache2
			kill $PID
		else
			# this is the worst situation... just kill all of them
			#for i in $PIDS; do
			#	kill $i
			#done
			# Except, we can't do that, because it's very, very bad
			if [ "$PIDS" ] && [ "$VERBOSE" != "no" ]; then
                                echo " ... failed!"
			        echo "You may still have some apache2 processes running.  There are"
 			        echo "processes named 'apache2' which do not match your pid file,"
			        echo "and in the name of safety, we've left them alone.  Please review"
			        echo "the situation by hand."
                        fi
                        return 1
		fi
	fi
}

SRVROOT=$(apache_parsecfg ServerRoot)
eval cd $SRVROOT

# Stupid hack to keep lintian happy. (Warrk! Stupidhack!).
case $1 in
	start)
		[ -f /etc/apache2/httpd.conf ] || touch /etc/apache2/httpd.conf
		# ssl_scache shouldn't be here if we're just starting up.
		SSL_SCACHE="`apache_parsecfg SSLSessionCache | sed 's,[^:]:\(.*\),\1,'`"
		if [ -f "$SSL_SCACHE" ]; then
			SCACHEDIR="`dirname $SSL_SCACHE`"
			if [ -d "$SCACHEDIR" ] && [ "$SCACHEDIR" != "/" ]; then
				rm -f `dirname $SSL_SCACHE`/*`basename $SSL_SCACHE`*
			fi
		fi
		AP_USER=`apache_parsecfg User`
		# run and lock files could be on a tmpfs
		for runfiledirective in LockFile DAVLockDB; do
			runfile=`apache_parsecfg $runfiledirective`
			if [ -n "$runfile" ]; then
				directory=`dirname $runfile`
				mkdir -p $directory
				chown $AP_USER $directory
			fi
		done
		for runfiledirective in PidFile ScriptSock SSLSessionCache SSLMutex; do
			if [ -n "$runfile" ]; then
				directory=`dirname $runfile`
				mkdir -p $directory
			fi
		done

		log_begin_msg "Starting apache 2.0 web server $AP_CONF_LOG..."
		if apache2ctlf startssl; then
                        log_end_msg 0
                else
                        log_end_msg 1
                fi
	;;
	stop)
		log_begin_msg "Stopping apache 2.0 web server $AP_CONF_LOG..."
		if apache_stop; then
                        log_end_msg 0
                else
                        log_end_msg 1
                fi
	;;
	reload)
		log_begin_msg "Reloading apache 2.0 configuration $AP_CONF_LOG..."
		if apache2ctlf graceful; then
                        log_end_msg 0
                else
                        log_end_msg 1
                fi
	;;
	restart | force-reload)
		log_begin_msg "Forcing reload of apache 2.0 web server $AP_CONF_LOG..."
		if ! apache_stop; then
                        log_end_msg 1
                fi
		if apache2ctlf startssl; then
                        log_end_msg 0
                else
                        log_end_msg 1
                fi
	;;
	status)
		exit 4
	;;
	*)
		echo "Usage: /etc/init.d/apache2 start|stop|restart|reload|force-reload" >&2
		exit 2
	;;
esac
