#! /bin/sh
### BEGIN INIT INFO
# Provides:          icinga2
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: icinga2 host/service/network monitoring and management system
# Description:       icinga2 is a monitoring and management system for hosts, services and networks.
### END INIT INFO

# Author: Alexander Wirt <formorer@debian.org>
#         Markus Frosch <markus@lazyfrosch.de>

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="icinga2 monitoring daemon"
NAME=icinga2
DAEMON=/usr/sbin/icinga2
DAEMON_CONFIG="/etc/icinga2/icinga2.conf"
DAEMON_USER=nagios
DAEMON_GROUP=nagios
DAEMON_CMDGROUP=www-data
DAEMON_ARGS="-e /var/log/icinga2/icinga2.err"
STARTUP_LOG="/var/log/icinga2/startup.log"
PIDFILE=/var/run/icinga2/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Block/ignore SIGPIPE inside Icinga2
# Workaround for a known bug in 2.6.0
# see https://dev.icinga.com/issues/13567#note-19
trap '' 13 # SIGPIPE

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

# check run directory
check_run () {
  test -d '/var/run/icinga2' || mkdir /var/run/icinga2
  test -d '/var/run/icinga2/cmd' || mkdir /var/run/icinga2/cmd

  chown "$DAEMON_USER":"$DAEMON_GROUP" /var/run/icinga2
  chmod 0755 /var/run/icinga2

  chown "$DAEMON_USER":"$DAEMON_CMDGROUP" /var/run/icinga2/cmd
  chmod 2710 /var/run/icinga2/cmd
}

check_config () {
  $DAEMON daemon --validate
}

#
# Function that starts the daemon/service
#
do_start()
{
  check_run
  # Return
  #   0 if daemon has been started
  #   1 if daemon was already running
  #   2 if daemon could not be started
  start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
    || return 1
  start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
    daemon -d $DAEMON_ARGS \
    || return 2
  # Add code here, if necessary, that waits for the process to be ready
  # to handle requests from services started subsequently which depend
  # on this one.  As a last resort, sleep for some time.
}

#
# Function that starts the daemon/service in foreground for debugging
#
do_foreground()
{
  start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test \
    || return 1
  start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -- \
    daemon $DAEMON_ARGS \
    || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
  # Return
  #   0 if daemon has been stopped
  #   1 if daemon was already stopped
  #   2 if daemon could not be stopped
  #   other if a failure occurred
  start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
  RETVAL="$?"
  [ "$RETVAL" = 2 ] && return 2
  # Wait for children to finish too if this is a daemon that forks
  # and if the daemon is only ever run from this initscript.
  # If the above conditions are not satisfied then add some other code
  # that waits for the process to drop all resources that could be
  # needed by services started subsequently.  A last resort is to
  # sleep for some time.
  start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
  [ "$?" = 2 ] && return 2
  # Many daemons don't delete their pidfiles when they exit.
  rm -f $PIDFILE
  return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
  #
  # If the daemon can reload its configuration without
  # restarting (for example, when it is sent a SIGHUP),
  # then implement that here.
  #
  start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
  return 0
}

do_check_config () {
  DOEXITONOK="$1"
  log_begin_msg "checking Icinga2 configuration"
  if ! check_config >$STARTUP_LOG 2>&1; then
    echo
    [ -n "$DOEXITONOK" ] && cat $STARTUP_LOG
    log_failure_msg "checking Icinga2 configuration. Check '$STARTUP_LOG' for details."
    exit 1
  else
    log_end_msg 0
    [ -n "$DOEXITONOK" ] && exit 0
  fi
}

case "$1" in
  start)
    do_check_config
    log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
      0|1) log_end_msg 0 ;;
      2) log_end_msg 1 ;;
    esac
    ;;
  foreground)
    do_check_config
    log_action_msg "Starting $DESC in foreground"
    status=0
    trap 'status=2;' INT # handle intr here
    for i in 1 2; do
      do_foreground || status="$?"
      case "$status" in
        0)
          log_success_msg "$NAME ended graceful"
          break
          ;;
        1)
          if [ "$i" -eq 1 ]; then
            log_warning_msg "$NAME already running!"
            log_begin_msg "Do you want to stop $NAME before going foreground? [y/N] "
            read -r question
            if [ "$question" = "y" ] || [ "$question" = "yes" ]; then
              do_stop
              continue
            fi
          fi
          log_failure_msg "$NAME already running! Please stop before starting in foreground!"
          break
          ;;
        2)
          log_failure_msg "$NAME ended"
          break
          ;;
      esac
    done
    exit $status
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1) log_end_msg 0 ;;
      2) log_end_msg 1 ;;
    esac
    ;;
  status)
    status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  reload|force-reload)
    do_check_config
    status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" || exit $?
    log_daemon_msg "Reloading $DESC" "$NAME"
    do_reload
    log_end_msg $?
    ;;
  restart)
    do_check_config
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
          0) log_end_msg 0 ;;
          1) log_end_msg 1 ;; # Old process is still running
          *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
  ;;
  checkconfig)
    do_check_config 1
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|reload|force-reload|restart|checkconfig|foreground}" >&2
    exit 3
    ;;
esac

# vi: ts=2 sw=2 expandtab :
:
