- Update to version 2.7.2: For more see NEWS and UPGRADING in /usr/share/doc/packages/nut. * upsdrvctl is now installed to $prefix/sbin rather than $driverexec. This usually means moving from /bin to /sbin, apart from few exceptions. * FreeDesktop Hardware Abstraction Layer (HAL) support was removed. * This is a good time to point out that for stricter packaging systems, it may be beneficial to add "--enable-option-checking=fatal" to the ./configure command line, in order to quickly pick up any other removed option flags. Other changes: * libupsclient had undefined references related to functions of libcommon.This issue was reported on Debian (bug #731156) and is now fixed * support for new devices: + CABAC UPS-1700DV2 + Eaton Powerware 3105 + Emerson Network Power Liebert PSI 1440 + MicroDowell B.Box LP 500 + Numeric Digital 800 plus + OptiUPS VS 575C + Tripp Lite SU10KRT3/1X * nutdrv_atcl_usb: new driver for 'ATCL FOR UPS' * al175: re-introduced this driver (actually, it was in 2.7.1) * upsdrvctl now provides retry options for upsdrvctl and driver(s) * snmp-ups: add support for XPPC-MIB and Tripp Lite SU10KRT3/1X. Also fix erroneous status in HP/Compaq SNMP MIB (with the most recent HP firmware (1.76) ; improved various MIBs (APC, HP/Compaq, ...) * nutdrv_qx: add new 'fallback' Q1 subdriver, with minimal OBS-URL: https://build.opensuse.org/request/show/258925 OBS-URL: https://build.opensuse.org/package/show/hardware/nut?expand=0&rev=49
371 lines
12 KiB
Bash
371 lines
12 KiB
Bash
#! /bin/sh
|
|
# Copyright (c) 1995-2006 SUSE / Novell Inc.
|
|
# All rights reserved.
|
|
#
|
|
# Author: Frank Lemser
|
|
# Wolfgang Rosenauer, 2000-2003
|
|
# Arjen de Korte, 2006
|
|
# Stanislav Brabec, 2006
|
|
# Please send feedback to http://www.suse.de/feedback/
|
|
#
|
|
# /etc/init.d/upsd
|
|
# and its symbolic link
|
|
# /(usr/)sbin/rcupsd
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
#
|
|
# System startup script for NUT UPS daemon
|
|
#
|
|
# LSB compatible service control script; see http://www.linuxbase.org/spec/
|
|
#
|
|
### BEGIN INIT INFO
|
|
# Provides: ups
|
|
# Required-Start: $network $syslog $remote_fs
|
|
# Should-Start: $time ypbind sendmail
|
|
# Required-Stop: $network $syslog $remote_fs
|
|
# Should-Stop: $time ypbind sendmail
|
|
# Default-Start: 3 5
|
|
# Default-Stop: 0 1 2 6
|
|
# Short-Description: UPS monitoring software (deprecated, remote/local)
|
|
# Description: Network UPS Tools provides remote or local
|
|
# monitoring of UPS.
|
|
# Deprecated. Please disable this service and enable nut-monitor
|
|
# and/or nut-server systemd services instead.
|
|
### END INIT INFO
|
|
#
|
|
# Note on runlevels:
|
|
# 0 - halt/poweroff 6 - reboot
|
|
# 1 - single user 2 - multiuser without network exported
|
|
# 3 - multiuser w/ network (text mode) 5 - multiuser w/ network and X11 (xdm)
|
|
#
|
|
|
|
DRIVER_BIN=/usr/lib/ups/driver
|
|
DRIVER_RUN=/var/lib/ups
|
|
|
|
# Location of upsd.pid file:
|
|
UPSD_PID=${DRIVER_RUN}/upsd.pid
|
|
|
|
# Check for missing binaries (stale symlinks should not happen)
|
|
# Note: Special treatment of stop for LSB conformance
|
|
UPSD_BIN=/usr/sbin/upsd
|
|
UPSMON_BIN=/usr/sbin/upsmon
|
|
UPSDRVCTL_BIN=/usr/sbin/upsdrvctl
|
|
test -x $UPSD_BIN || { echo "$UPSD_BIN not installed";
|
|
if [ "$1" = "stop" ]; then exit 0;
|
|
else exit 5; fi; }
|
|
test -x $UPSMON_BIN || { echo "$UPSMON_BIN not installed";
|
|
if [ "$1" = "stop" ]; then exit 0;
|
|
else exit 5; fi; }
|
|
test -x $UPSDRVCTL_BIN || { echo "$UPSDRVCTL_BIN not installed";
|
|
if [ "$1" = "stop" ]; then exit 0;
|
|
else exit 5; fi; }
|
|
|
|
# Check for existence of needed config files
|
|
UPS_CONFIG=/etc/ups/ups.conf
|
|
UPSD_CONFIG=/etc/ups/upsd.conf
|
|
UPSMON_CONFIG=/etc/ups/upsmon.conf
|
|
test -r $UPS_CONFIG || { echo "$UPS_CONFIG not existing";
|
|
if [ "$1" = "stop" ]; then exit 0; else exit 6; fi;
|
|
}
|
|
test -r $UPSD_CONFIG || { echo "$UPSD_CONFIG not existing";
|
|
if [ "$1" = "stop" ]; then exit 0; else exit 6; fi;
|
|
}
|
|
test -r $UPSMON_CONFIG || { echo "$UPSMON_CONFIG not existing";
|
|
if [ "$1" = "stop" ]; then exit 0; else exit 6; fi;
|
|
}
|
|
# verify, that we have at least a configured monitor
|
|
grep -q '^MONITOR' $UPSMON_CONFIG || {
|
|
echo "$UPSMON_CONFIG not configured";
|
|
if [ "$1" = "stop" ]; then exit 0; else exit 6; fi;
|
|
}
|
|
# verify, that user configured ups.conf.
|
|
if grep -q '^[[:space:]][[:space:]]*driver[[:space:]]*=[[:space:]]*undefined' $UPS_CONFIG ; then
|
|
echo "$UPS_CONFIG not configured, see /usr/share/doc/packages/nut/README.SUSE";
|
|
if [ "$1" = "stop" ]; then exit 0; else exit 6; fi;
|
|
fi
|
|
|
|
# Preconfigured user ID of UPS devices.
|
|
UPSD_USER="@UPSD_USER@"
|
|
|
|
# Owner of UPS port devices (empty to skip device check):
|
|
UPS_OWNER="$UPSD_USER:root"
|
|
|
|
# If this file exists, power is failing.
|
|
POWERDOWNFLAG=$(sed -n 's/^POWERDOWNFLAG[[:space:]]*//p' </etc/ups/upsmon.conf)
|
|
|
|
# Shell functions sourced from /etc/rc.status:
|
|
# rc_check check and set local and overall rc status
|
|
# rc_status check and set local and overall rc status
|
|
# rc_status -v be verbose in local rc status and clear it afterwards
|
|
# rc_status -v -r ditto and clear both the local and overall rc status
|
|
# rc_status -s display "skipped" and exit with status 3
|
|
# rc_status -u display "unused" and exit with status 3
|
|
# rc_failed set local and overall rc status to failed
|
|
# rc_failed <num> set local and overall rc status to <num>
|
|
# rc_reset clear both the local and overall rc status
|
|
# rc_exit exit appropriate to overall rc status
|
|
# rc_active checks whether a service is activated by symlinks
|
|
. /etc/rc.status
|
|
|
|
# Reset status of this service
|
|
rc_reset
|
|
|
|
# Return values acc. to LSB for all commands but status:
|
|
# 0 - success
|
|
# 1 - generic or unspecified error
|
|
# 2 - invalid or excess argument(s)
|
|
# 3 - unimplemented feature (e.g. "reload")
|
|
# 4 - user had insufficient privileges
|
|
# 5 - program is not installed
|
|
# 6 - program is not configured
|
|
# 7 - program is not running
|
|
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
|
|
#
|
|
# Note that starting an already running service, stopping
|
|
# or restarting a not-running service as well as the restart
|
|
# with force-reload (in case signaling is not supported) are
|
|
# considered a success.
|
|
|
|
case "$1" in
|
|
start)
|
|
test -n "$POWERDOWNFLAG" && rm -f "$POWERDOWNFLAG"
|
|
if grep -q '^\[' $UPS_CONFIG ; then
|
|
# Read current user in the config:
|
|
USER=$(sed -n 's/^[[:space:]]*user[[:space:]]*=[[:space:]]*//p' < $UPS_CONFIG)
|
|
if test -n "$USER" ; then
|
|
UPS_OWNER="$USER:root"
|
|
UPSD_USER="$USER"
|
|
fi
|
|
|
|
if test -n "$UPS_OWNER" ; then
|
|
PORTS=$(sed -n 's/^[[:space:]][[:space:]]*port[[:space:]]*=[[:space:]]*//p' < $UPS_CONFIG)
|
|
## Change permissions of undetectable ports (for detectable ports it's done by udev).
|
|
for PORT in $PORTS ; do
|
|
if test -L "$PORT" ; then
|
|
PORT=$(readlink -f $PORT)
|
|
fi
|
|
case "$PORT" in
|
|
/dev/ttyS* )
|
|
chown $UPS_OWNER $PORT || { rc_failed ; rc_status -v ; rc_exit ; }
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
echo -n "Starting NUT UPS drivers "
|
|
# Do not start upsdrvctl more times.
|
|
if ! test -f /var/run/upsdrvctl ; then
|
|
## Start daemon with startproc(8). If this fails
|
|
## the return value is set appropriately by startproc.
|
|
$UPSDRVCTL_BIN start >/dev/null 2>&1 || rc_failed
|
|
# Remember status and be verbose
|
|
rc_status -v || rc_exit
|
|
touch /var/run/upsdrvctl
|
|
else
|
|
rc_status -s ; rc_reset
|
|
fi
|
|
|
|
echo -n "Starting NUT UPS server "
|
|
## Start daemon with startproc(8). If this fails
|
|
## the return value is set appropriately by startproc.
|
|
startproc -q -p $UPSD_PID $UPSD_BIN ${UPSD_USER:+-u $UPSD_USER} || {
|
|
rc=$?
|
|
$UPSDRVCTL_BIN stop >/dev/null 2>&1
|
|
rc_failed $rc
|
|
}
|
|
# Remember status and be verbose
|
|
rc_status -v || rc_exit
|
|
fi
|
|
|
|
echo -n "Starting NUT UPS monitor "
|
|
## Start daemon with startproc(8). If this fails
|
|
## the return value is set appropriately by startproc.
|
|
/sbin/startproc -q $UPSMON_BIN
|
|
|
|
# Remember status and be verbose
|
|
rc_status -v
|
|
;;
|
|
stop)
|
|
echo -n "Shutting down NUT UPS monitor "
|
|
## Stop daemon with killproc(8) and if this fails
|
|
## killproc sets the return value according to LSB.
|
|
/sbin/killproc -TERM $UPSMON_BIN
|
|
# Remember status and be verbose
|
|
rc_status -v
|
|
|
|
echo -n "Shutting down NUT UPS server "
|
|
## Stop daemon with killproc(8) and if this fails
|
|
## killproc sets the return value according to LSB.
|
|
killproc -TERM -p $UPSD_PID $UPSD_BIN
|
|
# Remember status and be verbose
|
|
rc_status -v
|
|
|
|
# NOTE: Command should return OK, if no drivers are running.
|
|
# WARNING: There is no chance to stop daemons after ups.conf change!
|
|
# (except of some sort of find for pid's in ${DRIVER_RUN} dir )
|
|
echo -n "Shutting down NUT UPS drivers"
|
|
$UPSDRVCTL_BIN stop >/dev/null 2>&1 || :
|
|
# Remember status and be verbose
|
|
FAILED=true
|
|
for (( n=0 ; n<10 ; n++ )) ; do
|
|
if ! pgrep >/dev/null -f /usr/lib/ups/driver ; then
|
|
echo -n " "
|
|
FAILED=false
|
|
break
|
|
fi
|
|
sleep 1
|
|
echo -n "."
|
|
done
|
|
if $FAILED ; then
|
|
# Try again with pkill. Maybe configuration was changed.
|
|
# Drivers are not properly terminated after configuration
|
|
# change.
|
|
for (( n=0 ; n<10 ; n++ )) ; do
|
|
if ! pkill -TERM >/dev/null -f /usr/lib/ups/driver ; then
|
|
echo -n " "
|
|
FAILED=false
|
|
break
|
|
fi
|
|
sleep 1
|
|
echo -n "."
|
|
done
|
|
fi
|
|
if $FAILED ; then
|
|
rc_failed
|
|
fi
|
|
rm -f /var/run/upsdrvctl
|
|
rc_status -v
|
|
;;
|
|
try-restart|condrestart)
|
|
## Do a restart only if the service was active before.
|
|
## Note: try-restart is now part of LSB (as of 1.9).
|
|
## RH has a similar command named condrestart.
|
|
if test "$1" = "condrestart"; then
|
|
echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
|
|
fi
|
|
$0 status
|
|
if test $? = 0; then
|
|
$0 restart
|
|
else
|
|
rc_reset # Not running is not a failure.
|
|
fi
|
|
# Remember status and be quiet
|
|
rc_status
|
|
;;
|
|
restart)
|
|
## Stop the service and regardless of whether it was
|
|
## running or not, start it again.
|
|
$0 stop
|
|
$0 start
|
|
|
|
# Remember status and be quiet
|
|
rc_status
|
|
;;
|
|
force-reload)
|
|
## Signal the daemon to reload its config. Most daemons
|
|
## do this on signal 1 (SIGHUP).
|
|
echo -n "Reload service NUT UPS "
|
|
## if it supports it:
|
|
$UPSDRVCTL_BIN stop >/dev/null 2>&1 || :
|
|
$UPSDRVCTL_BIN start >/dev/null 2>&1 || :
|
|
/sbin/killproc -HUP -p $UPSD_PID $UPSD_BIN
|
|
/sbin/killproc -HUP $UPSMON_BIN
|
|
rc_status -v
|
|
;;
|
|
reload)
|
|
## Signal the daemon to reload its config. Most daemons
|
|
## do this on signal 1 (SIGHUP).
|
|
# WARNING: upsdrvctl does not support reload!
|
|
# Use force-reload unstead.
|
|
echo -n "Reload service NUT UPS (excluding upsdrvctl) "
|
|
## if it supports it:
|
|
/sbin/killproc -HUP -p $UPSD_PID $UPSD_BIN
|
|
/sbin/killproc -HUP $UPSMON_BIN
|
|
rc_status -v
|
|
;;
|
|
status)
|
|
## Check status with checkproc(8), if process is running
|
|
## checkproc will return with exit status 0.
|
|
|
|
# Return value is slightly different for the status command:
|
|
# 0 - service up and running
|
|
# 1 - service dead, but /var/run/ pid file exists
|
|
# 2 - service dead, but /var/lock/ lock file exists
|
|
# 3 - service not running (unused)
|
|
# 4 - service status unknown :-(
|
|
# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
|
|
|
|
# NOTE: checkproc returns LSB compliant status values.
|
|
# NOTE: rc_status knows that we called this init script with
|
|
# "status" option and adapts its messages accordingly.
|
|
|
|
echo -n "Checking for service NUT UPS server "
|
|
/sbin/checkproc -p $UPSD_PID $UPSD_BIN
|
|
# show & reset status - we need the status from monitor for
|
|
# try-restart in case that only the monitor is running.
|
|
rc_status -v -r
|
|
|
|
echo -n "Checking for service NUT UPS monitor "
|
|
/sbin/checkproc $UPSMON_BIN
|
|
rc_status -v
|
|
;;
|
|
probe)
|
|
## Optional: Probe for the necessity of a reload, print out the
|
|
## argument to this init script which is required for a reload.
|
|
## Note: probe is not (yet) part of LSB (as of 1.9)
|
|
if test -f $UPSD_PID && test $UPS_CONFIG -nt $UPSD_PID ; then
|
|
echo reload
|
|
elif test -f $UPSD_PID && test $UPSD_CONFIG -nt $UPSD_PID ; then
|
|
echo reload
|
|
elif test -f $UPSD_PID && test /etc/ups/upsd.users -nt $UPSD_PID ; then
|
|
echo reload
|
|
elif test -f /var/run/upsmon.pid && test $UPS_CONFIG -nt /var/run/upsmon.pid ; then
|
|
echo reload
|
|
elif test -f /var/run/upsmon.pid && test $UPSMON_CONFIG -nt /var/run/upsmon.pid ; then
|
|
echo reload
|
|
elif test -f /var/run/upsmon.pid && test /etc/ups/upsd.users -nt /var/run/upsmon.pid ; then
|
|
echo reload
|
|
fi
|
|
;;
|
|
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
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe|powerdown|try-powerdown}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
rc_exit
|