#!/bin/sh
#
# fcgi		FastCGI
#
# chkconfig:	345 60 40
#
# description:	FastCGI is a protocol for interfacing interactive programs with a web server.
#
# processname:	
# pidfile:      /var/run/fcgi/*.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
if is_yes "${NETWORKING}"; then
	if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status ]; then
		msg_network_down "FastCGI"
		exit 1
	fi
else
	exit 0
fi

instance_start() {
	(
		. /etc/fcgi.d/${1}
		msg_starting "FastCGI (${1})"
		# user/group
		args="$args ${FCGI_SPAWN_UID:+-u $FCGI_SPAWN_UID}"
		args="$args ${FCGI_SPAWN_GID:+-g $FCGI_SPAWN_GID}"

		# bind address
        if [ "$FCGI_SPAWN_SOCKET" ]; then
            args="$args ${FCGI_SPAWN_SOCKET:+-s $FCGI_SPAWN_SOCKET}"
            args="$args ${FCGI_SPAWN_SOCKET_UID:+-U $FCGI_SPAWN_SOCKET_UID}"
            args="$args ${FCGI_SPAWN_SOCKET_GID:+-G $FCGI_SPAWN_SOCKET_GID}"
        else
            args="$args ${FCGI_SPAWN_ADDR:+-a $FCGI_SPAWN_ADDR}"
		    args="$args ${FCGI_SPAWN_PORT:+-p $FCGI_SPAWN_PORT}"
        fi
        
		args="$args $FCGI_SPAWN_ARGS"

		# set umask the same way daemon() does.
		[ -z "$DEFAULT_SERVICE_UMASK" ] && DEFAULT_SERVICE_UMASK=022
		umask ${SERVICE_UMASK:-$DEFAULT_SERVICE_UMASK}
		env -i PATH=$PATH FCGI_WEB_SERVER_ADDRS=$FCGI_WEB_SERVER_ADDRS $FCGI_ENVIRONMENT /usr/sbin/spawn-fcgi -P /var/run/fcgi/${1}.pid $args -- $FCGI_BINARY > /dev/null
		RETVAL=$?

		if [ $RETVAL -eq 0 ]; then
			ok
		else
			fail
		fi

	)
	return $?
}

instance_stop() {
	(
		. /etc/fcgi.d/${1}
		msg_stopping "FastCGI (${1})"
		killproc --pidfile fcgi/${1}.pid ${FCGI_BINARY##*/}
	)
	return $?
}

instance_status() {
	status --pidfile fcgi/${1}.pid fcgi-${1} fcgi-${1}
	return $?
}

get_instances() {
	local files
	
	
	if [ -n "$(find /etc/fcgi.d/ -maxdepth 0 -empty)" ]; then 
		nls "Error: no FastCGI configuration files in %s, nothing to run" "/etc/fcgi.d/"
		exit 1
	fi
	
	if [ -n "$1" ]; then
		files="/etc/fcgi.d/$1"
	else
		files="$(find /etc/fcgi.d/ -maxdepth 1 -type f)"
	fi
	
	echo "$files"  | while read file; do
		if [ ! -f "$file" ]; then
			nls "Error: configuration for instance '%s' not found" $file
			exit 1
		fi
		
# 		if [ -x "$file" ]; then
# 			nls "Notice: ignored instance '%s' configuration, not executable" $file
# 			continue
# 		fi
		
		echo $file
	done
}

start() {
	local file
	local nstarted=0
	local nfailed=0
	
	get_instances $1 | while read file; do
		if [ -f /var/lock/subsys/fcgi-${file##*/} ]; then
			msg_already_running "FastCGI (${file##*/})"
			continue
		fi
		
		instance_start ${file##*/}
		
		RETVAL=$?
		if [ $RETVAL -eq 0 ]; then
			let nstarted=$nstarted+1
			touch /var/lock/subsys/fcgi-${file##*/}
		else
			let nfailed=$nfailed+1
		fi
	done
	
	if [ $nfailed -gt 0 ]; then
		nls "Warning: some instances failed to start"
	fi
}

stop() {
	local file
	
	if [ -n "$(find /var/lock/subsys/ -maxdepth 0 -name \"fcgi-*\" -empty)" ]; then
		msg_not_running "FastCGI"
		return
	fi
	
	get_instances $1 | while read file; do
		if [ ! -f /var/lock/subsys/fcgi-${file##*/} ]; then
			msg_not_running "FastCGI (${file##*/})"
			continue
		fi
		
		instance_stop ${file##*/}
		
		rm -f /var/lock/subsys/fcgi-${file##*/} >/dev/null 2>&1
	done
}

list_status() {
	local file

	get_instances $1 | while read file; do
		instance_status ${file##*/}
	done
}

RETVAL=0
# See how we were called.
case "$1" in
start)
	start $2
	;;
stop)
	stop $2
	;;
restart|force-reload)
	stop $2
	start $2
	;;
status)
	list_status $2
	;;
*)
	msg_usage "$0 {start|stop|restart|force-reload|status}"
	exit 3
esac

exit $RETVAL
