#!/bin/sh
#
# unimrcp-server This shell script takes care of starting and stopping the UniMRCP server.
#
# chkconfig: 2345 65 35
# description: UniMRCP is an open source MRCP v1 & v2 server

# Some global variables

# Application
APP_NAME="unimrcpserver"
APP_LONG_NAME="unimrcpserver"
UNIMRCP_DIR="/usr/local/unimrcp/"

EXEC="${UNIMRCP_DIR}bin/${APP_NAME} -d -o 2 -r ${UNIMRCP_DIR}"

# sudo user
USERNAME=root

# Priority at which to run the server. See "man nice" for valid priorities.
# nice is only used if a priority is specified.
PRIORITY=

# Location of the pid file.
PIDDIR="/var/run/"
pid=

LOG="/var/log/${APP_NAME}.log"

if [ -e $PIDDIR ]; then
echo
else
mkdir $PIDDIR
fi

# Allow configuration overrides in /etc/sysconfig/$APP_NAME
CONFIGFILE=/etc/sysconfig/$APP_NAME

[ -x $CONFIGFILE ] && . $CONFIGFILE

# Do not modify anything beyond this point
#-----------------------------------------------------------------------------

# Get the fully qualified path to the script
case $0 in
    /*)
        SCRIPT="$0"
        ;;
    *)
        PWD=`pwd`
        SCRIPT="$PWD/$0"
        ;;
esac

# Change spaces to ":" so the tokens can be parsed.
SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
# Get the real path to this script, resolving any symbolic links
TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'`
REALPATH=
for C in $TOKENS; do
REALPATH="$REALPATH/$C"
    while [ -h "$REALPATH" ] ; do
LS="`ls -ld "$REALPATH"`"
        LINK="`expr "$LS" : '.*-> \(.*\)$'`"
        if expr "$LINK" : '/.*' > /dev/null; then
REALPATH="$LINK"
        else
REALPATH="`dirname "$REALPATH"`""/$LINK"
        fi
done
done
# Change ":" chars back to spaces.
REALPATH=`echo $REALPATH | sed -e 's;:; ;g'`

# Change the current directory to the location of the script
cd "`dirname "$REALPATH"`"

chown $USERNAME $PIDDIR

# Process ID
PIDFILE="$PIDDIR/$APP_NAME.pid"

# Resolve the location of the 'ps' command
PSEXE="/usr/bin/ps"
if [ ! -x $PSEXE ]
then
PSEXE="/bin/ps"
    if [ ! -x $PSEXE ]
    then
echo "Unable to locate 'ps'."
        echo "Please report this with the location on your system."
        exit 1
    fi
fi

# Build the nice clause
if [ "X$PRIORITY" = "X" ]
then
CMDNICE=""
else
CMDNICE="nice -$PRIORITY"
fi

getpid() {
    if [ -f $PIDFILE ]
    then
if [ -r $PIDFILE ]
        then
pid=`cat $PIDFILE`
            if [ "X$pid" != "X" ]
            then
                # Verify that a process with this pid is still running.
                pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
                if [ "X$pid" = "X" ]
                then
                    # This is a stale pid file.
                    rm -f $PIDFILE
                    echo "Removed stale pid file: $PIDFILE"
                fi
fi
else
echo "Cannot read $PIDFILE."
            exit 1
        fi
fi
}

testpid() {
    pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
    if [ "X$pid" = "X" ]
    then
        # Process is gone so remove the pid file.
        rm -f $PIDFILE
    fi
}

console() {
    echo "Running $APP_LONG_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
exec sudo -u $USERNAME $CMDNICE $EXEC
    else
echo "$APP_LONG_NAME is already running."
        exit 1
    fi
}
 
start() {
    echo "Starting $APP_LONG_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
sudo -u $USERNAME $CMDNICE $EXEC
        pid=`$PSEXE -C $APP_NAME -o pid=`
echo $pid
echo $pid > $PIDFILE
    else
echo "$APP_LONG_NAME is already running."
        exit 1
    fi
}
 
stopit() {
    echo "Stopping $APP_LONG_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
echo "$APP_LONG_NAME was not running."
    else
         # Running so try to stop it.
        sudo -u $USERNAME kill $pid
        if [ $? -ne 0 ]
        then
            # An explanation for the failure should have been given
            echo "Unable to stop $APP_LONG_NAME."
            exit 1
        fi

        # We can not predict how long it will take for the wrapper to
        # actually stop as it depends on settings in wrapper.conf.
        # Loop until it does.
        savepid=$pid
        CNT=0
        TOTCNT=0
        while [ "X$pid" != "X" ]
        do
            # Loop for up to 5 minutes
            if [ "$TOTCNT" -lt "300" ]
            then
if [ "$CNT" -lt "5" ]
                then
CNT=`expr $CNT + 1`
                else
echo "Waiting for $APP_LONG_NAME to exit..."
                    CNT=0
                fi
TOTCNT=`expr $TOTCNT + 1`

                sleep 1

                testpid
            else
pid=
            fi
done

pid=$savepid
        testpid
        if [ "X$pid" != "X" ]
        then
echo "Timed out waiting for $APP_LONG_NAME to exit."
            echo " Attempting a forced exit..."
            kill -9 $pid
        fi

pid=$savepid
        testpid
        if [ "X$pid" != "X" ]
        then
echo "Failed to stop $APP_LONG_NAME."
            exit 1
        else
echo "Stopped $APP_LONG_NAME."
        fi
fi
}

status() {
    getpid
    if [ "X$pid" = "X" ]
    then
echo "$APP_LONG_NAME is not running."
        exit 1
    else
echo "$APP_LONG_NAME is running ($pid)."
        exit 0
    fi
}

case "$1" in

    'console')
        console
        ;;

    'start')
        start
        ;;
        
    'stop')
        stopit
        ;;

    'restart')
        stopit
        start
        ;;

    'status')
        status
        ;;

    *)
        echo "Usage: $0 { console | start | stop | restart | status }"
        exit 1
        ;;
esac

exit 0