#! /bin/sh
### BEGIN INIT INFO
# Provides:          nut
# Required-Start:    $local_fs $syslog $network $remote_fs
# Required-Stop:     $local_fs $syslog $network $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Network UPS Tools initscript
# Description:       This script take care of starting and stopping the
#                    Network UPS Tools components. When needed, it also
#                    handle the UPS hardware shutdown.
### END INIT INFO

# Author: Arnaud Quette <aquette@debian.org>

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin

NAME=nut
DESC="Network UPS Tools"
DEFAULT=/etc/default/nut
CONFIG=/etc/nut/nut.conf

. /lib/lsb/init-functions

# set upsd specific options. use "man upsd" for more info
UPSD_OPTIONS=""

# set upsmon specific options. use "man upsmon" for more info
UPSMON_OPTIONS=""

# Include defaults if available (transition period)
if [ -f $DEFAULT ] ; then
	. $DEFAULT
fi

# Include NUT nut.conf
if [ -f $CONFIG ] ; then
	. $CONFIG
fi

# Explicitly require the configuration to be done in /etc/nut/nut.conf
if [ "x$MODE" = "xnone" -o -z "$MODE" ] ; then
    log_action_msg "$NAME disabled, please adjust the configuration to your needs"
    log_action_msg "Then set MODE to a suitable value in $CONFIG to enable it"
    # exit success to avoid breaking the install process!
    exit 0
fi

pid_dir=/var/run/nut
upsmon_pid=${pid_dir}/upsmon.pid
upsd_pid=${pid_dir}/upsd.pid
upsd=/sbin/upsd
upsdrvctl=/sbin/upsdrvctl
upsmon=/sbin/upsmon
log=">/dev/null 2>/dev/null"

# Check if /var/run/nut exists and has the correct perms
check_var_directory() {
	[ ! -d ${pid_dir} ] && mkdir -p ${pid_dir} \
		&& chown root:nut ${pid_dir} \
		&& chmod 770 ${pid_dir}
}

# check if the right components are running
check_status() {
  case "$MODE" in
    standalone|netserver)
      status_of_proc -p $upsd_pid   $upsd   upsd
      status_of_proc -p $upsmon_pid $upsmon upsmon
      ;;
    netclient)
      status_of_proc -p $upsmon_pid $upsmon upsmon
      ;;
    none|*)
      ;;
  esac
}

start_stop_server () {
  case "$MODE" in
    standalone|netserver)
      case "$1" in
        start)
          ! $upsdrvctl start >/dev/null 2>&1  &&  \
            log_progress_msg "(driver(s) failed)" || log_progress_msg "driver(s)"
          start-stop-daemon -S -q -p $upsd_pid -x $upsd \
	          -- $UPSD_OPTIONS >/dev/null 2>&1
          ;;
        stop)
          start-stop-daemon -K -o -q -p $upsd_pid -n upsd >/dev/null 2>&1
          ! /sbin/upsdrvctl stop >/dev/null 2>&1  &&  \
            log_progress_msg "(driver(s) failed)" || log_progress_msg "driver(s)"
          ;;
      esac
      ;;
    none|netclient|*)
      return 1
      ;;
  esac
}

start_stop_client () {
  case "$MODE" in
    standalone|netserver|netclient)
      case "$1" in
        start)
          start-stop-daemon -S -q -p $upsmon_pid -x $upsmon \
	          -- $UPSMON_OPTIONS >/dev/null 2>&1
          ;;
        stop)
          start-stop-daemon -K -o -q -p $upsmon_pid -n upsmon >/dev/null 2>&1
          ;;
      esac
      ;;
    none|*)
      return 1
      ;;
  esac
}

case "$1" in

  start)
    log_daemon_msg "Starting $DESC"
    check_var_directory
    start_stop_server start && log_progress_msg "upsd"
    start_stop_client start && log_progress_msg "upsmon"
    log_end_msg 0
    ;;

  stop)
    log_daemon_msg "Stopping $DESC"
    start_stop_server stop && log_progress_msg "upsd"
    start_stop_client stop && log_progress_msg "upsmon"
    log_end_msg 0
    ;;

  reload)
    $upsd   -c reload >/dev/null 2>&1
    $upsmon -c reload >/dev/null 2>&1
    ;;

  restart|force-reload)
    log_daemon_msg "Restarting $DESC"
    start_stop_client stop
    start_stop_server stop
    sleep 5
    check_var_directory
    start_stop_server start && log_progress_msg "upsd"
    start_stop_client start && log_progress_msg "upsmon"
    log_end_msg 0
    ;;

  status)
    #log_daemon_msg "Checking status of $DESC"
    echo "Checking status of $DESC"
    check_status
    exit $?
    ;;

  poweroff)
    flag=`sed -ne 's#^ *POWERDOWNFLAG *\(.*\)$#\1#p' /etc/nut/upsmon.conf`
    wait_delay=`sed -ne 's#^ *POWEROFF_WAIT= *\(.*\)$#\1#p' /etc/nut/nut.conf`
    if [ -f "$flag" ] ; then
      if $upsmon -K >/dev/null 2>&1 ; then
	log_daemon_msg "Shutting down the UPS ..."
	sleep 1
	if $upsdrvctl shutdown ; then
	  sleep 5
	  log_progress_msg "Waiting for UPS to cut the power"
	  log_end_msg 0
	else
	  log_progress_msg "Shutdown failed."
	  log_progress_msg "Waiting for UPS batteries to run down"
	  log_end_msg 0
	fi
	if [ "$wait_delay" ] ; then
	  log_daemon_msg " (will reboot after $wait_delay) ..."
	  sleep "$wait_delay"
	  invoke-rc.d reboot stop
	fi
      else
        log_daemon_msg "Power down flag is not set (UPS shutdown not needed)"
      fi
    else
        if [ -z "$flag" ] ; then
	  log_daemon_msg   "##########################################################"
	  log_progress_msg "## POWERDOWNFLAG is not defined in /etc/nut/upsmon.conf ##"
	  log_progress_msg "##                                                      ##"
	  log_progress_msg "## Please read the Manual page upsmon.conf(5)           ##"
	  log_progress_msg "##########################################################"
	  log_end_msg 0
    	fi
    fi
    ;;

  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|reload|restart|force-reload|status|poweroff}" >&2
    exit 1
    ;;
esac

exit 0