2. Very detailed Change Log

This document intends to detail the change log for relatively recent work (roughly since the source code was tracked in Git).

Note

This change log section represents git commits in range v2.8.4..HEAD (commits 541c2ecf0..bf64358b6).

2.1. 2026-03-02 Jim Klimov <jimklimov+nut@gmail.com>

  • server/netssl.c: revise comments/indentations of #ifdef et al, and coding style [#3328]
  • conf/upsstats-modern-single.html.sample.in, docs/nut.dict: complete the CSS/JS graph auto-adjustment to voltage/temperature scales [#3318]
  • clients/upsstats.c, docs/man/upsstats.html.txt: add support for @IFEQ upsstats.use_celsius (0\|1)@ [#3318]

2.2. 2026-02-28 Jim Klimov <jimklimov+nut@gmail.com>

  • include/common.h: indent #ifdef contents
  • docs/config-prereqs.txt: add a reason for "fightwarn" branch mention

2.3. 2026-02-26 Owen Li <admin@iloli.ch>

  • drivers/apcsmart.c: quick change to make codescan happy

2.4. 2026-02-26 Jim Klimov <jimklimov+nut@gmail.com>

  • conf/upsd.conf.sample, docs/security.txt: fix typos
  • data/driver.list.in: Moved new Accurat entry aplhanumerically, fenced by blank lines [#3323]

2.5. 2026-02-25 Owen Li <admin@iloli.ch>

  • drivers/apcsmart.c, drivers/apcsmart_tabs.c, drivers/apcsmart_tabs.h: Update for versioning and author info
  • drivers/apcsmart.c, drivers/apcsmart_tabs.c, drivers/apcsmart_tabs.h: Add support for dual-byte command

2.6. 2026-02-25 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsclient.c: revise comments/indentations of #ifdef et al [#3328]
  • clients/upsstats.c: introduce DEFAULT_TEMPLATE_SINGLE\+DEFAULT_TEMPLATE_LIST macros for a single point of config [#3316]
  • docs/download.txt: NUT for Windows builds: note about compressing the unpacked location
  • docs/download.txt: NUT for Windows builds: note about the unpacked location (any)

2.7. 2026-02-14 lvl47 <43710193+lvl47@users.noreply.github.com>

  • data/driver.list.in: Update data/driver.list.in: add Accurat Flux 850 (Richcomm V2.0) Add Accurat Flux 850 (850VA/510W) to the Hardware Compatibility List. This Line-Interactive UPS uses the Richcomm V2.0 chipset (USB ID 0925:1234) and works with nutdrv_qx using the armac subdriver and megatec protocol. Requires NUT >= 2.8.2 (armac subdriver incomplete in 2.8.0). Accurat is a brand of batterium GmbH (Germany), sold primarily via Amazon EU. The chipset is identical to Vultech UPS2000VA-PRO discussed in #2738. Tested on Debian Bookworm (OMV 7.x) with NUT v2.8.5-rc4 from git master.

2.8. 2026-02-14 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/images/nut-squared.svg: add a margin-less version of NUT logo

2.9. 2026-02-13 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/man/nut.txt: old asciidoc variable "unset" only works with trailing exclamation mark

2.10. 2026-02-12 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, common/common.c, drivers/adelsystem_cbi.c, drivers/generic_modbus.c, include/common.h: common/common.c, include/common.h, drivers/adelsystem_cbi.c, drivers/generic_modbus.c: generalize elapsed_since_timeval() [#1938] Closes: #1938 Co-authored-by: Dimitris Economou <dimitris.s.economou@gmail.com>
  • clients/upsstats.c: display_tree(): drop spurious <br> at end of table data cell [#3316]

2.11. 2026-02-11 Jim Klimov <jimklimov+nut@gmail.com>

  • conf/upsstats-modern-single.html.sample.in: use spaces for separators between STATUS values (if many) [#3316]
  • conf/upsstats-modern-list.html.sample.in, conf/upsstats-modern-single.html.sample.in: conf/upsstats-modern-*.in: reconcile styles between two templates [#3316]
  • conf/upsstats-modern-list.html.sample.in, conf/upsstats-modern-single.html.sample.in, docs/nut.dict: conf/upsstats-modern-*.in: align with legacy templates [#3316] Notably variations about three-phase inputs/outputs.
  • conf/upsstats-modern-list.html.sample.in, conf/upsstats-modern-single.html.sample.in: conf/upsstats-modern-*.in: reduce kilobytage by dropping most of indentation [#3316] Should also help comparing with legacy templates and between these two.
  • NEWS.adoc, clients/upsstats.c, docs/man/upsstats.html.txt: clients/upsstats.c, docs/man/upsstats.html.txt: extend @STATUS@ to inject any separators, not only <br/> [#3316] Keep <br/> as legacy default, to work with older upsstats*.html templates. Closes: #2525
  • conf/upsstats.html.sample.in: drop duplicate @REFRESH@ directive [#3316]

2.12. 2026-02-11 Author: jawz101 <jawz101@users.noreply.github.com>

  • NEWS.adoc, conf/.gitignore, conf/Makefile.am, conf/hosts.conf.sample, conf/upsstats-modern-list.html.sample.in, conf/upsstats-modern-single.html.sample.in, configure.ac, data/htmlcgi/header.html.in, docs/nut.dict: Introduce upsstats-modern-list.html.sample.in upsstats-modern-single.html.sample.in [#3316]

2.13. 2026-02-10 Jim Klimov <jimklimov+nut@gmail.com>

  • configure.ac: when falling back to can_install_doc_man=yes do also try to touch the artifacts as when we do upon deliberate choice [#3314]
  • configure.ac: note more visibly that we can fall back to dist-tarball pre-built pages when we have only them and want something installed [#3314] NOTE: want_disted_doc_man=yes is set lower in code, hopefully we do reach that part; else have inputs for troubleshooting the recipes.
  • configure.ac: comment the trouble with automating Solaris man section layout when we only use dist-tarball pre-built pages [#3314]
  • configure.ac: refer to docs with Solaris man section layout [#3314]

2.14. 2026-02-09 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/Windows/wininit.c, NEWS.adoc, docs/man/nut.exe.txt: support exiting from "nut.exe -N" with Ctrl\+C [#3312]
  • clients/upsstats.c: display_template(): if rejecting a file, or after other errors, use HTML <BR/> tags in the printout (especially if debug is on) [#2524]
  • NEWS.adoc, clients/upsstats.c, conf/hosts.conf.sample, docs/man/hosts.conf.txt, docs/man/upsstats.cgi.txt: Introduce CUSTOM_TEMPLATE_LIST and CUSTOM_TEMPLATE_SINGLE settings in NUT CGI hosts.conf to constrain the permitted custom HTML template file names to a set that admins intend to use [#2524]
  • clients/upsstats.c: do_*link*() methods: err on the safe side and NULL-check the template_list/single vars before comparing strings [#2524]
  • clients/cgilib.c: extractcgiargs(): fix processing of query strings with flag tokens (no assignment) in the middle, not at end [#2524]
  • clients/upsset.c: use "Pragma: no-cache" HTTP header as in upsstats.cgi [#2524]
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: clients/ups{image,set,stats}.c: introduce support for browser-friendly logging in NUT CGI programs (in developer build and/or command-line runs) [#2524]
  • common/common.c, include/common.h: introduce UPSLOG_STDOUT bit and support in vupslog(), and cgilogbit_set() for browser-friendly logging in NUT CGI programs [#2524]
  • clients/upsclient.c: fix void* casting for a NSS build [#3311]
  • docs/download.txt: link to "Finding recent development iteration artifacts" wiki page
  • clients/cgilib.c: debug-trace also extractcgiargs() with what query-string text we pass into caller parsearg() implementations [#2524, #3219]

2.15. 2026-02-08 darkglade <35511291+darkglade@users.noreply.github.com>

2.16. 2026-02-08 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_upower.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: tools/nut-scanner/scan_*.c, NEWS.adoc: track seeked symbols to know where import failed [#3310]
  • tests/generic_gpio_liblocal.c: gpiod_line_request_get_values(): do not assign plain number to enum variables [#3297]
  • drivers/nutdrv_qx_voltronic-axpert.c: fix more casting from xcalloc() et al [#3297]
  • drivers/generic_gpio_common.c, drivers/generic_gpio_libgpiod.c, tests/generic_gpio_utest.c: fix more casting from xcalloc() et al [#3297]
  • docs/config-prereqs.txt, docs/nut.dict: update for Fedora 43 [#3311]
  • scripts/python/module/setup.py.in: try to actually catch warnings (e.g. DeprecationWarning) to use correct form of open() [#3256]
  • scripts/augeas/gen-nutupsconf-aug.py.in: fix ResourceWarnings about unclosed file descriptors [#3256]
  • scripts/augeas/gen-nutupsconf-aug.py.in: try to actually catch warnings (e.g. DeprecationWarning) to use correct form of open() [#3256]
  • tools/nut-scanner/scan_upower.c: drop unused import of "g_variant_get()" [#3293]
  • server/upsd.c, NEWS.adoc, docs/nut.dict: update_sysmaxconn(): support NUT_SYSMAXCONN_LIMIT envvar to tweak [#3302]
  • server/upsd.c: mainloop(): only log warnings if nfds_wanted > maxconn (equality should be ok) [#3302]
  • server/upsd.c: mainloop(): debug-log chunking details [#3302]
  • server/upsd.c: refactor with one update_sysmaxconn() implementation [#3302]
  • common/common.c: vupslog(): use a larger initial buffer
  • drivers/upsdrvctl.c: forkexec(): double-quote the WIN32 argv[0] in commandline [#3294, #3305] Closes: #3305
  • drivers/upsdrvctl.c: forkexec(): double-quote the WIN32 argv[0] in commandline [#3294, #3305] Closes: #3305

2.17. 2026-02-06 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsstats.c, docs/man/upsstats.cgi.txt, NEWS.adoc: support providing CGI options for alternate template file names (co-located with original ones) [#2524, #3304]
  • server/upsd.c, docs/man/upsd.conf.txt, conf/upsd.conf.sample, NEWS.adoc: track "sysmaxconn" not as a reason to fail data server configuration, but to chunk the MAXCONN-sized array processing into several smaller polls as needed [#3302]
  • clients/upsstats.c: parameterize template_single and template_list filenames with legacy defaults [#2524]
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: fix indentation for recent fixes and update © heading [#3219]
  • .github/workflows/08-PyNUTClient.yml: do not let @dotMAKE@ get in our way here [#3300] NOTE: We were running Makefile.am previously directly as a makefile for PyPI publishing; now a slightly transformed version of it.
  • configure.ac: avoid AM_COND_IF absent in older aclocal builds [#3300]
  • tools/nut-scanner/scan_nut.c: debug-trace what in upscli failed [#3300]
  • tools/gitlog2version.sh: fix for git describe versions before --exclude option [#3300]
  • tools/nut-scanner/scan_usb.c: do not call libusb_exit() after a failed libusb_init() on libusb older than 1.0.24 [#3300]
  • common/common.c: fix freeing of dynamically detected search_paths after fixing use of realpath() to use our buffer [#3300]
  • configure.ac: avoid reporting "Whether to enable support for parallelization of some tools" twice [#3300]
  • configure.ac: better detect HAVE_SEMAPHORE_LIBS (even if we do not need to link anything additional) [#3300]
  • tools/nut-scanner/scan_nut_simulation.c: use "#ifdef HAVE_PTHREAD" consistently with other code [#3300]

2.18. 2026-02-05 Jim Klimov <jimklimov+nut@gmail.com>

  • common/common.c: refine deliberate logging without PRIuSIZE in nut_prepare_search_paths() [#3300]
  • docs/nut.dict: update the dictionary [#3300]
  • common/common.c: vupslog(): be conservative about growing our buffer, most logs are short
  • common/common.c: get_libname_in_*(): use NUT_STRARG() when logging strings
  • common/common.c: nut_prepare_search_paths(): some systems require non-NULL args to realpath(), provide the buffer and handle errors better
  • common/common.c: nut_prepare_search_paths(): separate logging from index increment
  • common/common.c: nut_prepare_search_paths(): debug more about progressing through the arrays
  • configure.ac, include/nut_stdint.h, NEWS.adoc: actually detect support for (C99\+) printf("%zu") et al It seems Solaris 8 struggles with the lack of it, so formatting strings get skewed
  • drivers/ydn23.h: fix printing of "%zu" with PRIuSIZE
  • NEWS.adoc, UPGRADING.adoc, configure.ac, docs/configure.txt, tools/nut-scanner/Makefile.am, tools/nut-scanner/nut-scan.h, tools/nut-scanner/nut-scanner.c, tools/nut-scanner/scan_eaton_serial.c: configure.ac, tools/nut-scanner/nut-scan.h, tools/nut-scanner/Makefile.am, docs/configure.txt, NEWS.adoc, UPGRADING.adoc: Added an option to (primarily) --disable-threading [#3300] Can be useful for systems with broken libraries, as well as for CI testing of sequential implementation on build systems WITH threading support available (and until now unavoidable then). This commit also fixes problems found when trying such a build.
  • scripts/Windows/Installer/NUT-Installer.xml.in: ensure a newline at end of file (some SEDs complain)
  • configure.ac: rectify handling of nut_with_confdir [#3131]
  • drivers/vertiv-mib.c: refine code markup after another round of AI changes [#3299]

2.19. 2026-02-04 jawz101 <jawz101@users.noreply.github.com>

  • drivers/vertiv-mib.c: vertiv-mib: fix ID strings and implement high-precision OIDs for PSI5

2.20. 2026-02-04 Jim Klimov <jimklimov+nut@gmail.com>

  • .gitignore: GitIgnore "tags" files left over by (probably) bmake
  • Makefile.am, NEWS.adoc, clients/Makefile.am, common/Makefile.am, conf/Makefile.am, configure.ac, data/Makefile.am, data/htmlcgi/Makefile.am, docs/Makefile.am, docs/man/Makefile.am, drivers/Makefile.am, scripts/Makefile.am, scripts/Solaris/Makefile.am, scripts/Windows/Makefile.am, scripts/devd/Makefile.am, scripts/external_apis/Makefile.am, scripts/hotplug/Makefile.am, scripts/installer/Makefile.am, scripts/obs/Makefile.am, scripts/python/Makefile.am, scripts/python/module/Makefile.am, scripts/systemd/Makefile.am, scripts/udev/Makefile.am, scripts/upsdrvsvcctl/Makefile.am, server/Makefile.am, tests/Makefile.am, tests/NIT/Makefile.am, tools/nut-scanner/Makefile.am, tools/nutconf/Makefile.am: configure.ac, Makefile.am, NEWS.adoc: mark goals which expand SUBDIR_TGT_RULE with explicit .MAKE pseudo-target [#3300] The BSD make as of NetBSD 11 (Beta) updates gets confused about sub-calls to $(MAKE) with respective $(MAKEFLAGS) passed to it with our parallel build scripting, despite the standard "\+" prefix to commands in the caller. An explicit pseudo-target seems to help quiesce the warnings (and hopefully rectify the practical handling). Co-authored-by: Greg Troxel <gdt@lexort.com>
  • scripts/python/module/Makefile.am: better indent multi-line rules
  • Makefile.am: package: should not depend on "dist" to package up "all" the already-built artefacts Thanks to Lee Damon for the heads-up
  • Makefile.am: SET_PARMAKES_OPT snippet should not have started with "\+@" (was a goal body before)
  • scripts/augeas/gen-nutupsconf-aug.py.in, scripts/python/module/setup.py.in: fix codecs.open() deprecation warning (3.14\+) [#3256] Co-Authored-by: Paul Donald <newtwen\+github@gmail.com>
  • drivers/upsdrvctl.c: forkexec() WIN32: refine ability to CreateProcess() for the driver in build workspace, not only in final installation [#3294]
  • tests/NIT/nit.sh: use windows-style backslashes if the rest of driverpath uses them [#3294]
  • configure.ac: refine reporting of GPIO_VERSION when there is none
  • docs/config-prereqs.txt: update instructions for NetBSD 11.0 (Beta)
  • drivers/upsdrvctl.c: use windows-style backslashes if the rest of driverpath uses them [#3294]
  • drivers/vertiv-mib.c: refine ups.status [#3299]
  • drivers/vertiv-mib.c: refine beeper status vs. cmd [#3299]
  • NEWS.adoc, data/driver.list.in: update regarding Vertiv/Liebert MIB [#3299]
  • drivers/Makefile.am, drivers/snmp-ups.c, drivers/{vertiv-psi5-mib.c ⇒ vertiv-mib.c}, drivers/{vertiv-psi5-mib.h ⇒ vertiv-mib.h}: drivers/vertiv-*: generalize to "vertiv" MIB, this is not PSI5 specific [#3299]
  • drivers/vertiv-psi5-mib.c: reconcile new round of changes with older iteration (SU_FLAG* values, IETF identification) [#3299]

2.21. 2026-02-03 jawz101 <jawz101@users.noreply.github.com>

  • drivers/vertiv-psi5-mib.c: Update Vertiv PSI5 MIB version and OIDs Updated the version number and modified SNMP OIDs for device monitoring and alarms.

2.22. 2026-02-03 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, docs/nut.dict, drivers/vertiv-psi5-mib.c, drivers/vertiv-psi5-mib.h: drivers/vertiv-psi5-mib.{c,h}, NEWS.adoc: fix to actually compile [#3299]
  • m4/ax_realpath_lib.m4, NEWS.adoc, docs/nut.dict: retry by calling linker or compiler with the library paths and link name, to derive the path from error messages [#2431]
  • m4/ax_realpath_lib.m4: refactor with LIBRARY_PATH; clean up after ourselves [#2431]
  • drivers/vertiv-psi5-mib.c, drivers/vertiv-psi5-mib.h: drivers/vertiv-psi5-mib.{c,h}: fix markup and © headers, include "main.h" missed before [#3299]
  • configure.ac: simplify checks for UPower driver and nut-scanner support [#3293]

2.23. 2026-02-02 jawz101 <jawz101@users.noreply.github.com>

  • drivers/vertiv-psi5-mib.c: Enhance Vertiv PSI5 MIB with control features Added shutdown and start delay control for UPS.
  • drivers/snmp-ups.c: Bump driver version to 1.39
  • drivers/Makefile.am, drivers/vertiv-psi5-mib.c, drivers/vertiv-psi5-mib.h: squash vertiv commits * add c & h driver files * Add files via upload * Add vertiv-psi5-mib.c to Makefile.am * Add vertiv-psi5-mib.h to Makefile.am
  • drivers/snmp-ups.c: Add support for Vertiv PSI5 MIB

2.24. 2026-02-02 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/obs/debian.cdbs-autotools.mk, scripts/obs/debian.rules: scripts/obs/debian.rules: stash a copy of CDBS autotools.mk to include if the real thing is not available [#1209]
  • scripts/obs/debian.rules: make "autotools.mk" inclusion optional (Debian Testing in Jan/Feb 2026 seems to lack it) [#1209]
  • tools/nut-scanner/scan_upower.c: apply simpler indentation [#3293]
  • tools/nut-scanner/scan_upower.c: apply fixes about use of (lt_dlhandle)1 instead of (void *)1 [#3293]
  • tools/nut-scanner/nutscan-init.c: comment the situation about many libs related to UPower where we only load one for scanning [#3293]
  • NEWS.adoc: move nut-scanner UPower support notice into the nut-scanner tool section [#3293]
  • tools/nut-scanner/scan_upower.c: tools/nut-scanner/*.c: be stricter about "ifdef WITH_SOME_NUT_FEATURE" (we may have some defined but zeroed, so not active for a build) [#3293]
  • clients/upsimagearg.h, drivers/apcsmart-old.h, drivers/metasys.c, drivers/usb-common.h: *.{c,h}: rectify more indentations and line-wrapping in block comments
  • tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: tools/nut-scanner/scan_*.c: fix more inconsistent indentations
  • tools/nut-scanner/scan_ipmi.c: uncomment code block that detects "No IPMI on this host" to report the message
  • tools/nut-scanner/nutscan-init.c, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: tools/nut-scanner/*.c: use (lt_dlhandle)1 casting instead of (void *)1 also in comparisons
  • drivers/mge-hid.c: add a note about using enum value in sentinel for mge_model_names[] [#3293]
  • server/upsd.c: add a comment to FTS_T *fds [#3293] Bonus question: what could Gemini mean by "FTS"?..
  • drivers/nutdrv_qx.c: revert bogus change to qx_process() error handling of xmalloc() [#3293]
  • drivers/libshut.c, drivers/netxml-ups.c: standardize on "try_num" as the iteration variable name
  • clients/upsmon.c: there is little point checking configfile for non-NULLness at the beginning of main() [#3293]
  • clients/upsmon.c: indent back a block of code changed by the PR [#3293]
  • clients/cgilib.c, clients/upsc.c, clients/upsclient.c, clients/upscmd.c, clients/upslog.c, clients/upsmon.c, clients/upsrw.c, clients/upsset.c, common/common.c, common/strptime.c, common/wincompat.c, drivers/adelsystem_cbi.c, drivers/adelsystem_cbi.h, drivers/al175.c, drivers/apc-hid.c, drivers/apcsmart-old.c, drivers/apcsmart.c, drivers/bcmxcp.c, drivers/bcmxcp_usb.c, drivers/belkinunv.c, drivers/bestfortress.c, drivers/bicker_ser.c, drivers/clone-outlet.c, drivers/dstate.c, drivers/eaton-pdu-marlin-mib.c, drivers/everups.c, drivers/generic_gpio_libgpiod.c, drivers/generic_modbus.c, drivers/genericups.c, drivers/hpe-pdu-mib.c, drivers/huawei-ups2000.c, drivers/libshut.c, drivers/macosx-ups.c, drivers/mge-utalk.c, drivers/microdowell.c, drivers/microsol-apc.h, drivers/nut-ipmipsu.c, drivers/nut-libfreeipmi.c, drivers/nut-upower.c, drivers/nutdrv_hashx.c, drivers/nutdrv_qx.c, drivers/optiups.c, drivers/pijuice.c, drivers/powercom.c, drivers/richcomm_usb.c, drivers/riello_ser.c, drivers/skel.c, drivers/snmp-ups.c, drivers/snmp-ups.h, drivers/socomec_jbus.c, drivers/solis.c, drivers/tripplite-hid.c, drivers/tripplite_usb.c, drivers/tripplitesu.c, drivers/upsdrvctl.c, drivers/upshandler.h, drivers/usb-common.c, drivers/usb-common.h, drivers/ydn23.h, include/common.h, server/conf.c, server/netlist.c, server/upsd.c, tests/generic_gpio_liblocal.c, tools/nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-ip.c, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: *.{c,h}: rectify indentations and line-wrapping in general code structure and method arguments
  • drivers/apc_modbus.c: bump DRIVER_VERSION due to refined setting of mapping table entry types etc. via enum values [#3293]
  • NEWS.adoc: note the pointer-casting refinement [#3293] Kudos to Tim Niemueller, Gemini, and clang-21 extended warnings.
  • NEWS.adoc: fix the entry for tripplitesu [#3273]
  • drivers/apcsmart-old.c: fix git merging typo
  • tools/nut-scanner/nut-scan.h, tools/nut-scanner/nutscan-init.c, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: tools/nut-scanner/*.c: be stricter about "ifdef WITH_SOME_NUT_FEATURE" (we may have some defined but zeroed, so not active for a build) [#3293]
  • tools/nut-scanner/nutscan-device.h: comment the added meaning of TYPE_END in nutscan_device_type_t as the array size definition
  • scripts/obs/_config: Debian Next builders can not choose between libselinux1-dev (which provides libselinux-dev) and requested libselinux-dev (as dependency of libgio/libmount) so need a nudge [#3293]
  • .github/pull_request_template.md: update notes about ci_build.sh, add NEWS/UPGRADING adoc bumps
  • .github/pull_request_template.md: add a note to disclose AI and other coding aid usage, and that a human is ultimately responsible for the contributions
  • drivers/apcsmart.c: neuter upsdrv_help(): it brings no new value now that all NUT programs print references to on-line and man page docs
  • clients/upsclient.c, clients/upslog.c, common/common.c, common/strptime.c, drivers/al175.c, drivers/apcsmart.c, drivers/dstate.c, drivers/generic_modbus.c, drivers/huawei-ups2000.c, drivers/liebert-esp2.c, drivers/nutdrv_hashx.c, drivers/pijuice.c, drivers/powercom.c, drivers/powerp-bin.c, drivers/snmp-ups.c, drivers/tripplite_usb.c, drivers/tripplitesu.c, drivers/usb-common.c, server/upsd.c: *.{c,h}: rectify indentations and line-wrapping in if/for/while constructs
  • drivers/huawei-ups2000.c: use sizeof not fixed number for snprintf()
  • clients/upscmd.c, clients/upsimage.c, clients/upsmon.c, clients/upssched.c, clients/upsset.c, common/common-nut_version.c, common/common.c, common/wincompat.c, drivers/al175.c, drivers/apc-hid.c, drivers/apcsmart-old.c, drivers/apcsmart_tabs.c, drivers/arduino-hid.c, drivers/asem.c, drivers/bcmxcp.c, drivers/belkinunv.c, drivers/bestfcom.c, drivers/bestfortress.c, drivers/bestuferrups.c, drivers/clone-outlet.c, drivers/etapro.c, drivers/genericups.c, drivers/hidparser.c, drivers/libusb0.c, drivers/libusb1.c, drivers/macosx-ups.c, drivers/metasys.c, drivers/mge-xml.c, drivers/microdowell.c, drivers/netxml-ups.c, drivers/nutdrv_atcl_usb.c, drivers/optiups.c, drivers/richcomm_usb.c, drivers/riello_usb.c, drivers/skel.c, drivers/snmp-ups-helpers.c, drivers/tripplite-hid.c, drivers/tripplitesu.c, drivers/upscode2.c, drivers/usbhid-ups.c, tools/nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-ip.c, tools/nut-scanner/scan_avahi.c: *.{c,h}: rectify indentations and line-wrapping in block comments

2.25. 2026-02-01 Tim Niemueller <tim@niemueller.de>

  • m4/nut_check_libglib.m4: Add -isystem fix for glib
  • clients/cgilib.c, clients/upslog.c, clients/upsset.c, tools/nut-scanner/scan_avahi.c: Add nullptr checks and wrong enum cast
  • clients/cgilib.c, clients/nutclientmem.cpp, clients/upsc.c, clients/upscmd.c, clients/upslog.c, clients/upsmon.c, clients/upsrw.c, clients/upssched.c, clients/upsset.c, clients/upsstats.c, common/common.c, common/parseconf.c, common/state.c, drivers/adelsystem_cbi.c, drivers/adelsystem_cbi.h, drivers/al175.c, drivers/apc_modbus.c, drivers/apcsmart.c, drivers/bcmxcp.c, drivers/bcmxcp_usb.c, drivers/common_voltronic-crc.c, drivers/dummy-ups.c, drivers/ecoflow-hid.c, drivers/failover.c, drivers/generic_modbus.c, drivers/hidparser.c, drivers/libhid.c, drivers/libshut.c, drivers/main.c, drivers/mge-hid.c, drivers/microdowell.c, drivers/nhs_ser.c, drivers/nutdrv_qx.c, drivers/nutdrv_qx_masterguard.c, drivers/rhino.c, drivers/serial.c, drivers/snmp-ups.c, drivers/tripplite_usb.c, drivers/upsdrvctl.c, drivers/usb-common.c, drivers/usbhid-ups.c, server/conf.c, server/desc.c, server/upsd.c, server/user.c, tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan-display.c, tools/nut-scanner/nutscan-ip.c, tools/nut-scanner/nutscan-serial.c, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_eaton_serial.c, tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: Fix unrelated compiler warnings to be able to complete distcheck On the used clang version implicit conversion triggers a warning, the -Werror makes those errors. I have used Gemini for some of these, but quota ran out after half an hour and \~120 invocations so I completed the rest manually.

2.26. 2026-02-01 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/NIT/Makefile.am, tests/NIT/nit.sh: use platform-specific ABS_TOP_BUILDDIR separately from makefile abs_top_builddir [#3294] The original hack broke the PATH parsing (added colons in WIN32 tests)
  • tests/NIT/nit.sh: if we pass driverpath in WIN32 spelling, we want it not only quoted but also with escaped backslashes [#3292]
  • configure.ac, tests/NIT/Makefile.am: propagate possibly platform-adjusted spelling of ABS_TOP_SRCDIR and ABS_TOP_BUILDDIR so it ends up in "driverpath" correctly for WIN32 builds [#3292]
  • m4/nut_check_libglib.m4: generalize the -isystem fix to hack depCFLAGS first [#3293]
  • m4/nut_check_libglib.m4: Mostly revert 7f0ed5d29fc2035686cf5be820ec48db91ba19c8 [#3293] Earlier commits separated LIBGIO* from LIBGLIB* variables, but a parallel-developed fix happened to conflate them back.
  • tools/nut-scanner/Makefile.am: bump libnutscan version info [#3293] \+1 for "current" (added interfaces) and "+1" for age (only added, not removed)
  • configure.ac, docs/man/Makefile.am, drivers/Makefile.am, m4/nut_check_libglib.m4, tools/nut-scanner/Makefile.am, tools/nut-scanner/nutscan-init.c: configure.ac, m4/nut_check_libglib.m4, Makefiles: clearer name and user (and hack) the variables for libglib and for libgio [#3293]
  • configure.ac: when testing PYTHON* capabilities, check not only for a known PYTHON*_VERSION_INFO_REPORT but also for non-trivial PYTHON* itself - we could forget that due to auto-prio [#1792]

2.27. 2026-01-31 Tim Niemueller <tim@niemueller.de>

  • tools/nut-scanner/scan_upower.c: Variable ordering fix Pretend it’s 1999 and put declaration of the variable further up.
  • NEWS.adoc: Add entry to NEWS.adoc for nut-scanner upower support
  • common/common.c, common/nutconf.cpp: Fix compiler warnings about copy ellision This fixes the build fail triggered on CI farm, and some more that trigger on the more recent version 21 of clang.

2.28. 2026-01-31 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/NIT/nit.sh, NEWS.adoc: flip the switch to test upsdrvctl too [#2800]
  • tools/nut-scanner/nutscan-init.c: comment on do_upsconf_args() placeholder vs. ENABLE_SHARED_PRIVATE_LIBS [#2800]
  • drivers/upsdrvctl.c: register callback_upsconf_args if we ENABLE_SHARED_PRIVATE_LIBS [#2800]

2.29. 2026-01-30 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/packager-guide.txt, scripts/obs/Makefile.am, scripts/obs/debian.control, scripts/obs/debian.nut-gpio.install, scripts/obs/debian.nut-gpio.manpages, scripts/obs/debian.nut-upower.install, scripts/obs/debian.nut-upower.manpages, scripts/obs/nut.dsc: scripts/obs/*, docs/packager-guide.txt: introduce new sub-packages for GPIO and UPower drivers [#1209]

2.30. 2026-01-29 TomZanna <git@tomzanna.com>

  • NEWS.adoc, docs/man/tripplitesu.txt, drivers/tripplitesu.c: drivers/tripplitesu.c: add configurable command delay to prevent read timeouts
  • data/driver.list.in, drivers/tripplitesu.c: drivers/tripplitesu.c: add 1s delay in command_send Intermittent communication timeouts were observed when multiple commands were sent in rapid succession. Adding a 1-second delay at the beginning of command_send() ensures the hardware buffer is ready and prevents the "read timeout" errors.

2.31. 2026-01-29 Jim Klimov <jimklimov+nut@gmail.com>

  • .obs/workflows.yml: Revert ".obs/workflows.yml: separate project builds with what looks like RC tags to use a separate OBS template (tweaked to change the dash into tilde for packaging versions) [#1209]" This reverts commit cced83a58d8d980cbeaad019522ab0f0c25d77e7: the currently deployed OBS service does not filter by "tags"… sadly.
  • docs/maintainer-guide.txt: GHA file for PyNUTClient was renamed
  • scripts/Windows/build-mingw-nut.sh: add license header
  • docs/maintainer-guide.txt: add OBS reference recipes to watch for version bump when releasing
  • docs/maintainer-guide.txt: move VERSION_FORCED* file preparation (involves git tagging) to after changing committed files
  • docs/maintainer-guide.txt: update a comment

2.32. 2026-01-28 Vladdrako <vladdrako007@gmail.com>

  • drivers/powercom-hid.c: drivers: powercom-hid: use offdelay/ondelay config options for shutdown commands The powercom_shutdown_nuf(), powercom_stayoff_nuf(), and powercom_startup_nuf() functions were reading delay values from dstate_getinfo("ups.delay.shutdown") and dstate_getinfo("ups.delay.start"), which return the UPS’s CURRENT delay values read via HID. However, users configure their desired delays via the "offdelay" and "ondelay" driver options in ups.conf. These were being ignored. This patch changes the functions to: 1. First try the value passed directly to the instant command 2. Then try getval("offdelay")/getval("ondelay") from driver config 3. Then try dstate_getinfo() for current UPS values 4. Finally fall back to sensible defaults (60s shutdown, 120s startup) This ensures that user configuration is respected. Tested on Powercom RPT-800AP (VendorID: 0x0d9f, ProductID: 0x0004).

2.33. 2026-01-28 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/nut-driver-enumerator-test.sh: quiesce shell-check concerns about "==" comparator [#3055] Co-authored-by: Greg Troxel <gdt@lexort.com>
  • tools/semver-compare.sh, docs/nut-versioning.adoc: revise help for "Shellish syntax to compare two semvers" [#3055]
  • drivers/powercom-hid.c: bump POWERCOM_HID_VERSION and revise comments [#3288]
  • NEWS.adoc: update about powercom-hid fix for shutdown/stayoff/startup INSTCMDs [#3288]
  • clients/Makefile.am, tests/Makefile.am: revise libnutclient* dependencies to honour ENABLE_SHARED_PRIVATE_LIBS [#2800]
  • scripts/obs/_service: stash recent template project changes from OBS setup [#1209]
  • .obs/workflows.yml: separate project builds with what looks like RC tags to use a separate OBS template (tweaked to change the dash into tilde for packaging versions) [#1209]
  • docs/developers.txt: update recommendation about hiding IDE dirs from a careless git clean -fdX
  • NEWS.adoc, docs/nut.dict, drivers/nutdrv_qx.c, drivers/nutdrv_qx_voltronic.c: drivers/nutdrv_qx.c, nutdrv_qx_voltronic.c, NEWS.adoc, docs/nut.dict: qx_process_answer(): set errno=ETIMEDOUT (not EINVAL) if raised by caller or we had a zero-length read; use this in voltronic_claim() [#3276, #3283]
  • common/Makefile.am, tests/Makefile.am: revise libnutconf dependency to honour ENABLE_SHARED_PRIVATE_LIBS and match tools/nutconf/Makefile.am [#2800]
  • clients/Makefile.am, common/Makefile.am, tests/Makefile.am: tests/Makefile.am: revise dependency for libdummy_mockdrv.la to honour ENABLE_SHARED_PRIVATE_LIBS setting [#2800]

2.34. 2026-01-27 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/nutdrv_qx_voltronic.c: voltronic_claim(): do not limit second query retry to errno==EINVAL for now [#3276]
  • drivers/nutdrv_qx_voltronic.c: voltronic_claim(): log failed query codes and their errnos [#3276]
  • drivers/usb-common.c: add debug tracing [#2270]
  • NEWS.adoc, UPGRADING.adoc: update nut-upower entry with link to the PR [#3279]
  • configure.ac: move nut-upower up to be near macosx equivalent, and hotfix GLIB_CFLAGS with -isystem options to reduce CLANG (mostly) compiler warnings [#3279]
  • drivers/Makefile.am: cosmetic fixes [#3279]
  • drivers/nutdrv_qx_voltronic.c: voltronic_claim(): retry if the first query was OK and second was invalid [#3282]
  • drivers/nutdrv_qx.c: upsdrv_initups(): log that we got as far as matching the device claimer (and which media type while at it) [#3282]
  • drivers/nutdrv_qx.c: subdriver_matcher(): more debug-tracing [#3282]
  • data/driver.list.in: clean up the markup a bit [#3285]

2.35. 2026-01-26 air5551 <Air@example.org>

  • data/driver.list.in: Trying to make CI happy :3
  • data/driver.list.in: Added Liebert PSI5-800RT120

2.36. 2026-01-26 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/nutdrv_qx.c: try a longer sleep after serial dtr/rts setting [#3282] Some devices are slow to respond to a first query and fail detection. Maybe delaying by a bit over 1 second would help?
  • drivers/nutdrv_qx.c: improve debug tracing for main loop skeleton [#3282]
  • drivers/arduino-hid.c, NEWS.adoc, docs/nut.dict: add ups.load, input.voltage, output.voltage for e.g. Ugreen US3000 [#3281]

2.37. 2026-01-24 Tim Niemueller <tim@niemueller.de>

  • configure.ac, docs/acknowledgements.txt, docs/man/nut-scanner.txt, docs/nut.dict, m4/nut_check_libglib.m4, tools/nut-scanner/Makefile.am, tools/nut-scanner/nut-scan.h, tools/nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan-device.h, tools/nut-scanner/nutscan-init.c, tools/nut-scanner/nutscan-init.h, tools/nut-scanner/scan_upower.c: Add UPower support to nut-scanner

    • Added support for scanning UPower devices via GDBus/libgio. - Implemented dynamic loading of libgio/libglib to avoid hard dependencies. - Added --upower_scan (-J) option to nut-scanner. - Added m4/nut_check_libglib.m4 to detect GLib/GIO. - Updated configure.ac to check for UPower support requirements. - Updated nut-scanner build system and initialization. - Updated nut-scanner man page
  • docs/nut.dict: Update doc/nut.dict from make spellcheck-interactive Add missing terms.
  • NEWS.adoc, UPGRADING.adoc, docs/configure.txt, docs/man/Makefile.am, docs/man/{upower_dbus.txt ⇒ nut-upower.txt}, drivers/Makefile.am, drivers/{upower_dbus.c ⇒ nut-upower.c}: Rename upower_dbus driver to nut-upower
  • NEWS.adoc, UPGRADING.adoc, docs/config-prereqs.txt, docs/configure.txt, drivers/upower_dbus.c: Address upower driver immediate review comments
  • .github/workflows/01-make-dist.yml: Add libglib2.0-dev to github action builder Required to also test upower_dbus driver.

2.38. 2026-01-24 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/nut.dict: add gio [#3279]
  • drivers/upsdrvctl.c: stop_driver(): try shorter PING first, so a closed socket is detected earlier [#3277]
  • drivers/upsdrvctl.c: stop_driver(): if upsdrvquery_connect_drvname_upsname() failed, try another in case the driver is still starting and we were called too soon [#3277]
  • drivers/upsdrvctl.c, drivers/upsdrvquery.c: drivers/upsdrvquery.c: upsdrvquery_ping(): revise intense reading loop and timeout accounting when the read size remains 0 [#3277]
  • drivers/upsdrvctl.c: stop_driver(): handle not-hearing from the last PONG a bit cleaner [#3277]
  • NEWS.adoc, UPGRADING.adoc, docs/nut.dict, drivers/upsdrvquery.c, drivers/upsdrvquery.h: drivers/upsdrvquery.{c,h}, UPGRADING.adoc, NEWS.adoc: introduced upsdrvquery_NOSIGPIPE toggle for consumers who might want to handle SIGPIPE themselves [#3277]
  • drivers/upsdrvquery.c: upsdrvquery_close(): refactor work with setsockopt(), prefer it over the blanket signal change for the process; handle EPIPE specially [#3277]
  • drivers/upsdrvquery.c: upsdrvquery_write() use MSG_NOSIGNAL where available [#3277] Proper NUT daemons intercept SIGPIPE and survive closed connections, but consumers of upsdrvquery might not, and would crash. If we can, just return the error (and errno=EPIPE) for the specific call.
  • scripts/obs/_service: survive git tags with a dash [#1209] Avoid RPM build error like: line 121: Illegal char - (0x2d) in: Version: 2.8.5-rc1.12\+g3501cd37
  • .github/workflows/01-make-dist.yml, .github/workflows/05-codeql.yml: add libglib2.0-dev [#3279]
  • NEWS.adoc, docs/man/nut-ipmipsu.txt, drivers/nut-ipmipsu.c, drivers/nut-libfreeipmi.c, tools/nut-scanner/scan_ipmi.c: tools/nut-scanner/scan_ipmi.c, drivers/nut-ipmipsu.c: fixed an issue where multiple calls to clean-up crashed the program [#3193] Special thanks to maintainer of libfreeipmi for helping catch it! Co-authored-by: Albert Chu <chu11@llnl.gov>

2.39. 2026-01-23 Tim Niemueller <tim@niemueller.de>

  • configure.ac, docs/man/Makefile.am, docs/man/upower_dbus.txt, docs/nut.dict, drivers/Makefile.am, drivers/upower_dbus.c: Add UPower driver Enables to read UPS data from UPower. This is useful if a UPS connected to a desktop system should be exposed over the network. It can also be used to expose laptop batteries.

2.40. 2026-01-23 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/upsdrvctl.c: upsdrvquery_ping() after telling the driver to stop, so upsdrvctl exits when the driver is gone [#3277]
  • drivers/upsdrvquery.c, drivers/upsdrvquery.h: drivers/upsdrvquery.{c,h}: separate upsdrvquery_ping() from upsdrvquery_prepare() [#3277]
  • drivers/upsdrvquery.c: protect upsdrvquery_close() from SIGPIPE crash if the other side exited [#3277]
  • NEWS.adoc, drivers/upsdrvctl.c: drivers/upsdrvctl.c: if we fail to stop a driver by signal, retry to "exit" it by protocol [#3277]
  • NEWS.adoc, conf/ups.conf.sample, docs/man/ups.conf.txt, docs/man/upsdrvctl.txt, drivers/upsdrvctl.c: drivers/upsdrvctl.c, NEWS.adoc, conf/ups.conf.sample, docs: apply global debug_min from ups.conf also to upsdrvctl tool itself [#3276]
  • docs/man/nut-ipmipsu.txt: add errata note about possible troubles when changing OS user accounts [#3193]
  • tools/nut-scanner/README.adoc: fix typo
  • .circleci/config.yml: line-break elements added for DMF code base, so master-branch text lines match exactly

2.41. 2026-01-20 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/nut-scanner/Makefile.am: restore wording of -export-symbols-regex for libnutscan [#2800]

2.42. 2026-01-18 sginestrini <s.ginestrini@gmail.com>

  • data/driver.list.in: Fix formatting for Tecnoware UPS ERA PLUS 2000 entry in driver list

2.43. 2026-01-18 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/Makefile.am, drivers/libusb0.c, drivers/libusb1.c: fix linking of suggest_NDE_conflict() when we ENABLE_SHARED_PRIVATE_LIBS [#2800]
  • drivers/Makefile.am: drivers/Makefile.am, NEWS.adoc: optimise driver build/link with libdummy_usb.la [#2800]
  • drivers/Makefile.am, NEWS.adoc: optimise driver build/link with libdummy_usb.la [#2800]
  • configure.ac, docs/configure.txt: stress that --without-serial does not currently mean disabling modbus drivers nor libnutscan ability to talk serial
  • drivers/Makefile.am, NEWS.adoc: avoid building libdummy_serial.la when we configure --without-serial
  • NEWS.adoc: wrap recently indented lines
  • docs/nut.dict: fix sort order

2.44. 2026-01-17 sginestrini <s.ginestrini@gmail.com>

  • data/driver.list.in: Add UPS model UPS ERA PLUS 2000 to driver list

2.45. 2026-01-17 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/Makefile.am: fix linking of libdummy_serial.la with ENABLE_SHARED_PRIVATE_LIBS more conservatively [#2800]
  • drivers/Makefile.am: fix linking of libdummy_serial.la with ENABLE_SHARED_PRIVATE_LIBS [#2800]
  • tools/nutconf/Makefile.am: revise dependency trail involving libcommonclient.la [#2800]
  • NEWS.adoc, docs/nut.dict, drivers/powercom-hid.c: drivers/powercom-hid.c, NEWS.adoc: introduce powercom_hack_voltage_lkp to report battery.voltage [#2766] Authored-By: Vladyslav Andreichykov <vladdrako007@gmail.com>
  • drivers/cps-hid.c, NEWS.adoc: added Replace Battery information [#3268] Contributed via mailing list at https://alioth-lists.debian.net/pipermail/nut-upsdev/2026-January/008184.html Authored-by: John.Chang <John.Chang@cyberpower.com>
  • scripts/upower/95-upower-hid.hwdb: update comment for iDowell (and newly Goldenmate) devices on USB ID v075Dp0300 [#3265]

2.46. 2026-01-16 Jim Klimov <jimklimov@gmail.com>

  • ci_build.sh: Revert "ci_build.sh: do not auto-test both NUT_LIBNUTPRIVATE_VARIANTS on MacOS for now, stick with default (no) [#2800]" This reverts commit 520539ecaf11a4a7cc2f6feef5030ae579bad10b : issue was fixed by passing version data/methods into drivers using the callback mechanism made for upsdrv_*() implementations.

2.47. 2026-01-16 Jim Klimov <jimklimov+nut@gmail.com>

  • ci_build.sh, scripts/Windows/build-mingw-nut.sh: revise passing/defaulting of WITH_LIBNUTPRIVATE envvar toggle for WIN32 (cross-)builds [#2800]
  • common/common-nut_version.c, drivers/main.c, drivers/main.h: drivers/main.{c,h}, common/common-nut_version.c: pass nut_version stuff via upsdrv_callback_t too [#2800]
  • clients/Makefile.am: link libcommonversion.la BEFORE the dynamic libnutprivate-common.la [#2800]
  • tools/nut-scanner/Makefile.am: with ENABLE_SHARED_PRIVATE_LIBS and binaries keeping their version info inside, libnutscan is also such a binary as far as third-party consumers are concerned [#2800]
  • drivers/Makefile.am, tests/Makefile.am: fix libnutprivate linking with libdummy_mockdrv and libcommonversion [#2800]
  • configure.ac: fix use of cygpath (WIN32) where available, to determine ABS_TOP_{BUILD,SRC}DIR values
  • tools/nutconf/Makefile.am: fix dependency between libnutconf.la and libcommonclient.la for ENABLE_SHARED_PRIVATE_LIBS mode [#2800]
  • .obs/workflows.yml: "event" is a value, not list [#1209]
  • scripts/obs/debian.rules: no SED for dropped nut-common-tmpfiles.conf
  • scripts/obs/Makefile.am, scripts/obs/debian.nut-common.tmpfiles.in, scripts/obs/debian.rules: scripts/obs/*: drop misleading debian.nut-common.tmpfiles.in, deliver built one
  • scripts/obs/debian.rules: modernize naming of nut-common-tmpfiles.conf
  • scripts/obs/nut.spec, scripts/obs/debian.rules: honour new nut-common-sysusers.conf [#3262]
  • drivers/snmp-ups.c: avoid strncat() altogether by using snprintf() [#3253]
  • drivers/snmp-ups.c: fix remaining strcat⇒strncat [#3255]
  • tools/driver-list-format.sh: update the error message to stress expected format [#3265]
  • data/driver.list.in: TAB-separate all the fields of GoldenMate entry [#3265]

2.48. 2026-01-15 Jim Klimov <jimklimov@gmail.com>

  • ci_build.sh: do not auto-test both NUT_LIBNUTPRIVATE_VARIANTS on MacOS for now, stick with default (no) [#2800]
  • appveyor.yml: build CI tarballs WITH_LIBNUTPRIVATE=true [#2800]

2.49. 2026-01-15 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am, clients/Makefile.am, common/Makefile.am, common/common-nut_version.c, drivers/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am, tools/nut-scanner/Makefile.am, tools/nutconf/Makefile.am: common/common-nut_version.c, */Makefile.am: Introduce libcommonversion-private.la for builds where we ENABLE_SHARED_PRIVATE_LIBS so programs have their versions built in and can consult what the library thinks about itself [#2800] Costs about 30Kb (Linux with debug) per binary (upsc) for the now re-embedded version data and a few methods to show it. But still saves 200K compared to a build without libnutprivate.
  • docs/nut.dict: add LiFePO [#3265]
  • docs/nut.dict: update spelling of GoldenMate [#3265]
  • data/driver.list.in: fix spelling of GoldenMate [#3265]
  • NEWS.adoc: update about GoldenMate LiFePo4 support in usbhid-ups [#3265]
  • drivers/idowell-hid.c: switch to double-digit version [#3265] Instead of bumping 0.2 to 0.3, bump to 0.20 - better future-proof

2.50. 2026-01-15 DeadEnd <45110141+DeadEnded@users.noreply.github.com>

  • data/driver.list.in, docs/nut.dict, drivers/idowell-hid.c: Add missing values for Goldenmate to iDowell subdriver This PR will add additional values to the iDowell subdriver for support of Goldenmate brand UPS using LiFePO4.

2.51. 2026-01-14 Luca Boccassi <luca.boccassi@gmail.com>

  • Makefile.am, autogen.sh, configure.ac, docs/configure.txt, docs/nut.dict, scripts/systemd/.gitignore, scripts/systemd/Makefile.am: Install sysusers.d config for user/group Ubuntu, debian and other distro create the nut user/group pair by default in their packages. Add a sysusers.d config file and install it. This configuration file will create the configured user/group pair on first boot/factory reset/package installation, without requiring manual scripts or actions. This is very important for image-based OSes, but it is useful in other cases too, to allow using declarative configuration instead of scripts. https://www.freedesktop.org/software/systemd/man/latest/sysusers.d.html This is especially useful in combination with the existing tmpfiles.d config that is already installed, and makes use of the configured user/group. With the sysusers.d addition, it works out of the box without manual scripting.

2.52. 2026-01-14 Jordan Rodgers <com6056@gmail.com>

  • drivers/usbhid-ups.c: fix format specifier warning

2.53. 2026-01-14 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/Makefile.am: revise dependencies with libcommonversion.la [#2800]
  • appveyor.yml: after_test: separate installation from follow-up commands into a separate shell call
  • NEWS.adoc: document --with-systemdsysusersdir=PATH addition [#3262]

2.54. 2026-01-13 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/main.h: debug-print "cbsz" as an unambiguously sized uintmax_t [#2800]
  • drivers/main.h, drivers/main.c, drivers/main-stub.c, tests/generic_gpio_utest.c, tests/driver_methods_utest.c: wrap calls to register/validate callbacks with ignorance of "address" and "unreachable code" warnings [#2800] Some compilers detect that a persistent structure’s address would never be NULL so some conditions are always FALSE and some code never runs. The downside of using macros vs. methods…
  • m4/ax_c_pragmas.m4, drivers/main.c, drivers/apc_modbus.c: introduce HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_MISSING_FIELD_INITIALIZERS{,_BESIDEFUNC} compilers) [#2800]
  • docs/man/Makefile.am: update LINKMAN_EXCLUDE_NONDRIVER preemptively based on source inspection [#3255]
  • docs/man/Makefile.am: do not list index.txt twice in SRC_ALL_PAGES
  • docs/man/Makefile.am: linkman-driver-names.txt: do not refer to blazer-common and nut_usb_addvars as if they were standalone driver man pages [#3255]

2.55. 2026-01-12 Paul Donald <newtwen+github@gmail.com>

  • drivers/blazer_usb.c, drivers/nutdrv_qx.c, drivers/usbhid-ups.c: drivers/*: align subdriver output instead of Acceptable values…: blah, blah print: Acceptable values…: blah1 blah2 …
  • drivers/main.c: drivers/main: clean up help output print the self describing parameter name first, then the descriptive text. Otherwise it’s a wall of text where one has to search for the parameter, because it’s unaligned.

2.56. 2026-01-12 Jordan Rodgers <com6056@gmail.com>

  • NEWS.adoc, drivers/usbhid-ups.c: usbhid-ups: improve handling of transient LIBUSB_ERROR_IO failures Some devices (e.g., CyberPower CP1500PFCLCD) have firmware bugs that cause random I/O errors on specific HID reports during normal polling. Rather than triggering expensive reconnection attempts that can fail in daemon mode, skip the failing report and continue with remaining polls. Add safety check to detect true device disconnection: if all polls fail during an update cycle (items_succeeded == 0), trigger reconnect as before. This improves stability especially in daemon mode while still detecting real disconnections via other error codes or complete poll failure. Fixes #3116

2.57. 2026-01-12 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/nut-scanner/Makefile.am: revise nut_scanner_LDADD to use bigger common lib just in case so far [#2800]
  • Makefile.am, clients/Makefile.am, drivers/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am, tools/nut-scanner/Makefile.am: /Makefile.am: for parallel builds not in souce root, refine libnutprivate dependency definitions (also wants libcommonversion) [#2800]
  • ci_build.sh: add NUT_LIBNUTPRIVATE_VARIANTS to (randomized) build matrix with BUILD_TYPE=default-all-errors and explicit requests via WITH_LIBNUTPRIVATE envvar [#2800]
  • drivers/main.h: validate_upsdrv_callbacks(): do not fail when validating a newly made structure (with expected NULL references) [#2800]
  • tests/driver_methods_utest.c, tests/generic_gpio_utest.c: take note of NUT_DEBUG_LEVEL envvar [#2800]
  • drivers/main.h: validate_upsdrv_callbacks(): debug-log the values seen in upsdrv_callback_t structure as we go through it [#2800]
  • tests/generic_gpio_utest.c: do not segfault if aborting early [#2800]
  • drivers/main.h: fix init_upsdrv_callbacks() naming, assert correct inputs [#2800]
  • drivers/main.h: upsdrv_callback_t: separate sentinel from padding [#2800]
  • drivers/main.c, drivers/main.h: drivers/main.{c,h}: register_upsdrv_callbacks(): validate also struct size overall [#2800]
  • clients/Makefile.am, common/Makefile.am, configure.ac, drivers/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am, tools/nut-scanner/Makefile.am: Revise libnutprivate* file naming and libtool versioning [#2800] Once again, libtool versions are not plain SEMVERs!
  • ci_build.sh, scripts/Windows/build-mingw-nut.sh: default to --enable-shared-private-libs for Windows builds [#2800]
  • drivers/main.c, drivers/main.h: drivers/main.{c,h}: register_upsdrv_callbacks(): pass the callbacks as struct ptr, not raw big struct [#2800]
  • UPGRADING.adoc, common/Makefile.am, configure.ac, drivers/Makefile.am: configure.ac, common/Makefile.am, drivers/Makefile.am: version the libnutprivate* libraries, if made (avoid deployment surprises later on) [#2800]
  • drivers/main.c, drivers/main.h: drivers/main.{c,h}: add some portability checks that we load an expected structure with upsdrv_callbacks [#2800]
  • drivers/main.c, drivers/main.h: drivers/main.{c,h}: treat upsdrv_callback_t::upsdrv_info also as a pointer, not directly a structure [#2800]

2.58. 2026-01-11 rtm516 <ryantmilner@hotmail.co.uk>

  • test-ups.conf: Remove testing config
  • NEWS.adoc, test-ups.conf: Update news.adoc
  • drivers/nutdrv_qx.c, drivers/nutdrv_qx_hunnox.c: Add battery.charge to hunnox driver

2.59. 2026-01-11 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/Makefile.am, drivers/main-stub.c, drivers/main.c, drivers/main.h, tests/driver_methods_utest.c, tests/generic_gpio_utest.c: drivers/main-stub.c: separate from main.c and register_upsdrv_callbacks() to allow dynamic linking [#2800]
  • drivers/Makefile.am: libnutprivate-drivers-serial.la uses symbols from libnutprivate-drivers-common.la so link with it [#2800]
  • clients/Makefile.am, drivers/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am: */Makefile.am: wherever we define our own AM_C{,XX}FLAGS, be sure to refer to $(top_builddir)/include so partial builds also know about config.h [#2825 etc]

2.60. 2026-01-10 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/nut-scanner/Makefile.am: fix to use actual libnutprivate-common-client.la if building with ENABLE_SHARED_PRIVATE_LIBS [#2800]
  • common/Makefile.am, drivers/Makefile.am: fixup LDFLAGS for WIN32 builds of libnutprivate*.dll [#2800] …just in case - semi-natively under, MSYS2 the DLL files were built already
  • drivers/Makefile.am: fix nutdrv_qx_LDADD to use libnutprivate-drivers-serial.la when suitable [#2800]
  • clients/Makefile.am: fix upssched recipe to honour ENABLE_SHARED_PRIVATE_LIBS toggle [#2800]
  • clients/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am: /Makefile.am: fix other consumers of libcommon.la to honour ENABLE_SHARED_PRIVATE_LIBS toggle [#2800]
  • drivers/adelsystem_cbi.c, drivers/bcmxcp_usb.c, drivers/libshut.c, drivers/libusb0.c, drivers/libusb1.c, drivers/nutdrv_atcl_usb.c, drivers/nutdrv_qx_voltronic.c, drivers/powervar_cx.c, drivers/richcomm_usb.c, drivers/sms_ser.c, drivers/snmp-ups.c, drivers/tripplite_usb.c: drivers/*.c: refactor to not use unbounded sprintf()
  • drivers/mge-utalk.c: setvar(): refactor to not use unbounded sprintf(), and also not print into potentially NULL strchr()
  • tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: tools/nut-scanner/scan_*.c: refactor to not use unbounded sprintf()
  • NEWS.adoc, clients/upsmon.c, docs/nut.dict: clients/upsmon.c: wall(): refactor WIN32 case to not use unbounded sprintf()
  • NEWS.adoc: further removal of unbounded strcpy() usage [#3253]
  • tests/generic_gpio_liblocal.c: use snprintf() rather than strncpy() to avoid both truncation warnings and unterminated string practice
  • drivers/solis.c: use snprintf() rather than strncpy() to avoid both truncation warnings and unterminated string practice
  • drivers/nutdrv_qx_voltronic-axpert.c, drivers/nutdrv_qx_voltronic.c: drivers/nutdrv_qx_voltronic*.c: bump bitwarns[] to be same size as warns[] to avoid truncation
  • clients/upsstats.c: avoid unbounded strcpy(), especially for data coming from callers
  • tests/generic_gpio_liblocal.c: avoid unbounded strcpy()
  • drivers/adelsystem_cbi.c, drivers/belkinunv.c, drivers/generic_gpio_libgpiod.c, drivers/generic_modbus.c, drivers/masterguard.c, drivers/nutdrv_qx_masterguard.c, drivers/nutdrv_qx_voltronic-axpert.c, drivers/nutdrv_qx_voltronic.c, drivers/solis.c, drivers/upscode2.c: drivers/*: avoid unbounded strcpy()
  • common/setenv.c: avoid unbounded strcpy() just in case
  • docs/man/upsset.conf.txt: revise recommendations for CGI engine timeouts [#3219]
  • NEWS.adoc, UPGRADING.adoc, clients/upsstats.c, conf/upsstats-single.html.sample.in, conf/upsstats.html.sample.in, docs/man/upsstats.html.txt: clients/upsstats.c, docs/man/upsstats.html.txt, conf/upsstats*.html.sample.in, NEWS.adoc, UPGRADING.adoc: introduced @NUT_UPSSTATS_TEMPLATE@ magic token that HTML templates must start with [#3249, #3252]
  • clients/upsstats.c: display_template(): open HTML template in binary mode, so ftell()/fseek() work predictably [#3219] Fix rewinding FOREACHUPS command to the correct byte location on WIN32 (or other platforms with CR vs CRLF issues).
  • clients/upsstats.c: add call-stack tracing [#3249]

2.61. 2026-01-09 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am, clients/Makefile.am, common/Makefile.am, drivers/Makefile.am, scripts/Windows/Makefile.am, server/Makefile.am, tests/Makefile.am, tools/nut-scanner/Makefile.am: Refactor and tune back the ENABLE_SHARED_PRIVATE_LIBS implementation, so third-party code (clients, drivers) can build with minimal/no changes if using the NUT public shared libraries [#2800]
  • UPGRADING.adoc, clients/Makefile.am, clients/upsc.c, clients/upscmd.c, clients/upslog.c, clients/upsrw.c, common/upsconf.c, drivers/main.c, include/upsconf.h, server/upsd.c, tools/nut-scanner/Makefile.am: Implement callbacks for upsconf and parseconf methods that can be used with static and dynamic linked NUT programs [#2800]
  • NEWS.adoc, clients/upslog.c: clients/upslog.c: update help() text with a "*@host" example [#3083, #2756]

2.62. 2026-01-08 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, UPGRADING.adoc, common/Makefile.am, configure.ac, docs/configure.txt: configure.ac, common/Makefile.am, docs/configure.txt: introduce an option to --enable-shared-private-libs [#2800]
  • NEWS.adoc, clients/upsstats.c, conf/upsstats-single.html.sample.in, conf/upsstats.html.sample.in, docs/man/upsstats.html.txt, docs/nut.dict: NUT CGI upsstats (prog, doc, template): add links to expose device/all data as JSON docs [#3171]
  • docs/man/upsset.conf.txt, docs/nut.dict: docs/man/upsset.conf.txt: document recommendations about CGI timeout [#3219]
  • clients/cgilib.c: extractpostargs(): simplify the loop to avoid potential final parsearg() of leftovers [#3219]
  • clients/upsset.c, clients/cgilib.c: in cgilib, see if server tells us CONTENT_LENGTH, and on IIS truncate it by a byte; in upsset add a sacrificial sentinel into each HTML FORM [#3219]
  • clients/cgilib.c: extractpostargs(): revise debug logging [#3249]
  • drivers/openups-hid.c, drivers/usbhid-ups.c, NEWS.adoc, docs/nut.dict: fix "nobattery" alarm on OpenUPS devices [#3246]

2.63. 2026-01-07 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/cgilib.c: extractpostargs(): on WIN32, select() is a SOCKET concept and does not apply to STDIN [#3219]
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: clients/ups{set,stats,image}.c: on WIN32 initialize socket layer for select() to work [#3219]
  • clients/cgilib.c: extractpostargs(): troubleshoot incoming bytes [#3219]
  • clients/upsset.c, clients/cgilib.c: move the time-constrained read of POST data from STDIN from client code into common code [#3219]
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: clients/ups{set,stats,image}.c: setmode() actually seems to not be wide-spread; is available in WIN32 builds though, so constrain it to them [#3249]
  • clients/upsset.c: on WIN32 always extractpostargs() [#3207] …not sure if select() works as expected here, but NUT CGI under IIS keeps asking for login…
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: clients/ups{set,stats,image}.c: treat stdout as a binary stream for CGI on all platforms [#3207]
  • data/htmlcgi/index.html, data/htmlcgi/Makefile.am, NEWS.adoc: use a NUT favicon with CGI HTML pages
  • data/htmlcgi/bottom.html: populate with a bit of text so browser users know loading is completed and not stalled
  • docs/man/upsstats.html.txt: mention sibling upsstats-single.html early in the doc too
  • docs/man/upsset.conf.txt: suggest more ways of hiding/securing NUT CGI on a web server
  • docs/man/upsimage.cgi.txt, docs/man/upsset.cgi.txt, docs/man/upsset.conf.txt, docs/man/upsstats.cgi.txt, docs/man/upsstats.html.txt: docs/man/ups*.{cgi,html}.txt: refer to upsset.conf page about web server preparation for NUT CGI [#3207]
  • conf/.gitignore, conf/Makefile.am, ….html.sample ⇒ upsstats-single.html.sample.in}, …psstats.html.sample ⇒ upsstats.html.sample.in}, configure.ac: Convert conf/upsstats*.html.sample files into .in templates to consider EXEEXT where applicable (e.g. WIN32) [#3207]
  • NEWS.adoc, docs/nut.dict: update and restructure news for 2.8.5 cycle
  • common/common.c, scripts/Windows/wininit.c: scripts/Windows/wininit.c: err on the safe side and allocate buffers sized NUT_PATH_MAX \+ 1 (for the NUL byte)
  • common/common.c, common/parseconf.c: generalize the WIN32 UNC localhost prefix chop-off [#3207]
  • clients/upsset.c, clients/upsstats.c: debug-trace which config file we try to use [#3207]
  • common/parseconf.c: pconf_file_begin(): extend limited UNC path support on WIN32 builds [#3207] Let CGI work under IIS with \\?\c:\... paths to config files. TOTHINK: Maybe move this closer to GetModuleName() calls?

2.64. 2026-01-06 Yifeng Li <tomli@tomli.me>

  • drivers/huawei-ups2000.c: call ser_close() before modbus_connect(), fix #3244. In drivers/huawei-ups2000.c, the serial port is opened twice. Once by ser_open() to manually perform device identification, once by modbus_connect() for communicating with the UPS after identification succeeds. However, holding two file descriptors of the same serial port is problematic on Windows, even if they’re not actually used at the same time. A serial port is usually opened on Windows via CreateFileA() with dwShareMode = 0, which is done by libmodbus. According to the Win32 API documentation: > If this parameter is zero and CreateFile succeeds, the file or device > cannot be shared and cannot be opened again until the handle to the > file or device is closed. This is responsible for the following error on Windows: modbus_connect: unable to connect: No error Driver failed to start (exit status=1) This commit leaves only the raw ser_open() call in upsdrv_initups(), the modbus_connect() call is deleted to avoid opening the same serial port again. After device identification succeeds later in ups2000_device_identification() - called by upsdrv_initinfo(), the raw serial port is closed. Once at this point, modbus_connect() is called, just before upsdrv_initinfo() returns.

2.65. 2026-01-06 Jim Klimov <jimklimov+nut@gmail.com>

  • configure.ac, data/htmlcgi/header.html.in, docs/configure.txt, docs/man/upsset.conf.txt, NEWS.adoc, docs/nut.dict: introduce --with-cgi-uri [#3207]
  • clients/upsimage.c, clients/upsset.c, clients/upsstats.c: clients/ups{set,stats,image}.c: support NUT_DEBUG_LEVEL envvar in CGI clients [#3207]
  • docs/man/upsset.conf.txt: note also the "html" directory for pretty UI [#3207]
  • tools/nut-scanner/scan_nut_simulation.c, NEWS.adoc: use the more dynamic confpath() rather than built-in CONFPATH
  • drivers/snmp-ups.c, docs/man/snmp-ups.txt: use the more dynamic confpath() rather than built-in CONFPATH, and document the (incomplete) *mib.conf support
  • clients/upsstats.c: use the more dynamic confpath() rather than built-in CONFPATH [#3207] Already done for other files, only hosts.conf was seeked wrongly.
  • docs/man/upsset.conf.txt: revise MS IIS setup for NUT CGI experimentally [#3207]
  • appveyor.yml: comment about "mingwXX" in archived N4W builds [#3207]
  • docs/man/upsset.conf.txt, docs/nut.dict, NEWS.adoc: documented setup of Microsoft IIS to host the NUT CGI programs [#3207]
  • clients/upsset.c, clients/upsstats.c, conf/upsset.conf.sample, conf/upsstats.html.sample, configure.ac, data/htmlcgi/header.html.in, docs/man/upsstats.cgi.txt, docs/man/upsstats.html.txt: Consider EXEEXT in CGI programs, templates and docs [#3207]

2.66. 2026-01-04 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am: fix typos in "make distcheck-completeness" goal [#2829]
  • docs/Makefile.am: fix typo with paths [#1209]

2.67. 2026-01-03 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/Makefile.am: EXTRA_DIST the OBS logos [#1209]
  • docs/images/ci/obs-logo.png: actually attach the logo file [#1209]

2.68. 2026-01-02 Jim Klimov <jimklimov+nut@gmail.com>

  • README.adoc: updated entry about Gandi.Net
  • README.adoc: downsize obs-logo.png to match others [#1209]
  • README.adoc: README.adoc, docs/images/ci/obs-logo.png: use another better visible OBS logo [#1209] Fetched from https://upload.wikimedia.org/wikipedia/commons/3/35/Obs-logo.png
  • README.adoc, docs/images/ci/obs-logo.svg: use a better visible OBS logo [#1209] Copied from https://github.com/openSUSE/open-build-service/blob/master/docs/obs-logo.svg as of their commit 43c17f6
  • README.adoc, docs/nut.dict, docs/images/ci/openSUSEBuildService.png: reference openSUSE Build Service as a part of NUT CI farm [#1209] Use logo copied from https://build.opensuse.org/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19—043a458c5587aea3e3a61e9727a75569eab11948/openSUSEBuildService.png
  • README.adoc: reshuffle acknowledgements, so DigitalOcean is more prominently the NUT CI farm hosting provider (and Fosshost, like Travis CI, is history) [#2192]
  • scripts/systemd/nut-driver-enumerator-daemon-activator.service.in, scripts/systemd/nut-driver-enumerator-daemon.service.in, scripts/systemd/nut-driver-enumerator.service.in, scripts/systemd/nut-driver@.service.in, scripts/systemd/nut-monitor.service.in, scripts/systemd/nut-server.service.in, scripts/systemd/nut-udev-settle.service.in: scripts/systemd/nut-*.service.in: fix use of MODE in ExecCondition to also consider "none" [#3233] Also fix nut-monitor.service (upsmon) to still start for a "netserver": it is a full setup like "standalone", just with not only localhost clients expected.
  • configure.ac, scripts/systemd/.gitignore, scripts/systemd/Makefile.am, …/systemd/{nut-udev-settle.service ⇒ nut-udev-settle.service.in}: configure.ac, scripts/systemd/.gitignore, scripts/systemd/Makefile.am: rename nut-udev-settle.service into a .in template, handle ExecCondition here too [#3233]
  • NEWS.adoc, configure.ac, …/nut-driver-enumerator-daemon-activator.path.in, …t-driver-enumerator-daemon-activator.service.in, …/nut-driver-enumerator-daemon.service.in, scripts/systemd/nut-driver-enumerator.path.in, scripts/systemd/nut-driver-enumerator.service.in, scripts/systemd/nut-driver.target.in, scripts/systemd/nut-driver@.service.in, scripts/systemd/nut-logger.service.in, scripts/systemd/nut-monitor.service.in, scripts/systemd/nut-server.service.in, scripts/systemd/nut-sleep.service, scripts/systemd/nut-systemd.preset, scripts/systemd/nut-udev-settle.service, scripts/systemd/nut.target.in: scripts/systemd/*, configure.ac, NEWS.adoc: introduce @SYSTEMD_AVAILABLE_EXEC_CONDITION@ and put ExecCondition for MODE values into more units; depend from NDE path units also on nut.conf changes; bump systemd integration copyrights [#3233]

2.69. 2025-12-30 Jim Klimov <jimklimov+nut@gmail.com>

  • server/upsd.c: fix WIN32 logging of server→Event and ups→sock_fd as HANDLE (pointer) [#3207]
  • server/upsd.c: fix botched indentations [#3237]
  • tests/NIT/Makefile.am, tests/NIT/nit.sh: consider EXEEXT (e.g. with NUT for Windows builds) …and refactor part of runcmd() into dual-use execcmd()
  • tests/NIT/Makefile.am, tests/NIT/nit.sh: pass/guess {,TOP_}{BUILD,SRC}DIR values more reliably

2.70. 2025-12-29 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/NIT/nit.sh: add tests for upsc -j JSON outputs [#3178]
  • scripts/Windows/wininit.c, docs/man/nut.exe.txt, NEWS.adoc: try to stop the service before unregistering it [#3207]
  • NEWS.adoc, scripts/Windows/wininit.c: scripts/Windows/wininit.c: SvcInstall(): try to set a nice service description [#3207]
  • scripts/Windows/wininit.c: track also upsdrvctl_pid and all daemon handles; restart dead/killed daemons [#3207]
  • scripts/Windows/wininit.c: debug fault of WaitForMultipleObjects() and do not overflow maxhandle [#3207]
  • server/upsd.c: mainloop(): log DRIVER entries as such (not UPS) for consistency with later processing messages [#3207]
  • server/upsd.c: mainloop(): poll newly connected UPS right away, not in next cycle [#3207]
  • include/common.h: fix fallback WIN32 definition of INVALID_SOCKET to be certain [#3207]
  • server/upsd.c: mainloop(): track also nfds_considered (e.g. discarded as invalid), and check that WIN32 event loop handle is valid [#3207]
  • NEWS.adoc, clients/nutclient.cpp, clients/upsclient.c, docs/nut.dict, drivers/apcupsd-ups.c, server/upsd.c, tools/nut-scanner/nutscan-init.c: upsd, nut-scanner, libs, NEWS.adoc: only process WSAStartup() once [#3237]
  • server/upsd.c, NEWS.adoc: setuptcp(): copy over server→Event (WIN32) when handling "LISTEN *" [#3237]
  • server/upsd.c: setuptcp(): debug-log the FD occupied by new listener [#3207] …and WIN32 event, if applicable
  • server/upsd.c: setuptcp(): error-check WIN32 event creation and select subscription [#3207]
  • server/upsd.c: main(), poll_reload(): revise WIN32 MAXIMUM_WAIT_OBJECTS vs. maxconn (array size) and maxalloc (check) [#3207]
  • server/upsd.c: server_load(): log ANY address binding like we do for localhost [#3207]
  • server/upsd.c: server_load(): revise tried/succeeded logging [#3207]
  • server/upsd.c: mainloop(): revise honouring maxconn (and log about it) [#3207]
  • server/upsd.c, include/common.h: mainloop(): fix WIN32 debug printouts for SOCKET type [#3207]

2.71. 2025-12-28 Jim Klimov <jimklimov+nut@gmail.com>

  • UPGRADING.adoc, clients/nutclient.cpp, clients/nutclient.h, clients/upsclient.c, configure.ac, scripts/obs/nut.spec, server/conf.c, server/upsd.c, tests/cpputest-client.cpp, tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_nut.c: Rename autoconf variable PORT to NUT_PORT [#3238] …and test variables from NUT_* to env_NUT_*
  • clients/nutclient.cpp, clients/nutclient.h: clients/nutclient.{h,cpp}: use NUT-defined default PORT value if possible [#3238]
  • server/upsd.c: mainloop(): log also FDs we are polling [#3207]
  • server/upsd.c: listen_add(): be sure a new (invalid) server→Event is properly initialized [#3207]
  • include/common.h: use safer definitions of TYPE_FD* related macros for various platforms [#3207]

2.72. 2025-12-26 Jim Klimov <jimklimov+nut@gmail.com>

  • server/upsd.c: setuptcp() WIN32: associate with event loop only if sock_fd is valid [#3207]
  • server/upsd.c: mainloop(): throttle-sleep if failed a cycle in WIN32 and POSIX builds [#3207]
  • server/upsd.c: mainloop(): log FDs watched in WIN32 and POSIX builds [#3207]
  • docs/man/nut.exe.txt: add hints about NUT daemon startup troubleshooting [#3207]
  • scripts/Windows/wininit.c, NEWS.adoc, docs/man/nut.exe.txt: add "nut.exe restart" action [#3207]
  • scripts/Windows/wininit.c, NEWS.adoc: pepper with debug messages, especially for errors and status changes [#3207]
  • common/common.c: refactor getfullpath() and getprocname() WIN32 error reporting [#3207]
  • Makefile.am: install-win-bundle-thirdparty: do not install already-present and same DLLs into bindir (re-runs without clean)

2.73. 2025-12-25 David Marzal <2069735+Marzal@users.noreply.github.com>

  • scripts/systemd/nut-server.service.in: Don’t assume sh to be on SBINDIR Not sure if there is a better way to call sh without assuming a static dir. Something like command -v sh

2.74. 2025-12-24 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, docs/man/nut.exe.txt, docs/nut.dict, scripts/Windows/wininit.c: scripts/Windows/wininit.c: add "nut.exe status" and debug-ability of the start/stop/status actions [#3207]
  • NEWS.adoc, clients/upsclient.c, common/common.c, drivers/apcupsd-ups.c, include/common.h, server/upsd.c: clients/upsclient.c, common/common.c, etc: fix inet_ntopAI() and inet_ntopSS() helper thread unsafety [#3234]
  • common/common.c: getfullpath(): fix infinite loop [#3207]
  • common/common.c: getfullpath(): rephrase debug log entries [#3207]

2.75. 2025-12-24 David Marzal <2069735+Marzal@users.noreply.github.com>

  • scripts/systemd/nut-server.service.in: Just launch nut-server systemd servide if we are not on netclient mode Tested with ExecCondition=/bin/sh -c [ "$MODE" != "netclient" ] an

2.76. 2025-12-23 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am: install-win-bundle-thirdparty: typo fix (broken DLL delivery) [fallout of PR #3222, issue #3219]
  • docs/man/must_ep2000pro.txt: carry over a comment from PR description [#3228]

2.77. 2025-12-22 Jim Klimov <jimklimov@gmail.com>

  • docs/man/must_ep2000pro.txt: rephrase for better English [#3228]

2.78. 2025-12-22 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc: update for must_ep2000pro driver [#3228]
  • scripts/obs/Makefile.am: refactor DEB part of _preinstallimage recipe [#1209]
  • scripts/obs/Makefile.am, scripts/obs/.gitignore, scripts/obs/README.adoc, docs/nut.dict: add helper goal to generate a _preinstallimage file [#1209]
  • configure.ac, docs/configure.txt, NEWS.adoc: do not automatically --enable-extapi-enphase wherever possible just because we can; document the option [#2813] This is a niche feature for users who have Enphase solar devices and portal subscription.

2.79. 2025-12-21 Mikhail Mironov <mike@darkmike.ru>

  • docs/man/must_ep2000pro.txt: Correct documentation formating
  • drivers/must_ep2000pro.c: Correct format for signed datatypes

2.80. 2025-12-20 Mikhail Mironov <mike@darkmike.ru>

  • drivers/must_ep2000pro.c: Fixed error handling when calling shutdown.return
  • docs/nut.dict: Add words to nut.dict for pass spellcheck
  • data/driver.list.in, docs/man/Makefile.am, docs/man/must_ep2000pro.txt, drivers/Makefile.am, drivers/must_ep2000pro.c: Driver for UPS MUST EP2000Pro

2.81. 2025-12-18 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: avoid using alternation in SED [#3099]

2.82. 2025-12-17 Jim Klimov <jimklimov+nut@gmail.com>

  • common/common.c, include/common.h, scripts/Windows/wininit.c, server/upsd.c, drivers/upsdrvctl.c: refactor with a getfullpath2() to mix configure script options and hard-coded fallbacks [#3207]
  • NEWS.adoc: document fixes for WIN32 path resolution [#3207, #3063, #3065, #3219]
  • common/common.c: confpath(): first try getfullpath(CONFPATH), only then fall back to getfullpath(PATH_ETC) [#3207]
  • common/common.c: WIN32 getfullpath(): fix some off-by-one errors and add debug tracing [#3207]
  • drivers/upsdrvquery.c: fix logging of failed WaitNamedPipe
  • tests/NIT/nit.sh: report if GID/UID was not found to offset "if test…" not-a-number errors [#1209]
  • scripts/Windows/build-mingw-nut.sh: fix back the location for NUT config files in reference WIN32 builds [broken by #3049]
  • scripts/Windows/wininit.c: also use PATH_SBIN to upsdrvctl stop [#3207, #3065]
  • drivers/upsdrvctl.c: look for drivers in DRVPATH in WIN32 too [#3207, #3065]
  • common/common.c: getfullpath(): allow passing "relative_path" with absolute-ish values from NUT build and convert them to be relative to the installed binary [#3207]
  • common/common.c: getfullpath(): avoid "DIRNAME../etc" kind of bugs

    • should be "DIRNAME/../etc" [#3219]
  • common/common.c: refactor getfullpath() style and comments [#3207]
  • Makefile.am: all-fanout-maybe: report when optimized build is finished and we hand off to "make all" default implementation (may regenerate headers again) [#3039]
  • Makefile.am: do not default NUT_VERSION_H_GENERATED=true (at the cost that we would retry it once in "make all" default implementation) [#3039]
  • common/Makefile.am, include/Makefile.am, tools/nut-scanner/Makefile.am: do not skip rebuilding of nut_version.h if it is currently missing [#3039] May have been removed since, e.g. in make check-parallel-builds.
  • tools/nut-scanner/Makefile.am, include/Makefile.am, common/Makefile.am: streamline debugging of MAINTAINER_GENERATE_HEADER_DEBUG [#3039]
  • common/Makefile.am, tools/nut-scanner/Makefile.am: consider NUT_VERSION_H_GENERATED in transitive dependency definition [#3039]
  • docs/nut-versioning.adoc: do not group non-C usages under "Use in C code" title
  • tools/semver-compare.sh: for "test" action, quietly ignore trailing "]" or "]]" and warn if any other trailing args exists and would be ignored [#3055]
  • tools/semver-compare.sh: wrap help text so it fits in 80 cols (mostly) [#3055]
  • docs/nut-versioning.adoc, docs/nut.dict: document semver-compare.sh [#3055]
  • scripts/Solaris/reset-ups-usb-solaris.sh.sample: use configure-script or otherwise detected functional GREP/EGREP if possible [#3099]
  • scripts/Windows/dllldd.sh, scripts/Windows/build-mingw-prereqs.sh, Makefile.am: use configure-detected GREP and EGREP if possible [#3099]
  • scripts/installer/common/ipp-status, scripts/installer/common/shutdown, scripts/installer/install.sh: scripts/installer/*: recognize primary/secondary upsmon roles [#2288, #840]
  • scripts/installer/common/ipp-os-shutdown, scripts/installer/common/ipp-status, scripts/installer/install.sh, scripts/installer/make_package.sh: scripts/installer/*: use configure-script or otherwise detected functional GREP/EGREP if possible [#3099]
  • scripts/installer/aix/aix_init, scripts/installer/common/aix_init, scripts/installer/common/init, scripts/installer/common/ipp-event.sh, scripts/installer/common/ipp-host-shutdown.sample, scripts/installer/common/ipp-notifier.sh, scripts/installer/common/ipp-os-shutdown, scripts/installer/common/ipp-shutdown-daemon.sh, scripts/installer/common/ipp-status, scripts/installer/common/ipp-wrapper, scripts/installer/common/shutdown, scripts/installer/common/solaris_init, scripts/installer/install.sh, scripts/installer/make_package.sh, scripts/installer/solcmn/solaris_init, scripts/installer/uninstall-ipp: scripts/installer/*: bump copyrights for NUT community maintained version [#2288, #2621]

2.83. 2025-12-16 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/semver-compare.sh: with fixed-width strings instead of numbers, we can forgo the "sort -n", it is confusing on some systems [#3055] NetBSD, looking at you: ( echo 0001 0030 ; echo 0001 0003 ) \| sort inverses order with sort -n
  • tools/semver-compare.sh: rectify printf vs octal numbers (if there are leading zeroes) [#3055]
  • tools/gitlog2version.sh, tools/semver-compare.sh: fix numeric envvar/CLI arg evaluation for ksh [#3055] …where [ '' -ge 0 ] ; echo $? does not report a non-numeric error, but succeeds instead.
  • tools/gitlog2version.sh: make SCRIPT_DIR always known (so we can find semver-compare.sh helper) [#3055]
  • tests/nut-driver-enumerator-test.sh: add testcase_semver_compare() [#3055]
  • tools/semver-compare.sh: add "[[" alias to test action, and non-equality checks [#3055]
  • tools/semver-compare.sh: add dashless aliases to expand and strip actions [#3055]
  • tests/nut-driver-enumerator-test.sh: update comments for testcase_gitlog2version() [#3055]
  • tests/nut-driver-enumerator-test.sh: update head comment [#3055]
  • tools/semver-compare.sh: add an option to reverse-sort the versions [#3055]
  • NEWS.adoc, tools/Makefile.am, tools/gitlog2version.sh, tools/semver-compare.sh: tools/semver-compare.sh, tools/gitlog2version.sh: refactor expand/strip logic out of gitlog2version.sh; add more abilities to it [#3055]

2.84. 2025-12-15 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/FAQ.txt, docs/nut.dict: write down ideas from discussions about power race avoidance and killing UPS power when handling an outage [#1950, #2836] Mentored-by: Joshua M. Clulow <josh@sysmgr.org> Mentored-by: Lennart Poettering <lennart@poettering.net>
  • NEWS.adoc, docs/nut-versioning.adoc, tests/nut-driver-enumerator-test.sh, tools/gitlog2version.sh: tools/gitlog2version.sh, tests/nut-driver-enumerator-test.sh, docs/nut-versioning.adoc: introduce NUT_VERSION_STRIP_LEADING_ZEROES [#3055]
  • docs/nut-versioning.adoc: document more about the NUT_VERSION_QUERY=VER5X etc modes [#3055]
  • tools/gitlog2version.sh: move filter_extra_width() up and rename to filter_add_extra_width() [#3055]
  • docs/nut-versioning.adoc: rebalance examples for VER5X and DESC5X to consume about the same column width [#3055]

2.85. 2025-12-11 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/gitlog2version.sh: simplify use of printf (variable width support is not ubiquitous) [#3055]
  • docs/nut-versioning.adoc: more fix to asciidoc markup
  • tools/gitlog2version.sh: filter_extra_width(): fix formatting string for printf() [#3055] busybox sh printf is strict enough to care about the dot
  • tests/nut-driver-enumerator-test.sh: fix running the test suite itself by ksh [#3055] By default, VAR=VAL cmd sets VAR=VAL in the current shell and does not inherit it into cmd (nor reset it after the call).
  • tools/gitlog2version.sh: avoid substituting backslash-N via SED [#3055, #3099]
  • tools/gitlog2version.sh: avoid using alternation in SED [#3055, #3099]
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: substitute @SED@ to hopefully have the version with alternation support [#3099]
  • docs/nut-versioning.adoc: list example values in tables always as bullet-points so monospace is honoured by asciidoc
  • docs/nut-versioning.adoc: revise asciidoc markup (broken in the table context)
  • docs/nut-versioning.adoc: note that we MAY sometime return to the more idiomatic adherence to SEMVER standard and/or even/odd numbering to maintain release and development branches
  • NEWS.adoc: document changes of gitlog2version.sh and tests for it [#3055]
  • tools/gitlog2version.sh, tests/nut-driver-enumerator-test.sh: add a fallback mode for NUT_VERSION_DEFAULT=X.Y.Z(.W)\+gHASH (missing the commit count) [#3055]
  • tools/gitlog2version.sh: fix escaping of doublequote missed earlier [#3196]
  • docs/nut-versioning.adoc, docs/nut.dict, tools/gitlog2version.sh: tools/gitlog2version.sh: getver_default(): parse non-RC NUT_VERSION_FORCED values in legacy mode [#3055]
  • tests/nut-driver-enumerator-test.sh: extend with some tests for tools/gitlog2version.sh [#3055] Overall, we want to make sure the script works across different shell interpreters and toolkits, and that a NUT_VERSION_FORCED saved for a dist tarball would be consistently treated by the non-git mode as well.
  • tests/nut-driver-enumerator-test.sh: add a FAILFAST=true mode support [#3055]
  • tools/gitlog2version.sh: fix RC version comparison in legacy mode
  • tools/gitlog2version.sh, docs/nut-versioning.adoc: introduce NUT_VERSION_QUERY=VER5x etc. to simplify alphanumeric comparisons of different NUT releases [#3055]
  • tools/gitlog2version.sh: only read VERSION_FORCED(_SEMVER) file(s) if respective envvars were not passed in env [#3055]
  • tools/gitlog2version.sh: update comments

2.86. 2025-12-09 Tormod Volden <debian.tormod@gmail.com>

  • drivers/usb-common.c: usb-common.c: Fix truncation in nut_usb_get_string() References #3201

2.87. 2025-12-09 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/usb-common.c: nut_usb_get_string(): combine the fix for "buflen vs ret/2" with log warning from issue discussion [#3201, #3211] Proposed-by: Tormod Volden <debian.tormod@gmail.com>
  • NEWS.adoc: document the fix for nut_usb_get_string() [#3211]

2.88. 2025-12-07 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am, include/Makefile.am: introduce NUT_VERSION_H_GENERATED to pass run-time skip of active include/nut_version.h regeneration [#3039]
  • NEWS.adoc, drivers/libhid.c, drivers/usb-common.c: NEWS.adoc, drivers/libhid.c::HIDGetIndexString(), drivers/usb-common.c::nut_usb_get_string(): trace the bytes going around [#3201, #2604]
  • drivers/libhid.c: improve debugability of HIDDumpTree() Make it easier to see in debug log where processing of an entry starts

2.89. 2025-12-02 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/01-make-dist.yml: fix dist/doc tarballs of PRs being made for target branch in fact
  • docs/man/meanwell_ntu.txt: minor style and phrasing changes [#3206]
  • drivers/meanwell_ntu.c: adjust indentations etc. with NUT style guide [#3206]
  • docs/man/meanwell_ntu.txt: link to vendor doc file, it is very good [#3206]
  • docs/man/meanwell_ntu.txt, drivers/meanwell_ntu.c: suggest and disregard similarity with Megatec Qx protocol [#3206]
  • docs/man/meanwell_ntu.txt: fix dangling white-space chars [#3206]
  • docs/man/meanwell_ntu.txt: fix UTF char in ASCII text [#3206]

2.90. 2025-11-30 jhite1234 <jhite@bebuggin.com>

  • docs/man/meanwell_ntu.txt: spelling
  • docs/man/meanwell_ntu.txt: NUT style formatting and linkman useage
  • drivers/meanwell_ntu.c: more CI fixes for OmniOS and OpenIndiana
  • drivers/meanwell_ntu.c: small updates for CI fixes

2.91. 2025-11-30 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/meanwell_ntu.c: make DRIVER_VERSION double-digit [#3206]
  • NEWS.adoc: introduced meanwell_ntu driver [#3206]

2.92. 2025-11-29 jhite1234 <jhite@bebuggin.com>

  • docs/nut.dict: dictionary update
  • drivers/meanwell_ntu.c: fixes for CI build checks
  • drivers/meanwell_ntu.c: meanwell_ntu: drop termios.h include
  • data/driver.list.in: Add Mean Well NTU Series entry to driver.list.in
  • drivers/meanwell_ntu.c: meanwell_ntu: use experimental.* vars and standard ups.mode
  • docs/man/Makefile.am, drivers/Makefile.am: Add Mean Well NTU inverter/UPS driver
  • docs/man/meanwell_ntu.txt, drivers/meanwell_ntu.c: Add Mean Well NTU inverter/UPS driver

2.93. 2025-11-29 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/config-prereqs.txt: refer also to "Building NUT for in-place upgrades or non-disruptive tests" from "Prerequisites for building NUT on different OSes" as the two chapters are closely coupled
  • docs/config-prereqs.txt: revise instructions for (now older) Debian 12

2.94. 2025-11-24 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc: update about fixed back/double quoted shell scripting nuances [#3196]
  • Makefile.am, docs/Makefile.am, docs/man/Makefile.am, scripts/python/Makefile.am, scripts/python/module/Makefile.am, tests/Makefile.am, tools/Makefile.am: */Makefile.am: revise shell script syntax with backticks and double-quotes; single-quote Make variable expansions into shell [#3196]
  • docs/docinfo.xml.sh.in: revise shell script syntax with backticks and double-quotes [#3196]
  • docs/ci-farm-lxc-setup.txt: revise shell script syntax with backticks and double-quotes [#3196]
  • tools/nut-ddl-dump.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tools/nut-dumpdiff.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tools/gitlog2version.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tools/driver-list-format.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/valgrind/valgrind.sh.in: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/upsdrvsvcctl/upsdrvsvcctl.in: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/subdriver/gen-usbhid-subdriver.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/subdriver/gen-snmp-subdriver.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/python/app/NUT-Monitor: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/obs/nut.spec: revise packaging and init shell script syntax with backticks and double-quotes [#3196]
  • scripts/installer/aix/aix_init, scripts/installer/common/init, scripts/installer/common/ipp-event.sh, scripts/installer/common/ipp-host-shutdown.sample, scripts/installer/common/ipp-os-shutdown, scripts/installer/common/ipp-shutdown-daemon.sh, scripts/installer/common/ipp-status, scripts/installer/common/ipp-wrapper, scripts/installer/common/shutdown, scripts/installer/install.sh, scripts/installer/uninstall-ipp: scripts/installer/*: revise packaging and init shell script syntax with backticks and double-quotes [#3196]
  • scripts/Aix/nut.init.in, scripts/Solaris/postinstall.in, scripts/Solaris/preinstall.in, scripts/Solaris/preremove.in, scripts/Solaris/reset-ups-usb-solaris.sh.sample: scripts/{Aix,Solaris}: revise packaging and init shell script syntax with backticks and double-quotes [#3196]
  • scripts/fuse/execfuse-nut/getattr, scripts/fuse/execfuse-nut/read_file, scripts/fuse/execfuse-nut/readdir: scripts/fuse/*: revise shell script syntax with backticks and double-quotes [#3196]
  • scripts/Windows/build-mingw-nut.sh, scripts/Windows/build-mingw-prereqs.sh, scripts/Windows/dllldd.sh: scripts/Windows/*.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • configure.ac, m4/ax_realpath.m4, m4/ax_realpath_lib.m4, m4/nut_check_aspell.m4, m4/nut_check_libavahi.m4, m4/nut_check_libfreeipmi.m4, m4/nut_check_libgd.m4, m4/nut_check_libltdl.m4, m4/nut_check_libmodbus.m4, m4/nut_check_libneon.m4, m4/nut_check_libnetsnmp.m4, m4/nut_check_libnss.m4, m4/nut_check_libopenssl.m4, m4/nut_check_libregex.m4, m4/nut_check_libusb.m4, m4/nut_check_libwrap.m4, m4/nut_check_python.m4, m4/nut_compiler_family.m4: configure.ac, m4/*.m4: revise shell script syntax with backticks and double-quotes [#3196]
  • ci_build.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • autogen.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tests/NIT/nit.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tests/nut-driver-enumerator-test.sh: revise shell script syntax with backticks and double-quotes [#3196]
  • tests/nut-driver-enumerator-test.sh: double-quote $0 name inspection, safely for shell script syntax with backticks and double-quotes [#3196]
  • tests/nut-driver-enumerator-test.sh: support passing-or-failing tests (for syntax not supported by all of ksh implementations) [#3196]
  • tests/nut-driver-enumerator-test.sh: report if the failure could be due to unsupported or not-found shell interpreter [#3196]

2.95. 2025-11-23 Jim Klimov <jimklimov+nut@gmail.com>

  • tests/nut-driver-enumerator-test.sh: see now backticks and doublequotes play together in different shells [#3196]

2.96. 2025-11-23 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • NEWS.adoc: Update the PR number.
  • NEWS.adoc, drivers/nutdrv_qx.c: nutdrv_qx: Hides QX_FLAG_NONUT variables from syslog. One can see them by raising the debug level. Tested on A1000

2.97. 2025-11-22 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am: shellcheck-nde: be sure to test freshly generated script text
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in, NEWS.adoc: revise message logging in the script [#3194]

2.98. 2025-11-21 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/man/nut.txt: update sentence markup; expand on built-in vs configurable use of user/group accounts at run-time
  • docs/common.xsl, docs/man/asciidoc.conf.in: inherit style of anchorjs permalinks from the (heading) element they are in [#3185]
  • drivers/tripplite_usb.c, NEWS.adoc: bump the version and add news entry for PR #3192

2.99. 2025-11-20 rewsssiestedbo <48805403+rewsssiestedbo@users.noreply.github.com>

  • drivers/tripplite_usb.c: Update tripplite_usb.c to fix issue 3191 Use correct value (DEFAULT_UPSID) for the actual unit_id default value instead of a 32-bit -1 value. DEFAULT_UPSID is 65535, or a 16-bit -1 value.

2.100. 2025-11-20 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/nutdrv_qx_masterguard.c: driver/nutdrv_qx_masterguard.c: bump version [#3181]

2.101. 2025-11-19 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/Makefile.am, Makefile.am, NEWS.adoc: introduce SPELLCHECK_QUICK=true toggle for interactive mode to not re-check documents that passed with older nut.dict Follow-up to #2871
  • docs/common.xsl, docs/man/asciidoc.conf.in, COPYING, NEWS.adoc, docs/nut.dict: stash a copy of "AnchorJS - v5.0.0 - 2023-01-18" to add permalinks to HTML sections [#3185] One for docbook ⇒ large HTML (single and chunked docs, technically also PDF but it will likely ignore the JavaScript or not see the tags where it goes), another for manpages via xhtml. Closes: #3185

2.102. 2025-11-17 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/nut.dict: add British "ageing" for the keyword on the progress in getting old [#3181]
  • docs/new-drivers.txt, docs/nut.dict: docs/new-drivers.txt: document addvar, getval and testvar, and nut_usb_addvars (and planned ser/modbus siblings) [#2419, #2748] Documentation addition triggered by discussion in #3181

2.103. 2025-11-12 atanas-vladimirov <34871743+atanas-vladimirov@users.noreply.github.com>

  • NEWS.adoc: Update the PR number.

2.104. 2025-11-12 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc: formatting and typo fixes for masterguard QX updates [#3181]
  • UPGRADING.adoc: new *.html.sample templates to consider [#3180]
  • clients/upsclient.c: upscli_splitaddr(): highlight that currently a "port" must be numeric
  • clients/upsc.c: return valid JSON documents also in case of error [#3178]
  • clients/Makefile.am, common/Makefile.am, include/Makefile.am, {common ⇒ include}/strjson.h: includes/strjson.h: keep common headers in one place [#3178]
  • clients/Makefile.am: limit use of libcommonstrjson.la to upsc and upsstats.cgi [#3178]
  • .github/workflows/01-make-dist.yml: shorten workflow name, move details into job name [#1400] The workflow name is a shared prefix now for the job itself and for final "URL" entry that poses as a GHA check result. A prefix too long hides valuable data, especially in the latter case.

2.105. 2025-11-12 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • NEWS.adoc, data/cmdvartab, docs/man/nutdrv_qx.txt, docs/nut-names.txt, docs/nut.dict, drivers/nutdrv_qx_masterguard.c: nutdrv_qx_masterguard: Adds a clear.fault.record instant command Also adds two experimental variables: - battery.ageing.factor ("Battery ageing factor in promille) and - battery.calibration.factor (Battery calibration factor in percent). Tested on A1000 and A2000 units
  • NEWS.adoc: Update the PR number.
  • NEWS.adoc, conf/upsstats-single.html.sample, conf/upsstats.html.sample: upsstats*.html.sample: Enhance model detection in upsstats HTML templates. Some devices lack ups.model, causing the CGI to incorrectly report "Not supported".
  • clients/Makefile.am: Make sure libcommonstrjson.la dependencies exist

2.106. 2025-11-11 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/01-make-dist.yml: Create new GH Check report via shell/cURL [#1400]
  • .github/workflows/01-make-dist.yml, NEWS.adoc, docs/download.txt: drop experiments with updates of GH Check reports, and noise with PR/commit comments - leave just a new GH Check entry with text of the URL (and link to details page with clickable URL) [#1400]
  • clients/upsmon.c, scripts/systemd/nutshutdown.in: comments to clarify that POWERDOWNFLAG can happen on both NUT servers and pure client machines
  • configure.ac, NEWS.adoc: align British vs Americanish English spelling [#1400]
  • clients/upsstats.c: json_escape(): reduce the char value range-check [#3171] Avoid comparison is always true due to limited range of data type warning.

2.107. 2025-11-11 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • common/strjson.c, common/strjson.h: strjson.c, strjson.h: Add newline at end of files
  • NEWS.adoc: Update the PR number.
  • Makefile.am, NEWS.adoc, clients/Makefile.am, clients/upsc.c, clients/upsstats.c, common/Makefile.am, common/strjson.c, common/strjson.h, docs/man/upsc.txt: upsc: Add -j option for JSON output This commit introduces a new -j command-line flag to upsc to provide machine-readable JSON output for all operating modes. To support this and share logic with upsstats, the JSON string escaping logic has been refactored into a new, reusable module: - A new helper function json_print_esc() now lives in common/strjson.c - common/Makefile.am builds this as a new libcommonstrjson.la library. - clients/Makefile.am links both upsc and upsstats against this new library and adds the common/ include path. - upsstats.c is updated to use the shared json_print_esc() function.

2.108. 2025-11-11 Andrew J. Kroll <xxxajk@gmail.com>

  • scripts/python/app/NUT-Monitor-py2gtk2.in, scripts/python/app/NUT-Monitor-py3qt5.in: fix notification spamming

2.109. 2025-11-10 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/01-make-dist.yml: PoC with LouisBrunner/checks-action to change the action/check entry itself (as alternative to PR/commit comments) [#1400]
  • clients/upsstats.c: printf("%x") requires an UNSIGNED int argument [#3171]
  • UPGRADING.adoc: configure script would now probe the OS for more user and group account names [#3173]
  • configure.ac, NEWS.adoc: warn if nobody or nogroup end up being used for a build [#3173]
  • configure.ac, NEWS.adoc, docs/configure.txt: support more default user/group account names that may be defined in the OS [#3173]
  • NEWS.adoc: rephrase the upsstats\+JSON entry [#3171]

2.110. 2025-11-10 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • docs/man/upsstats.cgi.txt: Use devices instead of upses.

2.111. 2025-11-09 Jim Klimov <jimklimov+nut@gmail.com>

  • server/sstate.c, NEWS.adoc: wait a second before declaring UPS data stale [#661]
  • docs/download.txt: align British vs Americanish English spelling [#1400]
  • .github/workflows/01-make-dist.yml: drop MAKE_DIST_TOKEN [#1400]
  • .github/workflows/01-make-dist.yml: drop commented-away permissions [#1400]
  • docs/download.txt: revise notes on snapshots (not only GitHub now) and build types (git/dist) [#1400]

2.112. 2025-11-09 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • NEWS.adoc, clients/upsstats.c, docs/man/upsstats.cgi.txt: upsstats: Add JSON output mode via ?json parameter When the ?json (or &json) parameter is added to the URL, upsstats.cgi will now bypass all HTML template processing. Instead, it returns a "Content-Type: application/json" response containing the full data for the requested UPS(es), including all variables, raw status, and parsed status. This provides a modern API for external monitoring tools without affecting the existing HTML template functionality.

2.113. 2025-11-08 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/download.txt: move notes about building from source upwards [#1400]
  • docs/download.txt: add intro for development sources chapter [#1400]
  • NEWS.adoc: update about links to automatic dist tarballs [#1400]
  • .github/workflows/01-make-dist.yml: drop superfluous comment-posting action [#1400]
  • .github/workflows/01-make-dist.yml: update comments [#1400]
  • .github/workflows/01-make-dist.yml: extend to contents:write permission for commit comments [#1400]
  • .github/workflows/01-make-dist.yml: add links for running a custom container inside GHA worker [#1400]
  • .github/workflows/01-make-dist.yml: expand criteria for comment posting [#1400]
  • .github/workflows/01-make-dist.yml: debug-print inputs for substitution [#1400]
  • .github/workflows/01-make-dist.yml: try to blend in the github.event.pull_request.number to subst-github-ref-name [#1400]
  • .github/workflows/01-make-dist.yml: do not fail if we can not post the commit comment [#1400]
  • .github/workflows/01-make-dist.yml: rephrase initial sticky note for the PR [#1400]
  • .github/workflows/01-make-dist.yml: attempt to post a comment for commit itself [#1400]
  • .github/workflows/01-make-dist.yml: uncomment attempts to post comments with PR context only [#1400]
  • .github/workflows/01-make-dist.yml: drop the list of wider permissions we experimented with [#1400]
  • .github/workflows/01-make-dist.yml: comment away one of the ways to post a sticky comment; both seem to work well [#1400]
  • .github/workflows/01-make-dist.yml: try to report the more correct Git SHA with the tarball link [#1400]
  • NEWS.adoc: fix asciidoc markup for upsset improvement [#3164]
  • .github/workflows/01-make-dist.yml: subst-github-ref-name prefer github.head_ref (if set) since github.ref_name for pull_request_target reports the target branch [#1400]
  • drivers/nhs_ser.c, NEWS.adoc: limit the use of baud rates by what the OS does declare [#3163]

2.114. 2025-11-08 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • NEWS.adoc, clients/upsset.c: upsset.c: Recognize RANGE NUMBER and NUMBER types. Tested on Masterguard A1000 and A2000 units.

2.115. 2025-11-07 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/qa-guide.adoc: expand chapter on OBS [#1209]
  • .github/workflows/01-make-dist.yml: fix message [#1400]
  • .github/workflows/01-make-dist.yml: introduce "make distcheck-completeness" to verify that our dist archives exactly reproduce themselves [#2829]
  • Makefile.am, NEWS.adoc: introduce "make distcheck-completeness" to verify that our dist archives exactly reproduce themselves [#2829]
  • .github/workflows/01-make-dist.yml: refer to links from GH checks entry title [#1400] We have hit some snags about changing the artifact history or adding PR comments, at least before initially merging the first PR that adds this workflow (so pull_request_target has something to run from the master branch at all). Even if this turns out to be the end of the road, at least this way we can let people know where to find those generated tarballs :)
  • .github/workflows/01-make-dist.yml: try pull_request_target again, to use context of the main repo for actions [#1400]
  • .github/workflows/01-make-dist.yml: Revert ".github/workflows/01-make-dist.yml: add permissions for delete artifact [#1400]" This reverts commit 621e0e71aed71da21521ecf7784ece4b892720d0.
  • .github/workflows/01-make-dist.yml: try using a custom MAKE_DIST_TOKEN [#1400]
  • .github/workflows/01-make-dist.yml: add permissions for delete artifact [#1400]
  • scripts/obs/debian.control: Revert "scripts/obs/debian.control: dumb down the libmodbus requirement [#1209]" This reverts commit 21e5d7a79d8e3432c6382252c667eae3fb9e6223. Dropped NUT CI OBS support for platforms it still refuses to build instead.
  • scripts/obs/debian.control: Revert "scripts/obs/debian.control: dumb down the libi2c requirement [#1209]" This reverts commit 313e13e8fcae4f59d74ed20da7709d286dee14b7. Dropped NUT CI OBS support for platforms it still refuses to build instead.
  • scripts/obs/nut.spec: Revert "scripts/obs/nut.spec: try to constrain udev to non-RHEL [#1209]" This reverts commit 2b1a596f364ab172d80bacdba17616c942503077. Dropped NUT CI OBS support for platforms it still refuses to build instead.
  • scripts/obs/nut.spec: try to constrain udev to non-RHEL [#1209]
  • scripts/obs/debian.control: dumb down the libi2c requirement [#1209]
  • scripts/obs/debian.control: dumb down the libmodbus requirement [#1209] Do not constrain the versions so it can build on Debian 9 and 10; Note that for USB support we would need our fork anyway (until it gets merged to upstream, which may take years at their pace).
  • scripts/obs/nut.spec: more constraints about what is available in what distro versions [#1209]
  • scripts/obs/nut.spec: libltdl-devel (nut-scanner and consumers) and libgd-devel (cgi) are not ubiquitous [#1209]
  • scripts/obs/nut.spec: fix "distro_version" numbers (some have extra digits for sub-releases) [#1209]
  • scripts/obs/_config: no ccache in RHEL_7 it seems [#1209]
  • scripts/obs/_config: CentOS 10 depends on "either of" util-linux(-core), so we must pick one [#1209]
  • scripts/obs/nut.spec: define NUTPKG_WITH_<DEPNAME> when we requre the deps or not, based on distro/release [#1209]
  • scripts/obs/nut.spec: turn package availability/requirement for NUTPKG_WITH_* upside down [#1209]
  • .github/workflows/01-make-dist.yml: comment about substitute-string-action [#1400]
  • .github/workflows/01-make-dist.yml: try "issues: write" into permissions [#1400]
  • .github/workflows/01-make-dist.yml: try more ways to post a PR comment [#1400]

2.116. 2025-11-06 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/01-make-dist.yml: try to use GITHUB_TOKEN when posting a PR comment - v2 [#1400]
  • .github/workflows/01-make-dist.yml: define permissions for auto-generated GITHUB_TOKEN differently [#1400]
  • .github/workflows/01-make-dist.yml: no fatal problem if we can not delete an older tarball [#1400]
  • .github/workflows/01-make-dist.yml: try to use GITHUB_TOKEN when posting a PR comment [#1400]
  • .github/workflows/01-make-dist.yml: do not immediately fail the CI job if we can not post actions-comment-pull-request (e.g. in a NUT fork build) [#1400]
  • .github/workflows/01-make-dist.yml: after all use pull_request not pull_request_target so there is an attached PR to comment into [#1400]
  • .github/workflows/01-make-dist.yml: allow to fire on more branches [#1400]
  • .github/workflows/01-make-dist.yml: try to fix permissions for PR commenter [#1400]
  • .github/workflows/01-make-dist.yml: fix step IDs [#1400]
  • .github/workflows/01-make-dist.yml: "Try to get more Git metadata" only if "git describe" is initially useless [#1400]
  • .github/workflows/01-make-dist.yml: tell actions/checkout to fetch more git history right away [#1400]
  • .github/workflows/01-make-dist.yml: "Try to get more Git metadata" earlier so we can debug it better [#1400]
  • .github/workflows/01-make-dist.yml: typo fix (renamed subst-github-ref-name step) [#1400]
  • .github/workflows/01-make-dist.yml: flip TEST_REF for branches and commits (prNNNN/merge) alike [#1400]
  • .github/workflows/01-make-dist.yml: different var for built SHA [#1400]
  • .github/workflows/01-make-dist.yml: more trickery to make git-describe work [#1400]
  • .github/workflows/01-make-dist.yml: debug subst-github-ref-name [#1400]
  • .github/workflows/01-make-dist.yml: try to post a link to tarballs on build page - v2 (message/comment in PRs) [#1400]
  • .github/workflows/01-make-dist.yml: there is no env.GITHUB_HEAD_REF [#1400]
  • .github/workflows/01-make-dist.yml: act on tags too [#1400]
  • .github/workflows/01-make-dist.yml: pull whole repo if git describe fails [#1400]
  • .github/workflows/01-make-dist.yml: try to post a link to tarballs on build page [#1400]
  • .github/workflows/01-make-dist.yml: fix GHA scripting syntax; update comments [#1400]
  • .github/workflows/01-make-dist.yml: more debugging of git workspace [#1400]
  • .github/workflows/01-make-dist.yml: do not make dist-sig (via dist-files) in the CI job [#1400]
  • .github/workflows/01-make-dist.yml, NEWS.adoc: introduce a CI job to maintain dist tarballs of recent iterations [#1400, #2829]
  • .github/workflows/{codeql.yml ⇒ 05-codeql.yml}, .github/workflows/{PyNUTClient.yml ⇒ 08-PyNUTClient.yml}: .github/workflows: re-number the jobs to hopefully impact processing order on GHA farm [#1400]
  • Makefile.am, NEWS.adoc, docs/maintainer-guide.txt: introduce make dist-docs [#1400]
  • Makefile.am: dist-hook: report if DISTing VERSION_FORCED* files
  • .github/workflows/codeql.yml: fix typo for ccache key name

2.117. 2025-11-05 Jim Klimov <jimklimov+nut@gmail.com>

  • common/common.c: do not track upsnotify_reported_extend_timeout_systemd, we do not limit by it anyway [#3003] …and in the few cases this systemd notification is used, we do want to see it all
  • common/common.c, NEWS.adoc: do not comment on "watchdog situation logged once" if we do not actually log it before (visibly) [#3157]

2.118. 2025-11-03 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, drivers/dstate.c, drivers/dstate.h, drivers/main.c, drivers/main.h: drivers/main.{c,h}, drivers/dstate.{c,h}, NEWS.adoc: track CHRG/DISCHRG reality in all drivers, verify against what the device/protocol says [#3146]
  • drivers/usbhid-ups.c: only consider current_charge > 0 to rule out a conversion error [#3156]
  • drivers/usbhid-ups.c: fix indentations
  • NEWS.adoc, common/state.c, docs/nut.dict, include/state.h: common/state.c, include/state.h, NEWS.adoc: refactor with difftime_st_tree_timespec() [#3156]
  • NEWS.adoc, drivers/dstate.c, drivers/dstate.h, drivers/main.c, drivers/main.h: drivers/main.{c,h}, drivers/dstate.{c,h}, NEWS.adoc: track previous_battery_charge_value and previous_battery_charge_timestamp [#3146]
  • clients/upsmon.c, include/common.h: tone down definition of "infinity" by a notch [#3003]

2.119. 2025-10-31 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, drivers/usbhid-ups.c, drivers/usbhid-ups.h: drivers/usbhid-ups.{c,h}, NEWS.adoc: consider FULLYCHARGED and NOTFULLYCHARGED separately, because many subdrivers report neither; fall back to checking battery.charge=?100 to set CHRG flag [#3146]

2.120. 2025-10-30 NOV <149171388+NohanV@users.noreply.github.com>

  • drivers/cyberpower-mib.c: Add SNMP info for ups.realpower

2.121. 2025-10-30 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/libusb0.c, drivers/libusb1.c: drivers/libusb{0,1}.c: nut_libusb_open(): drop commented-away "goto next_device" now that we have a loop and "continue" to try another rdlen [#3136]
  • drivers/cyberpower-mib.c: bump CYBERPOWER_MIB_VERSION for added ups.realpower [#3154]
  • configure.ac, scripts/systemd/nut-monitor.service.in: introduce SYSTEMD_DAEMON_TIMEOUT_STOP_UPSMON substitution [#3003]
  • clients/upsmon.c: use upsnotify(NOTIFY_STATE_EXTEND_TIMEOUT, …) to protect from systemd or similar framework killing us by timeout [#3033]
  • common/common.c, include/common.h, NEWS.adoc: Introduced NOTIFY_STATE_EXTEND_TIMEOUT option and relevant variables [#3003]
  • common/common.c: upsnotify(): comment since which systemd versions different features are supported

2.122. 2025-10-29 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • docs/man/nutdrv_qx.txt: Fix the formatting of VOLTRONIC-AXPERT UNITS

2.123. 2025-10-27 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsmon.c, NEWS.adoc: doshutdown() etc: tickle (systemd) watchdog instead of long quietness when shutting down [#3003]
  • NEWS.adoc, drivers/libusb0.c, drivers/libusb1.c: drivers/libusb{0,1}.c, NEWS.adoc: if the tried "rdlen" did not succeed, fall back to the other value we had in mind [#3136] In libusb1.c also fix printout of rdlen variables from %d to %PRIi32

2.124. 2025-10-26 Jim Klimov <jimklimov+nut@gmail.com>

2.125. 2025-10-25 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/obs/Makefile.am: fix EXTRA_DIST list

2.126. 2025-10-24 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, docs/nut.dict: NEWS.adoc: announce upstreamed OBS packaging recipes [#1209, #1316, #3144]
  • tests/NIT/nit.sh: detect PYTHON from caller-provided PYTHON_DEFAULT as fallback interpreter [#3130]
  • configure.ac: on MacOS, also pass PYTHON_DEFAULT via /usr/bin/env [#3130]
  • tests/NIT/nit.sh: detect PYTHON from PY_SHEBANG (or use a caller-provided one) as explicit interpreter [#3130] CircleCI does see the correct shebang and the script as executable, but apparently tries to call it as a shell script and fails. Maybe /Users/distiller/.pyenv/shims/python3.13 is broken though?.. Or we hit https://github.com/NixOS/nixpkgs/issues/65351/ ?
  • .circleci/config.yml: set DEBUG_NIT=true to troubleshoot python test client runs [#3130]
  • tests/NIT/nit.sh: shouldDebug(): extend with a variable that can be set specifically for this script
  • .circleci/config.yml: opt out of blobless checkouts
  • .circleci/config.yml: update from XCode-13.4.1 to XCode-16.4 Older releases are deprecated and to be removed in November: * https://circleci.com/changelog/deprecation-of-eol-xcode-versions/ * https://circleci.com/changelog/images/#filtered
  • tests/NIT/nit.sh: revise isTestablePython() possible outcomes [#3130]
  • .github/workflows/PyNUTClient.yml: update to use PYTHON_DEFAULT varname now expected by scripts/python/module/Makefile.am [#3130]
  • NEWS.adoc, UPGRADING.adoc: warn about renamed data/html{,cgi} source dir [#3049]
  • lib/.gitignore, lib/libupsclient-config.in: lib//libupsclient-config.in, lib/.gitignore: README⇒README.adoc renamed a while ago
  • NEWS.adoc, UPGRADING.adoc: warn about renamed data/html{,cgi} source dir [#3049]
  • scripts/obs/debian.nut-cgi.docs: align with renaming of data/html ⇒ data/htmlcgi

2.127. 2025-10-23 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, drivers/apc-hid.c, drivers/apc_modbus.c, drivers/arduino-hid.c, drivers/bcmxcp_usb.c, drivers/blazer_usb.c, drivers/cps-hid.c, drivers/delta_ups-hid.c, drivers/legrand-hid.c, drivers/liebert-hid.c, drivers/mge-hid.c, drivers/nutdrv_atcl_usb.c, drivers/richcomm_usb.c: drivers/*.c, NEWS.adoc: revised use of NUT macros for USB Vendor IDs [#3139]
  • drivers/usb-common.h: update comment about USB_DEVICE() macro
  • drivers/nutdrv_qx.c: use symbolic names for USB Vendor IDs [#3139]
  • data/driver.list.in: add Ippon Innova TAE 1000 [#3137, #3139]
  • NEWS.adoc, UPGRADING.adoc, drivers/nutdrv_qx.c: drivers/nutdrv_qx.c: add USB ID based detection for innovatae protocol [#3137, #3139]
  • NEWS.adoc, UPGRADING.adoc, docs/nut.dict: list new nutdrv_qx_innovatae protocol support [#issue 3137, PR #3139]

2.128. 2025-10-22 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/nut.dict: update for NEWS of PR #3141
  • m4/nut_check_libregex.m4, NEWS.adoc: Added configure script options for libregex tuning [#3140, #3049]
  • NEWS.adoc, docs/nut.dict: update about logging the source of CFLAGS/LIBS/LDFLAGS values [#3049, #3140]
  • m4/nut_check_libsystemd.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libpowerman.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libopenssl.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libnss.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libgpiod.m4: fix the var names we "unset" in the end [#3049]
  • m4/nut_check_libneon.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libmodbus.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libnetsnmp.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libltdl.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libgpiod.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libavahi.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libusb.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libgd.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libfreeipmi.m4: track and report depCFLAGS_SOURCE/depLIBS_SOURCE consistently [#3049]
  • m4/nut_check_libfreeipmi.m4: comment a reminder about numerous libs that we can resolve here (with one being correct) [#3049]
  • m4/nut_arg_with.m4: revise brackets to pass arguments with commas in the value correctly [#3049]
  • m4/nut_arg_with.m4: Revert "m4/nut_arg_with.m4: simplify with use of m4_default() [#3049]" This reverts commit 9eba1eb885e9d29f3d8ecef7637010899661cb54, seems autoconf (or myself) gets lost in the maze of m4_default with or without brackets, especially when arguments with commas are involved.

2.129. 2025-10-22 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • NEWS.adoc, drivers/nutdrv_qx_masterguard.c: nutdrv_qx_masterguard: Bump MASTERGUARD_VERSION to 0.04 And updates the NEWS.adoc in regards of PR [#3141] Tested on Masterguard A1000 and A2000 units.
  • drivers/nutdrv_qx_masterguard.c: nutdrv_qx_masterguard: Makes the deep battery test command works The test.battery.start.deep (TUD) command requires the slave address as a parameter to function. Following the fix to masterguard_add_slaveaddr in the previous commit, this command can now be properly enabled. Tested on Masterguard A1000 and A2000 units.

2.130. 2025-10-21 Viktor Drobot <linux776@gmail.com>

  • drivers/nutdrv_qx_innovatae.c: More info about firmware version in bogus reply

2.131. 2025-10-21 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc: update notes for #3049 and #3140
  • ci_build.sh: check more ARCH and BITS sources for illumos/Solaris pkgconfig path guessing
  • m4/nut_check_libnetsnmp.m4: fix new --with-net-snmp-config=auto mode [#3049]
  • NEWS.adoc: update entry with PR number
  • m4/nut_arg_with.m4: NUT_ARG_WITH_LIBOPTS_CONFIGSCRIPT_IMPLEM: drop extra brackets [#3049]
  • m4/nut_check_libusb.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libnetsnmp.m4, m4/nut_check_libsystemd.m4: m4/nut_check_libnetsnmp.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libpowerman.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libopenssl.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_pkgconfig.m4: refactor NUT_ARG_* help and determination of --with-pkg-config [#3049]
  • m4/nut_check_libnss.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libneon.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libmodbus.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_check_libltdl.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • configure.ac, NEWS.adoc: there was never a scripts/devd/nut-usbups.rules.in (probably a copy-paste typo in NUT v2.8.0)
  • configure.ac, scripts/devd/README.adoc: revise help and doc regarding FreeBSD devd snippet file installation
  • m4/nut_arg_with.m4: simplify with use of m4_default() [#3049]
  • m4/nut_check_libgpiod.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_arg_with.m4: extend NUT_ARG_WITH_LIBOPTS* with optional alternate spelling of project name for help text [#3049]
  • configure.ac: rephrase help for (alt)pidpath [#3049]
  • m4/nut_check_libgd.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_arg_with.m4: add NUT_ARG_WITH_LIBOPTS_LIBS_AS_LDFLAGS and NUT_ARG_WITH_LIBOPTS_LDFLAGS for cosmetic completeness [#3049]
  • m4/nut_arg_with.m4: rearrange NUT_ARG_WITH_LIBOPTS_INCLUDES and NUT_ARG_WITH_LIBOPTS_LIBS using renamed NUT_ARG_WITH_LIBOPTS_INVALID_YESNO; use simpler NUT_ARG_WITH_LIBOPTS for new NUT_ARG_WITH_LIBOPTS_CONFIGSCRIPT* methods [#3049]
  • m4/nut_check_libfreeipmi.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]

2.132. 2025-10-21 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • drivers/nutdrv_qx_masterguard.c: nutdrv_qx_masterguard: Fix masterguard_add_slaveaddr return value The masterguard_add_slaveaddr function, defined as a preprocess_command handler, must return the length of the command string it has processed. It was incorrectly returning 0. This caused the main qx_process function to see a 0-byte command length, resulting in a send: timeout (0) debug log and a failure to send the command to the UPS. This commit fixes the function to return the correct command length (which was already stored in the local variable l), resolving the bug for all commands that use the ,XX slave address placeholder. Tested on Masterguard A1000 and A2000 units.

2.133. 2025-10-20 Viktor Drobot <linux776@gmail.com>

  • docs/nut.dict: Forgot to add to dict
  • docs/man/nutdrv_qx.txt, docs/nutdrv_qx-subdrivers.txt, drivers/Makefile.am, drivers/nutdrv_qx.c, drivers/nutdrv_qx_blazer-common.c, drivers/nutdrv_qx_blazer-common.h, drivers/nutdrv_qx_innovatae.c, drivers/nutdrv_qx_innovatae.h: Basic Ippon Innova TAE support

2.134. 2025-10-20 Jim Klimov <jimklimov+nut@gmail.com>

  • m4/nut_check_libavahi.m4: refactor to word the help and determine options via NUT_ARG_WITH_LIBOPTS* [#3049]
  • m4/nut_arg_with.m4: introduce NUT_ARG_WITH_LIBOPTS* [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-CCACHE_NAMESPACE [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --enable-extapi-enphase [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-user and --with-group (reword the latter) [#3049, #3120]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-valgrind [#3049]
  • configure.ac: move SYSTEM_AIX and CPU_TYPE determination way up, to where we detect other aspects of the build target
  • configure.ac: refactor NUT_ARG_* help and determination of udev, hotplug, devd, freebsdquirksdir paths [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-augeas-lenses-dir [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --enable-cppunit [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of systemd paths [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of Solaris/illumos packaging options, fix a few logical mismatches [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of PKGCONFIGDIR [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --enable-strip (and actually fix a missed compiler family dependency) [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --enable-force-nut-version-header (and actually fix default report vs. setting) [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-logfacility [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-port [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --enable-check-NIT [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of --with-doc(s) and --with-docs-changelog* tunables [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of DEFAULT_MAN_* tunables [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of CGIDATAPATH [#3049]

2.135. 2025-10-19 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am, configure.ac, data/Makefile.am, data/{html ⇒ htmlcgi}/.gitignore, data/{html ⇒ htmlcgi}/Makefile.am, data/{html ⇒ htmlcgi}/README.adoc, data/{html ⇒ htmlcgi}/bottom.html, data/{html ⇒ htmlcgi}/header.html.in, data/{html ⇒ htmlcgi}/index.html, data/{html ⇒ htmlcgi}/nut-banner.png, docs/configure.txt, docs/nut.dict: configure.ac, *.am: rename "htmldir" to "htmlcgidir", "data/html" to "data/htmlcgi", CGIPATH to CGIEXECPATH, and tentatively HTMLPATH to CGIDATAPATH (and actually expose the latter two from configure script) [#3049]
  • data/html/Makefile.am: ensure that HTML files for CGI are in dist tarball
  • configure.ac: add separators between unrelated subjects, revise comments
  • configure.ac: refactor NUT_ARG_* help and determination of CGIPATH [#3049]
  • NEWS.adoc, docs/man/nutdrv_qx.txt: update regarding test.battery.start.low [#3135]

2.136. 2025-10-18 Atanas Vladimirov <vladimirov.atanas@gmail.com>

  • data/cmdvartab, docs/nut-names.txt, drivers/nutdrv_qx_masterguard.c: nutdrv_qx_masterguard: Adds battery test until battery low. The difference between the battery test until battery low and deep battery test is that the latter is actually a battery calibration test and needs some preconditions to be met, i.e. the load must be between 30% and 100% and the battery capacity is greater than 99%. Battery test until battery low can be started anytime. Tested on Masterguard A1000 and A2000 units.

2.137. 2025-10-17 Jim Klimov <jimklimov+nut@gmail.com>

  • configure.ac: refactor NUT_ARG_* help and determination of DRVPATH [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of POWERDOWNFLAG [#3049]
  • configure.ac: refactor NUT_ARG_* help and determination of STATEPATH, PIDPATH and ALTPIDPATH [#3049]
  • configure.ac: define "confdir-suffix" via 4-arg syntax of NUT_ARG_WITH; rephrase other confdir options to say =PATH ⇒ =DIRPATH [#3049]
  • m4/nut_arg_with.m4: clarify that parentheses mean "default:" and *_SINGLEQUOTE values are "resolved from" [#3049]
  • m4/nut_arg_with.m4: extend NUT_ARG_ENABLE and NUT_ARG_WITH to optionally accept one more (second) argument for "…=VALUES" [#3049]
  • m4/nut_arg_with.m4: extend NUT_ARG_ENABLE_CUSTOM_DEFAULT_HELP and NUT_ARG_WITH_CUSTOM_DEFAULT_HELP to short-circuit $5==$4 if $5 is not specified [#3049]
  • m4/nut_arg_with.m4: more uniquely name the conftemp variables [#3049]
  • m4/nut_arg_with.m4: update comments [#3049]

2.138. 2025-10-16 Jim Klimov <jimklimov+nut@gmail.com>

  • configure.ac, m4/nut_arg_with.m4: extend newer NUT_ARG_WITH_CUSTOM_DEFAULT_HELP, NUT_ARG_WITH_EXPAND_DEFAULT_HELP etc. methods to optionally print "--with-VARNAME=VALUES" formatted messages [#3049]
  • m4/nut_arg_with.m4: fix passing of conftemp (non-verbatim per se) [#3049]
  • configure.ac, m4/nut_arg_with.m4: m4/nut_arg_with.m4, configure.ac, NEWS.adoc: refactor with ability to provide custom representation for default value in AS_HELP_STRING message [#3049]
  • configure.ac: fix typo in help message for --with-CCACHE_NAMESPACE
  • Makefile.am: install-as-root: fix typo after replacement of @VAR@ to $(VAR) [#3131]
  • Makefile.am, NEWS.adoc, UPGRADING.adoc, ci_build.sh, conf/Makefile.am, configure.ac, docs/configure.txt, docs/man/apc_modbus.txt, docs/nut.dict, docs/packager-guide.txt, lib/libnutclient.pc.in, lib/libnutclientstub.pc.in, lib/libnutconf.pc.in, lib/libnutscan.pc.in, lib/libupsclient-config.in, lib/libupsclient.pc.in, scripts/Aix/nut-aix.spec.in, scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: configure.ac, docs/configure.txt, lib/.pc.in, *.am et al: introduce --with-confdir= options, separate delivery of sample configs [#3131]
  • Makefile.am: install-as-root: use make variables for paths and package version [#3131]
  • m4/nut_check_python.m4, scripts/Solaris/Makefile.am, scripts/Solaris/precheck.py.in, scripts/augeas/Makefile.am, scripts/augeas/gen-nutupsconf-aug.py.in, scripts/python/module/Makefile.am, scripts/python/module/PyNUT.py.in, scripts/python/module/test_nutclient.py.in, tools/Makefile.am, tools/gitlog2changelog.py.in, tools/nut-snmpinfo.py.in: m4/nut_check_python.m4, *.am, *.py.in: introduce PYTHON_DEFAULT to track the implementation to substitute into shebangs or use as tool calls [#1792]

2.139. 2025-10-15 Jim Klimov <jimklimov+nut@gmail.com>

  • m4/nut_check_python.m4: separate NUT_CHECK_PYTHON_DEFAULT_BEST and NUT_CHECK_PYTHON_INTERIM_RESULTS, and implement discarding of "auto-prio" hits if another hit exists (yes, explicit, auto) [#1792] It seems AC_REQUIRE() calls have priority over other code lines in a method, and get executed first - so using extra methods (also for clearer code base).
  • docs/configure.txt: clarify --with-python*=yes; fix markup [#1792]
  • m4/nut_check_python.m4: separate NUT_CHECK_PYTHON*_SITE_PACKAGES into dedicated methods, to honour forgetting of interpreters due to auto-prio [#1792]
  • m4/nut_check_python.m4, NEWS.adoc, UPGRADING.adoc, INSTALL.nut.adoc, docs/configure.txt, docs/nut.dict: change default to auto-prioritize some one available python interpreter [#1792]

2.140. 2025-10-14 Jim Klimov <jimklimov+nut@gmail.com>

  • ci_build.sh: pkg-rpm\|pkg-spec: fix rpmbuild callout
  • ci_build.sh, scripts/obs/_service, scripts/obs/{debian.nut.changes ⇒ nut.changes}: scripts/obs/nut.changes: isn’t it a placeholder for RPM changelog?
  • INSTALL.nut.adoc: mention some surprising configure options, like the many --with-python* settings, and a --sysconfdir override [#1792]
  • docs/configure.txt, docs/nut.dict: revise the section on --with-python* settings [#1792]
  • NEWS.adoc, configure.ac: configure.ac: warn if several python versions were AUTO-detected and configured [#1792]

2.141. 2025-10-13 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/obs/debian.rules: make list-missing optional (absent in new cdbs)
  • scripts/obs/debian.rules: do not mislead about lack of dh_python2 due to our own tests
  • scripts/obs/debian.rules: update for bleeding-edge CDBS that lacks many scripts
  • docs/configure.txt: clarify that --with-group is barely used directly by daemons [#3120]
  • Makefile.am: spellcheck-interactive: follow-up with a spellcheck-quick to soak up timestamp changes of the dictionary file
  • drivers/snmp-ups.c: comment about us not parsing the port from device_path
  • configure.ac: when we suggest to "make" after "configure" is done, have a fallback if MAKE was not defined/exported
  • NEWS.adoc: Revert "NEWS.adoc: Fallout of the refactoring of drivers to use shutdown.* commands consistently [#1962]" This reverts commit 15bc72b0ae7952fe30b013b48eebfd7a6c9bf0a7 prepared problem log was not a problem after all.
  • drivers/victronups.c: fix whitespace markup; translate comments
  • drivers/victronups.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/usbhid-ups.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/powervar_cx_ser.c, NEWS.adoc: reshuffle code —  upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/powercom.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/pijuice.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/phoenixcontact_modbus.c, NEWS.adoc: reshuffle code —  upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/oneac.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/mge-utalk.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/metasys.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/masterguard.c, NEWS.adoc: reshuffle code —  upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/gamatronic.c: upsdrv_initups(): update comments [#1962]
  • drivers/everups.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/bicker_ser.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/bestuferrups.c, NEWS.adoc: reshuffle code —  upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/bestfortress.c, NEWS.adoc: reshuffle code —  upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]

2.142. 2025-10-12 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/asem.c, NEWS.adoc: reshuffle code — upsdrv_initups() is for preparing comms; upsdrv_initinfo() is for first using them [#1962]
  • drivers/upscode2.c: fix indentation
  • drivers/powervar_cx.c, drivers/powervar_cx.h: drivers/powervar_cx.{c,h}: fix setcmd()→setvar() for consistency [#1962]
  • NEWS.adoc, docs/nut.dict, drivers/powerp-bin.c, drivers/powerp-txt.c: drivers/powerp-{txt,bin}.c: install instcmd and setvar handlers [#1962]
  • drivers/optiups.c: fix indentation broken in white-space refactoring of early NUT v2.8.x evolution [#1962]
  • drivers/oneac.c: fix setcmd()→setvar() for consistency [#1962]
  • drivers/metasys.c: avoid spurious void return at end of upsdrv_initinfo() [#1962]
  • drivers/main.c: better log the progress for killpower via running driver instance
  • drivers/riello_ser.c: relocate methods to match structure of riello_usb.c to ease the comparisons
  • NEWS.adoc, drivers/riello_ser.c, drivers/riello_usb.c: drivers/riello_{ser,usb}.c: refactor parse_ups_status() and do not constrain "shutdown.return" and "load.*" INSTCMD with whether the UPS is known to be on battery or not [#1962]
  • scripts/Solaris/Makefile.am: "target_cpu=sparc" is inconclusive about binary bitness [#3099]
  • NEWS.adoc: Fallout of the refactoring of drivers to use shutdown.* commands consistently [#1962]
  • configure.ac: refactor echo of NUT_SOURCE_VERSION_REPORT, and suggest to "make" after "configure" is done Many projects do this latter convenience for beginner users. Seems nice.

2.143. 2025-10-11 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, docs/man/apcupsd-ups.txt, docs/nut.dict, drivers/apcupsd-ups.c: drivers/apcupsd-ups.c, docs: migrate from gethostbyname() to getaddrinfo(); become IPv6 capable [#1209]
  • drivers/apcupsd-ups.c: revise comments and markup
  • drivers/apcupsd-ups.c: use strrchr(device_path,:) to look for LAST colon, since bare IPv6 addresses contain colons too [#1209]
  • drivers/apcupsd-ups.c: update comments about default port 3551
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: avoid logging bogus-looking "OK" confirming undeclared activities [#3099]
  • docs/config-notes.txt, docs/configure.txt, docs/man/nut.txt, docs/man/upsmon.conf.txt: clarify /run vs. /var/run [#3099]
  • configure.ac, NEWS.adoc, UPGRADING.adoc: PIDPATH is now more strictly /var/run, unless /run is more preferable for good reason [#3099]

2.144. 2025-10-10 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/obs/nut.spec: update comment about python locations
  • scripts/obs/nut.spec: hide %dir /var/log (we do not own it), suffice to mkdir it in build area to match our logrotate configuration
  • scripts/obs/nut.spec: nut-monitor requires python-base
  • scripts/obs/_config: track a copy of prjconf data
  • scripts/obs/README.adoc: update notes on OBS prjconf
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: fix svccfg setprop for multiple DEPSVC FMRIs [#3099] Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
  • NEWS.adoc, UPGRADING.adoc, docs/nut.dict, m4/nut_check_python.m4: m4/nut_check_python.m4: try harder to report the "purelib" location as PYTHON*_SITE_PACKAGES [#1209]
  • NEWS.adoc, docs/nut.dict, tests/NIT/Makefile.am, tests/NIT/nit.sh: tests/NIT/nit.sh, tests/NIT/Makefile.am, NEWS.adoc: let test runs started as root in under-provisioned environments tweak user/group to what is available [#1209]
  • NEWS.adoc: one more Eaton USB ID supported [#2380]

2.145. 2025-10-09 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/obs/nut.spec: register other service units (enablement is via presets after all)
  • scripts/obs/nut.spec, scripts/obs/debian.rules: enable storing build configuration and checking the build with NUT Integration Tests suite, and strip binaries of debug symbols
  • scripts/obs/nut.spec: deduplicate man page files with symlinks
  • scripts/obs/nut.spec: reduce layering of HTMLPATH under apache_serverroot_data
  • scripts/obs/nut.spec: reduce layering of CGIPATH under apache_serverroot_cgi
  • scripts/obs/nut.spec: anticipate something like /usr/lib64/python2.7/site-packages/ too
  • scripts/obs/nut.spec: keep excluding from main package stuff that should be in others
  • scripts/obs/nut.spec: revise delivery of CGI artifacts as %dir
  • scripts/obs/nut.spec: address SUSE rpmlint issues with "make check" section
  • scripts/obs/nut.spec: address SUSE rpmlint issues with scripted-only NUT-Monitor package
  • scripts/obs/nut.spec: address SUSE rpmlint issues with logrotate
  • scripts/obs/nut.spec: deliver libs each in its ABI-version-named package
  • scripts/obs/nut.spec: comment away "%dir" and "%exclude" hacks that felt superfluous and probably are
  • scripts/obs/nut.spec: revise pre/port-in/un snippets
  • scripts/obs/nut.spec: do not relocate upssched-cmd to hard-coded /bin
  • scripts/obs/nut.spec: fence delivery of systemd files (check if we could resolve the the paths involved)
  • scripts/obs/nut.spec: fix systemdtmpfilesdir determination
  • scripts/obs/nut.spec: BuildRequires: libxml2-devel
  • scripts/obs/nut.spec: dep on accounts for pkg self-test does not work like this
  • scripts/obs/nut.spec: dep on chroot does not work like this
  • scripts/obs/nut.spec: do not package directly-named "/bin" objects
  • scripts/obs/nut.spec: require more tools for SUSE platform tests on OBS
  • scripts/obs/nut.spec: require user/group for post-install script context
  • scripts/obs/nut.spec: refactor how we get HTMLPATH and CGIPATH, they may be different in APXS output
  • scripts/obs/nut.spec: let the SPEC version reflect in NUT self-identification
  • ci_build.sh: add failsafes into pkg* build types
  • docs/nut.dict, scripts/obs/README.adoc: scripts/obs/README.adoc: update with Practical setup and Other notes
  • scripts/obs/Makefile.am, scripts/obs/_service: scripts/obs/_service: add a copy of working OBS recipe
  • Makefile.am, ci_build.sh, configure.ac, scripts/Makefile.am, {obs ⇒ scripts/obs}/Makefile.am, {obs ⇒ scripts/obs}/README.adoc, {obs ⇒ scripts/obs}/debian.Makefile.am, {obs ⇒ scripts/obs}/debian.NEWS, {obs ⇒ scripts/obs}/debian.changelog, {obs ⇒ scripts/obs}/debian.compat, {obs ⇒ scripts/obs}/debian.control, {obs ⇒ scripts/obs}/debian.copyright, {obs ⇒ scripts/obs}/debian.description.subst, {obs ⇒ scripts/obs}/debian.gbp.conf, {obs ⇒ scripts/obs}/debian.hotplug, {obs ⇒ scripts/obs}/debian.libnutclient-dev.install, {obs ⇒ scripts/obs}/debian.libnutclient-dev.manpages, {obs ⇒ scripts/obs}/debian.libnutclient1.install, {obs ⇒ scripts/obs}/debian.libnutclient1.lintian-overrides, {obs ⇒ scripts/obs}/debian.libnutclientstub-dev.install, {obs ⇒ scripts/obs}/debian.libnutclientstub1.install, {obs ⇒ scripts/obs}/debian.libnutclientstub1.lintian-overrides, {obs ⇒ scripts/obs}/debian.libnutscan-dev.install, {obs ⇒ scripts/obs}/debian.libnutscan1.install, {obs ⇒ scripts/obs}/debian.libups-nut-perl.install, {obs ⇒ scripts/obs}/debian.libupsclient-dev.install, {obs ⇒ scripts/obs}/debian.libupsclient-dev.manpages, {obs ⇒ scripts/obs}/debian.libupsclient4.install, {obs ⇒ scripts/obs}/debian.nut-cgi.README.Debian, {obs ⇒ scripts/obs}/debian.nut-cgi.docs, {obs ⇒ scripts/obs}/debian.nut-cgi.install, {obs ⇒ scripts/obs}/debian.nut-cgi.manpages, {obs ⇒ scripts/obs}/debian.nut-cgi.postinst, {obs ⇒ scripts/obs}/debian.nut-cgi.postrm, {obs ⇒ scripts/obs}/debian.nut-client.init.in, {obs ⇒ scripts/obs}/debian.nut-client.install, {obs ⇒ scripts/obs}/debian.nut-client.links, {obs ⇒ scripts/obs}/debian.nut-client.lintian-overrides, {obs ⇒ scripts/obs}/debian.nut-client.maintscript, {obs ⇒ scripts/obs}/debian.nut-client.manpages, {obs ⇒ scripts/obs}/debian.nut-client.postinst, {obs ⇒ scripts/obs}/debian.nut-client.preinst, {obs ⇒ scripts/obs}/debian.nut-client.prerm, {obs ⇒ scripts/obs}/debian.nut-common.install, {obs ⇒ scripts/obs}/debian.nut-common.postinst.in, {obs ⇒ scripts/obs}/debian.nut-common.prerm.in, {obs ⇒ scripts/obs}/debian.nut-common.tmpfiles.in, {obs ⇒ scripts/obs}/debian.nut-doc.doc-base.nut-developer-guide, {obs ⇒ scripts/obs}/debian.nut-doc.doc-base.nut-faq, {obs ⇒ scripts/obs}/debian.nut-doc.doc-base.nut-packager-guide, {obs ⇒ scripts/obs}/debian.nut-doc.doc-base.nut-user-manual, {obs ⇒ scripts/obs}/debian.nut-doc.install, {obs ⇒ scripts/obs}/debian.nut-ipmi.install, {obs ⇒ scripts/obs}/debian.nut-ipmi.manpages, {obs ⇒ scripts/obs}/debian.nut-linux-i2c.install, {obs ⇒ scripts/obs}/debian.nut-linux-i2c.manpages, {obs ⇒ scripts/obs}/debian.nut-modbus.install, {obs ⇒ scripts/obs}/debian.nut-modbus.manpages, {obs ⇒ scripts/obs}/debian.nut-monitor.install, {obs ⇒ scripts/obs}/debian.nut-monitor.menu, {obs ⇒ scripts/obs}/debian.nut-monitor.xpm, {obs ⇒ scripts/obs}/debian.nut-powerman-pdu.install, {obs ⇒ scripts/obs}/debian.nut-powerman-pdu.manpages, {obs ⇒ scripts/obs}/debian.nut-server.dirs, {obs ⇒ scripts/obs}/debian.nut-server.init.in, {obs ⇒ scripts/obs}/debian.nut-server.install, {obs ⇒ scripts/obs}/debian.nut-server.manpages, {obs ⇒ scripts/obs}/debian.nut-server.postinst, {obs ⇒ scripts/obs}/debian.nut-server.postrm, {obs ⇒ scripts/obs}/debian.nut-server.preinst, {obs ⇒ scripts/obs}/debian.nut-server.prerm.in, {obs ⇒ scripts/obs}/debian.nut-snmp.docs, {obs ⇒ scripts/obs}/debian.nut-snmp.install, {obs ⇒ scripts/obs}/debian.nut-snmp.manpages, {obs ⇒ scripts/obs}/debian.nut-xml.install, {obs ⇒ scripts/obs}/debian.nut-xml.manpages, {obs ⇒ scripts/obs}/debian.nut.README.Debian, {obs ⇒ scripts/obs}/debian.nut.TODO.Debian, {obs ⇒ scripts/obs}/debian.nut.changes, {obs ⇒ scripts/obs}/debian.nut.docs, {obs ⇒ scripts/obs}/debian.python-nut.install, {obs ⇒ scripts/obs}/debian.rules, {obs ⇒ scripts/obs}/debian.series, {obs ⇒ scripts/obs}/debian.watch, {obs ⇒ scripts/obs}/nut.dsc, {obs ⇒ scripts/obs}/nut.spec, {obs ⇒ scripts/obs}/pkgsrc.obs: Move obs/ to scripts/obs/ for consistency with other helper code
  • obs/nut.spec: shebangs: fix shell and sed syntax
  • obs/nut.spec: abstract the DOCPATH as a spec-var
  • obs/nut.spec: do not mention man1
  • obs/nut.spec: abstract the LIBEXECPATH as a spec-var
  • obs/nut.spec: reject found apache_serverroot that is under /usr/share
  • obs/nut.spec: announce where and how we rewrite shebangs
  • obs/nut.spec: seems there is no "%if X != Y" syntax
  • obs/nut.spec: comment about alias man pages seen as duplicate files in package
  • obs/nut.spec: specify system locations we use via %dir
  • obs/nut.spec: do not dump sockdebug and NDE script into /usr/libexec directly
  • obs/nut.spec: avoid what looks like spec-var expansion in comments
  • obs/debian.rules: try harder to detect python2/3 helper
  • ci_build.sh: pkg*: pre-cleanup more
  • ci_build.sh: pkg-deb: clean away cdbs temp leftovers
  • ci_build.sh: pkg-deb: install prereqs (TBD;: optional?)
  • ci_build.sh: pkg-deb: force debuikd differently
  • ci_build.sh: pkg-deb: fix shell and sed syntax
  • obs/Makefile.am, obs/control: obs/*: drop "control" symlink
  • ci_build.sh, obs/Makefile.am, obs/{nut-linux-i2c.install ⇒ debian.nut-linux-i2c.install}, obs/{nut-linux-i2c.manpages ⇒ debian.nut-linux-i2c.manpages}, obs/{nut-modbus.install ⇒ debian.nut-modbus.install}, obs/{nut-modbus.manpages ⇒ debian.nut-modbus.manpages}, obs/{nut.changes ⇒ debian.nut.changes}: obs.*, ci_build.sh: rename debiam recipe files to standard pattern
  • ci_build.sh: wrap pkg-rpm and pkg-deb (PoC)
  • obs/debian.rules: convince cdbs about dh_python3 when it is the only viable option
  • obs/nut.dsc, obs/debian.control: do not require "python-is-…" which confuses cdbs
  • NEWS.adoc, UPGRADING.adoc: Drop git-tracked compile script
  • Makefile.am: EXTRA_DIST the autotools compile script
  • .gitignore, compile: Drop git-tracked compile script

2.146. 2025-10-08 Jim Klimov <jimklimov+nut@gmail.com>

  • obs/nut.spec: reshuffle NUT_SYSTEMD_UNITS_SERVICE_TARGET definition
  • obs/debian.rules: fix pkg-config search for systemd vars
  • obs/debian.rules: fix iteration for debian *.install fixup (DMF)
  • obs/debian.rules: fix check for NUTPKG_WITH_DMF
  • obs/debian.rules: search for systemd configs also in libsystemd
  • obs/nut.spec: udev rules no longer under /etc - not a %config (hopefully)
  • obs/nut.spec: fix rpm-var expansion for conditionals
  • obs/debian.rules: fix sed with parentheses
  • obs/nut.spec: only package docs/cables/*.txt, not the whole builddir
  • obs/nut.spec: address some concerns from rpmlint
  • obs/nut.spec: %pre: try to groupadd to be sure
  • obs/debian.rules: make NUTPKG_WITH_DMF optional (based on the branch we build)
  • obs/debian.nut-cgi.docs: README renamed to *.adoc
  • obs/README.adoc, docs/nut.dict: update info about OBS recipes [#1209]
  • obs/nut.spec: require basic tooling used in rpmlint checks
  • obs/nut.spec: try another way of checking that apache_serverroot is defined and not empty
  • obs/debian.rules: bump SO_MAJOR_LIB* vars and add libnutconf installation
  • obs/nut.spec: comment about %(cmd) definitions
  • obs/debian.rules: binary-install/nut-monitor: use dh_python* more clearly
  • obs/debian.rules: fix a shell/make typo
  • obs/nut.spec: try another way of checking that apache_serverroot is defined and not empty
  • obs/nut.spec: exclude in root package whatever we put into sub-packages (rpmbuild seems to duplicate this)
  • obs/nut.spec: post: neuter faults of chown/chgrp/chmod (some rpmbuilds fail self-check due to lack of accounts)
  • obs/nut.spec: update comments
  • obs/nut.spec: actually detect ability to build NUTPKG_WITH_DMF (sources available or not in this branch)
  • obs/nut.spec: only use apache_serverroot if we can detect it; otherwise dump NUT CGI artifacts under our _libexecdir and _datadir
  • NEWS.adoc, UPGRADING.adoc, docs/man/Makefile.am, …/{nutdrv_siemens_sitop.txt ⇒ nutdrv_siemens-sitop.txt}: docs/man/nutdrv_siemens-sitop.txt, docs/man/Makefile.am, UPGRADING.adoc: Fixed man page naming for nutdrv_siemens-sitop(.8) (dash vs. underscore) to match the driver program name [#1209, #545]
  • configure.ac, scripts/python/Makefile.am: Avoid "make install" writing PyNUT.py and test_nutclient.py to same location twice
  • drivers/mge-hid.c: add Eaton Ellipse PRO 5S1600 [#2380]

2.147. 2025-10-07 Jim Klimov <jimklimov+nut@gmail.com>

  • obs/nut.spec: fix sub-package name for NUT-Monitor (GUI)
  • obs/debian.nut-monitor.install: GUI glade files have moved
  • obs/nut.spec: avoid "chown USER:GROUP" syntax
  • obs/debian.nut.docs: update file name lists
  • obs/nut.spec: only run udevadm where available
  • obs/nut.spec: rename "GROUP" which tends to pull in package type string
  • obs/nut.spec: deliver files that are built and installed but were not listed
  • obs/debian.control: support several libusb implementations
  • obs/debian.rules: do not run python directly anymore
  • obs/debian.changelog, obs/nut.dsc: bump formal versioning
  • obs/nut.spec: many docs files were renamed to *.adoc
  • obs/nut.spec: exclude DMF artifacts from main pkg only if NUTPKG_WITH_DMF in the first place
  • obs/nut.spec: reword comment
  • obs/nut.spec: hide dblatex
  • obs/nut.spec: explicitly "Prefer" something when OBS sees we "have choice for (X or Y)"
  • obs/nut.spec: do not call "python" directly
  • obs/nut.spec: revise neon dependency
  • obs/nut.spec: LUA only needed for DMF builds
  • obs/nut.spec: fix typos; make cppunit-devel optional (not in RHEL7)
  • obs/nut.spec: make TCP_WRAPPERS builds optional (if package seems available to be installed - was obsoleted in many distros)
  • obs/nut.spec: refactor BuildRequires to avoid catering to distro-specific macro names
  • obs/nut.spec: make IPMI, AVAHI and POWERMAN builds optional (if package seems available to be installed)
  • obs/nut.spec: make DMF builds and deliveries optional (currently off by default)
  • obs/nut.spec: accept either httpd-devel or apache2-devel
  • obs/nut.spec: accept either libusb-0.1 or 1.0
  • obs/nut.spec: update heading metadata
  • obs/nut.spec: expand python requirements
  • clients/upssched.c: start_timer(): drop unneeded NULLness checks [#3105]
  • conf/upsmon.conf.sample.in: align NOTIFYFLAG samples with NOTIFYMSG definitions [#3084] Also helps NIT generate an upsmon.conf to report those events in tests.
  • tests/NIT/upssched.conf.in: add handling for SHUTDOWN_HOSTSYNC [#3084]
  • docs/man/upsmon.txt, docs/nut.dict: introduce SHUTDOWN ACTIVITY WORKFLOW section [#3003, #3110]
  • docs/man/upsmon.txt: in SIMULATING POWER FAILURES section, refer to NIT scripts as a source of inspiration
  • docs/man/upsmon.txt: from UPS CONNECTION TYPES AND UPSMON ROLES section, refer to TIMED SHUTDOWNS section
  • docs/man/upsmon.txt: reword intro (and name) of UPS CONNECTION TYPES AND UPSMON ROLES section

2.148. 2025-10-06 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/man/upssched.txt: suggest using FSD notification for early shutdown activity on the upsmon primary system [#3003]
  • docs/man/upssched.conf.txt, docs/man/upssched.txt: note that command execution is not async in upssched
  • NEWS.adoc, clients/upsmon.c, clients/upsmon.h: clients/upsmon.{c,h}, NEWS.adoc: Make sure FSD notifications are always issued at latest when shutdown handling just starts (or earlier) [#3003, #3110]
  • ci_build.sh: consider_cleanup_shortcut(): better react to changes of sources for configure script …even if there is no Makefile yet
  • scripts/misc/nut.bash_completion.in: fix indentations
  • configure.ac, scripts/Makefile.am, scripts/misc/.gitignore, scripts/misc/{nut.bash_completion ⇒ nut.bash_completion.in}: scripts/misc/nut.bash_completion: convert to .in template to use TAIL_ARGS_FROM_NTH_LINE [#3099]
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: use TAIL_ARGS_FROM_NTH_LINE [#3099]
  • configure.ac: detect TAIL_ARGS_FROM_NTH_LINE [#3099]
  • configure.ac: fix indent

2.149. 2025-10-04 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/Solaris/postinstall.in: Update comments/messages for legacy init script usage on Solaris older than 10 [#3099]
  • scripts/Solaris/preremove.in, scripts/Solaris/postinstall.in: quiesce upsdrvctl activity; add tweak-ability for debugging NUT programs in the install script context (possibly with custom package builds) [#3099]
  • scripts/misc/nut.bash_completion, scripts/Solaris/reset-ups-usb-solaris.sh.sample, scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: avoid "tail -n \+/-NUM" syntax as unportable [#3099]
  • .github/workflows/codeql.yml: disable ccache use for actual compilation, for CodeQL analysis to hook into compiler correctly

2.150. 2025-10-02 Jim Klimov <jimklimov+nut@gmail.com>

  • ci_build.sh: fix typo in message
  • ci_build.sh: USE_CONFIG_SHELL at least from explicit caller envvar [#3099]
  • ci_build.sh: revise indentation
  • clients/upssched.c: simplify loop processing [#3097]
  • tests/NIT/upssched.conf.in: rename parameters passed to "EXECUTE" methods, for less confusing dev-testing logs [#3105]
  • clients/upsmon.c: add debug logging to NOTIFYCMD (WIN32) [#3097]
  • docs/man/upssched.txt: list common and unique options
  • NEWS.adoc, clients/upssched-cmd, clients/upssched.c, conf/upssched.conf.sample.in, docs/man/upssched.conf.txt, docs/man/upssched.txt, scripts/misc/notifyme-debug: upssched: introduce passing of NOTIFYMSG to CMDSCRIPT [#3105]

2.151. 2025-10-01 Jim Klimov <jimklimov+nut@gmail.com>

  • Makefile.am: work around lack of "id -u" [#3099]
  • ci_build.sh: detect_platform_PKG_CONFIG_PATH_and_FLAGS(): fix use of PKG_CONFIG variable [#3099]
  • ci_build.sh: work around NCPUS prefixed with white-space [#3099]
  • ci_build.sh: work around lack of "find -maxdepth" [#3099]
  • scripts/python/Makefile.am: add a fallback TOUPPER/TOLOWER implementation [#3099]
  • ci_build.sh, scripts/subdriver/gen-snmp-subdriver.sh, scripts/subdriver/gen-usbhid-subdriver.sh: add a fallback TOUPPER/TOLOWER implementation [#3099]
  • configure.ac, m4/ax_realpath.m4: introduce a fallback "mktemp" [#3099]
  • scripts/subdriver/gen-usbhid-subdriver.sh: quote calls to mktemp [#3099]
  • scripts/subdriver/gen-snmp-subdriver.sh, scripts/subdriver/gen-usbhid-subdriver.sh: add a fallback mktemp implementation [#3099]
  • scripts/subdriver/gen-snmp-subdriver.sh: avoid grep for char classes, it is also not ubiquitous [#3099]
  • scripts/subdriver/gen-snmp-subdriver.sh: avoid "GREP -e", it is also not ubiquitous [#3099]
  • ci_build.sh: avoid "GREP -e", it is also not ubiquitous [#3099]
  • ci_build.sh: fix GGREP detection [#3099]
  • tools/driver-list-format.sh: revise reaction to "diff" problems or successes [#3099]
  • tools/driver-list-format.sh: sed class [:blank:] is not portable [#3099]
  • tools/driver-list-format.sh, docs/docinfo.xml.sh.in: fallback for absent "diff -u" feature in pretty reporting [#3099]
  • Makefile.am, tests/nut-driver-enumerator-test.sh: fallback for absent "diff -u" feature; use detected or passed EGREP [#3099]
  • NEWS.adoc: update about portability fixes [#3099]
  • tests/NIT/nit.sh: "id -u" is not ubiquitous, find fallback ways to check that I_AM_ROOT [#3099]
  • ci_build.sh, configure.ac, docs/Makefile.am, docs/man/Makefile.am, m4/ax_realpath_lib.m4, m4/nut_check_libnetsnmp.m4, scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: Portability: in some shells, "if" only accepts the list of commands to run (there is no "if ! condition" support) - some better hidden cases [#3099]
  • scripts/installer/common/aix_init, scripts/installer/common/ipp-host-shutdown.sample, scripts/installer/common/ipp-os-shutdown: scripts/installer/*: fix syntax to pass on old Solaris 8 /bin/sh [#3099]
  • Makefile.am, ci_build.sh, configure.ac, docs/Makefile.am, docs/man/Makefile.am, scripts/Windows/build-mingw-prereqs.sh, scripts/python/app/NUT-Monitor, scripts/python/module/Makefile.am, scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in, tests/NIT/nit.sh, tools/Makefile.am, tools/gitlog2version.sh: Portability: in some shells, "if" only accepts the list of commands to run (there is no "if ! condition" support) [#3099]
  • autogen.sh: do fail if configure script did not get generated [#3099]
  • configure.ac, m4/ax_check_compile_flag.m4, m4/ax_realpath_lib.m4, m4/nut_check_asciidoc.m4, m4/nut_check_aspell.m4, m4/nut_check_libmodbus.m4, m4/nut_check_libsystemd.m4, m4/nut_check_os.m4, m4/nut_check_pkgconfig.m4, m4/nut_check_python.m4, m4/nut_compiler_family.m4: configure.ac, m4/*.m4: try to use the detected GREP and EGREP tools [#3099]
  • NEWS.adoc: add historic reference from #3099 to #1660
  • ci_build.sh: handle a couple more "test -e" cases [#3099]
  • docs/Makefile.am, docs/man/Makefile.am: handle a couple more "test -e" cases [#3099]
  • scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: substitute plain GREP too [#3099]
  • docs/man/Makefile.am: substitute plain GREP too [#3099]
  • docs/Makefile.am: substitute plain GREP too [#3099]
  • data/Makefile.am: export GREP or EGREP detected by configure, so further called scripts do not have to re-detect [#3099]
  • tools/gitlog2version.sh: use or discover GREP to avoid literal "grep" [#3099]
  • tools/driver-list-format.sh: use or discover EGREP to avoid literal "grep -E" [#3099]
  • configure.ac: detect and export (E)GREP as early as possible [#3099]
  • configure.ac: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • tests/NIT/Makefile.am: nut_version.h: export GREP or EGREP detected by configure, so further called scripts do not have to re-detect [#3099]
  • include/Makefile.am: nut_version.h: export GREP or EGREP detected by configure, so further called scripts do not have to re-detect [#3099]
  • autogen.sh, ci_build.sh: export GREP or EGREP if we detect them, so further called scripts do not have to re-detect [#3099]
  • NEWS.adoc: summarize fixes for "grep" and "test" callouts [issue #3099]
  • scripts/Solaris/postinstall.in: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • m4/ax_realpath.m4: protect against lack of "test -e" even better (some shells do crash trying) [#3099]
  • docs/man/Makefile.am: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • tests/NIT/nit.sh: use or discover EGREP to avoid literal "grep -E"; also GREP [#3099]
  • tools/nut-dumpdiff.sh: use or discover EGREP to avoid literal "grep -E" [#3099]
  • scripts/subdriver/gen-usbhid-subdriver.sh: use or discover EGREP to avoid literal "grep -E"; also GREP; avoid "grep -q" [#3099]
  • scripts/subdriver/gen-snmp-subdriver.sh: use or discover EGREP to avoid literal "grep -E"; also GREP; avoid "grep -q" [#3099]
  • scripts/Solaris/reset-ups-usb-solaris.sh.sample: roll back "grep -E" requirement [#3099, #1660]
  • ci_build.sh: use or discover EGREP to avoid literal "grep -E" [#3099]
  • drivers/nutdrv_hashx.c: do not directly require "stdint.h" [#3099]
  • drivers/Makefile.am: fix library search order for upsdrvctl build [#3099]
  • autogen.sh: avoid "find -not …" [#3099]
  • autogen.sh: use or discover EGREP to avoid literal "grep -E" [#3099]
  • autogen.sh: report about testing generated script syntax [#3099]
  • tools/gitlog2version.sh: avoid shell substitution missing in older shells [#3099]
  • tools/gitlog2version.sh: use or discover EGREP to avoid literal "grep -E" [#3099]
  • tools/gitlog2version.sh: avoid "[ -e" or "test -e" which some older shells lack and do crash trying [#3099]
  • docs/Makefile.am: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • Makefile.am: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • tests/NIT/README.adoc, tests/NIT/nit.sh: tests/NIT/nit.sh: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • ci_build.sh: avoid "[ -e" or "test -e" which some older shells lack [#3099]
  • Makefile.am: EXTRA_DIST some more useful files

2.152. 2025-09-30 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/net-protocol.txt: log the TODO idea for "Logout pending" of some sort [#3086]
  • docs/net-protocol.txt: cross-link LIST CLIENT and GET NUMLOGINS
  • docs/net-protocol.txt: clarify intro about client libraries and other bindings, in-tree or third-party

2.153. 2025-09-29 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/snmp-ups.c: allow to actually abort stuck init [#3101]
  • drivers/snmp-ups.c: implement a non-trivial upsdrv_tweak_prognames() to allow aliasing with "snmp-ups-old" [#3101]
  • NEWS.adoc, UPGRADING.adoc, docs/new-drivers.txt, docs/nut.dict, drivers/adelsystem_cbi.c, drivers/al175.c, drivers/apc_modbus.c, drivers/apcsmart-old.c, drivers/apcsmart.c, drivers/apcupsd-ups.c, drivers/asem.c, drivers/bcmxcp.c, drivers/belkin.c, drivers/belkinunv.c, drivers/bestfcom.c, drivers/bestfortress.c, drivers/bestuferrups.c, drivers/bestups.c, drivers/bicker_ser.c, drivers/blazer_ser.c, drivers/blazer_usb.c, drivers/clone-outlet.c, drivers/clone.c, drivers/dummy-ups.c, drivers/etapro.c, drivers/everups.c, drivers/failover.c, drivers/gamatronic.c, drivers/generic_gpio_common.c, drivers/generic_gpio_libgpiod.c, drivers/generic_modbus.c, drivers/genericups.c, drivers/huawei-ups2000.c, drivers/hwmon_ina219.c, drivers/isbmex.c, drivers/ivtscd.c, drivers/liebert-esp2.c, drivers/liebert-gxe.c, drivers/liebert.c, drivers/macosx-ups.c, drivers/masterguard.c, drivers/metasys.c, drivers/mge-utalk.c, drivers/microdowell.c, drivers/microsol-apc.c, drivers/microsol-common.c, drivers/netxml-ups.c, drivers/nhs_ser.c, drivers/nut-ipmipsu.c, drivers/nutdrv_atcl_usb.c, drivers/nutdrv_hashx.c, drivers/nutdrv_qx.c, drivers/nutdrv_siemens_sitop.c, drivers/oneac.c, drivers/optiups.c, drivers/phoenixcontact_modbus.c, drivers/pijuice.c, drivers/powercom.c, drivers/powerman-pdu.c, drivers/powerpanel.c, drivers/powervar_cx_ser.c, drivers/powervar_cx_usb.c, drivers/rhino.c, drivers/richcomm_usb.c, drivers/riello_ser.c, drivers/riello_usb.c, drivers/safenet.c, drivers/skel.c, drivers/sms_ser.c, drivers/snmp-ups.c, drivers/socomec_jbus.c, drivers/solis.c, drivers/tripplite.c, drivers/tripplite_usb.c, drivers/tripplitesu.c, drivers/upscode2.c, drivers/usbhid-ups.c, drivers/ve-direct.c, drivers/victronups.c: drivers/*, docs/new-drivers.txt, UPGRADING.adoc, NEWS.adoc: implement (no-op) upsdrv_tweak_prognames() and bump DRIVER_VERSION numbers [#3101]
  • drivers/main.c, drivers/main.h: drivers/*: introduce upsdrv_tweak_prognames() hook [#3101]
  • common/common.c, drivers/main.c: drivers/main.c: main(): use new sendsignalfnaliases() and sendsignalpidaliases() with prognames[] [#3101]
  • NEWS.adoc, common/common.c, docs/nut.dict, include/common.h: common/common.c, include/common.h, NEWS.adoc: extend with plural sendsignalpidaliases() and sendsignalfnaliases() [#3101]
  • drivers/main.c, drivers/main.h: drivers/main.{c,h}: allow to track several prognames[] for acceptable driver program aliases [#3101]
  • drivers/upsdrvctl.c: help(): fix global vs local arg name
  • NEWS.adoc, common/common.c, docs/nut.dict, include/common.h: common/common.c, include/common.h, NEWS.adoc: extend with plural checkprocnames() and compareprocnames() [#3101]
  • clients/upsmon.c: add comments to methods involved in shutdown to clarify who normally runs as root or not [#3084]

2.154. 2025-09-28 Nick Briggs <nicholas.h.briggs@gmail.com>

  • Makefile.am, clients/Makefile.am, docs/Makefile.am, docs/docinfo.xml.sh.in, docs/man/Makefile.am, scripts/python/Makefile.am, scripts/systemd/nut-server.service.in, scripts/upsdrvsvcctl/nut-driver-enumerator.sh.in: Modifies Makefile.am files and some script ".in" files to use $EGREP The standard Solaris 10/11 "/usr/bin/grep" does not accept the "-E" option. The autotools will set EGREP to the best available tool. Makefile.am that need EGREP functionality should use $(EGREP) rather than directly calling "grep -E". Additionally, scripts that are generated to be installed as part of the package that need EGREP functionality should use the same tool that was located during configuration (assuming no cross-compilation with different EGREP tool availability). Closes #3099

2.155. 2025-09-25 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsmon.c: main loop: avoid sleep if FSD signal was raised during the long work cycle [#3084]
  • clients/upsmon.c: user_fsd(), main loop: try to ensure immediate reaction to FSD signals (interrupt a sleep() if needed) [#3084]
  • docs/config-notes.txt: clarify that upsmon exit is now subject to SHUTDOWNEXIT setting [#3084, #2133]
  • NEWS.adoc, clients/upsmon.c, clients/upsmon.h, common/nutconf.cpp, common/nutwriter.cpp, conf/upsmon.conf.sample.in, docs/config-notes.txt, docs/man/upsmon.conf.txt, include/nutconf.hpp: clients/upsmon.h, conf/upsmon.conf.sample.in, etc: Introduced a SHUTDOWN_HOSTSYNC notification message [#3084]
  • conf/upsmon.conf.sample.in, docs/man/upsmon.conf.txt: revise documentation of FINALDELAY [#3084] Notably, both primary and secondary upsmon doshutdown() to handle FSD.
  • clients/upsmon.c: doshutdown(), runparent(): debug-log just before executing shutdowncmd [#3084]
  • clients/upsmon.c: runparent(): when waiting for a child to exit, and we know its PID, react to the end of specifically that process [#3084]
  • clients/upsmon.c: doshutdown(), runparent(): Take note of start timestamp before calling SHUTDOWNCMD [#3084]
  • clients/upsmon.c: doshutdown(): debug-log about waiting for FINALDELAY [#3084]
  • clients/upsmon.c: set_pdflag(): log if POWERDOWNFLAG is not configured or is being written now [#3084]
  • clients/upsmon.c: doshutdown(), runparent(): initialize "time(&start)" always [#3084] Avoid (semi-bogus) warnings from clang that variable 'start' may be uninitialized when used here in difftime() later on.
  • clients/upsmon.c: truly deal with SHUTDOWNEXIT timeout as such, not a countdown [#3084]
  • clients/upsmon.c: revise tracking pid_pipechild when parent exits [#3084]
  • clients/upsmon.c: fix whitespace markup in decls

2.156. 2025-09-24 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsmon.c: add interaction between upsmon parent and child if SHUTDOWNEXIT is non-trivial [#3084]
  • clients/upsmon.c: revise comments and log messages in forceshutdown(), doshutdown(), start_pipe() [#3084]
  • clients/upsmon.c: start_pipe(), notify(): revise parent/child logging around the fork() [#3084]
  • clients/upsmon.c, clients/upssched.c, drivers/upsdrvctl.c: call first setproctag() after setting up nut_debug_level [#3084]
  • common/common.c, include/common.h: refactor and optimize getprocname(getpid()) calls with caching getmyprocname() and getmyprocbasename() [#3084]
  • common/common.c, include/common.h, clients/upsmon.c, clients/upssched.c, drivers/upsdrvctl.c: move proctag_cleanup() into common code and auto-register during first use of setproctag() [#3084]
  • drivers/upsdrvctl.c, NEWS.adoc: introduce logging of self-assigned forked process tags [#3084]
  • clients/upssched.c, NEWS.adoc: introduce logging of self-assigned forked process tags [#3084]
  • clients/upsmon.c: improve debugging messages of forceshutdown() [#3084]
  • clients/upsmon.c, NEWS.adoc: introduce logging of self-assigned forked process tags [#3084]
  • common/common.c, include/common.h, NEWS.adoc, docs/nut.dict: introduce logging of self-assigned forked process tags [#3084]

2.157. 2025-09-23 Jim Klimov <jimklimov+nut@gmail.com>

  • ci_build.sh: honour CI_CCACHE_USE=no more diligently
  • NEWS.adoc, clients/upssched.c, conf/upssched.conf.sample.in, docs/man/upssched.conf.txt: clients/upssched.c: revise CANCEL-TIMER, introduce CANCEL-TIMER-MATCHED [#3097]
  • scripts/misc/notifyme-debug: fix shell typo
  • clients/upssched.c: fix START-TIMER-SHARED [#3097]
  • clients/upssched.c: revise logging of timer events [#3097]

2.158. 2025-09-22 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upssched.c: start_timer(): revise START-TIMER-SHARED behavior [#3097]
  • clients/upssched.c: fix CI suggestions [#3097]
  • clients/upssched.c: log-trace through, and fix, removetimers() and connection loss due to a recent bug there [#3097]
  • clients/upssched.c: send_to_one(): improve debugging [#3097]
  • clients/upssched.c: collect_string(): fix the iteration logic [#3097]
  • clients/upssched.c, docs/man/upssched.txt, NEWS.adoc: introduce upssched -l mode [#3097]
  • docs/man/upssched.conf.txt: PIPEFN: chain the paragraphs of one description (indent them correctly) [#3097]
  • NEWS.adoc, clients/upssched.c, conf/upssched.conf.sample.in, docs/man/upssched.conf.txt, tests/NIT/upssched.conf.in: clients/upssched.c, conf/upssched.conf.sample.in, docs/man/upssched.conf.txt, NEWS.adoc: introduce support for DEBUG_MIN in upssched.conf [#3097]
  • clients/upssched.c: update © header with major contributors
  • clients/upssched.c: in messages that refer to upsmon, append its man page section
  • clients/upssched.c, NEWS.adoc, conf/upssched.conf.sample.in, docs/man/upssched.conf.txt: let timers pass forward the UPSNAME and NOTIFYTYPE again - now with relevant values; introduce START-TIMER-SHARED [#3092, #3097]

2.159. 2025-09-21 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upssched.c: update comments [#3092]
  • clients/upssched.c: rename global upsname ⇒ ups_name to be on par with global notify_type [#3092]
  • docs/man/nut.txt, docs/nut.dict: describe NUT layer 3.5 - role of the drivers during shutdown
  • docs/man/nut.txt: suggest more packaged user-names for NUT daemons
  • NEWS.adoc, drivers/nutdrv_qx.c, drivers/nutdrv_qx.h: drivers/nutdrv_qx.{c,h}, NEWS.adoc: define an internal QX_FLAG_MAPPING_HANDLED, introduce analyze_mapping_usage() method [#3095]
  • drivers/nutdrv_qx.c: fix whitespace
  • drivers/usbhid-ups.c: analyze_mapping_usage(): rephrase last suggestion with also checking and building recent NUT code [#3082, #3095]

2.160. 2025-09-19 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/snmp-ups.c, drivers/usbhid-ups.c: drivers/snmp-ups.c: account SU_FLAG_MAPPING_HANDLED and do analyze_mapping_usage() [#3095]
  • NEWS.adoc, drivers/snmp-ups.h: drivers/snmp-ups.{c,h}, NEWS.adoc: define an internal SU_FLAG_MAPPING_HANDLED [#3095]
  • drivers/snmp-ups.c: fix markup
  • drivers/snmp-ups.h: modernize a few comments
  • drivers/snmp-ups.c: suggest in log how to improve a driver where only IETF auto-matched [#3095]
  • drivers/hidtypes.h: update a comment [#3082]
  • drivers/usbhid-ups.c: fix whitespace
  • drivers/usbhid-ups.c: offload analyze_mapping_usage() to a method [#3082, #3095] Note the activity is now still limited to when debug logging is enabled.

2.161. 2025-09-18 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/usbhid-ups.c, NEWS.adoc: suggest in log how to improve a driver with too few mappings defined/used [#3082]
  • NEWS.adoc, docs/ci-farm-do-setup.adoc, docs/ci-farm-lxc-setup.txt, docs/config-notes.txt, docs/config-prereqs.txt, docs/configure.txt, docs/daisychain.txt, docs/design.txt, docs/documentation.txt, docs/download.txt, docs/features.txt, docs/hid-subdrivers.txt, docs/net-protocol.txt, docs/new-clients.txt, docs/new-drivers.txt, docs/nut-names.txt, docs/nut-versioning.adoc, docs/nutdrv_qx-subdrivers.txt, docs/outlets.txt, docs/scheduling.txt, docs/security.txt, docs/snmp-subdrivers.txt, docs/sock-protocol.txt, docs/support.txt: docs/*.txt: add asciidoc comments with links to nut-website rendered contents of most interesting pages
  • docs/maintainer-guide.txt: avoid pushing final release tags to upstream more than once, really!
  • scripts/Makefile.am: do not EXTRA_DIST the generated scripts/Windows/Makefile — the .in template suffices Thanks to @gdt for the heads-up.

2.162. 2025-09-12 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsmon.c: doshutdown(): log more loudly that exit_flag is raised, so shutdownexitdelay does not apply currently [#3084]

2.163. 2025-09-11 Jim Klimov <jimklimov+nut@gmail.com>

  • clients/upsmon.c, NEWS.adoc: doshutdown(): collapse non-zero shutdownexitdelay handling into one clause, and ping the data server(s) while in the loop [#3084]
  • clients/upsmon.c: more logging about ways to exit() the program, and why/when it happened [#3084]

2.164. 2025-09-10 Jim Klimov <jimklimov+nut@gmail.com>

  • scripts/python/module/Makefile.am: emit log note that .pypi-dist-pip-wheel goal does not produce sdist archives [#3056]
  • scripts/python/module/Makefile.am: fix typo in comment
  • NEWS.adoc: fixed PyPI publication to include sdist tarball [#3056]
  • .github/workflows/PyNUTClient.yml: fix shell markup [#3056]
  • .github/workflows/PyNUTClient.yml: actually install "setuptools" module with "pip" [#3056]
  • .github/workflows/PyNUTClient.yml: allow manually running the GHA task

2.165. 2025-09-08 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/hid-subdrivers.txt, docs/nut.dict: docs/hid-subdrivers.txt: updating existing drivers: suggest newly logged discrepancies of "seen vs. used" data [#3082]
  • drivers/nutdrv_atcl_usb.c: when suggesting other drivers and configs, refer to build-aware man page sections
  • docs/hid-subdrivers.txt: fix a bit of markup
  • clients/upslog.c, NEWS.adoc: update help() and failure messages to suggest -m *,-
  • drivers/usbhid-ups.c: process_boolean_info(): handle OB=!OL and OL=!OB here (when the bit is being set) [#3080]
  • drivers/usbhid-ups.c: upsdrv_initups(): upsdebugx() at verbosity 0 (always) if there are too few mappings known or used via USB HID [#3082]
  • drivers/apc-hid.c, NEWS.adoc, scripts/upower/95-upower-hid.hwdb: declare support for APC 0x051d:0x0005 as a USB HID device [#3047]
  • drivers/nutdrv_atcl_usb.c: upsdrv_initups() failure mode: suggest using nutdrv_qx(8) or blazer_usb(8) driver instead [#1021, #2152 follow-up]
  • data/driver.list.in: add Voltronic Power USB ID 0665:5161 as nutdrv_qx supported (per driver source comments)
  • data/driver.list.in: add "Various" USB interface chip names or IDs 0665:5161 and 0001:0000 as nutdrv_qx or rarely nutdrv_atcl_usb supported
  • data/driver.list.in: add Salicru SPS 500 ONE USB ID 0665:5161 as nutdrv_qx supported [#3079]
  • data/driver.list.in: add Belkin USB ID 0665:5161 as nutdrv_qx supported (per driver source comments)
  • drivers/usbhid-ups.c: upsdrv_initups(): fix variable name for the snprintf() return value [#3083]
  • drivers/usbhid-ups.c: upsdrv_initups(): also report how many hid2nut mappings are known vs. how many were used using USB HID [#3082]
  • drivers/usbhid-ups.c: upsdrv_initups(): generalize the report of unused report descriptor entries to "completely unused" vs. "partially unused" (e.g. Feature vs Input) [#3082]
  • drivers/usbhid-ups.c, drivers/hidtypes.h, NEWS.adoc: check if the subdriver code (mappings) and the device report sit together well [#3082]
  • drivers/usbhid-ups.c: callback(): update logged message that not only Manufacturer, but possibly an explicit Model, may be not-supported
  • NEWS.adoc: update about usbhid-ups suggestion to iterate "subdriver" values
  • drivers/usbhid-ups.c: upsdrv_initups(): check that if no ups_status bit was set, suggest that wrong "subdriver" is used then [#3080, #3061, #2058]
  • drivers/usbhid-ups.c: callback(): add log messages to stress that the dump of Report Descriptor actually seen, and its later hid_ups_walk() with a particular subdriver, may not match up well [#3061]
  • drivers/usbhid-ups.c: upsdrv_initups(): add log messages to help trace logical progress through the code [#3061]
  • drivers/usbhid-ups.c: possibly_supported(): suggest iterating "subdriver" values [#2058]
  • NEWS.adoc, drivers/usbhid-ups.c, drivers/usbhid-ups.h: drivers/usbhid-ups.c: do not assume that "!online"=="offline" [#3080]
  • drivers/usbhid-ups.c: fix indentation (cosmetic)
  • drivers/usbhid-ups.c: ups_status_set(): revise code markup/style

2.166. 2025-09-07 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/mge-hid.c, NEWS.adoc: Improved support for Eaton 5S1500LCD (US version). [#2380]
  • NEWS.adoc, docs/config-prereqs.txt, docs/configure.txt, docs/developers.txt, docs/download.txt, docs/maintainer-guide.txt, docs/man/apcsmart.txt, docs/man/belkin.txt, docs/man/genericups.txt, docs/man/mge-shut.txt, docs/man/upsdrvsvcctl.txt, docs/man/upsmon.conf.txt, docs/man/upssched.conf.txt, docs/man/upsset.cgi.txt, docs/man/usbhid-ups.txt, docs/new-drivers.txt, docs/outlets.txt, docs/packager-guide.txt, docs/scheduling.txt, scripts/Windows/README.adoc, scripts/external_apis/enphase/README.adoc: Reword multiple docs to avoid admonition blocks with invalid sentences
  • docs/Makefile.am: spellcheck: help avoid admonition blocks with invalid sentences (after rendering as a box)
  • docs/download.txt: revise markup for Windows downloads
  • docs/download.txt: revise info about/from Repology
  • docs/download.txt: revise note about official releases
  • docs/download.txt: revise part about source archives from github

2.167. 2025-09-06 desertwitch <24509509+desertwitch@users.noreply.github.com>

  • drivers/nutdrv_qx_megatec.c: trim battery.runtime variable

2.168. 2025-09-05 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/codeql.yml: fix syntax for codeql queries

2.169. 2025-09-04 Jim Klimov <jimklimov+nut@gmail.com>

  • .github/workflows/codeql.yml: Revert ".github/workflows/codeql.yml: use modern "language" ID "c-cpp"" This reverts commit 972358ec7663007419f0b1926d30f9f5a494d910.
  • .github/workflows/codeql.yml: enable ccache per scenario, follow experience from wmnut#24
  • .github/workflows/codeql.yml: enable more codeql queries
  • .github/workflows/codeql.yml: relocate comments, drop dead code
  • .github/workflows/codeql.yml: avoid man-db update in APT actions
  • .github/workflows/codeql.yml: report the location and version of compiler used
  • .github/workflows/codeql.yml: add a way to vary matrix.build-mode for codeql
  • .github/workflows/codeql.yml: only init CodeQL just before the actual build, not before other filesystem changes
  • .github/workflows/codeql.yml: use modern "language" ID "c-cpp" "c" and "cpp" are older names, now aliases to this one
  • .github/workflows/codeql.yml: revise markup and comments of the matrix definition
  • .github/workflows/codeql.yml: Allow manually running the action, e.g. if disabled after some quietness in the source

2.170. 2025-09-03 Laurent Bigonville <bigon@bigon.be>

  • docs/Makefile.am: Fix installation of the pdf files

2.171. 2025-09-03 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/developers.txt: clarify use of "void" argument lists

2.172. 2025-09-02 Jim Klimov <jimklimov+nut@gmail.com>

  • tools/nut-usbinfo.pl: update comment
  • tools/nut-usbinfo.pl: use binmode for written files to have same markup regardless of builder OS
  • ci_build.sh: when reporting host envvars, use backslashes to facilitate copy-paste reproduction of CI builds
  • ci_build.sh: when reporting CONFIGURING NUT, use backslashes to facilitate copy-paste reproduction of CI builds
  • configure.ac, docs/configure.txt, m4/nut_check_python.m4, NEWS.adoc: allow to configure Python module install location more generally [#3062]
  • scripts/python/app/NUT-Monitor-py2gtk2.in, scripts/python/app/NUT-Monitor-py3qt5.in, scripts/python/app/NUT-Monitor-py3qt6.in: scripts/python/app/NUT-Monitor-py*.in: try to honour a customized PyNUT(Client) module path [#3062]

2.173. 2025-09-02 Hector Martin <marcan@marcan.st>

  • drivers/apc_modbus.c: apc_modbus: Fix invalid memory access for USB vendor/product/serial

2.174. 2025-08-31 Jim Klimov <jimklimov+nut@gmail.com>

  • configure.ac, docs/configure.txt, m4/nut_check_python.m4, NEWS.adoc: allow to configure PyNUT(Client) install location [#3062]

2.175. 2025-08-21 me <me@LIONINE>

  • drivers/upsdrvctl.c: In case of WIN32 build, most drivers are located in "bin". but referred Relative running path, it is "sbin". So changing to "NULL(running path)" to "bin"
  • scripts/Windows/wininit.c: nut.exe are call upsdrvctl.exe in bin. but upsdrvctl.exe located in sbin. So, change bin to sbin.

2.176. 2025-08-09 Colin Dean <colindean@users.noreply.github.com>

  • docs/download.txt, docs/nut.dict: Include macOS with Mac OS X Apple shortened the name to "OS X" in 2011 and then changed it to "macOS" in 2016 to align with the branding of Apple’s other operating systems. https://en.wikipedia.org/w/index.php?title=MacOS&oldid=1304698699
  • docs/download.txt: Update download.txt with link to Homebrew formula for macOS nut has been in Homebrew since 2014.

2.177. 2025-08-08 Jim Klimov <jimklimov+nut@gmail.com>

  • NEWS.adoc, UPGRADING.adoc: prepare for v2.8.5.x iterations
  • NEWS.adoc, UPGRADING.adoc, docs/docinfo.xml.in: Revert "NEWS.adoc, UPGRADING.adoc, docs/docinfo.xml.in: finalize text before NUT v2.8.4 release" This reverts commit 8f14140bbc395baa108bd06a9f664bd0a6f00bc8.
  • tools/gitlog2version.sh: for development, set fallback NUT_VERSION_DEFAULT=2.8.4.1

2.178. 2025-07-30 Jim Klimov <jimklimov+nut@gmail.com>

  • docs/qa-guide.adoc: mention OBS [#1209]
  • obs/README.adoc, obs/Makefile.am, Makefile.am, configure.ac: document the "obs" directory and cover it with scripting [#1209]
  • docs/qa-guide.adoc: move CodeQL up (alphabetically, and before semi-defunct Travis)
  • docs/nut-versioning.adoc, docs/developers.txt: rename to "NUT Semantic Versioning" consistently

2.179. 2025-07-08 Jim Klimov <jimklimov+nut@gmail.com>

  • drivers/usbhid-ups.c, drivers/powercom-hid.c, docs/man/usbhid-ups.txt, NEWS.adoc: introduce powercom_sdcmd_discrete_delay flag for Powercom Raptor and Smart KING Pro series [#3000]
  • drivers/powercom-hid.c: WIP fixes for discrete shutdown timings (per RAPTOR RPT-1500AP LCD practice) - fix messages [#3000]
  • NEWS.adoc, drivers/powercom-hid.c: fix shutdown delays for Powercom HID [#3000]
  • drivers/powercom-hid.c: WIP fixes for discrete shutdown timings (per RAPTOR RPT-1500AP LCD practice) [#3000] Authored-by: https://github.com/aleka204

2.180. 2024-12-30 Jim Klimov <jimklimov@gmail.com>

  • tests/nutlogtest.c: Standardize wording of "vs." over "vs" (comments, messages, docs) to be consistent, take two

2.181. 2024-01-31 Charles Lepple <clepple+nut@gmail.com>

  • drivers/tripplite_usb.c: add battery.charge for Protocol 3017 Reference: #2258

2.182. 2024-01-25 Charles Lepple <clepple+nut@gmail.com>

  • drivers/tripplite_usb.c: Protocol 3017 adjustments Reference: #2258 SMX1200XLHG is 230V / 50 Hz

2.183. 2023-02-28 Jim Klimov <jimklimov+nut@gmail.com>

  • common/str.c: str_ends_with(): update origin attribution

2.184. 2022-02-10 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: packaging/debian/rules: define a systemdtmpfilesdir
  • obs/debian.rules: packaging/debian/rules: report PKG_CONFIG_PATH default
  • obs/debian.control: packaging/debian/control: update "libmodbus5" dependency name for Debian 11

2.185. 2022-02-09 Jim Klimov <jim@jimklimov.com>

  • obs/debian.changelog, obs/debian.control, obs/debian.nut-server.install, obs/debian.nut-server.manpages, obs/nut-linux-i2c.install, obs/nut-linux-i2c.manpages, obs/nut-modbus.install, obs/nut-modbus.manpages, obs/nut.dsc: packaging/debian: update for nut-modbus and nut-linux-i2c driver packages

2.186. 2021-08-13 Clément <perrettecl@users.noreply.github.com>

  • obs/nut.dsc: Update nut.dsc

2.187. 2021-08-12 Clément <perrettecl@users.noreply.github.com>

  • obs/debian.control: Update debian.control

2.188. 2021-05-18 Clappier, Eric <EricClappier@Eaton.com>

  • obs/debian.libnutclientstub-dev.install: Remove lib static for libnutclientstub dev install
  • obs/debian.rules: Fix issue in debian rules for libnutclientstub

2.189. 2021-05-17 Clément <clementperrette@eaton.com>

  • obs/debian.control, obs/debian.libnutclientstub-dev.install, obs/debian.libnutclientstub1.install, obs/debian.libnutclientstub1.lintian-overrides: Add new package for nut client stub

2.190. 2021-05-04 Jim Klimov <jim@jimklimov.com>

  • obs/pkgsrc.obs: pkgsrc.obs: tell OBS pusher to append gitdate to version (first line must be from a specific range of values)
  • obs/pkgsrc.obs: pkgsrc.obs: tell OBS pusher to append gitdate to version

2.191. 2021-02-10 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-client.links, obs/debian.rules: obs packaging: avoid warnings from systemd-sysv about legacy init scripts without a service unit

2.192. 2021-01-21 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control, obs/nut.dsc: debian.rules, nut.dsc: rather ask for dh-python | dh-python2 | dh-python3 \| dh-pypy
  • obs/debian.control, obs/nut.dsc: debian.rules, nut.dsc: ask for dh_python2 | dh_python3 \| dh_pypy
  • obs/debian.rules: debian.rules: clarify that any python 2/3 is okay, but we need an interpreter called "python" to be generic
  • obs/debian.control: debian.control: clarify that any python 2/3 is okay, but we need an interpreter called "python" to be generic
  • obs/nut.dsc: nut.dsc: clarify that any python 2/3 is okay, but we need an interpreter called "python" to be generic

2.193. 2021-01-20 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control, obs/nut.dsc: FTY OBS packaging: require libsystemd-dev in the build root (to use pkgconfig systemd queries)

2.194. 2020-03-14 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-monitor.install: Fix formal 42ity packaging for nut-monitor.png icon (recent master branch added different resolutions)

2.195. 2019-12-06 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : fix away debian. prefix for *.in templates
  • obs/debian.Makefile.in, …n.nut-client.init ⇒ debian.nut-client.init.in}, …mmon.postinst ⇒ debian.nut-common.postinst.in}, …nut-common.prerm ⇒ debian.nut-common.prerm.in}, obs/debian.nut-common.tmpfiles, obs/debian.nut-common.tmpfiles.in, …n.nut-server.init ⇒ debian.nut-server.init.in}, …nut-server.prerm ⇒ debian.nut-server.prerm.in}, obs/debian.rules: Introduce "runbasedir" in debian packaging on OBS to use /run or /var/run as appropriate

2.196. 2019-04-12 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control, obs/nut.dsc: Debian packaging: explicitly request libssl*-dev so OBS is not confused for Debian 9 options
  • obs/nut.spec: nut.spec : do not fail making build dir trees
  • obs/debian.control, obs/nut.dsc: Debian packaging: explicitly request libjpeg-dev so OBS is not confused for Debian 9 options

2.197. 2019-04-03 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : update SO_MAJOR_LIBUPSCLIENT for 42ity packaging

2.198. 2019-02-20 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : make sure wanted SONAMES exist (numbers remained unchanged)
  • obs/debian.control, obs/debian.libnutclient0.lintian-overrides, …bnutclient0.install ⇒ debian.libnutclient1.install}, obs/debian.libnutclient1.lintian-overrides, obs/debian.rules, obs/nut.dsc: Problem: libnutclient not found in consumer packaged builds Solution: update the hardcoded pathnames in recipes, leave some comments for improvement

2.199. 2018-12-06 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control: debian.control : nut-ipmi should have run-time deps on IPMI libs
  • obs/debian.control: debian.control : rephrase nut-server description

2.200. 2018-10-05 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-server.postinst: debian.nut-server.postinst : REPORT_RESTART_42=no when reconfiguring
  • obs/debian.nut-server.postinst: nut-driver-enumerator : use --reconfigure to remake units from scratch in Debian postinstall

2.201. 2018-09-28 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-client.postinst, obs/debian.nut-common.postinst, obs/debian.nut-server.postinst: nut-(client|server\|common).postinst : skip DEBHELPER in our case

2.202. 2018-09-27 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control: debian.control : "nut-server" should have no business requiring "nut-client"
  • obs/debian.control: debian.control : have "nut" metapackage explicitly depend on nut-common to pre-create things
  • obs/debian.control: debian.control : new nut-common has no opinion about old nut-hal-drivers
  • obs/debian.nut-client.postinst, obs/debian.nut-common.postinst, obs/debian.nut-server.postinst: debian.nut-*.post/pre-inst/rm : do not fail package installation if could not start services
  • obs/debian.nut-client.postinst, obs/debian.nut-client.prerm, obs/debian.nut-common.postinst, obs/debian.nut-common.prerm, obs/debian.nut-server.postinst, obs/debian.nut-server.prerm: debian.nut-*.post/pre-inst/rm : call /bin/systemctl only on systems where it is available, and do not block on attempts to start the services

2.203. 2018-09-26 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control: debian.control : reference nut-common
  • obs/debian.rules: debian.rules : deliver one nut-common.conf tmpfiles config instead of two same files for client and server
  • obs/debian.control: debian.control : update sub-driver packages to rely on just the nut-server package, not nut metapackage
  • obs/debian.control: debian.control : clarify where packages provide clients for "a local or remote NUT server"
  • obs/debian.nut-client.prerm, obs/debian.nut-common.prerm, obs/debian.nut-server.prerm: Add systemd shutdown of installed units during uninstallation of the packages
  • obs/debian.nut-client.postinst, obs/debian.nut-common.postinst, obs/debian.nut-server.postinst: Add systemd startup of installed units
  • obs/debian.nut-client.postinst, obs/debian.nut-common.postinst, obs/debian.nut-server.postinst: Add systemd registration of installed units
  • obs/debian.control, obs/debian.nut-cgi.postinst, obs/debian.nut-client.postinst, obs/debian.nut-common.install, obs/debian.nut-common.postinst, obs/debian.nut-common.prerm, …-client.tmpfiles ⇒ debian.nut-common.tmpfiles}, obs/debian.nut-server.postinst, obs/debian.nut-server.tmpfiles, obs/debian.rules: Introduce (debian) nut-common package for user account and shared FS objects

2.204. 2018-09-06 Jim Klimov <jim@jimklimov.com>

  • obs/nut.spec: nut.spec : do not use the configure macro
  • obs/nut.spec: nut.spec : do not use the configure macro

2.205. 2018-09-05 Jim Klimov <jim@jimklimov.com>

  • obs/nut.spec: nut.spec : do not redefine (differently) paths set by %configure macro, try to set them directly
  • obs/nut.spec: nut.spec : whitespace
  • obs/nut.spec: nut.spec : remove commented-away references to private OBS patches that are not used anymore

2.206. 2018-09-03 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-server.install, obs/nut.spec: nut.spec : fix RPM packaging for OBS

2.207. 2018-01-15 Jim Klimov <jim@jimklimov.com>

  • obs/nut.spec: nut.spec : avoid "nut" vs "nut-drivers-net" conflict over gen-snmp-subdriver.sh

2.208. 2018-01-03 Jim Klimov <jim@jimklimov.com>

  • obs/nut.spec: nut.spec : publish augeas files

2.209. 2018-01-02 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control, obs/debian.rules, obs/nut.dsc: Debian packaging : require pkg-config, and provide some fallbacks if systemd dirs are unknown
  • obs/nut.spec: nut.spec : suse wants a package
  • obs/nut.spec: nut.spec : dist augeas files
  • obs/debian.rules, obs/nut.spec: Packaging : pass the systemd*dir arguments to configure script
  • obs/nut.spec: nut.spec : use proper systemdshutdowndir relevant for current distro/arch
  • obs/nut.spec: nut.spec : fix "bindir" macro to "_bindir"

2.210. 2017-12-31 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : avoid re-configuring before "make install" again
  • obs/debian.rules, obs/nut.spec: packaging : use --with-docs=man=dist-auto

2.211. 2017-10-19 Jim Klimov <jim@jimklimov.com>

  • obs/debian.compat, obs/debian.rules: Use DH_COMPAT=10 to enable parallel build support by default

2.212. 2017-10-13 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : enable parallelized packaging

2.213. 2017-04-12 Jim Klimov <jim@jimklimov.com>

  • obs/debian.nut-server.install: Drop remaining references to oldmge-shut

2.214. 2016-10-06 Arnaud Quette <arnaud.quette@free.fr>

  • obs/nut.spec: Distribute gen-snmp-subdriver.sh with nut-snmp for RPM
  • obs/debian.nut-snmp.install, obs/debian.rules: Distribute gen-snmp-subdriver.sh with nut-snmp

2.215. 2016-09-22 Jim Klimov <jim@jimklimov.com>

  • obs/debian.rules: debian.rules : skip even the manpages if the host cannot build them
  • obs/debian.rules: debian.rules : whitespace fixes
  • obs/debian.rules, obs/nut.dsc, obs/nut.spec: nut.dsc / nut.spec : do not request rebuild and revalidation of DMF files - they were tested in Jenkins NUT-master job (remove build dependency on pycparser and speed up the build)
  • obs/nut.spec: nut.spec : try to fix inability to detect LUA on some RPM buildhosts

2.216. 2016-09-14 Jim Klimov <jim@jimklimov.com>

  • obs/debian.libnutscan1.install, obs/debian.nut-snmp.install: debian.nut-snmp.install debian.libnutscan1.install : fix conflict for dmfnutscan resource dirs delivered by both packages
  • obs/nut.spec: nut.spec : fix mixed spaces vs tabs
  • obs/debian.nut-snmp.install, obs/nut.spec: RPM/DEB : deliver the sorted symlinks in packages

2.217. 2016-08-19 Jim Klimov <jim@jimklimov.com>

  • obs/debian.control, obs/nut.dsc, obs/nut.spec: OBS: Try to rectify package numbering and dependencies of sub-packages for Debian
  • obs/nut.dsc, obs/nut.spec: Build Requires python-pycparser
  • obs/nut.spec: OBS nut.spec : make manpages optional
  • obs/nut.spec: OBS nut.spec : fix LUA requirement at == 5.1 (not >= 5.1)
  • obs/nut.spec: nut.spec : make asciidoc a common dependency
  • obs/debian.rules, obs/nut.spec: OBS : try to call autogen.sh before configuring sources
  • obs/nut.spec: OBS nut.spec : use common tarball filename pattern
  • obs/nut.dsc: OBS nut.dsc : comment away DEBTRANSFORM of teh tarball
  • obs/debian.nut-snmp.install, obs/nut.spec: Update OBS packaging to deliver bin/nut-scanner-reindex-dmfsnmp
  • obs/debian.nut-snmp.install, obs/debian.rules, obs/nut.spec: Update packaging files to install DMF data files
  • obs/control: Seems OBS mkpac.sh wants a file named "control" in any debian-pkg directory type (obs/ too)

2.218. 2016-08-18 Jim Klimov <jim@jimklimov.com>

  • obs/debian.Makefile.am, obs/debian.Makefile.in, obs/debian.NEWS, obs/debian.changelog, obs/debian.compat, obs/debian.control, obs/debian.copyright, obs/debian.description.subst, obs/debian.gbp.conf, obs/debian.hotplug, obs/debian.libnutclient-dev.install, obs/debian.libnutclient-dev.manpages, obs/debian.libnutclient0.install, obs/debian.libnutclient0.lintian-overrides, obs/debian.libnutscan-dev.install, obs/debian.libnutscan1.install, obs/debian.libups-nut-perl.install, obs/debian.libupsclient-dev.install, obs/debian.libupsclient-dev.manpages, obs/debian.libupsclient4.install, obs/debian.nut-cgi.README.Debian, obs/debian.nut-cgi.docs, obs/debian.nut-cgi.install, obs/debian.nut-cgi.manpages, obs/debian.nut-cgi.postinst, obs/debian.nut-cgi.postrm, obs/debian.nut-client.init, obs/debian.nut-client.install, obs/debian.nut-client.links, obs/debian.nut-client.lintian-overrides, obs/debian.nut-client.maintscript, obs/debian.nut-client.manpages, obs/debian.nut-client.postinst, obs/debian.nut-client.preinst, obs/debian.nut-client.tmpfiles, obs/debian.nut-doc.doc-base.nut-developer-guide, obs/debian.nut-doc.doc-base.nut-faq, obs/debian.nut-doc.doc-base.nut-packager-guide, obs/debian.nut-doc.doc-base.nut-user-manual, obs/debian.nut-doc.install, obs/debian.nut-ipmi.install, obs/debian.nut-ipmi.manpages, obs/debian.nut-monitor.install, obs/debian.nut-monitor.menu, obs/debian.nut-monitor.xpm, obs/debian.nut-powerman-pdu.install, obs/debian.nut-powerman-pdu.manpages, obs/debian.nut-server.dirs, obs/debian.nut-server.init, obs/debian.nut-server.install, obs/debian.nut-server.manpages, obs/debian.nut-server.postinst, obs/debian.nut-server.postrm, obs/debian.nut-server.preinst, obs/debian.nut-server.prerm, obs/debian.nut-server.tmpfiles, obs/debian.nut-snmp.docs, obs/debian.nut-snmp.install, obs/debian.nut-snmp.manpages, obs/debian.nut-xml.install, obs/debian.nut-xml.manpages, obs/debian.nut.README.Debian, obs/debian.nut.TODO.Debian, obs/debian.nut.docs, obs/debian.python-nut.install, obs/debian.rules, obs/debian.series, obs/debian.watch, obs/nut.changes, obs/nut.dsc, obs/nut.spec: Added packaging metadata used by OBS as of 2016-08-18 (except debian.series)