#!/bin/bash

NAME=Sahara
PROG=sahara
EXEC=/usr/bin/${PROG}
CONFIGFILE=/etc/karoo.conf.d/config/sahara.cfg
PROCESS_PIDFILE=/var/run/karoo/sahara.pid
PROCESS_LOGFILE=/var/log/karoo/sahara.log
PROCESS_RUN="${EXEC} -D --pid-file ${PROCESS_PIDFILE} --sahara-config-file ${CONFIGFILE} --verbose --log-file ${PROCESS_LOGFILE} --log-level 7"
KAROO_EXEC=/usr/bin/karoo
KAROOCTL=/usr/bin/karooctl
KAROOCTLLOG=/var/log/karoo/karooctl.log

CURRENT_DIR="$(dirname "$0")"

KAROO_PIDFILE=/var/run/karoo/karoo.pid

source ${CURRENT_DIR}/init_common


is_carp_master()
{
  delay=15
  try=0

  while [ $try -lt $delay ] ; do
    $(/usr/bin/karoo --is-carp-master &> /dev/null)
    if [ "$?" = "0" ]; then
      return 0
    else
     sleep 1
     let try+=1
    fi
  done
  return 1
}

do_validate_config()
{
  echo -n $"Checking Flexi-Route"
  if ${KAROOCTL} scripts validate verbose=false; then
    echo_success
    echo ""
    return 0
  else
    echo_failure
    echo ""
    tail -20 ${KAROOCTLLOG}
    return 1
  fi
}

do_check_karoo()
{
  if ! do_validate_config; then
    return 1
  fi

  echo -n "CARP-HA "
   $(/usr/bin/karoo --is-carp-enabled &> /dev/null)
  if [ "$?" = "0" ]; then
    
    echo_yes
    echo "" 
    
    echo -n "CARP Master"
    if is_carp_master; then
      echo_yes
      echo ""
      echo -n "Starting Karoo (HA=yes)"
      if ! do_check_program_process ${KAROO_PIDFILE} 15; then
        do_stop "Karoo" ${KAROO_PIDFILE}
        return 1            
      fi
    else
      echo_no
      echo ""
    fi   
  else

    echo_none
    echo ""

    echo -e -n "Starting Karoo (HA=no)"
    if ! do_check_program_process ${KAROO_PIDFILE} 15; then
      do_stop "Karoo" ${KAROO_PIDFILE}
      return 1            
    fi
  fi
  return 0
}

do_stop_karoo()
{
  do_stop "Karoo" ${KAROO_PIDFILE}

  pid=`${CURRENT_DIR}/pid_from_path.pl ${KAROO_EXEC}`
  if [ -e "$pid" ]; then
    kill -9 ${pid}
  fi
  if [ -f ${KAROO_PIDFILE} ];then
    rm -f ${KAROO_PIDFILE} 
  fi
  return 0
}

do_restart_hard()
{
  do_stop "${NAME}" "${PROCESS_PIDFILE}" "${EXEC}"
  do_stop_karoo
  if do_start "${NAME}" "${PROCESS_RUN}" "${PROCESS_PIDFILE}" "${EXEC}"; then
    do_check_karoo
  fi
}


do_restart_karoo()
{
  $(/usr/bin/karoo --is-carp-enabled)
  if (($? > 0)); then
    echo -n ""	
  else
    $(/usr/bin/karoo --is-carp-master)
    if (($? > 0)); then
      echo "Error: You cannot restart Karoo if CARP is not master"
      return 1
    else
      echo_yes
      echo ""
    fi
  fi

  if ! do_validate_config; then
    return 1
  fi

  echo -n "Checking ${NAME} "
  if do_check_program_process ${PROCESS_PIDFILE} 1; then
    echo -n "Restarting Karoo "
    `${KAROO_EXEC} --restart`
    if ! do_check_program_process ${KAROO_PIDFILE} 10; then
      return 1
    fi
  else
    return 1
  fi
  
  return 0
}

do_status_karoo()
{
  echo -n "CARP-HA"
  $(/usr/bin/karoo --is-carp-enabled)
  if (($? > 0)); then
    echo_none
    echo ""
    if ! do_status "Karoo" "${KAROO_PIDFILE}"; then
        return 1
    fi
  else
    echo_yes
    echo ""
    
    echo -n "CARP Master "
    $(/usr/bin/karoo --is-carp-master)
    if (($? > 0)); then
      echo_no
      echo ""
    else
      echo_yes
      echo ""
      if ! do_status "Karoo" "${KAROO_PIDFILE}"; then
        return 1
      fi
    fi
  fi

  return 0
}

if ! is_root_user; then
  echo "You must run ${NAME} as root"
  exit 1 
fi

case "$1" in
  start)
    if do_start "${NAME}" "${PROCESS_RUN}" "${PROCESS_PIDFILE}" "${EXEC}"; then
      if ! do_check_karoo; then
        do_stop_karoo
        do_stop "${NAME}" "${PROCESS_PIDFILE}"
        exit 1
      fi
    else
       do_stop "${NAME}" "${PROCESS_PIDFILE}" "${EXEC}"
       exit 1
    fi
    ;;
  stop)
    do_stop "${NAME}" "${PROCESS_PIDFILE}" "${EXEC}"
    do_stop_karoo
    ;;
  restart)
    if ! do_restart_karoo; then
      exit 1
    fi
    ;;
  restart-hard)
    do_restart_hard
    ;;
  status)
    if ! do_status "${NAME}" "${PROCESS_PIDFILE}"; then
      exit 1
    fi 
    
    if ! do_status_karoo; then
      exit 1
    fi
    exit 0
  ;;
*)
echo "Usage: $0 (start|stop|restart|restart-hard|status)"
esac
exit 0