#!/bin/sh
#
# $Id: tomcat9 103 2021-03-10 19:25:19Z cl_yubikey_2018a $
#
# Starts/stops a tomcat9 instance based on variables set in an instance specific init.d script.
#
# Call /usr/bin/jpkg-tomcat9-create-instance to create your init script interactively
# or copy-and-change our template yourself: /usr/share/jpkg-tomcat9/init.d/instance.template 
#

# Source debian's function library.
. /lib/lsb/init-functions

export DEFAULT_JAVA_HOME
test -f /etc/default/jpkg-tomcat9 && . /etc/default/jpkg-tomcat9 

if [ -z "$JAVA_HOME" ] ; then
  if [ -z "$DEFAULT_JAVA_HOME" ] ; then
    echo "Neither JAVA_HOME nor DEFAULT_JAVA_HOME are set."
    exit 1
  else
    JAVA_HOME="$DEFAULT_JAVA_HOME"
  fi
fi

if [ ! -x "$JAVA_HOME/bin/java" ] ; then
  echo "JAVA_HOME does not point to a valid Java Installation: $JAVA_HOME"
  exit 2
fi

if [ -z "$CATALINA_HOME" ] ; then
  export CATALINA_HOME="/usr/share/jpkg-tomcat9/apache-tomcat-9"
else
  echo "Using caller's CATALINA_HOME: $CATALINA_HOME"
fi

if [ -z "$CATALINA_INSTANCE" ] ; then
  echo "CATALINA_INSTANCE not set."
  exit 4
fi

if [ -z "$CATALINA_BASE" ] ; then
  echo "CATALINA_BASE not set, try /var/www/java/${CATALINA_INSTANCE}"
  exit 5
fi

if [ ! -d "$CATALINA_BASE" ]
then
  echo "CATALINA_BASE does not point to a directory: ${CATALINA_BASE}"
  exit 6
fi

test -z "$CATALINA_USER"     && export CATALINA_USER=www-data
test -z "$CATALINA_GROUP"    && export CATALINA_GROUP=$(getent group $(getent passwd ${CATALINA_USER} |cut -f4 -d':') |cut -f1 -d':')
test -z "$CATALINA_CLASS"    && export CATALINA_CLASS=org.apache.catalina.startup.Bootstrap
test -z "$CATALINA_WAIT"     && export CATALINA_WAIT=30
test -z "$CATALINA_PID"      && mkdir -pv ${CATALINA_BASE}/run && chown $CATALINA_USER:$CATALINA_GROUP ${CATALINA_BASE}/run && export CATALINA_PID=${CATALINA_BASE}/run/tomcat9.pid
test -z "$LOGDIR"            && export LOGDIR=/var/log/tomcat9/${CATALINA_INSTANCE}

/bin/mkdir -pv $LOGDIR 

CATALINA_TMPDIR=$CATALINA_BASE/temp
/bin/mkdir -pv $CATALINA_TMPDIR

JESSIEFFVER=$(egrep "^[891]" /etc/debian_version 2>/dev/null ; egrep ubuntu /etc/apt/sources.list 2>/dev/null)

if [ -n "${JESSIEFFVER}" ] ; then

  echo "Detected jessie or above"

  CATALINA_OPTS="$CATALINA_OPTS -Dcatalina.base=$CATALINA_BASE"
  CATALINA_OPTS="$CATALINA_OPTS -Dcatalina.home=$CATALINA_HOME"
  CATALINA_OPTS="$CATALINA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
  CATALINA_OPTS="$CATALINA_OPTS $JAVA_OPTS"
  
  CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar
  if [ -d $CATALINA_BASE/lib ] ; then
    for jar in $CATALINA_BASE/lib/*.jar
    do
      CLASSPATH=${CLASSPATH:+$CLASSPATH:}$jar
    done
  fi

else 
  
  echo "Detected wheezy or below"

  CATALINA_OPTS="$CATALINA_OPTS -Dcatalina.base=$CATALINA_BASE"
  CATALINA_OPTS="$CATALINA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
  CATALINA_OPTS="$CATALINA_OPTS $JAVA_OPTS"

  CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar:$CATALINA_BASE/lib/*

fi

#echo "Classpath: $CLASSPATH"
#echo "CATALINA_HOME:  ${CATALINA_HOME}"
#echo "CATALINA_BASE:  ${CATALINA_BASE}"

export TOMCAT_USER=CATALINA_USER

case "$1" in
  start)
    # prepare logging directory
    DATESTRING=$(/bin/date "+%Y%m%d%H%M%S")
    LOGARCHIVE="$LOGDIR/archive/$DATESTRING"

    # make sure $CATALINA_BASE and $CHOWNDIRS are accessible
    /bin/chown -R $CATALINA_USER:$CATALINA_GROUP $CATALINA_BASE $CHOWNDIRS
    /bin/chmod -R 0750 $CATALINA_BASE $CHOWNDIRS

    # move eventual old logs
    OLDLOGS=$(/usr/bin/find $LOGDIR -mindepth 1 -maxdepth 1 -type f |grep -v check.log)
    if [ ! -z "$OLDLOGS" ]
    then
      /bin/mkdir -p $LOGARCHIVE
      #/bin/find $LOGDIR -type f -mindepth 1 -maxdepth 1 |/usr/bin/xargs /bin/gzip 
      /bin/gzip $OLDLOGS
      /bin/mv $LOGDIR/*gz $LOGARCHIVE/
      echo "Former logs have been gzip'ed and moved to $LOGARCHIVE/"
    fi
    /bin/chown -R $CATALINA_USER:$CATALINA_GROUP $LOGDIR
    /bin/chmod -R 0750 $LOGDIR

    #log_begin_msg "Starting Tomcat9 $CATALINA_INSTANCE ..."
    echo "Starting Tomcat9 $CATALINA_INSTANCE ..."

    cd $CATALINA_HOME
    echo ""
    echo sudo -E -u $CATALINA_USER ${CATALINA_HOME}/bin/catalina.sh start
    sudo -E -u $CATALINA_USER ${CATALINA_HOME}/bin/catalina.sh start
    # && touch $CATALINA_PID
    echo ""
    
    # chown again, which includes catalina.out
    /bin/chown -R $CATALINA_USER:$CATALINA_GROUP $LOGDIR $CATALINA_PID
    /bin/chmod -R 0750 $LOGDIR

    log_begin_msg "Started Tomcat9 $CATALINA_INSTANCE ..."
    log_end_msg $?
    ;;

  stop)
    #log_begin_msg "Stopping Tomcat9 $CATALINA_INSTANCE ..."
    echo "Stopping Tomcat9 $CATALINA_INSTANCE ..."
    cd $CATALINA_HOME
    echo ""
    echo sudo -E -u $CATALINA_USER ${CATALINA_HOME}/bin/catalina.sh stop
    sudo -E -u $CATALINA_USER ${CATALINA_HOME}/bin/catalina.sh stop
    echo ""
    log_begin_msg "Sttopped Tomcat9 $CATALINA_INSTANCE ..."
    log_end_msg $?
    ;;

  restart)
    $0 stop && $0 start
    ;;

  status)
    #log_begin_msg "Checking for tomcat9 $CATALINA_INSTANCE ..."
    echo "Checking for tomcat9 $CATALINA_INSTANCE ..."
    cd $CATALINA_HOME
    if [ -n "$CATALINA_PID" ] ; then
      if [ -f $CATALINA_PID ] ; then
        TOMCAT_PID=$(cat $CATALINA_PID)
        if [ -n "$TOMCAT_PID" ] ; then
          if [ -d "/proc/$TOMCAT_PID" ] ; then
            log_begin_msg "Status of tomcat9 $CATALINA_INSTANCE ..."
            log_end_msg 0
          else
            echo "Reaseon: No directory /proc/$TOMCAT_PID"
            log_begin_msg "Status of tomcat9 $CATALINA_INSTANCE ..."
            log_end_msg 1
          fi
        else
          echo "Reaseon: CATALINA_PID file $CATALINA_PID empty"
          log_begin_msg "Status of tomcat9 $CATALINA_INSTANCE ..."
          log_end_msg 1
        fi
      else 
        echo "Reaseon: CATALINA_PID file $CATALINA_PID not created"
        log_begin_msg "Status of tomcat9 $CATALINA_INSTANCE ..."
        log_end_msg 1
      fi
    else 
      echo "Reaseon: CATALINA_PID not set"
      log_begin_msg "Status of tomcat9 $CATALINA_INSTANCE ..."
      log_end_msg 1
    fi
    ;;

  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 99

esac

