diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ff5979..50ad191 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [5.8.0] - 2025-06-12 + +### Changed + +- Agents aren't being sent any signals on user logout. On the server side, assume that client disconnection == logout + +## [5.7.1] - 2025-06-05 + +### Fixed + +- Correcly handle UNIX signals in the user instance of the agent + ## [5.7.0] - 2025-05-27 ### Changed diff --git a/linux/debian/changelog b/linux/debian/changelog index 8bf0185..c95220d 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,15 @@ +ogagent (5.8.0-1) stable; urgency=medium + + * When client disconnect, assume that the user logged out + + -- OpenGnsys developers Thu, 12 Jun 2025 15:30:50 +0200 + +ogagent (5.7.1-1) stable; urgency=medium + + * Correctly handle UNIX signals + + -- OpenGnsys developers Thu, 05 Jun 2025 12:07:30 +0200 + ogagent (5.7.0-1) stable; urgency=medium * Use TLS again diff --git a/src/OGAgentUser.py b/src/OGAgentUser.py index a390a35..f25029c 100755 --- a/src/OGAgentUser.py +++ b/src/OGAgentUser.py @@ -35,6 +35,8 @@ import json import sys import time import os +import socket +import signal from PyQt6 import QtCore, QtGui, QtWidgets from about_dialog_ui import Ui_OGAAboutDialog @@ -328,6 +330,29 @@ if __name__ == '__main__': trayIcon.quit() sys.exit(1) + ## begin SIGTERM handling + signal_socket = socket.socketpair() + signal_socket[0].setblocking(False) + signal_socket[1].setblocking(False) + signal.set_wakeup_fd(signal_socket[0].fileno()) + + def signal_handler(signum, frame): + #print (f"Received signal {signum}") + pass + + def qt_signal_handler(): + data = signal_socket[1].recv(1) + #print(f"Signal ({data}) received via socket, shutting down gracefully...") + if trayIcon: + trayIcon.quit() + + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGINT, signal_handler) + + notifier = QtCore.QSocketNotifier(signal_socket[1].fileno(), QtCore.QSocketNotifier.Type.Read) + notifier.activated.connect(qt_signal_handler) + ## end SIGTERM handling + app.aboutToQuit.connect(trayIcon.cleanup) trayIcon.show() diff --git a/src/VERSION b/src/VERSION index 42cdd0b..11d9efa 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -5.7.0 +5.8.0 diff --git a/src/opengnsys/httpserver.py b/src/opengnsys/httpserver.py index 7ca3ba9..695ab9d 100644 --- a/src/opengnsys/httpserver.py +++ b/src/opengnsys/httpserver.py @@ -167,7 +167,7 @@ class HTTPServerThread(threading.Thread): logger.debug ('HTTP server: using certificate/CA from /opt/opengnsys/etc') context.load_cert_chain (certfile='/opt/opengnsys/etc/ogagent.crt', keyfile='/opt/opengnsys/etc/ogagent.key') context.load_verify_locations (cafile='/opt/opengnsys/etc/ca.crt') - elif os.path.exists (os.path.join (pf, 'ogagent.crt')) and os.path.exists (os.path.join (pf, 'ogagent.key')) and os.path.exists (os.path.join (pf, 'ca.crt')): + elif pf and os.path.exists (os.path.join (pf, 'ogagent.crt')) and os.path.exists (os.path.join (pf, 'ogagent.key')) and os.path.exists (os.path.join (pf, 'ca.crt')): logger.debug (f'HTTP server: using certificate/CA from the installation path ({pf})') context.load_cert_chain (certfile=os.path.join (pf, 'ogagent.crt'), keyfile=os.path.join (pf, 'ogagent.key')) context.load_verify_locations (cafile=os.path.join (pf, 'ca.crt')) diff --git a/src/opengnsys/ipc.py b/src/opengnsys/ipc.py index fbfee9c..d1a61ea 100644 --- a/src/opengnsys/ipc.py +++ b/src/opengnsys/ipc.py @@ -30,6 +30,7 @@ """ +import os import json import queue import socket @@ -193,6 +194,8 @@ class ClientProcessor(threading.Thread): logger.error('Invalid message in queue: {}'.format(e)) logger.debug('Client processor stopped') + if os.path.exists ('/windows/temp'): open ('/windows/temp/ogagentuser_died', 'w').close() + else: open ( '/tmp/ogagentuser_died', 'w').close() try: self.clientSocket.close() except Exception: diff --git a/src/opengnsys/service.py b/src/opengnsys/service.py index d13f686..7b4b969 100644 --- a/src/opengnsys/service.py +++ b/src/opengnsys/service.py @@ -30,6 +30,7 @@ @author: Adolfo Gómez, dkmaster at dkmon dot com """ +import os import json import socket import time @@ -197,6 +198,16 @@ class CommonService(object): Invoked to wait a bit CAN be OVERRIDDEN """ + client_died=False + if os.path.exists ('/windows/temp/ogagentuser_died'): + os.unlink ('/windows/temp/ogagentuser_died') + client_died=True + elif os.path.exists ('/tmp/ogagentuser_died'): + os.unlink ('/tmp/ogagentuser_died') + client_died=True + if client_died: + self.notifyLogout (b'') + time.sleep(float(miliseconds) / 1000) def notifyStop(self):