#!/bin/sh
#
# Start-up script for the Webclient and Webclient admin
# Copyright notice: Copyright (c) 2005 - 2024 Veryant
#
# Determine the version of ISCOBOL to use.
#
# If ISCOBOL has been set by the user, use that, otherwise, determine
# the location of this script (which is known to be $ISCOBOL/bin/webclient-and-admin)
# and derive the value of $ISCOBOL from that.
#
#
# Use following variables to override default settings:
# WEBCLIENT_HOME
# WEBCLIENT_OPTS
# WEBCLIENT_JAVA_EXE
# WEBCLIENT_JAVA_OPTS
# WEBCLIENT_LOG_FILE
# WEBCLIENT_PID_FILE
# 
# for example: 
# WEBCLIENT_HOME=/home/webclient WEBCLIENT_JAVA_EXE=/var/share/jdk8/bin/java ./webclient start

start_webclient() {
    if [ -f $PID_PATH_NAME ]; then
            echo "Webclient&Admin stopping ..."
            kill -9 $(cat $PID_PATH_NAME);
            sleep 1
            if [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
                echo "Webclient&Admin stopped ..."
                rm $PID_PATH_NAME
            else
                echo "Stopping Webclient&Admin failed."
                exit 1
            fi
        else
            echo "Webclient&Admin is not running ..."
        fi

        if [ ! -f $PID_PATH_NAME ] || [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
            echo "Starting Webclient&Admin ... "
            xvfb-run $SCRIPTPATH/$0 run  &
             echo "Webclient&Admin started"
        else
            echo "Webclient&Admin is already running with pid $(cat $PID_PATH_NAME)"
        fi
}

stop_webclient() {
    if [ -f $PID_PATH_NAME ]; then
        echo "Webclient&Admin stopping ..."
        kill -9 $(cat $PID_PATH_NAME);
        sleep 1
        if [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
            echo "Webclient&Admin stopped ..."
            rm $PID_PATH_NAME
        else
            echo "Stopping Webclient&Admin failed."
            exit 1
        fi
    else
        echo "Webclient&Admin is not running ..."
    fi
}

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


HOME=$ISCOBOL/webclient

export OPTS="-jar server/webclient-jetty-launcher.jar -w webclient-server.war -j jetty.properties -serveradmin -c webclient.config -pfa admin/webclient-admin.properties -adminctx /admin -aw admin/webclient-admin-server.war"
export JAVA_EXE=
export JAVA_OPTS=-Xmx2g

if [ -f "$ISCOBOL/bin/webclient-and-admin.options" ]
then
   . $ISCOBOL/bin/webclient-and-admin.options
fi

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

export LOG=$HOME/webclient.out
export PID_PATH_NAME=$HOME/webclient.pid
 
if [ -n "$WEBCLIENT_OPTS" ]; then
    OPTS=$WEBCLIENT_OPTS
fi  
if [ -n "$WEBCLIENT_JAVA_EXE" ]; then
    JAVA_EXE=$WEBCLIENT_JAVA_EXE
fi  
if [ -n "$WEBCLIENT_JAVA_OPTS" ]; then
    JAVA_OPTS=$WEBCLIENT_JAVA_OPTS
fi 
if [ -n "$WEBCLIENT_LOG_FILE" ]; then
    LOG=$HOME/$WEBCLIENT_LOG_FILE
fi 
if [ -n "$WEBCLIENT_PID_FILE" ]; then
    PID_PATH_NAME=$HOME/$WEBCLIENT_PID_FILE
fi 

cd $HOME
SCRIPTPATH=$ISCOBOL/bin

#
# 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 "${WEBCLIENT_JAVA_EXE}" ]
then
 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=$WEBCLIENT_JAVA_EXE
fi # endif $WEBCLIENT_JAVA_EXE

if [ -z `command -v xvfb-run` ]; then
    echo "Unable to locate xvfb-run command. Please install Xvfb before starting WebClient." 
    exit 1
fi
if [ ! -z `command -v ldconfig` ]; then
    if [ `ldconfig -p | grep -i libxext.so | wc -l` -eq 0 ]; then 
        echo "Missing dependent library libXext."
        exit 1
    fi
    if [ `ldconfig -p | grep -i libxi.so | wc -l` -eq 0 ]; then
        echo "Missing dependent library libXi."
        exit 1
    fi
    if [ `ldconfig -p | grep -i libxtst.so | wc -l` -eq 0 ]; then
        echo "Missing dependent library libXtst"
        exit 1
    fi
    if [ `ldconfig -p | grep -i libxrender.so | wc -l` -eq 0 ]; then
        echo "Missing dependent library libXrender."
        exit 1
    fi
fi

# See how we were called.
case "$1" in
    run)
        # Run Webclient server- expects X Server to be running
        if [ ! -f $PID_PATH_NAME ] || [ `ps -axo pid | grep "$(cat $PID_PATH_NAME)" | wc -l` -eq 0 ]; then
            $JAVA_EXE $JAVA_OPTS $OPTS 2>> $LOG >> $LOG &
            echo $! > $PID_PATH_NAME
            wait $(cat $PID_PATH_NAME)
        else
            echo "Webclient&Admin is already running with pid $(cat $PID_PATH_NAME)"
        fi
        ;;
    start)
        # Start daemon.
        start_webclient
        ;;
    stop)
        stop_webclient
    ;;
    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 "Webclient&Admin is running with pid $(cat $PID_PATH_NAME)."
            fi
        else
            echo "Webclient&Admin is not running ..."
        fi
    ;;
    restart)
        stop_webclient
        start_webclient
    ;;
    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
