allow to stop the application from a module
This commit is contained in:
@@ -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()
|
||||||
Reference in New Issue
Block a user