allow to stop the application from a module

This commit is contained in:
François Dausseur
2025-02-25 12:39:34 +01:00
parent a45d975617
commit c67c5e3e28

View File

@@ -13,7 +13,7 @@ from importlib import import_module
from threading import Thread, Lock from threading import Thread, Lock
import inspect import inspect
from threading import Thread from threading import Thread, Event
def is_number(s): def is_number(s):
@@ -63,6 +63,7 @@ class Commands(Thread):
self.cmods = {} self.cmods = {}
self.config = config self.config = config
self.log = log self.log = log
self.stop_all_event = None
self.stopped = False self.stopped = False
self.nickname = None self.nickname = None
if not (self.config is None): if not (self.config is None):
@@ -187,6 +188,10 @@ class Commands(Thread):
return self.cmods[module]._execute_command(method, *args, **kwargs) return self.cmods[module]._execute_command(method, *args, **kwargs)
def stop_all(self):
if self.stop_all_event is not None:
self.stop_all_event.set()
def cmd_help(self, *args, **kwargs): def cmd_help(self, *args, **kwargs):
"""Help of module commands. """Help of module commands.
Params: Params:
@@ -218,7 +223,7 @@ class Commands(Thread):
class CommandsLoader: class CommandsLoader:
def __init__(self, config: ConfigParser, log: logging.Handler, modpath: str): def __init__(self, stop_event: Event, config: ConfigParser, log: logging.Handler, modpath: str):
self.config = config self.config = config
self.modpath = modpath self.modpath = modpath
sys.path.append(os.path.join(modpath)) sys.path.append(os.path.join(modpath))
@@ -232,6 +237,7 @@ class CommandsLoader:
self.prefcmds = prefcmds self.prefcmds = prefcmds
self.log = log self.log = log
self.lock = Lock() self.lock = Lock()
self.stop_event = stop_event
self._load_commands() self._load_commands()
self._set_cmods() self._set_cmods()
@@ -276,6 +282,7 @@ class CommandsLoader:
obj = c(conf, self.log) obj = c(conf, self.log)
obj.log = self.log obj.log = self.log
obj.lock = self.lock obj.lock = self.lock
obj.stop_all_event = self.stop_event
break break
return obj return obj
@@ -338,6 +345,10 @@ class AppEngine:
self.log.setLevel(logging.DEBUG) self.log.setLevel(logging.DEBUG)
else: else:
self.log.setLevel(logging.WARNING) self.log.setLevel(logging.WARNING)
# Mechanism to stop the application
self.stop_event = Event()
self.stop_thread = Thread(target=self.wait_stop, args=(self.stop_event,))
self.stop_thread.start()
def signal_handler(self, sig, frame): def signal_handler(self, sig, frame):
print("\nExiting.") print("\nExiting.")
@@ -371,10 +382,14 @@ class AppEngine:
self.log.addHandler(journal.JournalHandler()) self.log.addHandler(journal.JournalHandler())
def exec(self, modpath: str = ""): def exec(self, modpath: str = ""):
self.cl = CommandsLoader(self.conf, self.log, modpath) self.cl = CommandsLoader(self.stop_event, self.conf, self.log, modpath)
self.cl.start() self.cl.start()
self.cl.join() self.cl.join()
self.cl.free() self.cl.free()
def wait_stop(self, evnt):
evnt.wait()
self.cl.stop()
def stop(self): def stop(self):
self.cl.stop() self.stop_event.set()