#! /bin/sh
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $remote_fs $syslog networking procps
# Required-Stop:	 $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Nginx Starting
# Description: Start all nginx services
### END INIT INFO

export PATH=/bin:/usr/bin:/sbin:/usr/sbin 
NAME=nginx 

COMMAND=$1
NUMERRORS=0

# Default defaults:
RUN=no
BINARY=/dh/nginx/bin/nginx-be
PHP_BINARY=/dh/cgi-system/php56.cgi
PHP_PATH=/bin:/usr/bin
PHP_PHPRC=/etc/php56/cgi/php.ini
PHP_FCGI_CHILDREN=4
NGINX_EXTRA_ARGS=

# ulimit defaults
LIMIT_OPEN_FILES=8000
LIMIT_USER_PROCS=5000

[[ -r /etc/default/nginx ]] && source /etc/default/nginx

ulimit -Sn $LIMIT_OPEN_FILES
ulimit -Su $LIMIT_USER_PROCS

SERVERS="$( /bin/ls /dh/nginx/servers | egrep -v "\." | sort )"

if [ $2 ]; then
	shift
	SERVERS=$@
fi

trap "" SIGHUP
trap "" SIGTERM

init() {
	if [[ $S =~ [^a-zA-Z0-9-] ]] ; then
		echo "Bad server name $S"
		exit 1
	fi
	if [[ ! -e "/dh/nginx/servers/$S" ]]; then
		echo "Missing /dh/nginx/servers/$S"
		NUMERRORS=$(($NUMERRORS+1))
		return 1
	fi
	PIDFILE="/dh/nginx/servers/$S/var/logs/nginx.pid"
	if [[ -r "/dh/nginx/servers/$S/nginx.conf" ]]; then
		PHP_USERS=`grep '#pragma php_launch' "/dh/nginx/servers/$S/nginx.conf"|sort|uniq|awk '{ print $3 }'`
	else
		# probably testing before first config push or something
		PHP_USERS=
	fi
	[[ -r "/dh/nginx/servers/$S/environ" ]] && source "/dh/nginx/servers/$S/environ"
	NGINX_ARGS="-c /dh/nginx/servers/$S/nginx.conf -p /dh/nginx/servers/$S/var/ $NGINX_EXTRA_ARGS"
	check_running
}

check_running() {
	RUNNING=
	PID=
	if [[ -s "$PIDFILE" ]] ; then
		PID="`cat $PIDFILE`"
		if grep -q "/servers/$S/" "/proc/$PID/cmdline" ; then
			RUNNING="$PID"
		fi
	fi
}

check_enabled() {
	if [[ x$RUN != xyes ]] ; then
		echo 'nginx not enabled in /etc/default/nginx'
		exit
	fi
}


start() {
	check_enabled
	init || return

	echo -n "Starting $S webserver... "

	if [[ $RUNNING ]]; then
		echo 'already running!'
	else
		if ! $BINARY $NGINX_ARGS ; then
			echo 'failed!'
			NUMERRORS=$(($NUMERRORS+1))
			return
		fi
		echo 'started.'
	fi

	if [[ ! "$PHP_SUPERVISOR" == "true" ]]; then	
		startphp "$S"
	else 
		echo "Supervisor controls php processes"
	fi
}

stop() {
	init || return

	echo -n "Stopping $S webserver... "

	if [[ ! $RUNNING ]]; then
		echo 'not running!'
	elif $BINARY $NGINX_ARGS -s stop ; then
		echo 'stopped.'
	else
		echo -n 'stop failed (bad config?) - trying signal... '
		kill -QUIT "$PID"
		sleep 2
		check_running
		if [[ ! $RUNNING ]]; then
			echo 'yep, that worked.'
			return
		fi
		echo -n 'forcing the matter... '
		kill -TERM "$PID"
		sleep 1
		check_running
		if [[ ! $RUNNING ]]; then
			echo 'yeah, that did the trick.'
			return
		else
			echo 'ugh, stubborn POS.'
			return 1
		fi
	fi
        if [[ ! "$PHP_SUPERVISOR" == "true" ]]; then
                stopphp
        else
                echo "Supervisor controls php processes"
        fi

}

restart() {
	stop ; sleep 1 ; start
}

reload() {
	check_enabled
	init || return 1

	echo -n "Reloading $S webserver... "

	if [[ ! $RUNNING ]]; then
		echo 'not running yet, starting it instead!'
		start
		return
	fi

	if ! $BINARY $NGINX_ARGS -s reload ; then
		echo 'failed!'
		NUMERRORS=$(($NUMERRORS+1))
	else
		echo 'reloaded!'
	fi
}

testconfig() {
	init || return

	$BINARY -c "/dh/nginx/servers/$S/$1" -p "/dh/nginx/servers/$S/var/" $NGINX_EXTRA_ARGS -t || NUMERRORS=$(($NUMERRORS+1))
}


startphp() {
	echo -n "Starting php: "
	for U in $PHP_USERS ; do
		echo -n " $U"
		SOCK="/home/$U/.php.sock"
		if [[ -S "$SOCK" ]] && lsof -t -O "$SOCK" > /dev/null ; then
			echo -n ' was OK...'
		else
			USER_PHP_BINARY="$PHP_BINARY"
			USER_PHP_PATH="$PHP_PATH"
			USER_PHPRC="$PHP_PHPRC"
			[[ -x "/home/$U/.php-launcher" ]] && USER_PHP_BINARY="/home/$U/.php-launcher"
			[[ -f "/home/$U/.php-ini" ]] && USER_PHPRC="/home/$U/.php-ini"
			[[ -d "/home/$U/bin" ]] && USER_PHP_PATH="/home/$U/bin:$PHP_PATH"
			sudo -H -u "$U" env -i \
				"PATH=$USER_PHP_PATH" \
				"HOME=/home/$U" \
				"PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN" \
				"PHPRC=$USER_PHPRC" \
				nohup "$USER_PHP_BINARY" -b "$SOCK" >> "/home/$U/logs/php.log" 2>> "/home/$U/logs/php.log" &
			echo -n ' launched...'
		fi
	done
	sleep 1 # Give PHPs a moment to bind sockets
	echo -n ' ok, chowning sockets...'
	/dh/nginx/bin/php_chowner.pl $PHP_USERS
	echo ' done!'
}

stopphp() {
	[[ $PHP_USERS ]] || return 1
	echo -n "Stopping php: "
	for U in $PHP_USERS ; do
		echo -n " $U"
		SOCK="/home/$U/.php.sock"
		PIDS=$( [[ -S "$SOCK" ]] && lsof -t -O "$SOCK" )
		if [[ $PIDS ]] ; then
			kill $PIDS
			echo -n ' stopped...'
		else
			echo -n ' not running...'
		fi
	done
	echo ' done!'
}

##############################################################################

case "$COMMAND" in
	start)
		check_enabled
		for S in $SERVERS ; do
			start
		done
	;;

	startphp)
		check_enabled
		for S in $SERVERS ; do
			init || continue
			startphp || echo "No PHP users on $S"
		done
	;;

	stopphp)
		for S in $SERVERS ; do
			init || continue
			stopphp || echo "No PHP users on $S"
		done
	;;

	restartphp)
		for S in $SERVERS ; do
			init || continue
			stopphp || echo "No PHP users on $S"
			startphp
		done
	;;

	stop)
		for S in $SERVERS ; do
			stop
		done
	;;

	restart)
		for S in $SERVERS ; do
			restart
		done
	;;

	reload)
		for S in $SERVERS ; do
			reload
		done
	;;

	test)
		for S in $SERVERS ; do
			testconfig nginx.conf.pushing
		done
	;;

	*)
		echo "Usage: /etc/init.d/$NAME {start|stop|reload|restart} [servers]"
		exit 1
	;;
esac

exit "$NUMERRORS"
