diff --git a/debian/icinga2-common.icinga2.init b/debian/icinga2-common.icinga2.init index 1c3821338..f64bb3b1c 100644 --- a/debian/icinga2-common.icinga2.init +++ b/debian/icinga2-common.icinga2.init @@ -40,41 +40,49 @@ SCRIPTNAME=/etc/init.d/$NAME # 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 + test -d '/var/run/icinga2' || mkdir /var/run/icinga2 + test -d '/var/run/icinga2/cmd' || mkdir /var/run/icinga2/cmd - chown nagios:nagios /var/run/icinga2 - chmod 0755 /var/run/icinga2 + chown nagios:nagios /var/run/icinga2 + chmod 0755 /var/run/icinga2 - chown nagios:www-data /var/run/icinga2/cmd - chmod 2710 /var/run/icinga2/cmd + chown nagios:www-data /var/run/icinga2/cmd + chmod 2710 /var/run/icinga2/cmd } check_config () { - if ! $DAEMON --validate -u "$DAEMON_USER" -g "$DAEMON_GROUP" -c "$DAEMON_CONFIG" >/dev/null 2>&1; then - # blark output - $DAEMON --validate -u "$DAEMON_USER" -g "$DAEMON_GROUP" -c "$DAEMON_CONFIG" - fi + $DAEMON --validate -u "$DAEMON_USER" -g "$DAEMON_GROUP" -c "$DAEMON_CONFIG" } - # # Function that starts the daemon/service # do_start() { - # 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 -- \ - -c "$DAEMON_CONFIG" -u "$DAEMON_USER" -g "$DAEMON_GROUP" -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. + # 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 -- \ + -c "$DAEMON_CONFIG" -u "$DAEMON_USER" -g "$DAEMON_GROUP" -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 -- \ + -c "$DAEMON_CONFIG" -u "$DAEMON_USER" -g "$DAEMON_GROUP" $DAEMON_ARGS \ + || return 2 } # @@ -82,110 +90,143 @@ do_start() # 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" + # 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 + # + # 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 >/dev/null 2>&1; then + echo + check_config + log_failure_msg "checking Icinga2 configuration" + exit 1 + else + log_end_msg 0 + [ -n "$DOEXITONOK" ] && exit 0 + fi } check_run case "$1" in start) - log_action_msg "checking Icinga2 configuration" - if ! check_config; then - log_failure_msg "config test failed!" - log_end_msg 1 - exit 1 - fi - - log_daemon_msg "Starting $DESC" "$NAME" - do_start - case "$?" in - 0|1) log_end_msg 0 ;; - 2) log_end_msg 1 ;; - esac - ;; + 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 - ;; + 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 "$DAEMON" "$NAME" && exit 0 || exit $? - ;; + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; reload|force-reload) - log_action_msg "checking Icinga2 configuration" - if ! check_config; then - log_failure_msg "config test failed!" - log_end_msg 1 - exit 1 - fi - - log_daemon_msg "Reloading $DESC" "$NAME" - do_reload - log_end_msg $? - ;; + do_check_config + log_daemon_msg "Reloading $DESC" "$NAME" + do_reload + log_end_msg $? + ;; restart) - log_action_msg "checking Icinga2 configuration" - if ! check_config; then - log_failure_msg "config test failed!" + 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 - exit 1 - fi - - 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 - ;; + ;; + esac + ;; + checkconfig) + do_check_config 1 + ;; *) - echo "Usage: $SCRIPTNAME {start|stop|status|reload|force-reload|restart}" >&2 - exit 3 - ;; + echo "Usage: $SCRIPTNAME {start|stop|status|reload|force-reload|restart|checkconfig|foreground}" >&2 + exit 3 + ;; esac +# vi: ts=2 sw=2 expandtab : :