#!/bin/sh
# ganeti daemons init script
#
# chkconfig: 2345 99 01
# description: Ganeti Cluster Manager
### BEGIN INIT INFO
# Provides:          ganeti
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Ganeti Cluster Manager
# Description:       Ganeti Cluster Manager
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
DESC="Ganeti cluster"

DAEMON_UTIL=/usr/lib/ganeti/daemon-util

SCRIPTNAME="/etc/init.d/ganeti"

test -f "$DAEMON_UTIL" || exit 0

if [ -r /lib/lsb/init-functions ]; then
  . /lib/lsb/init-functions
elif [ -r /etc/rc.d/init.d/functions ]; then
  . /etc/rc.d/init.d/functions
else
  echo "Unable to find init functions"
  exit 1
fi

check_exitcode() {
    RC=$1

    if errmsg=$($DAEMON_UTIL check-exitcode $RC)
    then
        log_action_end_msg 0 "$errmsg"
    else
        log_action_end_msg 1 "$errmsg"
    fi
}

start_action() {
    # called as start_action daemon-name
    local daemon="$1"
    log_action_begin_msg "$daemon"
    $DAEMON_UTIL start "$@"
    check_exitcode $?
}

stop_action() {
    # called as stop_action daemon-name
    local daemon="$1"
    log_action_begin_msg "$daemon"
    $DAEMON_UTIL stop "$@"
    check_exitcode $?
}

maybe_do() {
    requested="$1"; shift
    action="$1"; shift
    target="$1"
    if [ -z "$requested" -o "$requested" = "$target" ]; then
        $action "$@"
    fi
}

start_all() {
    if ! $DAEMON_UTIL check-config; then
        log_warning_msg "Incomplete configuration, will not run."
        exit 0
    fi

    for i in $($DAEMON_UTIL list-start-daemons); do
        maybe_do "$1" start_action $i
    done
}

stop_all() {
    for i in $($DAEMON_UTIL list-stop-daemons); do
        maybe_do "$1" stop_action $i
    done
}

status_all() {
    local daemons="$1" status ret

    if [ -z "$daemons" ]; then
      daemons=$($DAEMON_UTIL list-start-daemons)
    fi

    status=0

    for i in $daemons; do
      if status_of_proc $($DAEMON_UTIL daemon-executable $i) $i; then
          ret=0
      else
          ret=$?
          # Use exit code from first failed call
          if [ "$status" -eq 0 ]; then
              status=$ret
          fi
      fi
    done

    exit $status
}

if [ -n "$2" ] && ! errmsg=$($DAEMON_UTIL is-daemon-name "$2" 2>&1); then
    log_failure_msg "$errmsg"
    exit 1
fi

case "$1" in
    start)
        log_daemon_msg "Starting $DESC" "$2"
        start_all "$2"
        ;;
    stop)
        log_daemon_msg "Stopping $DESC" "$2"
        stop_all "$2"
        ;;
    restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$2"
        stop_all "$2"
        start_all "$2"
        ;;
    status)
        status_all "$2"
        ;;
    *)
        log_success_msg "Usage: $SCRIPTNAME {start|stop|force-reload|restart}"
        exit 1
        ;;
esac

exit 0
