#!/bin/bash

#
# FirstClass Server control script.
# 

# find_pid name
find_pid()
{
	ps axc | grep -w $1 | awk '{print $1}'
}

# send_signal pid [signal]
send_signal()
{
    # Signal the service
    if kill $2 $1 ; then
		return 0
    else
		# normal kill failed, try sudo version
		if sudo kill $2 $1 ; then
			return 0
		else
			return 1
		fi
    fi
}


#Set platform dependent definitions
if [ "`uname -s`" = "Darwin" ] ; then
	SERVICE_FOLDER="/Library/FirstClass Server"
	USERDOCS="/Users/fcadmin/Documents"
else
	SERVICE_FOLDER="/opt/fcsd"
	USERDOCS="/home/fcadmin/documents"
fi

SERVICE_NAME="FirstClass Core Server"
SERVICE_APP="fcsd"
#

SERVICE_PID=`find_pid "$SERVICE_APP"`
#
PRECMD="$USERDOCS/pre$SERVICE_APP"
POSTCMD="$USERDOCS/post$SERVICE_APP"

ERROR=0
ARGV="$@"
if [ "x$ARGV" = "x" ] ; then 
    ARGS="help"
fi

cd "$SERVICE_FOLDER"

for ARG in $@ $ARGS ; do
    case $ARG in
    start)
	if [ -n "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is already running ($SERVICE_PID)."
	    continue
	fi
	if [ -f "$PRECMD" ] ; then
	    source "$PRECMD" "$ARG"
	fi
	# Start the service"
	"./$SERVICE_APP" -d 
	sleep 5
	SERVICE_PID=`find_pid "$SERVICE_APP"`
	if [ -n "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) started ($SERVICE_PID)."
	    if [ -f "$POSTCMD" ] ; then
	        source "$POSTCMD" "$ARG"
	    fi
	else
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) could not be started."
	    ERROR=3
	fi
	;;
    stop)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
	else
	    if [ -f "$PRECMD" ] ; then
	        source "$PRECMD" "$ARG"
	    fi
	    # Halt the service
	    if send_signal $SERVICE_PID ; then
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) stopped ($SERVICE_PID)."
	        if [ -f "$POSTCMD" ] ; then
	            source "$POSTCMD" "$ARG"
	        fi
	    else
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) could not be stopped ($SERVICE_PID)."
		ERROR=4
	    fi
	fi
	;;
    force)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
	else
	    # Halt the service
	    if send_signal $SERVICE_PID -9 ; then
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) force-killed ($SERVICE_PID)."
	    else
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) could not be force-killed ($SERVICE_PID)."
		ERROR=4
	    fi
	fi
	;;
    restart)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
	else
	    if [ -f "$PRECMD" ] ; then
	        source "$PRECMD" "$ARG"
	    fi
	    # Halt the service
	    if send_signal $SERVICE_PID ; then
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) stopped ($SERVICE_PID)."
		sleep 10
		"$0" "start"
	    else
		echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) could not be stopped ($SERVICE_PID)."
	    	ERROR=4
	    fi
	fi
	;;
    pause)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
	else
	    # Signal the service
	    if send_signal $SERVICE_PID -USR1 ; then
		echo "$0 $ARG: Pause mirror(s) signal sent to $SERVICE_NAME ($SERVICE_APP) process ($SERVICE_PID)."
	    else
	        echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) mirrors could not be paused."
	    	ERROR=4
	    fi
	fi
	;;
    continue)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
	else
	    # Signal the service
	    if send_signal $SERVICE_PID -USR2 ; then
		echo "$0 $ARG: Continue mirror(s) signal sent to $SERVICE_NAME ($SERVICE_APP) process ($SERVICE_PID)."
	    else
	        echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) mirror(s) could not be continued."
	    	ERROR=4
	    fi
	fi
	;;
    status)
	if [ -z "$SERVICE_PID" ]; then
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is not running."
    	    ERROR=4
	else
	    echo "$0 $ARG: $SERVICE_NAME ($SERVICE_APP) is running ($SERVICE_PID)."
	fi
	;;
    *)
	echo "usage: $0 (start|stop|force|status|pause|continue|help)"
	cat <<EOF

start      - start $SERVICE_NAME
stop       - stop $SERVICE_NAME (gracefully)
force      - stop $SERVICE_NAME (force-kill)
status     - check whether the $SERVICE_NAME is running or not
pause      - pause all mirrors
continue   - continue all mirrors
help       - this screen

EOF
	ERROR=2
    ;;

    esac

done

exit $ERROR

