#!/bin/sh
# chkconfig:         2345 75 15
# description:       blbankingweb
### BEGIN INIT INFO
# Provides:          blbankingweb
# Required-Start:    $local_fs $network $remote_fs $syslog $time
# Required-Stop:     $local_fs $network $remote_fs $syslog $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: BL Banking Web
### END INIT INFO

# Uncomment the following line to override the JVM search sequence
# INSTALL4J_JAVA_HOME_OVERRIDE=
# Uncomment the following line to add additional VM parameters
# INSTALL4J_ADD_VM_PARAMS=


INSTALL4J_JAVA_PREFIX=""
GREP_OPTIONS=""

fill_version_numbers() {
  if [ "$ver_major" = "" ]; then
    ver_major=0
  fi
  if [ "$ver_minor" = "" ]; then
    ver_minor=0
  fi
  if [ "$ver_micro" = "" ]; then
    ver_micro=0
  fi
  if [ "$ver_patch" = "" ]; then
    ver_patch=0
  fi
}

read_db_entry() {
  if [ -n "$INSTALL4J_NO_DB" ]; then
    return 1
  fi
  if [ ! -f "$db_file" ]; then
    return 1
  fi
  if [ ! -x "$java_exc" ]; then
    return 1
  fi
  found=1
  exec 7< $db_file
  while read r_type r_dir r_ver_major r_ver_minor r_ver_micro r_ver_patch r_ver_vendor<&7; do
    if [ "$r_type" = "JRE_VERSION" ]; then
      if [ "$r_dir" = "$test_dir" ]; then
        ver_major=$r_ver_major
        ver_minor=$r_ver_minor
        ver_micro=$r_ver_micro
        ver_patch=$r_ver_patch
        fill_version_numbers
      fi
    elif [ "$r_type" = "JRE_INFO" ]; then
      if [ "$r_dir" = "$test_dir" ]; then
        is_64bit=$r_ver_micro
        if [ "W$r_ver_minor" = "W$modification_date" ] && [ "W$is_64bit" != "W" ]; then
          found=0
          break
        fi
      fi
    fi
    r_ver_micro=""
  done
  exec 7<&-

  return $found
}

create_db_entry() {
  tested_jvm=true
  version_output=`"$bin_dir/java" $1 -version 2>&1`
  is_gcj=`expr "$version_output" : '.*gcj'`
  is_64bit=`expr "$version_output" : '.*64-Bit\|.*amd64'`
  if [ "$is_gcj" = "0" ]; then
    java_version=`expr "$version_output" : '.*"\(.*\)".*'`
    ver_major=`expr "$java_version" : '\([0-9][0-9]*\).*'`
    ver_minor=`expr "$java_version" : '[0-9][0-9]*\.\([0-9][0-9]*\).*'`
    ver_micro=`expr "$java_version" : '[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*'`
    ver_patch=`expr "$java_version" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*[\._]\([0-9][0-9]*\).*'`
  fi
  fill_version_numbers
  if [ -n "$INSTALL4J_NO_DB" ]; then
    return
  fi
  db_new_file=${db_file}_new
  if [ -f "$db_file" ]; then
    awk '$2 != "'"$test_dir"'" {print $0}' $db_file > $db_new_file
    cp "$db_new_file" "$db_file"
    rm "$db_new_file" 2> /dev/null
  fi
  dir_escaped=`echo "$test_dir" | sed -e 's/ /\\\\ /g'`
  echo "JRE_VERSION	$dir_escaped	$ver_major	$ver_minor	$ver_micro	$ver_patch" >> $db_file
  echo "JRE_INFO	$dir_escaped	1	$modification_date	$is_64bit" >> $db_file
  chmod g+w $db_file
}

check_date_output() {
  if [ -n "$date_output" -a $date_output -eq $date_output 2> /dev/null ]; then
    modification_date=$date_output
  fi
}

test_jvm() {
  tested_jvm=na
  test_dir=$1
  bin_dir=$test_dir/bin
  java_exc=$bin_dir/java
  if [ -z "$test_dir" ] || [ ! -d "$bin_dir" ] || [ ! -f "$java_exc" ] || [ ! -x "$java_exc" ]; then
    return
  fi

  modification_date=0
  date_output=`date -r "$java_exc" "+%s" 2>/dev/null`
  if [ $? -eq 0 ]; then
    check_date_output
  fi
  if [ $modification_date -eq 0 ]; then
    stat_path=`command -v stat 2> /dev/null`
    if [ "$?" -ne "0" ] || [ "W$stat_path" = "W" ]; then
      stat_path=`which stat 2> /dev/null`
      if [ "$?" -ne "0" ]; then
        stat_path=""
      fi
    fi
    if [ -f "$stat_path" ]; then
      date_output=`stat -f "%m" "$java_exc" 2>/dev/null`
      if [ $? -eq 0 ]; then
        check_date_output
      fi
      if [ $modification_date -eq 0 ]; then
        date_output=`stat -c "%Y" "$java_exc" 2>/dev/null`
        if [ $? -eq 0 ]; then
          check_date_output
        fi
      fi
    fi
  fi

  tested_jvm=false
  read_db_entry || create_db_entry $2

  if [ "$ver_major" = "" ]; then
    return;
  fi
  if [ "$ver_major" -lt "1" ]; then
    return;
  elif [ "$ver_major" -eq "1" ]; then
    if [ "$ver_minor" -lt "8" ]; then
      return;
    fi
  fi

  if [ "$ver_major" = "" ]; then
    return;
  fi
  if [ "$ver_major" -gt "21" ]; then
    return;
  fi

  app_java_home=$test_dir
}

add_class_path() {
  if [ -n "$1" ] && [ `expr "$1" : '.*\*'` -eq "0" ]; then
    local_classpath="$local_classpath${local_classpath:+:}${1}${2}"
  fi
}


read_vmoptions() {
  vmoptions_file=`eval echo "$1" 2>/dev/null`
  if [ ! -r "$vmoptions_file" ]; then
    vmoptions_file="$prg_dir/$vmoptions_file"
  fi
  if [ -r "$vmoptions_file" ] && [ -f "$vmoptions_file" ]; then
    exec 8< "$vmoptions_file"
    while read cur_option<&8; do
      is_comment=`expr "W$cur_option" : 'W *#.*'`
      if [ "$is_comment" = "0" ]; then 
        vmo_classpath=`expr "W$cur_option" : 'W *-classpath \(.*\)'`
        vmo_classpath_a=`expr "W$cur_option" : 'W *-classpath/a \(.*\)'`
        vmo_classpath_p=`expr "W$cur_option" : 'W *-classpath/p \(.*\)'`
        vmo_include=`expr "W$cur_option" : 'W *-include-options \(.*\)'`
        if [ ! "W$vmo_include" = "W" ]; then
            if [ "W$vmo_include_1" = "W" ]; then
              vmo_include_1="$vmo_include"
            elif [ "W$vmo_include_2" = "W" ]; then
              vmo_include_2="$vmo_include"
            elif [ "W$vmo_include_3" = "W" ]; then
              vmo_include_3="$vmo_include"
            fi
        fi
        if [ ! "$vmo_classpath" = "" ]; then
          local_classpath="$i4j_classpath:$vmo_classpath"
        elif [ ! "$vmo_classpath_a" = "" ]; then
          local_classpath="${local_classpath}:${vmo_classpath_a}"
        elif [ ! "$vmo_classpath_p" = "" ]; then
          local_classpath="${vmo_classpath_p}:${local_classpath}"
        elif [ "W$vmo_include" = "W" ]; then
          needs_quotes=`expr "W$cur_option" : 'W.* .*'`
          if [ "$needs_quotes" = "0" ]; then 
            vmoptions_val="$vmoptions_val $cur_option"
          else
            if [ "W$vmov_1" = "W" ]; then
              vmov_1="$cur_option"
            elif [ "W$vmov_2" = "W" ]; then
              vmov_2="$cur_option"
            elif [ "W$vmov_3" = "W" ]; then
              vmov_3="$cur_option"
            elif [ "W$vmov_4" = "W" ]; then
              vmov_4="$cur_option"
            elif [ "W$vmov_5" = "W" ]; then
              vmov_5="$cur_option"
            fi
          fi
        fi
      fi
    done
    exec 8<&-
    if [ ! "W$vmo_include_1" = "W" ]; then
      vmo_include="$vmo_include_1"
      unset vmo_include_1
      read_vmoptions "$vmo_include"
    fi
    if [ ! "W$vmo_include_2" = "W" ]; then
      vmo_include="$vmo_include_2"
      unset vmo_include_2
      read_vmoptions "$vmo_include"
    fi
    if [ ! "W$vmo_include_3" = "W" ]; then
      vmo_include="$vmo_include_3"
      unset vmo_include_3
      read_vmoptions "$vmo_include"
    fi
  fi
}


unpack_file() {
  if [ -f "$1" ]; then
    jar_file=`echo "$1" | awk '{ print substr($0,1,length($0)-5) }'`
    bin/unpack200 -r "$1" "$jar_file" > /dev/null 2>&1

    if [ $? -ne 0 ]; then
      echo "Error unpacking jar files. The architecture or bitness (32/64)"
      echo "of the bundled JVM might not match your machine."
      echo "You might also need administrative privileges for this operation."
      exit 1
    else
      chmod a+r "$jar_file"
    fi
  fi
}

run_unpack200() {
  if [ -d "$1/lib" ]; then
    old_pwd200=`pwd`
    cd "$1"
    for pack_file in lib/*.jar.pack
    do
      unpack_file $pack_file
    done
    for pack_file in lib/ext/*.jar.pack
    do
      unpack_file $pack_file
    done
    cd "$old_pwd200"
  fi
}

search_jre() {
if [ -z "$app_java_home" ]; then
  test_jvm "$INSTALL4J_JAVA_HOME_OVERRIDE"
fi

if [ -z "$app_java_home" ]; then
if [ -f "$app_home/.install4j/pref_jre.cfg" ]; then
    read file_jvm_home < "$app_home/.install4j/pref_jre.cfg"
    test_jvm "$file_jvm_home"
    if [ -z "$app_java_home" ] && [ $tested_jvm = "false" ]; then
if [ -w "$db_file" ]; then
  /bin/sh -c ': > "$db_file"' 2> /dev/null
fi
        test_jvm "$file_jvm_home"
    fi
fi
fi

if [ -z "$app_java_home" ]; then
  test_jvm "$app_home/jre" 
  if [ -z "$app_java_home" ] && [ $tested_jvm = "false" ]; then
if [ -w "$db_file" ]; then
  /bin/sh -c ': > "$db_file"' 2> /dev/null
fi
    test_jvm "$app_home/jre"
  fi
fi

if [ -z "$app_java_home" ]; then
  test_jvm "$app_home/.install4j/jre.bundle/Contents/Home" 
  if [ -z "$app_java_home" ] && [ $tested_jvm = "false" ]; then
if [ -w "$db_file" ]; then
  /bin/sh -c ': > "$db_file"' 2> /dev/null
fi
    test_jvm "$app_home/.install4j/jre.bundle/Contents/Home"
  fi
fi

if [ -z "$app_java_home" ]; then
  if [ "W$INSTALL4J_NO_PATH" != "Wtrue" ]; then
    prg_jvm=`command -v java 2> /dev/null`
    if [ "$?" -ne "0" ] || [ "W$prg_jvm" = "W" ]; then
      prg_jvm=`which java 2> /dev/null`
      if [ "$?" -ne "0" ]; then
        prg_jvm=""
      fi
    fi
    if [ ! -z "$prg_jvm" ] && [ -f "$prg_jvm" ]; then
      old_pwd_jvm=`pwd`
      path_java_bin=`dirname "$prg_jvm"`
      cd "$path_java_bin"
      prg_jvm=java

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


if [ -z "$app_java_home" ]; then
  common_jvm_locations=" /usr/bin/java* /usr/bin/jdk* /usr/bin/jre* /usr/bin/j2*re* /usr/bin/j2sdk* /usr/java* /usr/java*/jre /usr/jdk* /usr/jre* /usr/j2*re* /usr/j2sdk* /usr/java/j2*re* /usr/java/j2sdk* /opt/java* /usr/java/jdk* /usr/java/jre* /usr/lib/java/jre /usr/local/java* /usr/local/jdk* /usr/local/jre* /usr/local/j2*re* /usr/local/j2sdk* /usr/jdk/java* /usr/jdk/jdk* /usr/jdk/jre* /usr/jdk/j2*re* /usr/jdk/j2sdk* /usr/lib/jvm/* /usr/lib/java* /usr/lib/jdk* /usr/lib/jre* /usr/lib/j2*re* /usr/lib/j2sdk* /System/Library/Frameworks/JavaVM.framework/Versions/1.?/Home /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home /Library/Java/JavaVirtualMachines/*.jdk/Contents/Home/jre /Library/Java/JavaVirtualMachines/*.jre/Contents/Home /Library/Java/JavaVirtualMachines/*.jdk/Contents/Home"
  for current_location in $common_jvm_locations
  do
if [ -z "$app_java_home" ]; then
  test_jvm "$current_location"
fi

  done
fi

if [ -z "$app_java_home" ]; then
  test_jvm "$JAVA_HOME"
fi

if [ -z "$app_java_home" ]; then
  test_jvm "$JDK_HOME"
fi

if [ -z "$app_java_home" ]; then
  test_jvm "$INSTALL4J_JAVA_HOME"
fi

if [ -z "$app_java_home" ]; then
if [ -f "$app_home/.install4j/inst_jre.cfg" ]; then
    read file_jvm_home < "$app_home/.install4j/inst_jre.cfg"
    test_jvm "$file_jvm_home"
    if [ -z "$app_java_home" ] && [ $tested_jvm = "false" ]; then
if [ -w "$db_file" ]; then
  /bin/sh -c ': > "$db_file"' 2> /dev/null
fi
        test_jvm "$file_jvm_home"
    fi
fi
fi

}

old_pwd=`pwd`

progname=`basename "$0"`
linkdir=`dirname "$0"`

cd "$linkdir"
prg="$progname"

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

prg_dir=`dirname "$prg"`
progname=`basename "$prg"`
cd "$prg_dir"
prg_dir=`pwd`
app_home=../
cd "$app_home"
app_home=`pwd`
bundled_jre_home="$app_home/jre"

cd "$prg_dir"/..

cache_home="$XDG_CACHE_HOME"
if [ "W$cache_home" = "W" ]; then
  cache_home="$HOME/.cache"
fi
db_home="$cache_home/install4j"
mkdir -p "$db_home" > /dev/null 2>&1
db_file="$db_home/jre_version"
if [ ! -w "$db_home" ]; then
  db_home=/tmp
  db_file="$db_home/install4j_jre_version_$USER"
fi
if [ -d "$db_file" ] || ([ -f "$db_file" ] && [ ! -r "$db_file" ]) || ([ -f "$db_file" ] && [ ! -w "$db_file" ]); then
  db_file="${db_file}.2"
fi
if [ ! "__i4j_lang_restart" = "$1" ] && [ ! "__i4j_auth_restart" = "$1" ]; then
run_unpack200 "$bundled_jre_home"
run_unpack200 "$bundled_jre_home/jre"
fi
search_jre
if [ -z "$app_java_home" ]; then
if [ -w "$db_file" ]; then
  /bin/sh -c ': > "$db_file"' 2> /dev/null
fi
  search_jre
fi
if [ -z "$app_java_home" ]; then
  echo "No suitable Java Virtual Machine could be found on your system."
  echo The version of the JVM must be at least 1.8 and at most 21.
  echo Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
  exit 83
fi


local_classpath=""
i4j_classpath="$app_home/.install4j/i4jruntime.jar:$app_home/.install4j/launcherbca35147.jar"
add_class_path "$i4j_classpath"
  add_class_path "$app_home/lib" "/*"
add_class_path "$app_home/conf"

vmoptions_val=""
read_vmoptions "$prg_dir/$progname.vmoptions"
INSTALL4J_ADD_VM_PARAMS="$INSTALL4J_ADD_VM_PARAMS $vmoptions_val"

for param in $@; do
  if [ `echo "W$param" | cut -c -3` = "W-J" ]; then
    INSTALL4J_ADD_VM_PARAMS="$INSTALL4J_ADD_VM_PARAMS `echo "$param" | cut -c 3-`"
  fi
done


has_space_options=false
if [ "W$vmov_1" = "W" ]; then
  vmov_1="-Di4jv=0"
else
  has_space_options=true
fi
if [ "W$vmov_2" = "W" ]; then
  vmov_2="-Di4jv=0"
else
  has_space_options=true
fi
if [ "W$vmov_3" = "W" ]; then
  vmov_3="-Di4jv=0"
else
  has_space_options=true
fi
if [ "W$vmov_4" = "W" ]; then
  vmov_4="-Di4jv=0"
else
  has_space_options=true
fi
if [ "W$vmov_5" = "W" ]; then
  vmov_5="-Di4jv=0"
else
  has_space_options=true
fi

return_code=0
case "$1" in
    start)
        echo "Starting blbankingweb"

if [ "$has_space_options" = "true" ]; then
$INSTALL4J_JAVA_PREFIX nohup "$app_java_home/bin/java" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start  > /dev/null 2>&1 &
return_code=$?
else
$INSTALL4J_JAVA_PREFIX nohup "$app_java_home/bin/java" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start  > /dev/null 2>&1 &
return_code=$?
fi


    ;;
    start-launchd)
        echo "Starting blbankingweb"

if [ "$has_space_options" = "true" ]; then
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start 
return_code=$?
else
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start 
return_code=$?
fi


    ;;
    stop)
        echo "Shutting down blbankingweb"

$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" -classpath "$local_classpath" install4j.play.core.server.ProdServerStart stop
return_code=$?


    ;;
    restart|force-reload)
        echo "Shutting down blbankingweb"

$INSTALL4J_JAVA_PREFIX "$app_java_home/bin/java" -classpath "$local_classpath" install4j.play.core.server.ProdServerStart stop
return_code=$?


        echo "Restarting blbankingweb"

if [ "$has_space_options" = "true" ]; then
$INSTALL4J_JAVA_PREFIX nohup "$app_java_home/bin/java" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start  > /dev/null 2>&1 &
return_code=$?
else
$INSTALL4J_JAVA_PREFIX nohup "$app_java_home/bin/java" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart start  > /dev/null 2>&1 &
return_code=$?
fi


    ;;
    status)

$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" -classpath "$local_classpath" install4j.play.core.server.ProdServerStart status
return_code=$?


    ;;
    run)

if [ "$has_space_options" = "true" ]; then
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart run 
return_code=$?
else
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart run 
return_code=$?
fi


    ;;
    run-redirect)

if [ "$has_space_options" = "true" ]; then
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart run-redirect 
return_code=$?
else
$INSTALL4J_JAVA_PREFIX exec "$app_java_home/bin/java" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" install4j.play.core.server.ProdServerStart run-redirect 
return_code=$?
fi


    ;;
    *)
        echo "Usage: $0 {start|stop|run|run-redirect|status|restart|force-reload}"
        exit 1
    ;;
esac

exit $return_code
