Compare commits

...

4 Commits

3 changed files with 57 additions and 22 deletions

View File

@@ -11,6 +11,7 @@ from __future__ import annotations
import json import json
import re import re
import shutil import shutil
from json import JSONDecodeError
from pathlib import Path from pathlib import Path
from subprocess import PIPE, CalledProcessError, run from subprocess import PIPE, CalledProcessError, run
from typing import List, get_args from typing import List, get_args
@@ -151,18 +152,36 @@ def symlink_webui_nginx_log(
def get_local_client_version(client: BaseWebClient) -> str | None: def get_local_client_version(client: BaseWebClient) -> str | None:
relinfo_file = client.client_dir.joinpath("release_info.json") relinfo_file = client.client_dir.joinpath("release_info.json")
version_file = client.client_dir.joinpath(".version") version_file = client.client_dir.joinpath(".version")
default = "n/a"
if not client.client_dir.exists(): if not client.client_dir.exists():
return None return default
if not relinfo_file.is_file() and not version_file.is_file():
return "n/a"
# try to get version from release_info.json first
if relinfo_file.is_file(): if relinfo_file.is_file():
with open(relinfo_file, "r") as f: try:
return str(json.load(f)["version"]) if relinfo_file.stat().st_size == 0:
else: raise JSONDecodeError("Empty file", "", 0)
with open(version_file, "r") as f: with open(relinfo_file, "r", encoding="utf-8") as f:
return f.readlines()[0] data = json.load(f)
raw_version = data.get("version")
if raw_version is not None:
parsed = str(raw_version).strip()
if parsed:
return parsed
except (JSONDecodeError, OSError):
Logger.print_error("Invalid 'release_info.json'")
# fallback to .version file
if version_file.is_file():
try:
with open(version_file, "r") as f:
line = f.readline().strip()
return line or default
except OSError:
Logger.print_error("Unable to read '.version'")
return default
def get_remote_client_version(client: BaseWebClient) -> str | None: def get_remote_client_version(client: BaseWebClient) -> str | None:

View File

@@ -62,16 +62,16 @@ class BackupService:
target_name target_name
or f"{source_path.stem}_{self.timestamp}{source_path.suffix}" or f"{source_path.stem}_{self.timestamp}{source_path.suffix}"
) )
if target_path is not None:
backup_path = self._backup_root.joinpath(target_path, filename)
else:
backup_path = self._backup_root.joinpath(filename)
backup_path.mkdir(parents=True, exist_ok=True) backup_dir = self._backup_root
shutil.copy2(source_path, backup_path) if target_path is not None:
backup_dir = self._backup_root.joinpath(target_path)
backup_dir.mkdir(parents=True, exist_ok=True)
shutil.copy2(source_path, backup_dir.joinpath(filename))
Logger.print_ok( Logger.print_ok(
f"Successfully backed up '{source_path}' to '{backup_path}'" f"Successfully backed up '{source_path}' to '{backup_dir}'"
) )
return True return True
@@ -109,7 +109,16 @@ class BackupService:
else: else:
backup_path = self._backup_root.joinpath(backup_dir_name) backup_path = self._backup_root.joinpath(backup_dir_name)
shutil.copytree(source_path, backup_path) if backup_path.exists():
Logger.print_info(f"Reusing existing backup directory '{backup_path}'")
shutil.copytree(
source_path,
backup_path,
dirs_exist_ok=True,
symlinks=True,
ignore_dangling_symlinks=True,
)
Logger.print_ok( Logger.print_ok(
f"Successfully backed up '{source_path}' to '{backup_path}'" f"Successfully backed up '{source_path}' to '{backup_path}'"

View File

@@ -8,6 +8,7 @@
# ======================================================================= # # ======================================================================= #
import re import re
from pathlib import Path
from subprocess import CalledProcessError, run from subprocess import CalledProcessError, run
from typing import List, Tuple from typing import List, Tuple
@@ -311,13 +312,19 @@ class SpoolmanExtension(BaseExtension):
mrsvc.load_instances() mrsvc.load_instances()
mr_instances = mrsvc.get_all_instances() mr_instances = mrsvc.get_all_instances()
for instance in mr_instances: for instance in mr_instances:
asvc_path = instance.data_dir.joinpath("moonraker.asvc") asvc_path: Path = instance.data_dir.joinpath("moonraker.asvc")
if asvc_path.exists(): if asvc_path.exists() and asvc_path.is_file():
if "Spoolman" in open(asvc_path).read(): with open(asvc_path, "a+") as f:
Logger.print_info(f"Spoolman already in {asvc_path}. Skipping...") if "Spoolman" in f.read():
continue Logger.print_info(
f"Spoolman already in {asvc_path}. Skipping..."
)
continue
content: List[str] = f.readlines()
if content and not content[-1].endswith("\n"):
f.write("\n")
with open(asvc_path, "a") as f:
f.write("Spoolman\n") f.write("Spoolman\n")
Logger.print_ok(f"Spoolman added to {asvc_path}!") Logger.print_ok(f"Spoolman added to {asvc_path}!")