diff --git a/moonraker/confighelper.py b/moonraker/confighelper.py index 275d0ff..335f44e 100644 --- a/moonraker/confighelper.py +++ b/moonraker/confighelper.py @@ -8,6 +8,10 @@ from __future__ import annotations import configparser import os import hashlib +import shutil +import filecmp +import pathlib +import logging from utils import SentinelClass from components.gpio import GpioOutputPin from components.template import JinjaTemplate @@ -423,3 +427,22 @@ def get_configuration(server: Server, raise ConfigError("No section [server] in config") orig_sections = config.sections() return ConfigHelper(server, config, 'server', orig_sections) + +def backup_config(cfg_path: str) -> None: + cfg = pathlib.Path(cfg_path).expanduser().resolve() + backup = cfg.parent.joinpath(f".{cfg.name}.bkp") + try: + if backup.exists() and filecmp.cmp(cfg, backup): + # Backup already exists and is current + return + shutil.copy2(cfg, backup) + logging.info(f"Backing up last working configuration to '{backup}'") + except Exception: + logging.exception("Failed to create a backup") + +def find_config_backup(cfg_path: str) -> Optional[str]: + cfg = pathlib.Path(cfg_path).expanduser().resolve() + backup = cfg.parent.joinpath(f".{cfg.name}.bkp") + if backup.is_file(): + return str(backup) + return None diff --git a/moonraker/moonraker.py b/moonraker/moonraker.py index 049aaa6..3c92151 100755 --- a/moonraker/moonraker.py +++ b/moonraker/moonraker.py @@ -193,7 +193,8 @@ class Server: if not self.warnings: cfg_file = self.app_args['config_file'] - await self.event_loop.run_in_thread(utils.backup_config, cfg_file) + await self.event_loop.run_in_thread( + confighelper.backup_config, cfg_file) # Start HTTP Server logging.info( @@ -855,7 +856,8 @@ def main() -> None: "-n", "--nologfile", action='store_true', help="disable logging to a file") cmd_line_args = parser.parse_args() - app_args = {'config_file': cmd_line_args.configfile} + cfg_file = cmd_line_args.configfile + app_args = {'config_file': cfg_file} # Setup Logging version = utils.get_software_version() @@ -885,7 +887,7 @@ def main() -> None: try: server = Server(app_args, file_logger, event_loop) except confighelper.ConfigError as e: - backup_cfg = utils.find_config_backup(app_args['config_file']) + backup_cfg = confighelper.find_config_backup(cfg_file) if alt_config_loaded or backup_cfg is None: logging.exception("Server Config Error") estatus = 1 @@ -915,7 +917,7 @@ def main() -> None: # Restore the original config and clear the warning # before the server restarts if alt_config_loaded: - app_args['config_file'] = cmd_line_args.configfile + app_args['config_file'] = cfg_file app_args.pop('config_warning', None) alt_config_loaded = False event_loop.close() diff --git a/moonraker/utils.py b/moonraker/utils.py index 5a003d6..3e72ea5 100644 --- a/moonraker/utils.py +++ b/moonraker/utils.py @@ -18,8 +18,6 @@ import hashlib import json import shlex import re -import shutil -import filecmp from queue import SimpleQueue as Queue # Annotation imports @@ -232,22 +230,3 @@ def load_system_module(name: str) -> ModuleType: else: raise ServerError(f"Unable to import module {name}") return module - -def backup_config(cfg_path: str) -> None: - cfg = pathlib.Path(cfg_path).expanduser().resolve() - backup = cfg.parent.joinpath(f".{cfg.name}.bkp") - try: - if backup.exists() and filecmp.cmp(cfg, backup): - # Backup already exists and is current - return - shutil.copy2(cfg, backup) - logging.info(f"Backing up last working configuration to '{backup}'") - except Exception: - logging.exception("Failed to create a backup") - -def find_config_backup(cfg_path: str) -> Optional[str]: - cfg = pathlib.Path(cfg_path).expanduser().resolve() - backup = cfg.parent.joinpath(f".{cfg.name}.bkp") - if backup.is_file(): - return str(backup) - return None