Hi all and happy new year! I have a server minifarm at home but it's Kyiv/Ukraine so wall power goes on and off unexpectedly quite a few times a day. What I want is for servers to gracefully start when power appears and gracefully shut down when it disappears. To that end I've got some APC Back-UPS RS 1000, set up an usbhid-ups driver and upsd. upsmon configuration turned out to be too convoluted so I decided to write my own custom solution, since the protocol is fairly simple. So the daemon I wrote connects to upsd and monitors input.voltage and ups.status. BTW had to override pollinterval = 1 and pollfreq = 1 in ups.conf to make input.voltage report input voltage in more or less real-time instead of cached. The code logic is such that as soon as input.voltage goes below input.transfer.low and ups.status goes from OL to OB the farm shutdown is initiated and ups is issued INSTCMD load.off.delay command and is smart enough to shut itself down too. So far this part of the project works OK -- the farm turns itself off nicely and unattended. BUT. There seem to be lack of facility to do shutdown.return though. Still have to to that manually each time. I've attached upsc/upscmd/upsrw outputs but so far haven't figured out a combination that might do the trick. Provided my UPS can do it, of course, but why shouldn't it? From what I've read in the certain discussion on this maillist that occurred 12 years ago and from nut documentation I suspect the hope is not lost and it is possible to somehow hack in proper shutdown.return But my expertise ends here. Should anyone help me run all the debug mode magic I've read of and make good use of it, my thankfullness will have no bounds. Best regards, G. -------------- next part -------------- upsc battery.charge: 100 battery.charge.low: 10 battery.charge.warning: 50 battery.date: 2001/09/25 battery.mfr.date: 2007/07/20 battery.runtime: 105 battery.runtime.low: 120 battery.type: PbAc battery.voltage: 26.8 battery.voltage.nominal: 24.0 device.mfr: American Power Conversion device.model: Back-UPS RS 1000 device.serial: 8B0729R16742 device.type: ups driver.name: usbhid-ups driver.parameter.pollfreq: 1 driver.parameter.pollinterval: 1 driver.parameter.port: auto driver.parameter.synchronous: auto driver.version: 2.8.0-Windows-190-g9fb8d6d5f driver.version.data: APC HID 0.100 driver.version.internal: 0.49 driver.version.usb: libusb-1.0.26 (API: 0x1000109) input.sensitivity: medium input.transfer.high: 264 input.transfer.low: 194 input.transfer.reason: input voltage out of range input.voltage: 226.0 input.voltage.nominal: 230 ups.beeper.status: enabled ups.delay.shutdown: 20 ups.firmware: 7.g9a.I ups.firmware.aux: g9a ups.load: 14 ups.mfr: American Power Conversion ups.mfr.date: 2007/07/20 ups.model: Back-UPS RS 1000 ups.productid: 0002 ups.realpower.nominal: 600 ups.serial: 8B0729R16742 ups.status: OL LB ups.test.result: No test initiated ups.timer.reboot: 0 ups.timer.shutdown: -1 ups.vendorid: 051d upscmd Instant commands supported on UPS [NorkaPower]: beeper.disable - Disable the UPS beeper beeper.enable - Enable the UPS beeper beeper.mute - Temporarily mute the UPS beeper beeper.off - Obsolete (use beeper.disable or beeper.mute) beeper.on - Obsolete (use beeper.enable) load.off - Turn off the load immediately load.off.delay - Turn off the load with a delay (seconds) shutdown.reboot - Shut down the load briefly while rebooting the UPS shutdown.stop - Stop a shutdown in progress test.battery.start.deep - Start a deep battery test test.battery.start.quick - Start a quick battery test test.battery.stop - Stop the battery test test.panel.start - Start testing the UPS panel test.panel.stop - Stop a UPS panel test upsrw [battery.charge.low] Remaining battery level when UPS switches to LB (percent) Type: STRING Maximum length: 10 Value: 10 [battery.mfr.date] Battery manufacturing date Type: STRING Maximum length: 10 Value: 2007/07/20 [battery.runtime.low] Remaining battery runtime when UPS switches to LB (seconds) Type: STRING Maximum length: 10 Value: 120 [input.sensitivity] Input power sensitivity Type: STRING Maximum length: 10 Value: medium [input.transfer.high] High voltage transfer point (V) Type: STRING Maximum length: 10 Value: 264 [input.transfer.low] Low voltage transfer point (V) Type: STRING Maximum length: 10 Value: 194 [ups.delay.shutdown] Interval to wait after shutdown with delay command (seconds) Type: STRING Maximum length: 10 Value: 20
I wonder if you refer to https://nut-upsuser.alioth.debian.narkive.com/Fj636tRZ/support-of-shutdown-return-on-a-apc-back-ups-cs-500 discussion from a decade ago... Essentially, with the command you tell the UPS to cut power in X seconds from now (some may not support it at all, some may have effective minimal units e.g. some CPS use whole 30 or 60 second chunks - so asking to go down in 59 sec often means immediately in fact). This is a risky thing to request while the OS just begins a shutdown and would take indeterminate time to stop all services and unmount filesystems. Traditionally NUT "killpower" handling was injected into the end of (init/rc-script driven) shutdown routine. While the drivers and upsd were stopped as any other services, another copy of the driver is spawned in the final seconds to tell the ups to cut power (on the primary server in upsmon terms). Often this part of code also deals with a "power race condition" (on all clients) - as your systems take time to go down, wall power may return and some UPS models may refuse to continue emergency power off. Power consumers should wait "a lot" (more time than the UPS provides normally) and reboot. Nowadays systemd allows shutdown hooks for similar effect, other frameworks (e.g. SMF) might not. Anyhow these tricks may be time-limited by the framework ("we were asked to go down, so `killall -9` after X sec"). Still, wondering what was "too convoluted" with standard upsmon? What could be done better? Note recent ML discussions about `upssched` use that may allow for finer-grained reaction (but that is tangentially related and may be "convoluted" indeed). Hope this helps, Jim Klimov On Sun, Jan 1, 2023, 10:41 Gennadiy Poryev via Nut-upsuser < nut-upsuser at alioth-lists.debian.net> wrote:> Hi all and happy new year! > > I have a server minifarm at home but it's Kyiv/Ukraine so wall power > goes on and off unexpectedly quite a few times a day. What I want is for > servers to gracefully start when power appears and gracefully shut down > when it disappears. > > To that end I've got some APC Back-UPS RS 1000, set up an usbhid-ups > driver and upsd. upsmon configuration turned out to be too convoluted so > I decided to write my own custom solution, since the protocol is fairly > simple. > > So the daemon I wrote connects to upsd and monitors input.voltage and > ups.status. BTW had to override pollinterval = 1 and pollfreq = 1 in > ups.conf to make input.voltage report input voltage in more or less > real-time instead of cached. > > The code logic is such that as soon as input.voltage goes below > input.transfer.low and ups.status goes from OL to OB the farm shutdown > is initiated and ups is issued INSTCMD load.off.delay command and is > smart enough to shut itself down too. > > So far this part of the project works OK -- the farm turns itself off > nicely and unattended. > > BUT. > > There seem to be lack of facility to do shutdown.return though. Still > have to to that manually each time. > > I've attached upsc/upscmd/upsrw outputs but so far haven't figured out a > combination that might do the trick. Provided my UPS can do it, of > course, but why shouldn't it? > > From what I've read in the certain discussion on this maillist that > occurred 12 years ago and from nut documentation I suspect the hope is > not lost and it is possible to somehow hack in proper shutdown.return > > But my expertise ends here. Should anyone help me run all the debug mode > magic I've read of and make good use of it, my thankfullness will have > no bounds. > > Best regards, > > G. > _______________________________________________ > Nut-upsuser mailing list > Nut-upsuser at alioth-lists.debian.net > https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/nut-upsuser >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://alioth-lists.debian.net/pipermail/nut-upsuser/attachments/20230101/a420828b/attachment.htm>