#!/bin/bash
#
# Description:  Control script for OSEE Application Server
###################################################################

echo "Start of OSEE control script"

if [ -z "$OSEE_APP_SERVER_PORT" ]; then
  OSEE_APP_SERVER_PORT=8089 
fi

if [ -z "$OSGI_TELNET_PORT" ]; then
  OSGI_TELNET_PORT=$(($OSEE_APP_SERVER_PORT+1))
fi

if [ -z "$INSTALL_PATH" ]; then
  INSTALL_PATH=$(dirname "$BASH_SOURCE")
fi

if [ -z "$OSEE_APP_SERVER_DATA" ]; then
  OSEE_APP_SERVER_DATA=$INSTALL_PATH/../osee_server_data
fi

if [ -z "$OSEE_SERVER_MAX_MEMORY" ]; then
  OSEE_SERVER_MAX_MEMORY=3G
fi

if [ -z "$LOG_BACK" ]; then
  LOG_BACK="logback/logback-config.xml"
fi

if [ -z "$USE_LOAD_BALANCER" ]; then
  USE_LOAD_BALANCER=false
fi

if [ -z "$OSEE_AUTHENTICATION_PROTOCOL" ]; then
  OSEE_AUTHENTICATION_PROTOCOL="loginId"
fi

if [ -z "$OSEE_BALANCER_GROUP" ]; then
  OSEE_BALANCER_GROUP="osee"
fi

####################################################################

EQUINOX_LAUNCHER=`ls plugins/org.eclipse.equinox.launcher_*.jar`

# Source function library.
[ -z "$JAVA_HOME" -a -x /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh

if [ -d "$JAVA_HOME" ]; then
  JAVA_EXEC=$JAVA_HOME/bin/java
else
  JAVA_EXEC=`which java`
fi

OS_NAME=`uname -s`
OS_MACHINE=`uname -n`

SERVER_ID="$OS_MACHINE"_"$OSEE_APP_SERVER_PORT"
CONFIGURATION_AREA="$INSTALL_PATH/$SERVER_ID.config"
mkdir -p "$CONFIGURATION_AREA"


LOG="$INSTALL_PATH/logs/osee_app_server_$SERVER_ID.log"
LOCK="$INSTALL_PATH/locks/osee_app_server_$SERVER_ID.lock"

OSEE_APP_SERVER_EXTRA_VMARGS="-Djavax.net.ssl.trustStore=$INSTALL_PATH/etc/keystore/lba.jks -Djavax.net.ssl.trustStorePassword=secret -Dcm.config.uri=$OSEE_SERVER_CONFIG_URI -Djava.security.egd=file:///dev/urandom -Dosee.authentication.protocol=$OSEE_AUTHENTICATION_PROTOCOL -Dosee.application.server.data=$OSEE_APP_SERVER_DATA -Dosee.check.tag.queue.on.startup=false -Dosee.proxy.bypass.enabled=true"

######################################################################
                                        
RETVAL=0

BOOTUP=color
RES_COL=3
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"

echo_success() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
  echo -n $"  OK  "
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 0
}

echo_failure() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo -n $"FAILED"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

success() {
  #if [ -z "${IN_INITLOG:-}" ]; then
  #   initlog $INITLOG_ARGS -n $0 -s "$3" -e 1
  #fi
  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
  return 0
}

# Log that something failed
failure() {
  rc=$?
  #if [ -z "${IN_INITLOG:-}" ]; then
  #   initlog $INITLOG_ARGS -n $0 -s "$3" -e 2
  #fi
  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_failure
  [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
  [ -w /var/gdm/.gdmfifo ] && echo "BOOTUP_ERRORS" > /var/gdm/.gdmfifo &
  return $rc
}

print_osee_app_server_home(){
   echo "OSEE App Server Home: [$INSTALL_PATH]"
   echo ""
}

test_app_server_alive() {
 (expect -c "
     log_user 0
     set timeout 10
     spawn telnet $OS_MACHINE $OSGI_TELNET_PORT
     expect_after eof {exit 1}
     expect \"osgi> \" {send \"disconnect\r\"}
     expect \"default=y) \" {send \"y\r\"}
     exit 0
   ")
   isAlive=$?
   if [ $isAlive -eq 0 ]; then
      isAlive="Alive"
   fi
}

pid_of_osee_app_server() {  
  pid=`netstat -tulpn | grep $OSEE_APP_SERVER_PORT | awk '{print $1}'`
}

start() {

    NMAP=$(nmap -p ${OSEE_APP_SERVER_PORT} localhost)
    if [[ $NMAP != *"closed"* ]]; then
           echo "OSEE port ${OSEE_APP_SERVER_PORT} already in use";
           exit 1
    fi
    [ -e "$LOG" ] && cnt=`wc -l "$LOG" | awk '{ print $3 }'` || cnt=1

    echo $"Starting OSEE App Server: "
    
    mkdir -p "$INSTALL_PATH"/logs
    mkdir -p "$INSTALL_PATH"/locks
    
    pid_of_osee_app_server
    if [ -n "$pid" ]; then
           echo Server already started with pid: $pid
           exit 0
    fi
    echo $OSEE_SERVER_CONFIG_URI    
    EXECUTION_CMD="$JAVA_EXEC -Xms40m -Xmx$OSEE_SERVER_MAX_MEMORY -Dorg.osgi.service.http.port=$OSEE_APP_SERVER_PORT -Dlogback.configurationFile=$LOG_BACK $OSEE_APP_SERVER_EXTRA_VMARGS -jar $EQUINOX_LAUNCHER -console $OSGI_TELNET_PORT -consoleLog $OSEE_APP_ARGS -clean>> $LOG 2>&1 &" 
    EXECUTION_CMD=${EXECUTION_CMD//Program Files/\'Program Files\'}
    echo "EXEC: $EXECUTION_CMD"> "$LOG"
   
    `eval` $EXECUTION_CMD

    pid_of_osee_app_server 
    echo pid: $pid
    RETVAL=$?
     if [ -z "$pid" ]; then
         echo Server not started for port $OSEE_APP_SERVER_PORT
       echo "[  FAILED  ]"
       elif [ $RETVAL == 0 ]; then
          echo Server started with port $OSEE_APP_SERVER_PORT and pid $pid
          echo "[  OK  ]"
       else 
          echo Server not started with port $OSEE_APP_SERVER_PORT
          echo "[ FAILED ]"   
    fi

    [ $RETVAL = 0 ] && `echo "" > "$LOCK"`
}

stop() {
    echo -n $"Stopping OSEE App Server: "

    pid_of_osee_app_server
	 echo pid: $pid
    # process still alive, try kill
    if [ -n "$pid" ]; then
 		 kill $(netstat -plten | grep $OSEE_APP_SERVER_PORT | awk -F'/' '{print $1}' | awk '{print $9}')
       RETVAL=$?
       if [ $RETVAL == 0 ]; then
         # kill successfully sent to process
         sleep 5
         pid_of_osee_app_server
         if [ -n "$pid" ]; then
            # server still alive, kill -9
             kill -9 $recheck
         fi
      fi
    fi

    rm -rf "$CONFIGURATION_AREA"
    rm -f "$LOCK"
    RETVAL=$?
    if [ $RETVAL == 0 ]; then
          echo "[  OK  ]"
    else
           echo "[FAILED]"
    fi
}

status() {
   pid_of_osee_app_server
   
   if [ -n "$pid" ]; then
       
          test_app_server_alive

         if [ "$isAlive" == "Alive" ]; then
              echo "OSEE App Server (pid $pid) is running..."
         else 
              echo "OSGI without OSEE (pid $pid) is running..."
       fi
             
   fi
  
   if [ -z "$pid" ]; then
                echo No pid found for port $OSEE_APP_SERVER_PORT                  
           else
             echo Server is running for port $OSEE_APP_SERVER_PORT
             return 0
   fi
   echo "OSEE App Server is stopped"
   return 3
}

setLoadBalancerPortEnablement () {
  if [ "$USE_LOAD_BALANCER" = true ]; then
    source $INSTALL_PATH/balancer.sh
    if [ $ACTION == "disable" ]; then
       sleep 5
    fi
  fi
}

# See how we were called.
OSEE_APP_SERVER_CMD=$1
case "$OSEE_APP_SERVER_CMD" in
  start)
    print_osee_app_server_home
    start
    if [ $RETVAL == 0 ]; then
      ACTION="enable"
      setLoadBalancerPortEnablement
    else
       echo "OSEE Application Server do not start"
    fi
    ;;
  stop)
    print_osee_app_server_home
      ACTION="disable"
      setLoadBalancerPortEnablement
    stop
    ;;
  status)
    print_osee_app_server_home
    status
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo $"Usage: {start|stop|restart|status}"
    exit 1
esac


exit $RETVAL

