if [ "x$1" = "x" -o "x$1" = "x-h" ]; then
echo "Copyright (c) 2008-2020 Synology Inc. All rights reserved."
echo "Usage: `basename $0` { online | lowbatt | nocomm | fsd }"
exit
fi
# Copyright (c) 2008-2010 Synology Inc. All rights reserved.
. /usr/syno/bin/synoupscommon
if [ "x$1" = "x" -o "x$1" = "x-h" ]; then
echo "Copyright (c) 2008-2020 Synology Inc. All rights reserved."
echo "Usage: `basename $0` { online | lowbatt | nocomm | fsd }"
exit
fi
UPSMode=`/bin/get_key_value $SYNOUPS_CONF ups_mode`
SYNOBOOTBIN="/usr/syno/bin/synobootseq"
case "${UPSMode}" in
[Ss][Nn][Mm][Pp] | [Uu][Ss][Bb])
UPSMaster=1
EnabledKey="ups_enabled"
UPSMonServer="localhost"
;;
*)
UPSMaster=0
EnabledKey="upsslave_enabled"
UPSMonServer=`/bin/get_key_value $SYNOUPS_CONF upsslave_server`
if [ "x$UPSMonServer" = "x" ]; then
UPSMonServer="localhost"
elif [ 0 -lt `echo ${UPSMonServer}|grep -c ':'` ]; then
UPSMonServer="[${UPSMonServer}]"
fi
;;
esac
UPSEnabled=`/bin/get_key_value $SYNOUPS_CONF ${EnabledKey}`
case "$UPSEnabled" in
[Yy][Ee][Ss])
;;
*)
echo "UPS is not enable."
exit
;;
esac
UPSSafeShutdown=`/bin/get_key_value $SYNOUPS_CONF ups_safeshutdown`
case "${UPSSafeShutdown}" in
[Nn][Oo])
UPSSafeShutdown=0;;
[Yy][Ee][Ss])
UPSSafeShutdown=1;;
*)
UPSSafeShutdown=0;;
esac
SynoUpsStateLog() {
local ups_log_item="device.mfr device.model battery.charge battery.runtime battery.voltage input.voltage output.voltage ups.load ups.status"
if [ $# -ge 1 ]; then
logger -p user.err -t synoups $1
fi
logger -p user.err -t synoups "=====log UPS status start====="
for item in $ups_log_item; do
local upsc_result=`${BIN_UPSC} ups@${UPSMonServer} ${item}`
logger -p user.err -t synoups "${item}=${upsc_result}"
done
logger -p user.err -t synoups "=====log UPS status end====="
}
SYSLOG() {
logger -p user.err -t upsmsg "$1"
}
UPSStatusGet() {
ups_stat=`${BIN_UPSC} ups@${UPSMonServer} ups.status 2>/dev/null`
if [ $? -ne 0 ]; then
echo "ERR"
return 255
fi
for status in $ups_stat ; do
case "$status" in
"OL"|"OB"|"LB")
echo "$status"
return
;;
esac
done
echo "ERR"
}
UPSShutdown() {
if [ $UPSMaster -ne 1 ]; then
echo "Slave waits for safe shutdown" >> $SZF_SAFEMODE
touch /var/.NormalShutdown
SYSLOG "UPS waits for safe shutdown."
return
fi
OL=0
LB=0
while [ $OL -ne 2 -a $LB -ne 2 ]; do
sleep 10
St=`UPSStatusGet`
if [ "$St" = "OL" ]; then
OL=`expr $OL + 1`
LB=0
else
LB=`expr $LB + 1`
OL=0
fi
echo "OL=$OL LB=$LB" >> $SZF_SAFEMODE
done
if [ $OL -eq 2 ]; then
synologset1 sys warn 0x11300012
echo "UPS back to On-Line and reboot." >> $SZF_SAFEMODE
/sbin/reboot
elif [ $LB -eq 2 ]; then
touch /var/.NormalShutdown
if [ $UPSSafeShutdown -eq 0 ]; then
echo "Waiting UPS exhausted." >> $SZF_SAFEMODE
SYSLOG "Waiting UPS exhausted."
else
echo "UPS safe shutdown." >> $SZF_SAFEMODE
SYSLOG "UPS safe shutdown."
shutdown_retry=0
while [ $shutdown_retry -ne 3 ]; do
StopUps
/usr/bin/upsdrvctl shutdown
if [ $? -eq 0 ]; then
return 0
fi
shutdown_retry=`expr $shutdown_retry + 1`
echo "UPS shutdown retry ... $shutdown_retry" >> $SZF_SAFEMODE
echo "UPS shutdown retry ... $shutdown_retry" > /dev/kmsg
# omron driver will reset usb (~30s) when command timeout
sleep 40
done
echo "UPS shutdown fail." >> $SZF_SAFEMODE
echo "UPS shutdown fail" > /dev/kmsg
fi
fi
}
UPSSafeMode() {
if [ -f $SZF_SAFEMODE ]; then
return
fi
$SYNOBOOTBIN --is-shutdown
if [ $? -eq 0 ]; then
SYSLOG "[UPS] System is shutting down. Ignore onbattery event."
return
fi
SYSLOG "[UPS] Check Boot Status."
$SYNOBOOTBIN --is-ready
while [ $? -ne 0 ]
do
sleep 2
$SYNOBOOTBIN --is-ready
done
St=`UPSStatusGet`
if [ "$St" = "OL" ]; then
SYSLOG "WARNING: UPS is On-Line"
return
fi
echo "$1" > $SZF_SAFEMODE
/usr/syno/bin/synologset1 sys warn 0x11300011
SYSLOG "[UPS] Server is going to Safe Mode. It will stop all services and umount all volumes."(此处与楼主的不同,不敢修改)
/usr/syno/sbin/synopoweroff -s &
}
UPSRestart() {
if [ -f $SZF_ONBATT ]; then
rm $SZF_ONBATT
if [ ! -f $SZF_SAFEMODE ]; then
/usr/syno/bin/synologset1 sys info 0x11300012
/usr/syno/bin/synonotify UPSOnAC
SYSLOG "UPS back online, not in safe mode"
fi
fi
if [ ! -f $SZF_SAFEMODE ]; then
return
fi
echo "UPS back on-line, in safe mode, so wait to reboot" >> $SZF_SAFEMODE
sleep 30
St=`UPSStatusGet`
timeout=$((3*60))
if [ "$St" = "OL" ]; then
SYSLOG "[UPS] Check Safe Mode Done."
while [ "active" != "`synosystemctl get-active-status safe-shutdown.target`" ] && [ $timeout -gt 0 ]
do
sleep 2
timeout=`expr $timeout - 2`
done
synologset1 sys warn 0x11300012
SYSLOG "UPS back to On-Line and reboot."
/sbin/reboot
fi
}
ONBatt() {
if [ ! -f $SZF_ONBATT ]; then
touch $SZF_ONBATT
SYSLOG "UPS on battery."
fi
}
UPSLowBattCheck() {
local Status=`UPSStatusGet`
if [ "$Status" = "OL" ]; then
return
fi
/usr/syno/bin/synonotify UPSPowerFail
SYSLOG "UPS battery low"
}