#!/bin/sh
#
# Startup script for the isCOBOL Server
# Copyright notice: Copyright (c) 2005 - 2023 Veryant  
#
# Use following variables to override default settings:
# ISSERVER_HOME
# ISSERVER_OPTS
# ISSERVER_JAVA_EXE
# ISSERVER_JAVA_OPTS
# ISSERVER_LOG_FILE
# ISSERVER_PID_FILE
# 
# for example: 
# ISSERVER_HOME=/home/iscobol ISSERVER_JAVA_EXE=/var/share/jdk8/bin/java ./isserver start


AddPath () {
  if [ -z "$2" ]; then
    echo $1
  else
    echo $1:$2
  fi
}

export HOME=`dirname $0`

if [ -z "${ISCOBOL}" ]
then
    D=`dirname $0`
    B=`basename $0`
    abspath="`cd \"${D}\" 2>/dev/null && pwd || echo \"${D}\"`/${B}"
    _BIN_DIR=`dirname ${abspath}`
    ISCOBOL=`dirname ${_BIN_DIR}`
fi

if [ -f "$ISCOBOL/bin/default_java.conf" ]
then
. $ISCOBOL/bin/default_java.conf
fi

export OPTS=
export JAVA_EXE=
export JAVA_OPTS=

if [ -f "$HOME/isserver.options" ]
then
   . $HOME/isserver.options
fi

if [ -n "$ISSERVER_HOME" ]; then
    HOME="$ISSERVER_HOME"
fi  

export LOG=$HOME/isserver.out
export PID_PATH_NAME=$HOME/isserver.pid


if [ -n "$ISSERVER_OPTS" ]; then
    OPTS=$ISSERVER_OPTS
fi  
if [ -n "$ISSERVER_JAVA_EXE" ]; then
    JAVA_EXE=$ISSERVER_JAVA_EXE
fi  
if [ -n "$ISSERVER_JAVA_OPTS" ]; then
    JAVA_OPTS=$ISSERVER_JAVA_OPTS
fi 
if [ -n "$ISSERVER_LOG_FILE" ]; then
    LOG=$HOME/$ISSERVER_LOG_FILE
fi 
if [ -n "$ISSERVER_PID_FILE" ]; then
    PID_PATH_NAME=$HOME/$ISSERVER_PID_FILE
fi 


if [ -z `command -v $0` ]; then 
    CURRENTDIR=`pwd`
    cd `dirname $0` > /dev/null
    SCRIPTPATH=`pwd`/
    cd $CURRENTDIR
else
    SCRIPTPATH="" 
fi


if [ -z "${ISSERVER_JAVA_EXE}" ]
then

#
# Determine the version of the JRE to use.
#
# If the variable ISCOBOL_JRE_ROOT has been set, use that, otherwise
# if ISCOBOL_JDK_ROOT is set, use that, otherwise derive the location 
# of the JRE from the version of 'java' that is on the user's path
#

 if [ -z "${ISCOBOL_JRE_ROOT}" ]
 then
   if [ -z "${ISCOBOL_JDK_ROOT}" ]
   then

    _JAVA_LOCATION=`type java | cut -f3 -d' '` 

    while [ -h "$_JAVA_LOCATION" ]; do
       ls=`ls -ld "$_JAVA_LOCATION"`
       link=`expr "$ls" : '.*-> \(.*\)$'`
       if expr "$link" : '/.*' > /dev/null; then
         _JAVA_LOCATION="$link"
       else
         _JAVA_LOCATION=`dirname "$_JAVA_LOCATION"`/"$link"
       fi
    done  

    if [ -z "$_JAVA_LOCATION" ]
    then
        echo "ERROR: Could not locate JRE. Please ensure that 'java' is"
        echo "on your PATH or set ISCOBOL_JRE_ROOT"
        exit 1
    fi

    _JRE_BINDIR=`dirname $_JAVA_LOCATION`
    ISCOBOL_JRE_ROOT=`dirname $_JRE_BINDIR`
    if [ ! -f "$ISCOBOL_JRE_ROOT/bin/java" ]
    then
        ISCOBOL_JRE_ROOT=`dirname $ISCOBOL_JRE_ROOT`
        if [ ! -f "$ISCOBOL_JRE_ROOT/bin/java" ]
        then
            echo "ERROR: Could not locate java runtime."
            echo "Please ensure that ISCOBOL_JRE_ROOT is set correctly."
            exit 1
        fi
    fi
   else
    # if ISCOBOL_JDK_ROOT is set, then use it
    ISCOBOL_JRE_ROOT=$ISCOBOL_JDK_ROOT/jre
   fi
 fi

 if [ -z "${_JRE_BINDIR}" ]
 then
   JAVA_EXE=$ISCOBOL_JRE_ROOT/bin/java
 else
   JAVA_EXE=$_JRE_BINDIR/java
 fi

else
  JAVA_EXE=$ISSERVER_JAVA_EXE
fi # endif $ISSERVER_JAVA_EXE


# Search for additional shared libraries.
if [ "`uname`" = "AIX" ]; then
  LIBPATH=`AddPath $ISCOBOL/native/lib $LIBPATH`
  export LIBPATH
elif [ "`uname`" = "HP-UX" ]; then
  SHLIB_PATH=`AddPath $ISCOBOL/native/lib $SHLIB_PATH`
  export SHLIB_PATH
elif [ "`uname`" = "Darwin" ]; then
  DYLD_LIBRARY_PATH=`AddPath $ISCOBOL/native/lib $DYLD_LIBRARY_PATH`
  export DYLD_LIBRARY_PATH
else
  LD_LIBRARY_PATH=`AddPath $ISCOBOL/native/lib $LD_LIBRARY_PATH`
  export LD_LIBRARY_PATH
fi

#
# Now set classpath and invoke isCOBOL Server
#

# Search for additional jar file libraries.

for f in $ISCOBOL/jars/*.jar
do
  if [ -z "${ISCOBOL_CLASSPATH}" ]
  then
    ISCOBOL_CLASSPATH=$f
  else
    ISCOBOL_CLASSPATH=$ISCOBOL_CLASSPATH:$f
  fi
done

for f in $ISCOBOL/lib/*.jar
do
  if [ -z "${ISCOBOL_CLASSPATH}" ]
  then
    ISCOBOL_CLASSPATH=$f
  else
    ISCOBOL_CLASSPATH=$ISCOBOL_CLASSPATH:$f
  fi
done

ISCOBOL_CLASSPATH=$ISCOBOL_CLASSPATH:$CLASSPATH

# See how we were called.
case "$1" in
    run)
        # run daemon.
        if [ ! -f $PID_PATH_NAME ] || [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
            echo "Starting isCOBOL Server using $ISCOBOL ... "
            $JAVA_EXE $JAVA_OPTS -classpath $ISCOBOL_CLASSPATH com.iscobol.as.AppServerImpl $OPTS 2>> $LOG >> $LOG &
	    if [ $? -ne 0 ]; then
               echo "command not found!"
            fi
            echo $! > $PID_PATH_NAME
            echo "isCOBOL Server started with pid $(cat $PID_PATH_NAME)"
            wait $(cat $PID_PATH_NAME)
        else
            echo "isCOBOL Server is already running with pid $(cat $PID_PATH_NAME)"
        fi
        ;;
    start)
        # Start daemon.
        if [ ! -f $PID_PATH_NAME ] || [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
            echo "Starting isCOBOL Server using $ISCOBOL ... "
            $JAVA_EXE $JAVA_OPTS -classpath $ISCOBOL_CLASSPATH com.iscobol.as.AppServerImpl $OPTS 2>> $LOG >> $LOG &
            echo $! > $PID_PATH_NAME
            echo "isCOBOL Server started with pid $(cat $PID_PATH_NAME)"
        else
            echo "isCOBOL Server is already running with pid $(cat $PID_PATH_NAME)"
        fi
        ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            echo "isCOBOL Server stopping ..."
            kill -9 $(cat $PID_PATH_NAME);
            if [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
                echo "isCOBOL Server stopped ..."
                rm $PID_PATH_NAME
            else
                echo "Stopping isCOBOL Server failed."
                exit 1
            fi
        else
            echo "isCOBOL Server is not running ..."
        fi
    ;;
    status)
        if [ -f $PID_PATH_NAME ]; then
            if [ `ps axo pid | grep "^ *$(cat $PID_PATH_NAME)$" | wc -l` -eq 0 ]; then
                rm $PID_PATH_NAME
            else
                echo "isCOBOL Server is running with pid $(cat $PID_PATH_NAME)."
            fi
        else
            echo "isCOBOL Server is not running ..."
        fi
    ;;
    restart)
        $SCRIPTPATH$0 stop
        $SCRIPTPATH$0 start
    ;;

    env)
        echo "ISCOBOL:$ISCOBOL"
        echo "HOME:$HOME"
        echo "OPTS:$OPTS"
        echo "JAVA_EXE:$JAVA_EXE"
        echo "JAVA_OPTS:$JAVA_OPTS"
        echo "LOG:$LOG"
        echo "PID:$PID_PATH_NAME"
        echo "SCRIPT:$SCRIPTPATH$0" 
    ;;

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

exit 0
