Crea servizio watchdog configurabile

This commit is contained in:
2026-06-30 20:28:02 +02:00
parent 124cc370e5
commit 4dca5fbf95
17 changed files with 904 additions and 0 deletions

65
src/bakrest/service.py Normal file
View File

@@ -0,0 +1,65 @@
from __future__ import annotations
import sys
import servicemanager
import win32event
import win32service
import win32serviceutil
from .config import load_config
from .logging_setup import configure_logging
from .watcher import WatchdogRuntime
class BakRestWatchdogService(win32serviceutil.ServiceFramework):
_svc_name_ = "BakRestWatchdog"
_svc_display_name_ = "Bak&Rest Watchdog Service"
_svc_description_ = "Monitors configured folders and records file changes for Bak&Rest backups."
def __init__(self, args: list[str]) -> None:
super().__init__(args)
self.stop_event_handle = win32event.CreateEvent(None, 0, 0, None)
self.runtime: WatchdogRuntime | None = None
def SvcStop(self) -> None:
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
if self.runtime:
self.runtime.stop()
win32event.SetEvent(self.stop_event_handle)
def SvcDoRun(self) -> None:
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ""),
)
config = load_config()
logger = configure_logging(config.storage.logs_dir, "service")
logger.info("Windows service started with configuration: %s", config.path)
self.runtime = WatchdogRuntime(config, logger)
try:
self.runtime.run()
except Exception:
logger.exception("BakRestWatchdog failed")
raise
def main() -> None:
_apply_configured_startup()
win32serviceutil.HandleCommandLine(BakRestWatchdogService)
def _apply_configured_startup() -> None:
if len(sys.argv) < 2 or sys.argv[1].lower() != "install":
return
if "--startup" in sys.argv:
return
config = load_config()
startup = "auto" if config.service_autostart else "manual"
sys.argv.extend(["--startup", startup])
if __name__ == "__main__":
main()