#!/bin/sh
#
# WildFly control script
#
# chkconfig: 2345 80 20
# description: WildFly startup/shutdown script
#
### BEGIN INIT INFO
# Provides:             wildfly
# Required-Start:       $remote_fs $network
# Required-Stop:        $remote_fs $network
# Should-Start:         $named
# Should-Stop:          $named
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    WildFly Application Server
# Description:          WildFly startup/shutdown script
### END INIT INFO

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

NAME=$(readlink -f "${0}" | xargs basename)

# Check privileges
if [ "$(id -u)" -ne 0 ]; then
	echo "You need root privileges to run this script"
	exit 1
fi

# Load wildfly init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
	JBOSS_CONF="/etc/default/${NAME}"
fi

# Set defaults.
if [ -f "$JBOSS_CONF" ]; then
	. "$JBOSS_CONF"
fi

# Location of JDK
if [ -n "$JAVA_HOME" ]; then
	export JAVA_HOME
fi

# Setup the JVM
if [ -z "$JAVA" ]; then
	if [ -n "$JAVA_HOME" ]; then
		JAVA="$JAVA_HOME/bin/java"
	else
		JAVA="java"
	fi
fi

# Location of wildfly
if [ -z "$JBOSS_HOME" ]; then
	JBOSS_HOME="/opt/${NAME}"
fi
export JBOSS_HOME

# Check if wildfly is installed
if [ ! -f "$JBOSS_HOME/jboss-modules.jar" ]; then
	echo "$NAME is not installed in \"$JBOSS_HOME\""
	exit 1
fi

# Run as wildfly user
if [ -z "$JBOSS_USER" ]; then
	JBOSS_USER=wildfly
fi

# Check wildfly user
if ! id $JBOSS_USER > /dev/null 2>&1 || [ -z "$JBOSS_USER" ]; then
	echo "User \"$JBOSS_USER\" does not exist..."
	exit 1
fi

# Check owner of JBOSS_HOME
if [ ! "$(stat -L -c "%U" "$JBOSS_HOME")" = $JBOSS_USER ]; then
	echo "The user \"$JBOSS_USER\" is not owner of \"$(readlink -f "$JBOSS_HOME")\""
	echo "Try: chown -R $JBOSS_USER:$JBOSS_USER \"$(readlink -f "$JBOSS_HOME")\""
	exit 1
fi

# Location to set the pid file
if [ -z "$JBOSS_PIDFILE" ]; then
	JBOSS_PIDFILE=/var/run/wildfly/${NAME}.pid
fi
export JBOSS_PIDFILE

# Location to set the lock file
if [ -z "$JBOSS_LOCKFILE" ]; then
	JBOSS_LOCKFILE=/var/lock/subsys/${NAME}
fi

# Location to keep the console log
if [ -z "$JBOSS_CONSOLE_LOG" ]; then
	JBOSS_CONSOLE_LOG=/var/log/${NAME}/console.log
fi

# The amount of time to wait for startup
if [ -z "$STARTUP_WAIT" ]; then
	STARTUP_WAIT=30
fi

# The amount of time to wait for shutdown
if [ -z "$SHUTDOWN_WAIT" ]; then
	SHUTDOWN_WAIT=30
fi

# Startup mode of wildfly
if [ -z "$JBOSS_MODE" ]; then
	JBOSS_MODE=standalone
fi

if [ -z "$JBOSS_BASE_DIR" ]; then
         JBOSS_BASE_DIR="$JBOSS_HOME/$JBOSS_MODE"
fi
JBOSS_OPTS="$JBOSS_OPTS -Djboss.server.base.dir=$JBOSS_BASE_DIR"

JBOSS_MARKERFILE=$JBOSS_BASE_DIR/tmp/startup-marker

# Startup mode script
if [ "$JBOSS_MODE" = "standalone" ]; then
	JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh
	if [ -z "$JBOSS_CONFIG" ]; then
		JBOSS_CONFIG=standalone.xml
	fi
else
	JBOSS_SCRIPT=$JBOSS_HOME/bin/domain.sh
	if [ -z "$JBOSS_DOMAIN_CONFIG" ]; then
		JBOSS_DOMAIN_CONFIG=domain.xml
	fi
	if [ -z "$JBOSS_HOST_CONFIG" ]; then
		JBOSS_HOST_CONFIG=host.xml
	fi
fi

# Helper function to check status of wildfly service
check_status() {
	status -p "$JBOSS_PIDFILE" -l "$(basename "$JBOSS_LOCKFILE")" "$NAME" >/dev/null 2>&1
}

start() {
	printf "%s\n" $"Starting $NAME: "
	check_status
	status_start=$?
	if [ $status_start -eq 3 ]; then
		mkdir -p "$(dirname "$JBOSS_PIDFILE")"
		mkdir -p "$(dirname "$JBOSS_CONSOLE_LOG")"
		chown $JBOSS_USER "$(dirname "$JBOSS_PIDFILE")" || true
		cat /dev/null > "$JBOSS_CONSOLE_LOG"
		currenttime=$(date +%s%N | cut -b1-13)

		if [ "$JBOSS_MODE" = "standalone" ]; then
			cd "$JBOSS_HOME" >/dev/null 2>&1 || exit
			daemon --user=$JBOSS_USER --pidfile="$JBOSS_PIDFILE" LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE="$JBOSS_PIDFILE" "$JBOSS_SCRIPT -c $JBOSS_CONFIG $JBOSS_OPTS &" >> "$JBOSS_CONSOLE_LOG" 2>&1
			cd - >/dev/null 2>&1 || exit
		else
			cd "$JBOSS_HOME" >/dev/null 2>&1 || exit
			daemon --user=$JBOSS_USER --pidfile="$JBOSS_PIDFILE" LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE="$JBOSS_PIDFILE" "$JBOSS_SCRIPT --domain-config=$JBOSS_DOMAIN_CONFIG --host-config=$JBOSS_HOST_CONFIG $JBOSS_OPTS &" >> "$JBOSS_CONSOLE_LOG" 2>&1
			cd - >/dev/null 2>&1 || exit
		fi

		count=0
		until [ $count -gt $STARTUP_WAIT ]
		do
			sleep 1
			count=$($count+1);
			if [ -f "$JBOSS_MARKERFILE" ]; then
				markerfiletimestamp=$(grep -o '[0-9]\+' "$JBOSS_MARKERFILE") > /dev/null
				if [ "$markerfiletimestamp" -gt "$currenttime" ] ; then
					if ! grep -i 'success:' "$JBOSS_MARKERFILE" > /dev/null; then
						success
						echo
						touch "$JBOSS_LOCKFILE"
						exit 0
					fi
					
					if ! grep -i 'error:' "$JBOSS_MARKERFILE" > /dev/null; then
						warning
						echo
						echo "$NAME started with errors, please see server log for details."
						touch "$JBOSS_LOCKFILE"
						exit 0
					fi
				fi
			fi
		done

		if check_status; then
			warning
			echo
			echo "$NAME hasn't started within the timeout allowed."
			touch "$JBOSS_LOCKFILE"
			exit 0
		else
			failure
			echo
			echo "$NAME failed to start within the timeout allowed."
			exit 1
		fi

	else
		echo
		$0 status
	fi
}

stop() {
	printf "%s\n" $"Shutting down $NAME: "
	check_status
	status_stop=$?
	if [ $status_stop -eq 0 ]; then
		count=0;
		if [ -f "$JBOSS_PIDFILE" ]; then
			read -r kpid < "$JBOSS_PIDFILE"
			kwait=$($SHUTDOWN_WAIT)

			# Try issuing SIGTERM
			su -s /bin/sh -c "kill -15 $kpid" $JBOSS_USER
			until [ "$(pgrep --pid "$kpid" 2> /dev/null | grep -c "$kpid" 2> /dev/null)" -eq '0' ] || [ $count -gt "$kwait" ]
				do
				sleep 1
				count=$($count+1);
			done

			if [ "$count" -gt "$kwait" ]; then
				if ! su -s /bin/sh -c "kill -9 $kpid" $JBOSS_USER 2> /dev/null; then
				        failure
				        exit 1
				fi
			fi
		fi
		success
	elif [ $status_stop -eq 1 ]; then
		echo
		printf "%s\n" "$NAME dead but pid file exists, cleaning up"
	elif [ $status_stop -eq 2 ]; then
		echo
		printf "%s\n" "$NAME dead but subsys locked, cleaning up"
	elif [ $status_stop -eq 3 ]; then
		echo
		printf "%s\n" $"$NAME is already stopped"
	fi
	rm -f "$JBOSS_PIDFILE"
	rm -f "$JBOSS_LOCKFILE"
	echo
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		$0 stop
		$0 start
		;;
	status)
		status -p "$JBOSS_PIDFILE" -l "$(basename "$JBOSS_LOCKFILE")" "$NAME"
		;;
	*)
		## If no parameters are given, print which are avaiable.
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
		;;
esac
