#!/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=@PKGLIBDIR@/daemon-util

SCRIPTNAME="@SYSCONFDIR@/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
