diff --git a/core/engine.py b/core/engine.py index d076b7f..62c1ede 100644 --- a/core/engine.py +++ b/core/engine.py @@ -192,11 +192,18 @@ def _module_runner(module_class: Type[BaseModule], bus_queue: multiprocessing.Qu try: module.start() + # start() is non-blocking — keep subprocess alive while module threads run + while module._running: + time.sleep(1) except Exception: logger.exception("Module %s crashed in start()", module.name) bus_proxy.emit("MODULE_ERROR", {"module": module.name, "error": "start_crash"}, source_module=module.name) finally: + try: + module.stop() + except Exception: + pass state.stop() @@ -357,9 +364,11 @@ class Engine: self.capture_bus = None # Inject capture_bus into module configs for passive modules + # Some modules use "capture_bus", others "_capture_bus" — inject both for name, entry in self._modules.items(): if getattr(entry.module_class, "requires_capture_bus", False): entry.config["capture_bus"] = self.capture_bus + entry.config["_capture_bus"] = self.capture_bus results = {} for name in order: diff --git a/modules/stealth/mac_manager.py b/modules/stealth/mac_manager.py index 838484c..dd61ada 100644 --- a/modules/stealth/mac_manager.py +++ b/modules/stealth/mac_manager.py @@ -210,6 +210,9 @@ class MacManager(BaseModule): if rows: return dict(random.choice(rows)) return None + except sqlite3.OperationalError: + logger.warning("mac_profiles table missing — DB not seeded, using fallback") + return None finally: conn.close()