From 3a547fb5305a762ae068f2d5eeaa29059fffd4d2 Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Thu, 2 Dec 2021 08:42:10 -0500 Subject: [PATCH] base_deploy: add support for persistent state Signed-off-by: Eric Callahan --- .../components/update_manager/base_deploy.py | 58 +++++++++++++++---- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/moonraker/components/update_manager/base_deploy.py b/moonraker/components/update_manager/base_deploy.py index d98ad32..c7e3830 100644 --- a/moonraker/components/update_manager/base_deploy.py +++ b/moonraker/components/update_manager/base_deploy.py @@ -6,8 +6,9 @@ from __future__ import annotations import logging +import time -from typing import TYPE_CHECKING, Dict, Any +from typing import TYPE_CHECKING, Dict, Any, Optional if TYPE_CHECKING: from confighelper import ConfigHelper from utils import ServerError @@ -16,18 +17,44 @@ if TYPE_CHECKING: class BaseDeploy: def __init__(self, config: ConfigHelper, - cmd_helper: CommandHelper + cmd_helper: CommandHelper, + name: Optional[str] = None, + prefix: str = "", + cfg_hash: Optional[str] = None ) -> None: - name_parts = config.get_name().split() - self.name = name_parts[-1] + if name is None: + name = config.get_name().split()[-1] + self.name = name + if prefix: + prefix = f"{prefix} {self.name}: " + self.prefix = prefix self.server = config.get_server() self.cmd_helper = cmd_helper - if name_parts == 1: - self.prefix: str = "" - if config.get('type', "") == "web": - self.prefix = f"Web Client {self.name}: " - else: - self.prefix = f"Application {self.name}: " + self.refresh_interval = cmd_helper.get_refresh_interval() + refresh_interval = config.getint('refresh_interval', None) + if refresh_interval is not None: + self.refresh_interval = refresh_interval * 60 * 60 + if cfg_hash is None: + cfg_hash = config.get_hash().hexdigest() + self.cfg_hash = cfg_hash + storage: Dict[str, Any] = self._load_storage() + self.last_refresh_time: float = storage.get('last_refresh_time', 0.0) + + def needs_refresh(self) -> bool: + storage = self._load_storage() + last_cfg_hash = storage.get('last_config_hash', "") + next_refresh_time = self.last_refresh_time + self.refresh_interval + return ( + self.cfg_hash != last_cfg_hash or + time.time() > next_refresh_time + ) + + def get_last_refresh_time(self) -> float: + return self.last_refresh_time + + def _load_storage(self) -> Dict[str, Any]: + umdb = self.cmd_helper.get_umdb() + return umdb.get(self.name, {}) async def refresh(self) -> None: pass @@ -38,6 +65,17 @@ class BaseDeploy: def get_update_status(self) -> Dict[str, Any]: return {} + def get_persistent_data(self) -> Dict[str, Any]: + return { + 'last_config_hash': self.cfg_hash, + 'last_refresh_time': self.last_refresh_time + } + + def _save_state(self) -> None: + umdb = self.cmd_helper.get_umdb() + self.last_refresh_time = time.time() + umdb[self.name] = self.get_persistent_data() + def log_exc(self, msg: str, traceback: bool = True) -> ServerError: log_msg = f"{self.prefix}{msg}" if traceback: