#!/bin/bash
#
# thermos-observer Starts the Thermos task observer.
#
# chkconfig:   345 55 25
# description: This script starts the Thermos task observer, which provides a WebUI for \
#              viewing the state of tasks launched by the Thermos executor.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

### BEGIN INIT INFO
# Provides: thermos-observer
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Starts the Thermos task observer.
# Description: Starts the Thermos task observer.
### END INIT INFO

# Source LSB function library.
. /lib/lsb/init-functions

exec="/usr/bin/thermos-startup"
prog="thermos-observer"
logdir="/var/log/thermos"
lockfile="/var/run/thermos-observer.lock"
pid_file="/var/run/thermos-observer.pid"
stdout_log="${logdir}/observer.log"
stderr_log="${logdir}/observer-error.log"

# Get a sane screen width
[ -z "${COLUMNS:-}" ] && COLUMNS=80
[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)"

# Read in init configuration.
if [ -z "${BOOTUP:-}" ]; then
  if [ -f /etc/sysconfig/init ]; then
    . /etc/sysconfig/init
  else
    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
  fi
  if [ "$CONSOLETYPE" = "serial" ]; then
    BOOTUP=serial
    MOVE_TO_COL=
    SETCOLOR_SUCCESS=
    SETCOLOR_FAILURE=
    SETCOLOR_WARNING=
    SETCOLOR_NORMAL=
  fi
fi

function usage {
  err "Starts the Thermos task observer."
  err "Usage: ${0} (restart|start|stop|status)"
}

function out {
  printf '%s\n' "$*";
}

function msg {
  out "$*" >&2;
}

function err {
  local x=${?};
  msg "$*";
  return $(( ${x} == 0 ? 1 : ${x} ));
}

function 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
}

function 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
}

# Parse arguments.
ACTION=${1}

# Ensures that action is.
if [ -z ${ACTION} ]; then
  err "ERROR: No action specified."
  usage
  exit -1
fi

start() {
  [ -x ${exec} ] || exit 5
  [ -f ${config} ] || exit 6
  echo -n $"Starting $prog: "
  start_daemon daemonize -o ${stdout_log} -e ${stderr_log} -p ${pid_file} ${exec}
  retval=$?
  [ $retval -eq 0 ] && (echo_success; touch $lockfile) || echo_failure
  echo
  return $retval
}

stop() {
  echo -n $"Stopping $prog: "
  killproc -p ${pid_file} ${exec}
  retval=$?
  [ $retval -eq 0 ] && (echo_success; rm -f $lockfile) || echo_failure
  echo
  return $retval
}

restart() {
  stop
  start
}

reload() {
  restart
}

force_reload() {
  restart
}

rh_status() {
  pid=$(pidofproc -p ${pid_file} ${prog})
  if [ $? -eq 0 ]; then
    echo "${prog} (pid ${pid}) is running..."
    return 0
  else
    if [ -e $lockfile ]; then
      echo "${prog} dead but lockfile exists"
      return 2
    else
      echo "${prog} is stopped"
      return 1
    fi
  fi
}

rh_status_q() {
  rh_status >/dev/null 2>&1
}

# Executes the requested daemon action.
case "${ACTION}" in
  start)
    rh_status_q && rh_status && exit 0
    start
    ;;
  stop)
    stop
    ;;
  status)
    rh_status
    ;;
  restart)
    restart
    ;;
  *)
    err "ERROR: Invalid action specified."
    usage
    exit -3
esac

exit $?
