Skip to content

Complete client bindings for NUT networked protocol#3402

Merged
jimklimov merged 70 commits intonetworkupstools:masterfrom
jimklimov:complete-client-protocol
Apr 13, 2026
Merged

Complete client bindings for NUT networked protocol#3402
jimklimov merged 70 commits intonetworkupstools:masterfrom
jimklimov:complete-client-protocol

Conversation

@jimklimov
Copy link
Copy Markdown
Member

@jimklimov jimklimov commented Apr 9, 2026

This PR follows up from #339 covers:

@jimklimov jimklimov added this to the 2.8.6 milestone Apr 9, 2026
@jimklimov jimklimov added this to NUT QA Apr 9, 2026
@jimklimov jimklimov added C++ CI Entries related to continuous integration infrastructure (here CI = tools + scripts + recipes) python NUT protocols perl Perl binding code for NUT portability We want NUT to build and run everywhere possible AI For good or bad, machine tools are upon us. Humans are still the responsible ones. labels Apr 9, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 9, 2026

A ZIP file with standard source tarball and another tarball with pre-built docs for commit a654ba3 is temporarily available: NUT-tarballs-PR-3402.zip.

@jimklimov jimklimov moved this to In Progress in NUT QA Apr 10, 2026
Comment thread clients/nutclient.cpp Dismissed
Comment thread clients/nutclientmem.cpp Dismissed
Comment thread clients/nutclientmem.cpp Dismissed
@jimklimov
Copy link
Copy Markdown
Member Author

jimklimov commented Apr 10, 2026

Various RedHat-derived distros on OBS disliked this. On the upside, from one PR to another these SSL errors are getting more legible. This also did catch certificate expectation mismatches (=>failed handshake) during the post-STRATTLS "OK" version query, as desired :)

[  170s] ================================
[  170s] Fri Apr 10 00:04:34 UTC 2026 [INFO] [testcase_sandbox_python_without_credentials] Call Python module test suite: PyNUT (NUT Python bindings) without login credentials
[  170s] Fri Apr 10 00:04:34 UTC 2026 [INFO] Adding client-side (Open)SSL config to python env to talk to our OpenSSL-capable upsd
[  170s] PyNUTClient test...
[  170s] [DEBUG] Class initialization...
[  170s] [DEBUG]  -> Host  = 127.0.0.1 (port 35027, timeout 5.0)
[  170s] [DEBUG]  -> Login = 'None' / 'None'
[  170s] [DEBUG]  -> SSL   = True (force: True, verify: True)
[  170s] [DEBUG] Creating SSL context
[  170s] [DEBUG] SSL context created
[  170s] [DEBUG] Connecting to host
[  170s] [DEBUG] Requesting STARTTLS
[  170s] [DEBUG] STARTTLS accepted, wrapping socket
[  170s] [DEBUG] STARTTLS setup claimed to succeed, but protocol version check in the secured session failed
[  170s] EXCEPTION during initialization: STARTTLS setup claimed to succeed, but protocol version check in the secured session failed, and SSL is required
[  170s] Traceback (most recent call last):
[  170s]   File "/home/abuild/rpmbuild/BUILD/nut-2.8.5.56+gc3b208ec/scripts/python/module/test_nutclient.py", line 35, in <module>
[  170s]     nut    = PyNUT.PyNUTClient( login=NUT_USER, password=NUT_PASS, debug=NUT_DEBUG, host=NUT_HOST, port=NUT_PORT,
[  170s]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[  170s]   File "/home/abuild/rpmbuild/BUILD/nut-2.8.5.56+gc3b208ec/scripts/python/module/PyNUT.py", line 198, in __init__
[  170s]     self.__connect()
[  170s]   File "/home/abuild/rpmbuild/BUILD/nut-2.8.5.56+gc3b208ec/scripts/python/module/PyNUT.py", line 264, in __connect
[  170s]     raise PyNUTError("STARTTLS setup claimed to succeed, but protocol version check in the secured session failed, and SSL is required")
[  170s] PyNUT.PyNUTError: STARTTLS setup claimed to succeed, but protocol version check in the secured session failed, and SSL is required
[  170s] Fri Apr 10 00:04:34 UTC 2026 [ERROR] [testcase_sandbox_python_without_credentials] PyNUT complained, check above
[  170s] ================================
[  170s] Fri Apr 10 00:04:34 UTC 2026 [INFO] [testcase_sandbox_perl_with_credentials] Call Perl module test suite: UPS::Nut (NUT Perl bindings) with login credentials
[  170s] Fri Apr 10 00:04:34 UTC 2026 [INFO] Adding client-side (Open)SSL config to python env to talk to our OpenSSL-capable upsd
[  171s] net_starttls: SSL_accept failed (SSL_ERROR 1): Success
[  171s] Can't initialize: SSL setup failed but it is required at /home/abuild/rpmbuild/BUILD/nut-2.8.5.56+gc3b208ec/scripts/perl/test_nutclient.pl line 55.
[  171s] Can't call method "Error" on an undefined value at /home/abuild/rpmbuild/BUILD/nut-2.8.5.56+gc3b208ec/scripts/perl/test_nutclient.pl line 60.
[  171s] UPS::Nut test...
[  171s] DEBUG: STARTTLS accepted, upgrading socket.
[  171s] DEBUG: SSL upgrade failed: SSL connect attempt failed error:0A000086:SSL routines::certificate verify failed
[  171s] DEBUG: SSL setup failed but it is required
[  171s] DEBUG: Object destroyed.
[  171s] Fri Apr 10 00:04:35 UTC 2026 [ERROR] [testcase_sandbox_perl_with_credentials] UPS::Nut complained, check above

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

Build nut 2.8.5.4520-master completed (commit 3acbe35394 by @jimklimov)

@AppVeyorBot
Copy link
Copy Markdown

@jimklimov
Copy link
Copy Markdown
Member Author

jimklimov commented Apr 10, 2026

Python trouble was genuine; with Perl in more detail (on a Fedora 43 worker); it also seems that some specific constellation of options is relevant (a simple NUT_SSL_VARIANTS=nss CC=clang CXX=clang++ ./ci_build.sh docs=no did not evoke the problem, so I copied the line ultimately used by OBS packaging):

:; ./configure --disable-static --with-pic \
    --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libdir=/usr/lib64 --libexecdir=/usr/libexec/ups \
    --sysconfdir=/etc/ups --datadir=/usr/share/nut --docdir=/usr/share/doc/nut \
    --with-ssl --with-openssl --with-libltdl=yes --with-cgi=auto --with-serial --with-usb \
    --with-snmp --with-neon --with-dev --with-ipmi=auto --with-powerman=auto \
    --with-doc=man=dist-auto --with-htmlpath=/usr/share/nut/htdocs \
    --with-cgipath=/usr/libexec/ups/cgi-bin --with-statepath=/var/lib/ups \
    --with-drvpath=/usr/libexec/ups/driver --with-user=upsd --with-group=daemon \
    --with-udev-dir=/usr/lib/udev --enable-option-checking=fatal \
    --with-systemdsystemunitdir --with-systemdshutdowndir \
    --with-augeas-lenses-dir=/usr/share/augeas/lenses/dist \
    --enable-keep_nut_report_feature --enable-strip --enable-check-NIT

UPDATE: Oh, it was using OpenSSL not NSS (faceplum)

:; make -ksj && NUT_DEBUG_LEVEL_UPSD=6 make check-NIT NIT_CASE=perl

...
   9.499026     [D5:3176458:upsd] mainloop: skip invalid SERVER listener [::1:35017, FD -1]: socket not bound
   9.499032     [D2:3176458:upsd] mainloop: polling 6 filedescriptors; some stats: considered 7 connections, wanted to actually poll 6 and was constrained by maxconn=1024 and chunked by sysmaxconn=1024
   9.535879     [D2:3176458:upsd] mainloop: polling returned 1 hits
   9.535896     [D3:3176458:upsd] mainloop: Incoming data from CLIENT [127.0.0.1, FD 8]
   9.535912     [D6:3176458:upsd] Entering check_command: STARTTLS
   9.535919     [D6:3176458:upsd] check_command: Calling command handler for STARTTLS
   9.535942     [D2:3176458:upsd] write: [destfd=8] [len=12] [OK STARTTLS]
DEBUG: STARTTLS accepted, upgrading socket.
DEBUG: SSL upgrade failed: SSL connect attempt failed error:0A000086:SSL routines::certificate verify failed
DEBUG: SSL setup failed but it is required
Can't initialize: SSL setup failed but it is required at /home/abuild/nut/scripts/perl/test_nutclient.pl line 55.
DEBUG: Object destroyed.
   9.585792     net_starttls: SSL_accept failed (SSL_ERROR 1): Success
   9.585812     [D1:3176458:upsd] ssl_error() ret=-1 SSL_ERROR 1
   9.585819     [D1:3176458:upsd] ssl_debug: error:0A000418:SSL routines::tlsv1 alert unknown ca
   9.585826     [D4:3176458:upsd] mainloop: adding FD handler #0 for DRIVER (1/1) [dummy, FD 5]
   9.585831     [D4:3176458:upsd] mainloop: adding FD handler #1 for DRIVER (2/2) [UPS1, FD 6]
   9.585836     [D4:3176458:upsd] mainloop: adding FD handler #2 for DRIVER (3/3) [UPS2, FD 7]
   9.585841     [D4:3176458:upsd] mainloop: adding FD handler #3 for CLIENT (1/1) [127.0.0.1 => (null), FD 8]
   9.585845     [D4:3176458:upsd] mainloop: adding FD handler #4 for SERVER listener (1/1) [localhost:35017, FD 3]
   9.585849     [D4:3176458:upsd] mainloop: adding FD handler #5 for SERVER listener (2/2) [127.0.0.1:35017, FD 4]
   9.585854     [D5:3176458:upsd] mainloop: skip invalid SERVER listener [::1:35017, FD -1]: socket not bound
   9.585858     [D2:3176458:upsd] mainloop: polling 6 filedescriptors; some stats: considered 7 connections, wanted to actually poll 6 and was constrained by maxconn=1024 and chunked by sysmaxconn=1024
   9.585973     [D2:3176458:upsd] mainloop: polling returned 1 hits
   9.585980     [D3:3176458:upsd] mainloop: Incoming data from CLIENT [127.0.0.1, FD 8]
   9.585990     [D2:3176458:upsd] Disconnect 127.0.0.1 (read failure): Success
   9.585993     [D3:3176458:upsd] client_disconnect: semi-initialised SSL on a client, sleep a bit to flush the buffers with possible error messages
Can't call method "Error" on an undefined value at /home/abuild/nut/scripts/perl/test_nutclient.pl line 60.
Fri Apr 10 07:35:11 UTC 2026 [ERROR] [testcase_sandbox_perl_with_credentials] UPS::Nut complained, check above

NOTE: Can't call method "Error" on an undefined value is not a problem, the $nut object is half-initialized and discarded, so post-mortem in test script can not print from it.

@jimklimov jimklimov added the SSL/NSS Issues and PRs about SSL, TLS and other crypto-related matters label Apr 10, 2026
@AppVeyorBot
Copy link
Copy Markdown

Build nut 2.8.5.4522-master completed (commit f8bc9a971e by @jimklimov)

jimklimov added a commit to jimklimov/nut that referenced this pull request Apr 10, 2026
@jimklimov jimklimov force-pushed the complete-client-protocol branch from 02f6b97 to 3330fd2 Compare April 10, 2026 11:59
@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

Build nut 2.8.5.4524-master completed (commit bd5a7c4452 by @jimklimov)

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

@AppVeyorBot
Copy link
Copy Markdown

jimklimov and others added 27 commits April 13, 2026 15:22
… (if any) [networkupstools#3331]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…t, a few times [networkupstools#3401]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…ed to the SSL library [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…should be defined in args by caller, not by a hack in production code [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…SSL envvar toggle to disable attempts at SSL altogether [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
… intermixed)

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…rror in SSL setup fail messages [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…and follow up with that [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…ided in env [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…lable, neuter NUT_FORCESSL based on that [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…t the error with "FEATURE-NOT-SUPPORTED" in text [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…n undefined value" messages in failed tests; clearly say that $nut is no more [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…DIAGNOSTIC_IGNORED_DEPRECATED_DECLARATIONS{,_BESIDEFUNC} to implement methods for deprecated "master" operation [networkupstools#840, networkupstools#3402]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
…tart_SSL() [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov@gmail.com>
…s host names [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov@gmail.com>
…RL (or defaulting to no debug) [networkupstools#1711]

Signed-off-by: Jim Klimov <jimklimov@gmail.com>
]

Signed-off-by: Jim Klimov <jimklimov@gmail.com>
…ions [networkupstools#3402]

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
… quotes not braces [networkupstools#1711]

It is then evaluated at run-time as code reaches that line
(or not - conditionals), not at interpretation time where
it fails too early. Also use "1;" in the end as a tidy practice.

Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
… enabled on Darwin platform [networkupstools#3404]

Signed-off-by: Jim Klimov <jimklimov@gmail.com>
@jimklimov jimklimov force-pushed the complete-client-protocol branch from 038590c to a654ba3 Compare April 13, 2026 13:23
@jimklimov jimklimov merged commit 968fd10 into networkupstools:master Apr 13, 2026
23 of 24 checks passed
@jimklimov jimklimov deleted the complete-client-protocol branch April 13, 2026 13:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI For good or bad, machine tools are upon us. Humans are still the responsible ones. C++ CI Entries related to continuous integration infrastructure (here CI = tools + scripts + recipes) NUT protocols perl Perl binding code for NUT portability We want NUT to build and run everywhere possible python SSL/NSS Issues and PRs about SSL, TLS and other crypto-related matters

Projects

Status: In Progress

3 participants