#!/bin/bash

INIT_DIR="$(dirname "$0")"

is_root_user()
{
  if [ "$(id -u)" != "0" ]; then
    return 1
  else
    return 0
  fi
}

do_setlimits()
{
  ulimit -c unlimited
  ulimit -d unlimited
  ulimit -f unlimited
  ulimit -n 999999
  ulimit -v unlimited
  ulimit -l unlimited
  return 0
}


# Get a sane screen width
[ -z "${COLUMNS:-}" ] && COLUMNS=80

if [ -z "${CONSOLETYPE:-}" ]; then
  if [ -c "/dev/stderr" ]; then
    CONSOLETYPE="$(/sbin/consoletype < /dev/stderr 2>/dev/null)"
  else
    CONSOLETYPE="serial"
  fi
fi

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


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
}

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

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

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


check_process()
{
  try=0
  delay=$2
  while [ $try -lt $delay ] ; do
    if [ -e "$1" ]; then
      pid=`head -n1 $1`
      [ -d "/proc/$pid" ] && return 0
    fi
  sleep 1
  let try+=1
  done
  return 1
}

killproc()
{
  try=0
  delay=$2
  pid=0
  if [ -e "$1" ]; then
    pid=`head -n1 $1`
    [ -d "/proc/$pid" ] && kill $pid > /dev/null
  else
    return 0;
  fi

  while [ $try -lt $delay ] ; do
    [ -d "/proc/$pid" ] || return 0
    sleep 1
    let try+=1
  done

  [ -d "/proc/$pid" ] && kill -9 $pid /dev/null
  try=0
  while [ $try -lt 5 ] ; do
    [ -d "/proc/$pid" ] || return 0
    sleep 1
    let try+=1
  done
  return 1
}

assure_process_shutdown()
{
  try=0
  delay=$2
  pid=0
  if [ -e "$1" ]; then
    pid=`head -n1 $1`
  else
    return 0;
  fi

  if [ -d "/proc/$pid" ]; then
    kill $3 $pid
  fi

  while [ $try -lt $delay ] ; do
    [ -d "/proc/$pid" ] || return 0
    sleep 1
    let try+=1
  done

  if [ -d "/proc/$pid" ]; then
    kill -9 $pid
  fi

  try=0
  while [ $try -lt 5 ] ; do
    [ -d "/proc/$pid" ] || return 0
    sleep 1
    let try+=1
  done
  return 1
}

do_check_program_process()
{
  if check_process "$1" $2; then
    echo_success
    echo ""
    return 0
  else
    echo_failure
    echo ""
    return 1
  fi
}

do_assure_program_shutdown()
{
  if assure_process_shutdown "${1}" 10; then
    echo_success
    echo ""
  else
    echo_failure
    echo ""
  fi
}

do_start()
{
  if check_process ${3} 1; then
    echo "${1} Service already running."
    return 0
  fi
  
  do_setlimits

  echo -n "Starting ${1} "

  ${2} &> /dev/null
  if ! do_check_program_process ${3} 10; then
    do_stop "${1}" "${3}" "${4}"
    return 1            
  fi

  return 0
}

do_start_ignore_running()
{
  if check_process ${3} 1; then
    echo -n "Existing Process ${1} "
    echo_success
    echo ""
    return 0
  fi
  
  do_setlimits

  echo -n "Starting ${1} "

  ${2} &> /dev/null
  if ! do_check_program_process ${3} 10; then
    do_stop "${1}" "${3}" "${4}"
    return 1            
  fi

  return 0
}

do_stop()
{
  echo -n "Stopping ${1} "
  do_assure_program_shutdown ${2}

  if [ "${3}" != "" ]; then
    pid=`$INIT_DIR/pid_from_path.pl ${3}`
    if [ "$pid" != "" ]; then
      kill -9 ${pid}
    fi
  fi

  if [ -f ${2} ]; then
    rm -rf ${2}
  fi
  return 0
}

do_status()
{
  echo -n "Checking ${1} "
  if do_check_program_process ${2} 1; then
    return 0
  else
    return 1
  fi
  return 1
}


