#! /bin/sh
#
# mediarec: Starts mediarec daemon
#
# chkconfig: 345 96 02
# processname: mediarec
# description: Media Recorder
# config:
# Author: Sangoma Technologies - Alkassoum Ahmoud <aahmoud@sangoma.com>

SERVICE_PROD_NAME="Media Recorder"
SERVICE_NAME=mediarec
SERVICE_CONF_FILE=/etc/sysconfig/$SERVICE_NAME
SERVICE_USLEEP=500000
SERVICE_USLEEP_TIMEOUT=$(((20*1000000)/$SERVICE_USLEEP))

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

# pull in sysconfig settings only if INSTALLDIR is not already present
if [ -z "$INSTALLDIR" ]
then
	if [ ! -f $SERVICE_CONF_FILE ]
	then
		echo "FATAL: There is no $SERVICE_CONF_FILE file!!"
		exit
	fi
	. $SERVICE_CONF_FILE
fi

export LD_LIBRARY_PATH="$INSTALLDIR/lib"
export PYTHONPATH="$PYTHONPATH:$CUSTOM_PYTHON_PATH"
export PATH="$INSTALLDIR/bin:$PATH"
export XTABLES_LIBDIR="$INSTALLDIR/lib/xtables"
SERVICE_XML_CONF="$INSTALLDIR/etc/$SERVICE_NAME/$SERVICE_NAME.xml"
SERVICE_PID_FILE=$INSTALLDIR/run/$SERVICE_NAME.pid
SERVICE_BINARY=$INSTALLDIR/etc/$SERVICE_NAME/$SERVICE_NAME
RECOVER_LOOP=30

check_service()
{
	if [ -f "$SERVICE_PID_FILE" ]
	then
		service_pid=$(cat $SERVICE_PID_FILE)
		service_proc_cmdline="/proc/$service_pid/cmdline"

		if [ -e "$service_proc_cmdline" ]
		then
			if grep -q "$SERVICE_BINARY" "$service_proc_cmdline"  > /dev/null
			then
				echo "running"
			else
				echo "stopped-invalid"
			fi
		else
			echo "stopped-stale"
		fi
	else
		echo "stopped"
	fi
}

start()
{
    service_extra_action=""
	service_status="$(check_service)"

	if [ "x$service_status" = "xrunning" ]
    then
		echo -n $"$SERVICE_PROD_NAME is already started:"
		failure
		echo
		exit 1
	elif [ "x$service_status" = "xstopped-stale" -o "x$service_status" = "xstopped-invalid" ]
	then
		service_extra_action=" (stale PID file)"
		rm -f "$SERVICE_PID_FILE"
	fi

	touch /var/lock/subsys/$SERVICE_NAME
	RETVAL=0

    echo -n $"Starting $SERVICE_PROD_NAME$service_extra_action:"

	local cmd="$SERVICE_BINARY -c $SERVICE_XML_CONF -p $SERVICE_PID_FILE"

	if [ -x $SERVICE_BINARY ]
	then
		(/usr/bin/setsid $cmd &) &> /dev/null < /dev/null
		success
	else
		rm -f /var/lock/subsys/$SERVICE_NAME
		failure
	fi

	echo
}

stop()
{
	service_status="$(check_service)"

	if [ "x$service_status" != "xrunning" ]
	then
		if [ "x$service_status" = "xstopped-stale" -o "x$service_status" = "xstopped-invalid" ]
		then
			echo -n $"$SERVICE_PROD_NAME is not running anymore:"
		else
			echo -n $"$SERVICE_PROD_NAME is not started:"
		fi

		failure
		echo
		return 0
	fi

	service_pid=$(cat $SERVICE_PID_FILE)
	echo -n $"Stopping $SERVICE_PROD_NAME (pid=$service_pid):"

	$SERVICE_BINARY -p $SERVICE_PID_FILE --stop &> /dev/null

	RETVAL=$?
	if [ "$RETVAL" = 0 ]
	then
		tcnt=0;
		# at this point just finish the routine if we stop seeing the process 
		while true
		do
			kill -s 0 $service_pid &> /dev/null
			RETVAL=$?
			if [ "$RETVAL" != 0 ]
			then
				RETVAL=0
				success
				break
			fi
			usleep $SERVICE_USLEEP
			tcnt=$((tcnt+1))
			if [ $tcnt -gt $SERVICE_USLEEP_TIMEOUT ]; then
				eval "kill -9 $service_pid &> /dev/null"
				success
    			break
			fi
			#echo "Waiting for pid down $tcnt/$SERVICE_USLEEP_TIMEOUT"
		done
			rm -f /var/lock/subsys/$SERVICE_NAME
    		echo
	else
		rm -f $SERVICE_STOPFILE
   		failure
   		echo
	fi

}

initdb()
{
	$SERVICE_BINARY -c $SERVICE_XML_CONF --init-database &> /dev/null
	RETVAL=$?
	if [ "$RETVAL" = 0 ]
	then
		success
   		echo
	else
   		failure
   		echo
	fi
}

show_status()
{
	# show_status requires the service to be started
	if [ ! -f "$SERVICE_PID_FILE" ]
	then
		echo -n $"$SERVICE_PROD_NAME is not started:"
		failure
		echo 
		return 1
	fi

	$SERVICE_BINARY --show-status
	RETVAL=$?
	if [ "$RETVAL" = 0 ]
	then
		success
   		echo
	else
   		failure
   		echo
	fi

}

silentstatus() {
	service_pid=`pidof $1`
	if [[ ! -z "$service_pid" ]]; then
		return 0
	else
		return 3
	fi
}

recover() {
	c=1
	stat=0
	while (( $c <= $RECOVER_LOOP )); do
		silentstatus $SERVICE_NAME
		stat=$?
		if (( stat == 3 )); then
			start
			break
		else
			sleep 1
			(( c++ ))
		fi
	done
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		status -p $SERVICE_PID_FILE $SERVICE_BINARY
		RETVAL=$?
		;;
	restart)
		stop
		start
		;;
	recover)
		recover
		;;
	initdb)
		initdb
		;;
	show_status)
		show_status
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|status|initdb|show_status}"
		RETVAL=1
esac
exit $RETVAL


