5 Commits
v0.3 ... v0.4

Author SHA1 Message Date
François Dausseur
fffba77497 Merge branch 'main' of https://git.beafrancois.fr/Foue-opensource/pyappengine 2025-04-17 14:40:38 +02:00
François Dausseur
28057dddd6 Removed systemd dependency 2025-04-17 14:40:34 +02:00
François Dausseur
d46e3b9859 release 0.4 2025-02-25 12:41:28 +01:00
François Dausseur
c67c5e3e28 allow to stop the application from a module 2025-02-25 12:39:34 +01:00
François Dausseur
a45d975617 new release 2025-02-25 11:48:24 +01:00
3 changed files with 21 additions and 13 deletions

View File

@@ -1 +1 @@
0.2 0.4

View File

@@ -15,9 +15,7 @@ classifiers = [
"License :: OSI Approved :: CeCILL-C", "License :: OSI Approved :: CeCILL-C",
"Operating System :: OS Independent", "Operating System :: OS Independent",
] ]
dependencies = [ dependencies = [ ]
"systemd-python",
]
dynamic = ["version"] dynamic = ["version"]
[project.urls] [project.urls]

View File

@@ -5,7 +5,6 @@ import sys
import traceback import traceback
from configparser import ConfigParser from configparser import ConfigParser
import logging import logging
from systemd import journal
import inspect import inspect
from enum import Enum, auto from enum import Enum, auto
import signal import signal
@@ -13,7 +12,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 +62,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 +187,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 +222,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 +236,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 +281,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 +344,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.")
@@ -364,17 +374,17 @@ class AppEngine:
if is_writeable: if is_writeable:
self.log.addHandler(logging.FileHandler(fname)) self.log.addHandler(logging.FileHandler(fname))
else: else:
self.log.addHandler(journal.JournalHandler())
self.log.error('No write permissions: "{}"'.format(fname)) self.log.error('No write permissions: "{}"'.format(fname))
else:
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()