#!/bin/bash
#
# /etc/init.d/fusionauth-app -- startup script for FusionAuth App
#
# Written by FusionAuth <dev@fusionauth.io>
#
### BEGIN INIT INFO
# chkconfig:         2345 99 10
# Provides:          fusionauth-app
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start FusionAuth App
# Description:       Start FusionAuth App
### END INIT INFO

set -e


#
# Set the options and such
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin
NAME=fusionauth-app
DESC="FusionAuth App"
CATALINA_HOME=/usr/local/fusionauth/fusionauth-app/apache-tomcat
CATALINA_BASE=${CATALINA_HOME}
CATALINA_TMPDIR=/tmp/fusionauth-app
FUSIONAUTH_USER=fusionauth
CLASSPATH="$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar"
MARKER="fusionAuthApp878711B77"


#
# Execute the FusionAuth App env script
#

if [ -f ${CATALINA_HOME}/bin/setenv.sh ]; then
  . ${CATALINA_HOME}/bin/setenv.sh
else
  echo "Missing setenv.sh. Please contact FusionAuth support for assistance"
  exit 1
fi


#
# Run all the initial checks
#

if [ `id -u` -ne 0 ]; then
  echo "You need root privileges to run this script"
  exit 1
fi

if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" -a ! -d "$CATALINA_BASE/conf" ]; then
  echo "$NAME is not installed"
  exit 1
fi

# Make sure tomcat is started with system locale
if [ -r /etc/sysconfig/i18n ]; then
  . /etc/sysconfig/i18n
  export LANG
fi


#
# The main case statement
#

case "$1" in
  start)
    echo -n "Starting $DESC:    "
    if pgrep -f ${MARKER} > /dev/null 2>&1; then
      echo "$NAME already running"
    else
      # Remove / recreate CATALINA_TMPDIR directory
      rm -rf "$CATALINA_TMPDIR"
      mkdir "$CATALINA_TMPDIR" || {
        echo "Could not create JVM temporary directory"
        exit 1
      }
      chown ${FUSIONAUTH_USER}:root "$CATALINA_TMPDIR"
      cd "$CATALINA_TMPDIR"

      # Set the owner for the log directories. They are created in the setenv.sh script if they don't already exist
      chown -R ${FUSIONAUTH_USER}:root ${FUSIONAUTH_LOG_DIR}
      chown -R ${FUSIONAUTH_USER}:root ${CATALINA_HOME}/logs

      START="/usr/local/fusionauth/java/current/bin/java -classpath \"$CLASSPATH\" -Dcatalina.base=\"$CATALINA_BASE\" -Dcatalina.home=\"$CATALINA_HOME\" $JAVA_OPTS $CATALINA_OPTS -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" -D$MARKER -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=\"$CATALINA_BASE/conf/logging.properties\" org.apache.catalina.startup.Bootstrap start >> $CATALINA_OUT 2>&1 &"
      su -p ${FUSIONAUTH_USER} -c "$START"
      sleep 5

      if pgrep -f ${MARKER} > /dev/null 2>&1; then
        echo "(done)"
      else
        echo "(failed)"
      fi
    fi
    ;;
  stop)
    echo -n "Stopping $DESC:    "
    if pgrep -f ${MARKER} > /dev/null 2>&1; then
      tries=0
      code=1
      set +e
      while [[ "$tries" < 3 && "$code" != 0 ]]; do
        /usr/local/fusionauth/java/current/bin/java -cp ${CLASSPATH} -Dcatalina.home=${CATALINA_HOME} -Dcatalina.base=${CATALINA_BASE} ${JAVA_OPTS} -Djava.awt.headless=true org.apache.catalina.startup.Bootstrap stop > /dev/null 2>&1
        code=$?
        tries=$((tries+1))
        sleep 2
      done
      set -e

      if ! pgrep -f ${MARKER} > /dev/null 2>&1; then
        echo "(done)"
      else
        echo "(failed)"
      fi
    else
      echo "(not running)"
    fi
    rm -rf "$CATALINA_TMPDIR"
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  status)
    if pgrep -f ${MARKER} > /dev/null 2>&1; then
      echo "$DESC is running with pid: $(pgrep -f ${MARKER})"
    else
      echo "$DESC is not running."
      exit 3
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0
