fix global variable handling in config

This commit is contained in:
2022-08-12 09:16:27 +02:00
parent 914ec8cfb9
commit 50d0dbef79
2 changed files with 20 additions and 11 deletions

View File

@@ -203,12 +203,12 @@ class Pyinotifyd:
config = {} config = {}
name = Pyinotifyd.name name = Pyinotifyd.name
exec("from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL", exec("from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL",
{}, config) config)
exec(f"from {name} import Pyinotifyd, Watch", {}, config) exec(f"from {name} import Pyinotifyd, Watch", config)
exec(f"from {name} import setLoglevel, enableSyslog", {}, config) exec(f"from {name} import setLoglevel, enableSyslog", config)
exec(f"from {name}.scheduler import *", {}, config) exec(f"from {name}.scheduler import *", config)
with open(config_file, "r") as fh: with open(config_file, "r") as fh:
exec(fh.read(), {}, config) exec(fh.read(), config)
instance = config[f"{name}"] instance = config[f"{name}"]
assert isinstance(instance, Pyinotifyd), \ assert isinstance(instance, Pyinotifyd), \
f"{name}: expected {type(Pyinotifyd)}, " \ f"{name}: expected {type(Pyinotifyd)}, " \

View File

@@ -46,13 +46,13 @@ class SchedulerLogger(logging.LoggerAdapter):
class TaskScheduler: class TaskScheduler:
class TaskState: class TaskState:
def __init__(self, id=None, task=None, cancelable=True): def __init__(self, task_id=None, task=None, cancelable=True):
self.id = id or str(uuid4()) self.id = task_id or str(uuid4())
self.task = task self.task = task
self.cancelable = cancelable self.cancelable = cancelable
def __init__(self, job, files=True, dirs=False, delay=0, logname="sched", def __init__(self, job, files=True, dirs=False, delay=0, logname="sched",
loop=None): loop=None, global_vars={}):
assert iscoroutinefunction(job), \ assert iscoroutinefunction(job), \
f"job: expected coroutine, got {type(job)}" f"job: expected coroutine, got {type(job)}"
assert isinstance(files, bool), \ assert isinstance(files, bool), \
@@ -61,6 +61,8 @@ class TaskScheduler:
f"dirs: expected {type(bool)}, got {type(dirs)}" f"dirs: expected {type(bool)}, got {type(dirs)}"
assert isinstance(delay, int), \ assert isinstance(delay, int), \
f"delay: expected {type(int)}, got {type(delay)}" f"delay: expected {type(int)}, got {type(delay)}"
assert isinstance(global_vars, dict), \
f"global_vars: expected {type(dict)}, got {type(global_vars)}"
self._job = job self._job = job
self._files = files self._files = files
@@ -68,7 +70,7 @@ class TaskScheduler:
self._delay = delay self._delay = delay
self._log = logging.getLogger((logname or __name__)) self._log = logging.getLogger((logname or __name__))
self._loop = (loop or asyncio.get_event_loop()) self._loop = (loop or asyncio.get_event_loop())
self._globals = global_vars
self._tasks = {} self._tasks = {}
self._pause = False self._pause = False
@@ -124,7 +126,14 @@ class TaskScheduler:
return return
logger.info("start task") logger.info("start task")
if self._globals:
local_vars = {"self": self,
"event": event,
"task_id": task_state.id}
task_state.task = self._loop.create_task(
eval("self._job(event, task_id)", self._globals, local_vars))
else:
task_state.task = self._loop.create_task( task_state.task = self._loop.create_task(
self._job(event, task_state.id)) self._job(event, task_state.id))