[Nut-upsuser] NUT 2.6.3, openSUSE 12.2 : UPS unit not switched off: Fixed

Roger Price roger at rogerprice.org
Sun Oct 28 11:48:14 UTC 2012


On Fri, 26 Oct 2012, Kris Jordan wrote:
> Did you install NUT from a package? Note, 2.6.5 is the current
> version and 2.6.4 had fixed a vulnerability.

I'm using the nut 2.6.3 package included in the openSUSE 12.2 
distribution.

> Check that your distribution's shutdown script is running 
> 'upsdrvctl shutdown' in the presence of the killpower file
> (POWERDOWNFLAG).

Summary: looks like an openSUSE bug, simple fix available.

OpenSUSE 12.2 has a script /usr/sbin/rcupsd for starting and stopping the 
upsd service. This is a link to script /etc/init.d/upsd which contains:

     powerdown)
 	## Special command: Instruct UPS to shutdown.
 	sync &
 	if grep -q '^\[' $UPS_CONFIG ; then
 	    echo -n "Instructing UPS to powerdown "
 	    $UPSDRVCTL_BIN shutdown >/dev/null 2>&1 || rc_failed
 	    rc_check
 	else
 	    echo "No local UPS defined, skipping powerdown "
 	fi
 	rc_status -v
 	;;
     try-powerdown)
 	## Special command: Instruct UPS to shutdown, if halt is running
 	## or variable UPSD_POWERDOWN_CONDITION is set and power is failing.
 	## Otherwise silently quit.
 	##
 	if test "$RUNLEVEL" = "0" -o -n "$UPSD_POWERDOWN_CONDITION" ; then
 	    if test -n "$POWERDOWNFLAG" -a -f "$POWERDOWNFLAG" ; then
 		exec $0 powerdown
 	    fi
 	fi
 	;;

where  UPSDRVCTL_BIN=/usr/lib/ups/driver/upsdrvctl

In addition, file /etc/sysconfig/shutdown contains the configuration 
parameter

   # Hook during system shutdown to run extra command
   HALT_POWERDOWN_INSERT="/etc/init.d/upsd try-powerdown"

but when upsd try-powerdown is called it fails silently because $RUNLEVEL 
and $UPSD_POWERDOWN_CONDITION are empty.  upsd powerdown is never called.

I changed the configuration parameter to 
HALT_POWERDOWN_INSERT="/etc/init.d/upsd powerdown", reran command 
SuSEconfig, and tried again but there was no change.  However typing the 
command /etc/init.d/upsd powerdown does shut down the UPS unit.

OpenSUSE 12.2 has fully embraced systemctl and systemd: I tried grepping 
around in the /lib/systemd shutdown specifications, but I cannot find any 
reference to /etc/init.d/upsd powerdown.  This is beginning to look like a 
bug in openSUSE 12.2 which I will report in their forums.

Here is a fix: There is a file /etc/init.d/halt.local which is currently 
empty:

  # /etc/init.d/halt.local
  # script with local commands to be executed from init on system shutdown
  # Here you should add things, that should happen directly before shuting
  # down.

I added the lines

  # RP 2012-10-28 Turn off the UPS unit.
  # Needed for automatic system restart when wall power returns.
  UPSDRVCTL_BIN=/usr/lib/ups/driver/upsdrvctl
  echo `date -I` `date +%T` "$0 calls $UPSDRVCTL_BIN shutdown" >> /var/log/halt.local
  $UPSDRVCTL_BIN shutdown

I pulled the plug from the wall and witnessed a server shutdown followed 
10 seconds later by a UPS shutdown.  Pushing the plug back into the wall 
got the system running again.

Roger



More information about the Nut-upsuser mailing list