#!/bin/bash
#

# Copyright (C) 2009, 2011, 2012 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

set -e

@SHELL_ENV_INIT@

readonly defaults_file="$SYSCONFDIR/default/ganeti"

# This is a list of all daemons and the order in which they're started. The
# order is important as there are dependencies between them. On shutdown,
# they're stopped in reverse order.
DAEMONS=(
  ganeti-noded
  ganeti-confd
  ganeti-wconfd
  ganeti-rapi
  ganeti-luxid
  ganeti-kvmd
  )

# This is the list of daemons that are loaded on demand; they should only be
# stopped, not started.
ON_DEMAND_DAEMONS=(
  ganeti-metad
  )

_mond_enabled() {
  [[ "@CUSTOM_ENABLE_MOND@" == True ]]
}

if _mond_enabled; then
  DAEMONS+=( ganeti-mond ganeti-maintd)
fi

# The full list of all daemons we know about
ALL_DAEMONS=( ${DAEMONS[@]} ${ON_DEMAND_DAEMONS[@]} )

NODED_ARGS=
CONFD_ARGS=
WCONFD_ARGS=
LUXID_ARGS=
RAPI_ARGS=
MOND_ARGS=

# Read defaults file if it exists
if [[ -s $defaults_file ]]; then
  . $defaults_file
fi

# Meant to facilitate use utilities in /etc/rc.d/init.d/functions in case
# start-stop-daemon is not available.
_ignore_error() {
  eval "$@" || :
}

_daemon_pidfile() {
  echo "$RUN_DIR/$1.pid"
}

_daemon_executable() {
  echo "@PREFIX@/sbin/$1"
}

_daemon_usergroup() {
  case "$1" in
    confd)
      echo "@GNTCONFDUSER@:@GNTCONFDGROUP@"
      ;;
    wconfd)
      echo "@GNTWCONFDUSER@:@GNTWCONFDGROUP@"
      ;;
    luxid)
      echo "@GNTLUXIDUSER@:@GNTLUXIDGROUP@"
      ;;
    rapi)
      echo "@GNTRAPIUSER@:@GNTRAPIGROUP@"
      ;;
    noded)
      echo "@GNTNODEDUSER@:@GNTNODEDGROUP@"
      ;;
    mond)
      echo "@GNTMONDUSER@:@GNTMONDGROUP@"
      ;;
    metad)
      echo "@GNTMETADUSER@:@GNTMETADGROUP@"
      ;;
    maintd)
      echo "@GNTMONDUSER@:@GNTMONDGROUP@"
      ;;
    *)
      echo "root:@GNTDAEMONSGROUP@"
      ;;
  esac
}

# Specifies the additional capabilities needed by individual daemons
_daemon_caps() {
  case "$1" in
    metad)
      echo "cap_net_bind_service=+ep"
      ;;
    *)
      echo ""
      ;;
  esac
}

# Checks whether the local machine is part of a cluster
check_config() {
  local server_pem=$DATA_DIR/server.pem
  local fname

  for fname in $server_pem; do
    if [[ ! -f $fname ]]; then
      echo "Missing configuration file $fname" >&2
      return 1
    fi
  done

  return 0
}

# Checks the exit code of a daemon
check_exitcode() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing exit code.' >&2
    return 1
  fi

  local rc="$1"; shift

  case "$rc" in
    0) ;;
    11)
      echo "not master"
    ;;
    *)
      echo "exit code $rc"
      return 1
    ;;
  esac

  return 0
}

# Checks if we should use systemctl to start/stop daemons
use_systemctl() {
  # Is systemd running as PID 1?
  [ -d /run/systemd/system ] || return 1

  type -p systemctl >/dev/null || return 1

  # Does systemd know about Ganeti at all?
  loadstate="$(systemctl show -pLoadState ganeti.target)"
  if [ "$loadstate" = "LoadState=loaded" ]; then
    return 0
  fi

  return 1
}

# Prints path to PID file for a daemon.
daemon_pidfile() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift

  _daemon_pidfile $name
}

# Prints path to daemon executable.
daemon_executable() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift

  _daemon_executable $name
}

# Prints a list of all daemons in the order in which they should be started
list_start_daemons() {
  local name

  for name in "${DAEMONS[@]}"; do
    echo "$name"
  done
}

# Prints a list of all daemons in the order in which they should be stopped
list_stop_daemons() {
  for name in "${ALL_DAEMONS[@]}"; do
    echo "$name"
  done | tac
}

# Checks whether a daemon name is known
is_daemon_name() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift

  for i in "${ALL_DAEMONS[@]}"; do
    if [[ "$i" == "$name" ]]; then
      return 0
    fi
  done

  echo "Unknown daemon name '$name'" >&2
  return 1
}

# Checks whether daemon is running
check() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift
  local pidfile=$(_daemon_pidfile $name)
  local daemonexec=$(_daemon_executable $name)

  if use_systemctl; then
    activestate="$(systemctl show -pActiveState "${name}.service")"
    if [ "$activestate" = "ActiveState=active" ]; then
      return 0
    else
      return 1
    fi
  elif type -p start-stop-daemon >/dev/null; then
    start-stop-daemon --stop --signal 0 --quiet \
      --pidfile $pidfile
  else
    _ignore_error status \
      -p $pidfile \
      $daemonexec
  fi
}

# Starts a daemon
start() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift
  # Convert daemon name to uppercase after removing "ganeti-" prefix
  local plain_name=${name#ganeti-}
  local ucname=$(tr a-z A-Z <<<$plain_name)
  local pidfile=$(_daemon_pidfile $name)
  local usergroup=$(_daemon_usergroup $plain_name)
  local daemonexec=$(_daemon_executable $name)

  if use_systemctl; then
    systemctl start "${name}.service"
    return $?
  fi

  # Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
  eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""

  @PKGLIBDIR@/ensure-dirs

  # Grant capabilities to daemons that need them
  local daemoncaps=$(_daemon_caps $plain_name)
  if [[ "$daemoncaps" != "" ]]; then
    if type -p setcap >/dev/null; then
      setcap $daemoncaps $(readlink -f $daemonexec)
    else
      echo "setcap missing, could not set capabilities for $name." >&2
      return 1
    fi
  fi

  if type -p start-stop-daemon >/dev/null; then
    start-stop-daemon --start --quiet --oknodo \
      --pidfile $pidfile \
      --startas $daemonexec \
      --chuid $usergroup \
      -- $args "$@"
  else
    # TODO: Find a way to start daemon with a group, until then the group must
    # be removed
    _ignore_error daemon \
      --pidfile $pidfile \
      --user ${usergroup%:*} \
      $daemonexec $args "$@"
  fi

}

# Stops a daemon
stop() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift
  local pidfile=$(_daemon_pidfile $name)

  if use_systemctl; then
    systemctl stop "${name}.service"
  elif type -p start-stop-daemon >/dev/null; then
    start-stop-daemon --stop --quiet --oknodo --retry 30 \
      --pidfile $pidfile
  else
    _ignore_error killproc -p $pidfile $name
  fi
}

# Starts a daemon if it's not yet running
check_and_start() {
  local name="$1"

  if ! check $name; then
    if use_systemctl; then
      echo "${name} supervised by systemd but not running, will not restart."
      return 1
    fi

    start $name
  fi
}

# Starts the master role
start_master() {
  if use_systemctl; then
    systemctl start ganeti-master.target
  else
    start ganeti-wconfd
    start ganeti-rapi
    start ganeti-luxid
  fi
}

# Stops the master role
stop_master() {
  if use_systemctl; then
    systemctl stop ganeti-master.target
  else
    stop ganeti-luxid
    stop ganeti-rapi
    stop ganeti-wconfd
  fi
}

# Start all daemons
start_all() {
  use_systemctl && systemctl start ganeti.target
  # Fall through so that we detect any errors.

  for i in $(list_start_daemons); do
    local rc=0

    # Try to start daemon
    start $i || rc=$?

    if ! errmsg=$(check_exitcode $rc); then
      echo "$errmsg" >&2
      return 1
    fi
  done

  return 0
}

# Stop all daemons
stop_all() {
  if use_systemctl; then
    systemctl stop ganeti.target
  else
    for i in $(list_stop_daemons); do
      stop $i
    done
  fi
}

# SIGHUP a process to force re-opening its logfiles
rotate_logs() {
  if [[ "$#" -lt 1 ]]; then
    echo 'Missing daemon name.' >&2
    return 1
  fi

  local name="$1"; shift
  local pidfile=$(_daemon_pidfile $name)
  local daemonexec=$(_daemon_executable $name)

  if type -p start-stop-daemon >/dev/null; then
    start-stop-daemon --stop --signal HUP --quiet \
      --oknodo --pidfile $pidfile
  else
    _ignore_error killproc \
      -p $pidfile \
      $daemonexec -HUP
  fi
}

# SIGHUP all processes
rotate_all_logs() {
  for i in $(list_stop_daemons); do
    rotate_logs $i
  done
}

# Reloads the SSH keys
reload_ssh_keys() {
  @RPL_SSH_INITD_SCRIPT@ restart
}

# Read @SYSCONFDIR@/rc.d/init.d/functions if start-stop-daemon not available
if ! type -p start-stop-daemon >/dev/null && \
   [[ -f @SYSCONFDIR@/rc.d/init.d/functions ]]; then
  _ignore_error . @SYSCONFDIR@/rc.d/init.d/functions
fi

if [[ "$#" -lt 1 ]]; then
  echo "Usage: $0 <action>" >&2
  exit 1
fi

orig_action=$1; shift

if [[ "$orig_action" == *_* ]]; then
  echo "Command must not contain underscores" >&2
  exit 1
fi

# Replace all dashes (-) with underlines (_)
action=${orig_action//-/_}

# Is it a known function?
if ! declare -F "$action" >/dev/null 2>&1; then
  echo "Unknown command: $orig_action" >&2
  exit 1
fi

# Call handler function
$action "$@"
