From 962d4324fb2c652b3b14fdbd074e80d9bc614bfc Mon Sep 17 00:00:00 2001 From: "Loan (LSE)" Date: Fri, 1 Dec 2023 18:21:26 +0000 Subject: [PATCH] [FIX] hw_drivers: add cron for HTTPS certificate update Context: When an HTTPS certificate is delivered, it is valid for ~1 month. To avoid missing the certificate, a script is automatically ran daily to check if a new HTTPS certificate is necessary. On the IoT box, it is added in the native Unix system with this file: https://github.com/odoo/odoo/blob/16.0/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/cron.daily/odoo However, prior to this commit, there is nothing equivalent for windows Note: the HTTPS certificate check is also done automatically when accessing the homepage. Before this commit: After an HTTPS certificate delivery, if we let the IoT server running non-stop (and without accessing the homepage). The HTTPS will expire without any automatic renew. After this commit: The cron process is handled by the handler Manager Other note: - Using native Windows "Scheduled Task" have been proposed at: https://github.com/odoo/odoo/pull/144584 But, was judged too risky from a security point of view - `sched` library have been discarded as the code is too verbose - This is unstable for the iot-box. This is the reason for the initial Windows check on the import. The iot-box does not need this fix anyway as explained in the context opw-3617687 closes odoo/odoo#145114 X-original-commit: b9bd36056fbd3c27148da82cc49039669b8f8563 Signed-off-by: Loan Sens (lse) --- addons/hw_drivers/main.py | 12 ++++++++++++ setup/win32/requirements-local-proxy.txt | 1 + 2 files changed, 13 insertions(+) diff --git a/addons/hw_drivers/main.py b/addons/hw_drivers/main.py index 34b1ab12d8d..8f7b005797c 100644 --- a/addons/hw_drivers/main.py +++ b/addons/hw_drivers/main.py @@ -14,6 +14,14 @@ from odoo.addons.hw_drivers.websocket_client import WebsocketClient _logger = logging.getLogger(__name__) +try: + import schedule +except ImportError: + schedule = None + # For now, it is intended to not be installed on the iot-box as it uses native Unix cron system + if platform.system() == 'Windows': + _logger.warning('Could not import library schedule') + try: from dbus.mainloop.glib import DBusGMainLoop except ImportError: @@ -104,6 +112,9 @@ class Manager(Thread): except Exception as e: _logger.error("Error in %s: %s", str(interface), e) + # Set scheduled actions + schedule and schedule.every().day.at("00:00").do(helpers.get_certificate_status) + #Setup the websocket connection if helpers.get_odoo_server_url(): iot_client.start() @@ -116,6 +127,7 @@ class Manager(Thread): self.previous_iot_devices = iot_devices.copy() self.send_alldevices(iot_client) time.sleep(3) + schedule and schedule.run_pending() except Exception: # No matter what goes wrong, the Manager loop needs to keep running _logger.error(format_exc()) diff --git a/setup/win32/requirements-local-proxy.txt b/setup/win32/requirements-local-proxy.txt index eebff0aa628..6f73279901a 100644 --- a/setup/win32/requirements-local-proxy.txt +++ b/setup/win32/requirements-local-proxy.txt @@ -4,3 +4,4 @@ ghostscript==0.7 cryptocode==0.1 pysmb==1.2.9.1 websocket-client==1.6.3 +schedule==1.2.1