#!/bin/bash
#
# chkconfig: 345 99 01
# description: Communication Server
# processname: CommServer
# pidfile: /opt/remotenas/CommServer/commserver.pid
#

# set -e

SHUTDOWN_TIMEOUT_IN_SECONDS=10

usage() {
	cat <<EOF
Example usage:

./$1
service $1 start
service $1 stop
service $1 status

Mandatory args:

Optional args:
	start
	stop
EOF
	return 0
}


init() {
	USER="remotenas"
	ROOT_DIR="/opt/remotenas/CommServer"
	SERVICENAME="commserver"
	PIDFILE="$ROOT_DIR/$SERVICENAME.pid"
	LOCKFILE="/var/lock/subsys/commserver"
}

removePIDFile() {
	echo "Removing $PIDFILE"
	rm -f "$PIDFILE"
	sync
}

initJRE_PATH() {
	JRE_CANDIDATES="/etc/alternatives/jre /usr/lib/jvm/jre /etc/alternatives/jre_oracle /usr/lib/jvm/jre-oracle /usr/java/default/jre"
	JRE_PATH='-'
	path='-'
	for candidate in $JRE_CANDIDATES
	do
		if [ -L "$candidate" ] || [ -d "$candidate" ]
		then
			path="$(readlink -f $candidate || echo -)"
			if [ "$path" != "-" ]
			then
				JRE_PATH="$path"
				break
			fi
		fi
	done

	if [ ! -d "$JRE_PATH" ]
	then
		echo "ERROR - cannot find JRE_PATH" >&2
		exit 2
	fi
}

start() {
	cd $ROOT_DIR

	echo "Starting $SERVICENAME"

	# Prepare std log file
	STDOUT_LOG_FILE="/var/opt/remotenas/logs/output.log"
	chown "$USER":"$USER" "$STDOUT_LOG_FILE" || true

	# Prepare log file
	LOG_FILE="/var/opt/remotenas/logs/gdserver.log"
	chown "$USER":"$USER" "$LOG_FILE" || true

	initJRE_PATH

	CLASSPATH=
	for library in $ROOT_DIR/lib/* ; do
		CLASSPATH="$CLASSPATH":$library
	done

	sudo -E -u "$USER" /bin/bash - << EOF
		mkdir -p  $(dirname "$STDOUT_LOG_FILE")

		export LD_LIBRARY_PATH="$ROOT_DIR/bin:$JRE_PATH/lib/amd64:$JRE_PATH/lib/amd64/server:$JRE_PATH/lib/amd64/xawt"

		java -Xmx2048m \
			-Djava.library.path="$ROOT_DIR/bin" \
			-Djava.net.preferIPv4Stack=true \
			-Dcom.sun.management.jmxremote \
			-Dcom.sun.management.jmxremote.port=9010 \
			-Dcom.sun.management.jmxremote.local.only=true \
			-Dcom.sun.management.jmxremote.authenticate=true \
			-Dcom.sun.management.jmxremote.ssl=false \
			-Dcom.sun.management.jmxremote.password.file=$ROOT_DIR/jmxremote.password \
			-Dcom.sun.management.jmxremote.access.file=$ROOT_DIR/jmxremote.access \
			-Dhttps.cipherSuites="TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA" \
			-classpath "$CLASSPATH" \
			com.vestiacom.gdserver.Main >> "$STDOUT_LOG_FILE" 2>&1 &

		echo \$! > "${PIDFILE}"
		sync
		echo "Started $SERVICENAME - PID written to $PIDFILE"
EOF
	[ $? -eq 0 ] && touch $LOCKFILE

}


status() {
	echo "Installed in $ROOT_DIR"
	if [[ ! -f "${PIDFILE}" ]]; then
		echo "$SERVICENAME is not running"
		return 0
	fi
	PID=$(cat "$PIDFILE")

	if ps -p "$PID" > /dev/null
	then
		echo "$SERVICENAME is running with PID: $PID"
	else
		echo "$SERVICENAME is not running"
		removePIDFile
	fi
}

stop() {
	if [[ ! -f "${PIDFILE}" ]]; then
		rm -f $LOCKFILE
		echo "$SERVICENAME is not running"
		return 0
	fi


	PID=$(cat "$PIDFILE")

	if ! kill $1 "${PID}" ; then
		echo "Stopping $SERVICENAME (pid $PID) failed"
	else
		echo "$SERVICENAME stopped"
	fi
    waitUntilStopped
	removePIDFile
	rm -f $LOCKFILE
}

waitUntilStopped(){
    local shutdownTimer=0
    while [ -f /proc/"$PID"/exe ] && [ "$shutdownTimer" -le "$SHUTDOWN_TIMEOUT_IN_SECONDS" ]; do
        sleep 1
        (( shutdownTimer = shutdownTimer+1 ))
    done
    if [ -f /proc/"$PID"/exe ]
    then
        echo "WARNING: $SERVICENAME shutdown exceeded $SHUTDOWN_TIMEOUT_IN_SECONDS seconds timeout"
    fi
}

run() {
	case "$1" in
		start)
			stop -15; sleep 1; start;
			;;
		restart)
			stop -15; sleep 1; start;
			;;
		stop)
			stop -15
			;;
		force-stop)
			stop -9
			;;
		force-restart)
			stop -9; sleep 1; start;
			;;
		status)
			status
			;;
		*)
			usage "$SERVICENAME"
			exit 4
			;;
	esac
}

init
run "$@"

exit 0
