[Nut-upsdev] Proposal for technique to stop a timer at any moment

Roger Price roger at rogerprice.org
Fri Jul 1 09:44:27 UTC 2016


Dear list, I would like to propose a set of patches which make it possible 
for a upssched-cmd script to stop a timer at an arbitrary moment. If you 
find this of interest, I will submit a set of patches to 2.7.4.

Roger


Introduction
------------

The comments at the top of upssched.c say << * timers can be cancelled at any 
time before they trigger >>. It would be very useful if this were true, but 
unfortunately as Charles Lepple says in 
https://lists.alioth.debian.org/pipermail/nut-upsuser/2016-June/010177.html << 
...timers are internal to upssched, and the only way to cancel them is through 
an event listed in the configuration file. >>

A general technique for stopping timers would be very useful for those who rely 
on the script upssched-cmd to provide their system shutdown logic.

Proposal
--------

I would like to propose a set of patches which make it possible to stop a timer 
at an arbitrary moment. The technique is very general in nature: it consists of 
sending signals USR1 and USR2 to the UPS's managed by upsd. Process upsd 
remembers the signals on behalf of the UPS's and passes them to upsmon when 
polled.  Signals USR1 and USR2 extend the set of notify types known by upsmon. 
The signal events may lead to notifications and calls of upssched.  In 
upssched.conf the AT declarations are extended to include USR1 and USR2 events, 
thus allowing declarations such as

  AT SIGUSR1 * CANCEL-TIMER shutdown-timer

Such a declaration is activated in upssched-cmd with a Bash command such 
as "killall -SIGUSR1 upsd" .

Patches
-------

My patches are generated using command

  diff -rup ./nut-2.7.4 ./nut-2.7.4.dev

where nut-2.7.4 is the directory created when unzipping nut-2.7.4.tar.gz .

Documentation
-------------

I propose submitting the documentation changes as plain text editorial 
comments.

The NUT User Manual Chapter 7.2. "The advanced approach, using upssched" 
http://networkupstools.org/docs/user-manual.chunked/ar01s07.html#_the_advanced_approach_using_upssched 
is the subject of issue 293 "Improve upssched example in documentation". 
I propose an example showing how to monitor an unreliable UPS.
https://github.com/networkupstools/nut/issues/293

Debugging
---------

I find it convenient to be able to turn on/up/down/off the debugging level 
without touching the upsd process.  I do this by setting the required debugging 
depth in optional file <config-path>/NUT_DEBUG_LEVEL .  I include the required 
patch to common.c - perhaps this technique will be useful to others.

Testing
-------

The proposed patches to 2.7.4 have been tested on openSUSE 13.1 Evergreen 
long term support with an Eaton ECO 1600 and a tired MGE Ellipse 1500.

Programming style
-----------------

10 years of my career were spent programming in assembler on large process 
control systems.  I have also programmed in many high level languages such 
as APL, Algol, ML, Prolog, Erlang,.. but never in C.  However I have a 
copy of K&R, and Stevens' "Programming in the UNIX Environment", and I 
have tried as far as possible, and with the help of the NUT emacs style 
function to follow the NUT C style, although the diff program does not 
make this clear.





More information about the Nut-upsdev mailing list