Compare commits

..

5 Commits

Author SHA1 Message Date
dw-0
5fa32a1c24 Merge be5f345a7c into 099d47df2f 2024-02-10 16:21:15 +01:00
dw-0
be5f345a7c style: reformat code
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2024-02-10 16:21:19 +01:00
dw-0
948927cfd3 feat: implement backup menu and backup methods for existing components
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2024-02-10 11:47:27 +01:00
dw-0
34ebe5d15e refactor(BackupManager): backup_file method only takes in single files now
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2024-02-10 11:40:38 +01:00
dw-0
3bef6ecb85 feat(BackupManager): allow to ignore folders
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2024-02-10 00:50:45 +01:00
37 changed files with 334 additions and 130 deletions

View File

@@ -13,4 +13,3 @@ from pathlib import Path
APPLICATION_ROOT = Path(__file__).resolve().parent.parent APPLICATION_ROOT = Path(__file__).resolve().parent.parent
KIAUH_CFG = APPLICATION_ROOT.joinpath("kiauh.cfg") KIAUH_CFG = APPLICATION_ROOT.joinpath("kiauh.cfg")
KIAUH_BACKUP_DIR = Path.home().joinpath("kiauh-backups")

View File

@@ -11,10 +11,13 @@
from pathlib import Path from pathlib import Path
from kiauh.core.backup_manager import BACKUP_ROOT_DIR
MODULE_PATH = Path(__file__).resolve().parent MODULE_PATH = Path(__file__).resolve().parent
KLIPPER_DIR = Path.home().joinpath("klipper") KLIPPER_DIR = Path.home().joinpath("klipper")
KLIPPER_ENV_DIR = Path.home().joinpath("klippy-env") KLIPPER_ENV_DIR = Path.home().joinpath("klippy-env")
KLIPPER_BACKUP_DIR = BACKUP_ROOT_DIR.joinpath("klipper-backups")
KLIPPER_REQUIREMENTS_TXT = KLIPPER_DIR.joinpath("scripts/klippy-requirements.txt") KLIPPER_REQUIREMENTS_TXT = KLIPPER_DIR.joinpath("scripts/klippy-requirements.txt")
DEFAULT_KLIPPER_REPO_URL = "https://github.com/Klipper3D/klipper" DEFAULT_KLIPPER_REPO_URL = "https://github.com/Klipper3D/klipper"

View File

@@ -13,8 +13,8 @@ import subprocess
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.components.klipper import KLIPPER_DIR, KLIPPER_ENV_DIR, MODULE_PATH from kiauh.components.klipper import KLIPPER_DIR, KLIPPER_ENV_DIR, MODULE_PATH
from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.utils.constants import SYSTEMD from kiauh.utils.constants import SYSTEMD
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger

View File

@@ -12,10 +12,10 @@
import shutil import shutil
from typing import List, Union from typing import List, Union
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper import KLIPPER_DIR, KLIPPER_ENV_DIR from kiauh.components.klipper import KLIPPER_DIR, KLIPPER_ENV_DIR
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.klipper.klipper_dialogs import print_instance_overview from kiauh.components.klipper.klipper_dialogs import print_instance_overview
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.utils.filesystem_utils import remove_file from kiauh.utils.filesystem_utils import remove_file
from kiauh.utils.input_utils import get_selection_input from kiauh.utils.input_utils import get_selection_input
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger

View File

@@ -12,9 +12,6 @@
from pathlib import Path from pathlib import Path
from kiauh import KIAUH_CFG from kiauh import KIAUH_CFG
from kiauh.core.backup_manager.backup_manager import BackupManager
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper import ( from kiauh.components.klipper import (
EXIT_KLIPPER_SETUP, EXIT_KLIPPER_SETUP,
DEFAULT_KLIPPER_REPO_URL, DEFAULT_KLIPPER_REPO_URL,
@@ -35,9 +32,12 @@ from kiauh.components.klipper.klipper_utils import (
check_is_single_to_multi_conversion, check_is_single_to_multi_conversion,
update_name_scheme, update_name_scheme,
handle_instance_naming, handle_instance_naming,
backup_klipper_dir,
) )
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.utils.input_utils import get_confirm from kiauh.utils.input_utils import get_confirm
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
from kiauh.utils.system_utils import ( from kiauh.utils.system_utils import (
@@ -149,9 +149,7 @@ def update_klipper() -> None:
cm = ConfigManager(cfg_file=KIAUH_CFG) cm = ConfigManager(cfg_file=KIAUH_CFG)
if cm.get_value("kiauh", "backup_before_update"): if cm.get_value("kiauh", "backup_before_update"):
bm = BackupManager() backup_klipper_dir()
bm.backup_directory("klipper", KLIPPER_DIR)
bm.backup_directory("klippy-env", KLIPPER_ENV_DIR)
instance_manager = InstanceManager(Klipper) instance_manager = InstanceManager(Klipper)
instance_manager.stop_all_instance() instance_manager.stop_all_instance()

View File

@@ -9,22 +9,21 @@
# This file may be distributed under the terms of the GNU GPLv3 license # # This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= # # ======================================================================= #
import grp
import os import os
import re import re
import grp
import shutil import shutil
import subprocess import subprocess
import textwrap import textwrap
from pathlib import Path from pathlib import Path
from typing import List, Union, Literal, Dict from typing import List, Union, Literal, Dict
from kiauh.core.config_manager.config_manager import ConfigManager from kiauh.components.klipper import (
from kiauh.core.instance_manager.base_instance import BaseInstance MODULE_PATH,
from kiauh.core.instance_manager.instance_manager import InstanceManager KLIPPER_DIR,
from kiauh.core.instance_manager.name_scheme import NameScheme KLIPPER_ENV_DIR,
from kiauh.core.repo_manager.repo_manager import RepoManager KLIPPER_BACKUP_DIR,
from kiauh.components.klipper import MODULE_PATH, KLIPPER_DIR, KLIPPER_ENV_DIR )
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.klipper.klipper_dialogs import ( from kiauh.components.klipper.klipper_dialogs import (
print_missing_usergroup_dialog, print_missing_usergroup_dialog,
@@ -34,6 +33,12 @@ from kiauh.components.klipper.klipper_dialogs import (
) )
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.components.moonraker.moonraker_utils import moonraker_to_multi_conversion from kiauh.components.moonraker.moonraker_utils import moonraker_to_multi_conversion
from kiauh.core.backup_manager.backup_manager import BackupManager
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.instance_manager.name_scheme import NameScheme
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.utils.common import get_install_status_common from kiauh.utils.common import get_install_status_common
from kiauh.utils.constants import CURRENT_USER from kiauh.utils.constants import CURRENT_USER
from kiauh.utils.input_utils import get_confirm, get_string_input, get_number_input from kiauh.utils.input_utils import get_confirm, get_string_input, get_number_input
@@ -41,12 +46,10 @@ from kiauh.utils.logger import Logger
from kiauh.utils.system_utils import mask_system_service from kiauh.utils.system_utils import mask_system_service
def get_klipper_status() -> ( def get_klipper_status() -> Dict[
Dict[ Literal["status", "status_code", "instances", "repo", "local", "remote"],
Literal["status", "status_code", "instances", "repo", "local", "remote"], Union[str, int],
Union[str, int], ]:
]
):
status = get_install_status_common(Klipper, KLIPPER_DIR, KLIPPER_ENV_DIR) status = get_install_status_common(Klipper, KLIPPER_DIR, KLIPPER_ENV_DIR)
return { return {
"status": status.get("status"), "status": status.get("status"),
@@ -276,3 +279,9 @@ def create_example_printer_cfg(instance: Klipper) -> None:
cm.set_value("virtual_sdcard", "path", str(instance.gcodes_dir)) cm.set_value("virtual_sdcard", "path", str(instance.gcodes_dir))
cm.write_config() cm.write_config()
Logger.print_ok(f"Example printer.cfg created in '{instance.cfg_dir}'") Logger.print_ok(f"Example printer.cfg created in '{instance.cfg_dir}'")
def backup_klipper_dir() -> None:
bm = BackupManager()
bm.backup_directory("klipper", source=KLIPPER_DIR, target=KLIPPER_BACKUP_DIR)
bm.backup_directory("klippy-env", source=KLIPPER_ENV_DIR, target=KLIPPER_BACKUP_DIR)

View File

@@ -11,9 +11,9 @@
import textwrap import textwrap
from kiauh.components.klipper import klipper_remove
from kiauh.core.menus import BACK_HELP_FOOTER from kiauh.core.menus import BACK_HELP_FOOTER
from kiauh.core.menus.base_menu import BaseMenu from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.klipper import klipper_remove
from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN

View File

@@ -9,14 +9,13 @@
# This file may be distributed under the terms of the GNU GPLv3 license # # This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= # # ======================================================================= #
from typing import List
from pathlib import Path
import urllib.request import urllib.request
from pathlib import Path
from typing import List
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.log_uploads import LogFile from kiauh.components.log_uploads import LogFile
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger

View File

@@ -11,10 +11,10 @@
import textwrap import textwrap
from kiauh.components.log_uploads.log_upload_utils import get_logfile_list
from kiauh.components.log_uploads.log_upload_utils import upload_logfile
from kiauh.core.menus import BACK_FOOTER from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.log_uploads.log_upload_utils import upload_logfile
from kiauh.components.log_uploads.log_upload_utils import get_logfile_list
from kiauh.utils.constants import RESET_FORMAT, COLOR_YELLOW from kiauh.utils.constants import RESET_FORMAT, COLOR_YELLOW

View File

@@ -11,10 +11,13 @@
from pathlib import Path from pathlib import Path
from kiauh.core.backup_manager import BACKUP_ROOT_DIR
MODULE_PATH = Path(__file__).resolve().parent MODULE_PATH = Path(__file__).resolve().parent
MAINSAIL_DIR = Path(Path.home(), "mainsail") MAINSAIL_DIR = Path.home().joinpath("mainsail")
MAINSAIL_CONFIG_DIR = Path(Path.home(), "mainsail-config") MAINSAIL_BACKUP_DIR = BACKUP_ROOT_DIR.joinpath("mainsail-backups")
MAINSAIL_CONFIG_JSON = Path(MAINSAIL_DIR, "config.json") MAINSAIL_CONFIG_DIR = Path.home().joinpath("mainsail-config")
MAINSAIL_CONFIG_JSON = MAINSAIL_DIR.joinpath("config.json")
MAINSAIL_URL = ( MAINSAIL_URL = (
"https://github.com/mainsail-crew/mainsail/releases/latest/download/mainsail.zip" "https://github.com/mainsail-crew/mainsail/releases/latest/download/mainsail.zip"
) )

View File

@@ -15,12 +15,12 @@ import subprocess
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.mainsail import MAINSAIL_DIR, MAINSAIL_CONFIG_DIR from kiauh.components.mainsail import MAINSAIL_DIR, MAINSAIL_CONFIG_DIR
from kiauh.components.mainsail.mainsail_utils import backup_config_json from kiauh.components.mainsail.mainsail_utils import backup_config_json
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_SITES_ENABLED from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_SITES_ENABLED
from kiauh.utils.filesystem_utils import remove_file from kiauh.utils.filesystem_utils import remove_file
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger

View File

@@ -14,9 +14,6 @@ from pathlib import Path
from typing import List from typing import List
from kiauh import KIAUH_CFG from kiauh import KIAUH_CFG
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.mainsail import ( from kiauh.components.mainsail import (
MAINSAIL_URL, MAINSAIL_URL,
@@ -38,6 +35,9 @@ from kiauh.components.mainsail.mainsail_utils import (
symlink_webui_nginx_log, symlink_webui_nginx_log,
) )
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_SITES_ENABLED from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_SITES_ENABLED
from kiauh.utils.common import check_install_dependencies from kiauh.utils.common import check_install_dependencies
from kiauh.utils.filesystem_utils import ( from kiauh.utils.filesystem_utils import (

View File

@@ -11,13 +11,18 @@
import json import json
import shutil import shutil
import requests
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from kiauh.core.backup_manager.backup_manager import BackupManager import requests
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.mainsail import MAINSAIL_CONFIG_JSON, MAINSAIL_DIR from kiauh.components.mainsail import (
MAINSAIL_CONFIG_JSON,
MAINSAIL_DIR,
MAINSAIL_BACKUP_DIR,
)
from kiauh.core.backup_manager.backup_manager import BackupManager
from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_CONFD from kiauh.utils import NGINX_SITES_AVAILABLE, NGINX_CONFD
from kiauh.utils.common import get_install_status_webui from kiauh.utils.common import get_install_status_webui
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
@@ -37,9 +42,9 @@ def backup_config_json(is_temp=False) -> None:
bm = BackupManager() bm = BackupManager()
if is_temp: if is_temp:
fn = Path.home().joinpath("config.json.kiauh.bak") fn = Path.home().joinpath("config.json.kiauh.bak")
bm.backup_file([MAINSAIL_CONFIG_JSON], custom_filename=fn) bm.backup_file(MAINSAIL_CONFIG_JSON, custom_filename=fn)
else: else:
bm.backup_file([MAINSAIL_CONFIG_JSON]) bm.backup_file(MAINSAIL_CONFIG_JSON)
def restore_config_json() -> None: def restore_config_json() -> None:
@@ -97,3 +102,12 @@ def get_mainsail_remote_version() -> str:
response = requests.get(url) response = requests.get(url)
data = json.loads(response.text) data = json.loads(response.text)
return data[0]["name"] return data[0]["name"]
def backup_mainsail_data() -> None:
with open(MAINSAIL_DIR.joinpath(".version"), "r") as v:
version = v.readlines()[0]
bm = BackupManager()
bm.backup_directory(f"mainsail-{version}", MAINSAIL_DIR, MAINSAIL_BACKUP_DIR)
bm.backup_file(MAINSAIL_CONFIG_JSON, MAINSAIL_BACKUP_DIR)
bm.backup_file(NGINX_SITES_AVAILABLE.joinpath("mainsail"), MAINSAIL_BACKUP_DIR)

View File

@@ -11,9 +11,9 @@
import textwrap import textwrap
from kiauh.components.mainsail import mainsail_remove
from kiauh.core.menus import BACK_HELP_FOOTER from kiauh.core.menus import BACK_HELP_FOOTER
from kiauh.core.menus.base_menu import BaseMenu from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.mainsail import mainsail_remove
from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN

View File

@@ -11,10 +11,14 @@
from pathlib import Path from pathlib import Path
from kiauh.core.backup_manager import BACKUP_ROOT_DIR
MODULE_PATH = Path(__file__).resolve().parent MODULE_PATH = Path(__file__).resolve().parent
MOONRAKER_DIR = Path.home().joinpath("moonraker") MOONRAKER_DIR = Path.home().joinpath("moonraker")
MOONRAKER_ENV_DIR = Path.home().joinpath("moonraker-env") MOONRAKER_ENV_DIR = Path.home().joinpath("moonraker-env")
MOONRAKER_BACKUP_DIR = BACKUP_ROOT_DIR.joinpath("moonraker-backups")
MOONRAKER_DB_BACKUP_DIR = BACKUP_ROOT_DIR.joinpath("moonraker-db-backups")
MOONRAKER_REQUIREMENTS_TXT = MOONRAKER_DIR.joinpath( MOONRAKER_REQUIREMENTS_TXT = MOONRAKER_DIR.joinpath(
"scripts/moonraker-requirements.txt" "scripts/moonraker-requirements.txt"
) )

View File

@@ -11,9 +11,9 @@
import textwrap import textwrap
from kiauh.components.moonraker import moonraker_remove
from kiauh.core.menus import BACK_HELP_FOOTER from kiauh.core.menus import BACK_HELP_FOOTER
from kiauh.core.menus.base_menu import BaseMenu from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.moonraker import moonraker_remove
from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN from kiauh.utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN

View File

@@ -13,9 +13,9 @@ import subprocess
from pathlib import Path from pathlib import Path
from typing import List, Union from typing import List, Union
from kiauh.components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR, MODULE_PATH
from kiauh.core.config_manager.config_manager import ConfigManager from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.base_instance import BaseInstance from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR, MODULE_PATH
from kiauh.utils.constants import SYSTEMD from kiauh.utils.constants import SYSTEMD
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
@@ -34,9 +34,13 @@ class Moonraker(BaseInstance):
self.port = self._get_port() self.port = self._get_port()
self.backup_dir = self.data_dir.joinpath("backup") self.backup_dir = self.data_dir.joinpath("backup")
self.certs_dir = self.data_dir.joinpath("certs") self.certs_dir = self.data_dir.joinpath("certs")
self.db_dir = self.data_dir.joinpath("database") self._db_dir = self.data_dir.joinpath("database")
self.log = self.log_dir.joinpath("moonraker.log") self.log = self.log_dir.joinpath("moonraker.log")
@property
def db_dir(self) -> Path:
return self._db_dir
def create(self, create_example_cfg: bool = False) -> None: def create(self, create_example_cfg: bool = False) -> None:
Logger.print_status("Creating new Moonraker Instance ...") Logger.print_status("Creating new Moonraker Instance ...")
service_template_path = MODULE_PATH.joinpath("assets/moonraker.service") service_template_path = MODULE_PATH.joinpath("assets/moonraker.service")
@@ -46,7 +50,7 @@ class Moonraker(BaseInstance):
env_file_target = self.sysd_dir.joinpath("moonraker.env") env_file_target = self.sysd_dir.joinpath("moonraker.env")
try: try:
self.create_folders([self.backup_dir, self.certs_dir, self.db_dir]) self.create_folders([self.backup_dir, self.certs_dir, self._db_dir])
self.write_service_file( self.write_service_file(
service_template_path, service_file_target, env_file_target service_template_path, service_file_target, env_file_target
) )

View File

@@ -12,9 +12,9 @@
import textwrap import textwrap
from typing import List from typing import List
from kiauh.core.menus.base_menu import print_back_footer
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.menus.base_menu import print_back_footer
from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT, COLOR_YELLOW, COLOR_CYAN from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT, COLOR_YELLOW, COLOR_CYAN
@@ -39,11 +39,11 @@ def print_moonraker_overview(
dialog += "| |\n" dialog += "| |\n"
instance_map = { instance_map = {
k.get_service_file_name(): k.get_service_file_name().replace( k.get_service_file_name(): (
"klipper", "moonraker" k.get_service_file_name().replace("klipper", "moonraker")
if k.suffix in [m.suffix for m in moonraker_instances]
else ""
) )
if k.suffix in [m.suffix for m in moonraker_instances]
else ""
for k in klipper_instances for k in klipper_instances
} }

View File

@@ -13,10 +13,10 @@ import shutil
import subprocess import subprocess
from typing import List, Union from typing import List, Union
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper.klipper_dialogs import print_instance_overview from kiauh.components.klipper.klipper_dialogs import print_instance_overview
from kiauh.components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR from kiauh.components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.utils.filesystem_utils import remove_file from kiauh.utils.filesystem_utils import remove_file
from kiauh.utils.input_utils import get_selection_input from kiauh.utils.input_utils import get_selection_input
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger

View File

@@ -15,12 +15,8 @@ from pathlib import Path
from typing import List from typing import List
from kiauh import KIAUH_CFG from kiauh import KIAUH_CFG
from kiauh.core.backup_manager.backup_manager import BackupManager
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.components.klipper.klipper import Klipper from kiauh.components.klipper.klipper import Klipper
from kiauh.components.klipper.klipper_dialogs import print_instance_overview from kiauh.components.klipper.klipper_dialogs import print_instance_overview
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.components.mainsail import MAINSAIL_DIR from kiauh.components.mainsail import MAINSAIL_DIR
from kiauh.components.mainsail.mainsail_utils import enable_mainsail_remotemode from kiauh.components.mainsail.mainsail_utils import enable_mainsail_remotemode
from kiauh.components.moonraker import ( from kiauh.components.moonraker import (
@@ -36,7 +32,13 @@ from kiauh.components.moonraker import (
) )
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.components.moonraker.moonraker_dialogs import print_moonraker_overview from kiauh.components.moonraker.moonraker_dialogs import print_moonraker_overview
from kiauh.components.moonraker.moonraker_utils import create_example_moonraker_conf from kiauh.components.moonraker.moonraker_utils import (
create_example_moonraker_conf,
backup_moonraker_dir,
)
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.utils.filesystem_utils import check_file_exist from kiauh.utils.filesystem_utils import check_file_exist
from kiauh.utils.input_utils import ( from kiauh.utils.input_utils import (
get_confirm, get_confirm,
@@ -206,9 +208,7 @@ def update_moonraker() -> None:
cm = ConfigManager(cfg_file=KIAUH_CFG) cm = ConfigManager(cfg_file=KIAUH_CFG)
if cm.get_value("kiauh", "backup_before_update"): if cm.get_value("kiauh", "backup_before_update"):
bm = BackupManager() backup_moonraker_dir()
bm.backup_directory("moonraker", MOONRAKER_DIR)
bm.backup_directory("moonraker-env", MOONRAKER_ENV_DIR)
instance_manager = InstanceManager(Moonraker) instance_manager = InstanceManager(Moonraker)
instance_manager.stop_all_instance() instance_manager.stop_all_instance()

View File

@@ -12,9 +12,6 @@
import shutil import shutil
from typing import Dict, Literal, List, Union from typing import Dict, Literal, List, Union
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.components.mainsail import MAINSAIL_DIR from kiauh.components.mainsail import MAINSAIL_DIR
from kiauh.components.mainsail.mainsail_utils import enable_mainsail_remotemode from kiauh.components.mainsail.mainsail_utils import enable_mainsail_remotemode
from kiauh.components.moonraker import ( from kiauh.components.moonraker import (
@@ -22,8 +19,14 @@ from kiauh.components.moonraker import (
MODULE_PATH, MODULE_PATH,
MOONRAKER_DIR, MOONRAKER_DIR,
MOONRAKER_ENV_DIR, MOONRAKER_ENV_DIR,
MOONRAKER_BACKUP_DIR,
MOONRAKER_DB_BACKUP_DIR,
) )
from kiauh.components.moonraker.moonraker import Moonraker from kiauh.components.moonraker.moonraker import Moonraker
from kiauh.core.backup_manager.backup_manager import BackupManager
from kiauh.core.config_manager.config_manager import ConfigManager
from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.core.repo_manager.repo_manager import RepoManager
from kiauh.utils.common import get_install_status_common from kiauh.utils.common import get_install_status_common
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
from kiauh.utils.system_utils import ( from kiauh.utils.system_utils import (
@@ -31,12 +34,10 @@ from kiauh.utils.system_utils import (
) )
def get_moonraker_status() -> ( def get_moonraker_status() -> Dict[
Dict[ Literal["status", "status_code", "instances", "repo", "local", "remote"],
Literal["status", "status_code", "instances", "repo", "local", "remote"], Union[str, int],
Union[str, int], ]:
]
):
status = get_install_status_common(Moonraker, MOONRAKER_DIR, MOONRAKER_ENV_DIR) status = get_install_status_common(Moonraker, MOONRAKER_DIR, MOONRAKER_ENV_DIR)
return { return {
"status": status.get("status"), "status": status.get("status"),
@@ -132,3 +133,23 @@ def moonraker_to_multi_conversion(new_name: str) -> None:
# if mainsail is installed, we enable mainsails remote mode # if mainsail is installed, we enable mainsails remote mode
if MAINSAIL_DIR.exists() and len(im.instances) > 1: if MAINSAIL_DIR.exists() and len(im.instances) > 1:
enable_mainsail_remotemode() enable_mainsail_remotemode()
def backup_moonraker_dir():
bm = BackupManager()
bm.backup_directory("moonraker", source=MOONRAKER_DIR, target=MOONRAKER_BACKUP_DIR)
bm.backup_directory(
"moonraker-env", source=MOONRAKER_ENV_DIR, target=MOONRAKER_BACKUP_DIR
)
def backup_moonraker_db_dir() -> None:
im = InstanceManager(Moonraker)
instances: List[Moonraker] = im.instances
bm = BackupManager()
for instance in instances:
name = f"database-{instance.data_dir_name}"
bm.backup_directory(
name, source=instance.db_dir, target=MOONRAKER_DB_BACKUP_DIR
)

View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python3
# ======================================================================= #
# Copyright (C) 2020 - 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# This file is part of KIAUH - Klipper Installation And Update Helper #
# https://github.com/dw-0/kiauh #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
BACKUP_ROOT_DIR = Path.home().joinpath("kiauh-backups")

View File

@@ -13,15 +13,17 @@ import shutil
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from kiauh import KIAUH_BACKUP_DIR from kiauh.core.backup_manager import BACKUP_ROOT_DIR
from kiauh.utils.common import get_current_date from kiauh.utils.common import get_current_date
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
# noinspection PyUnusedLocal
# noinspection PyMethodMayBeStatic # noinspection PyMethodMayBeStatic
class BackupManager: class BackupManager:
def __init__(self, backup_root_dir: Path = KIAUH_BACKUP_DIR): def __init__(self, backup_root_dir: Path = BACKUP_ROOT_DIR):
self._backup_root_dir = backup_root_dir self._backup_root_dir = backup_root_dir
self._ignore_folders = None
@property @property
def backup_root_dir(self) -> Path: def backup_root_dir(self) -> Path:
@@ -31,32 +33,38 @@ class BackupManager:
def backup_root_dir(self, value: Path): def backup_root_dir(self, value: Path):
self._backup_root_dir = value self._backup_root_dir = value
def backup_file( @property
self, files: List[Path] = None, target: Path = None, custom_filename=None def ignore_folders(self) -> List[str]:
): return self._ignore_folders
if not files:
raise ValueError("Parameter 'files' cannot be None or an empty List!") @ignore_folders.setter
def ignore_folders(self, value: List[str]):
self._ignore_folders = value
def backup_file(self, file: Path = None, target: Path = None, custom_filename=None):
if not file:
raise ValueError("Parameter 'file' cannot be None!")
target = self.backup_root_dir if target is None else target target = self.backup_root_dir if target is None else target
for file in files:
Logger.print_status(f"Creating backup of {file} ...") Logger.print_status(f"Creating backup of {file} ...")
if Path(file).is_file(): if Path(file).is_file():
date = get_current_date().get("date") date = get_current_date().get("date")
time = get_current_date().get("time") time = get_current_date().get("time")
filename = f"{file.stem}-{date}-{time}{file.suffix}" filename = f"{file.stem}-{date}-{time}{file.suffix}"
filename = custom_filename if custom_filename is not None else filename filename = custom_filename if custom_filename is not None else filename
try: try:
Path(target).mkdir(exist_ok=True) Path(target).mkdir(exist_ok=True)
shutil.copyfile(file, target.joinpath(filename)) shutil.copyfile(file, target.joinpath(filename))
except OSError as e: Logger.print_ok("Backup successfull!")
Logger.print_error(f"Unable to backup '{file}':\n{e}") except OSError as e:
continue Logger.print_error(f"Unable to backup '{file}':\n{e}")
else: else:
Logger.print_info(f"File '{file}' not found ...") Logger.print_info(f"File '{file}' not found ...")
def backup_directory(self, name: str, source: Path, target: Path = None) -> None: def backup_directory(self, name: str, source: Path, target: Path = None) -> None:
if source is None or not Path(source).exists(): if source is None or not Path(source).exists():
raise OSError raise OSError("Parameter 'source' is None or Path does not exist!")
target = self.backup_root_dir if target is None else target target = self.backup_root_dir if target is None else target
try: try:
@@ -64,9 +72,19 @@ class BackupManager:
Logger.print_status(log) Logger.print_status(log)
date = get_current_date().get("date") date = get_current_date().get("date")
time = get_current_date().get("time") time = get_current_date().get("time")
shutil.copytree(source, target.joinpath(f"{name}-{date}-{time}")) shutil.copytree(
source,
target.joinpath(f"{name.lower()}-{date}-{time}"),
ignore=self.ignore_folders_func,
)
Logger.print_ok("Backup successfull!")
except OSError as e: except OSError as e:
Logger.print_error(f"Unable to backup directory '{source}':\n{e}") Logger.print_error(f"Unable to backup directory '{source}':\n{e}")
return return
Logger.print_ok("Backup successfull!") def ignore_folders_func(self, dirpath, filenames):
return (
[f for f in filenames if f in self._ignore_folders]
if self._ignore_folders is not None
else []
)

View File

@@ -18,7 +18,6 @@ from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.utils.constants import SYSTEMD from kiauh.utils.constants import SYSTEMD
from kiauh.utils.logger import Logger from kiauh.utils.logger import Logger
I = TypeVar(name="I", bound=BaseInstance, covariant=True) I = TypeVar(name="I", bound=BaseInstance, covariant=True)

View File

@@ -0,0 +1,89 @@
#!/usr/bin/env python3
# ======================================================================= #
# Copyright (C) 2020 - 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# This file is part of KIAUH - Klipper Installation And Update Helper #
# https://github.com/dw-0/kiauh #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
import textwrap
from kiauh.components.klipper.klipper_utils import backup_klipper_dir
from kiauh.components.mainsail.mainsail_utils import backup_mainsail_data
from kiauh.components.moonraker.moonraker_utils import (
backup_moonraker_dir,
backup_moonraker_db_dir,
)
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.utils.common import backup_printer_config_dir
from kiauh.utils.constants import COLOR_CYAN, RESET_FORMAT, COLOR_YELLOW
# noinspection PyUnusedLocal
# noinspection PyMethodMayBeStatic
class BackupMenu(BaseMenu):
def __init__(self):
super().__init__(
header=True,
options={
"1": self.backup_klipper,
"2": self.backup_moonraker,
"3": self.backup_printer_config,
"4": self.backup_moonraker_db,
"5": self.backup_mainsail,
},
footer_type=BACK_FOOTER,
)
def print_menu(self):
header = " [ Backup Menu ] "
line1 = f"{COLOR_YELLOW}INFO: Backups are located in '~/kiauh-backups'{RESET_FORMAT}"
color = COLOR_CYAN
count = 62 - len(color) - len(RESET_FORMAT)
menu = textwrap.dedent(
f"""
/=======================================================\\
| {color}{header:~^{count}}{RESET_FORMAT} |
|-------------------------------------------------------|
| {line1:^62} |
|-------------------------------------------------------|
| Klipper & Moonraker API: | Touchscreen GUI: |
| 1) [Klipper] | 7) [KlipperScreen] |
| 2) [Moonraker] | |
| 3) [Config Folder] | Other: |
| 4) [Moonraker Database] | 9) [Telegram Bot] |
| | |
| Klipper Webinterface: | |
| 5) [Mainsail] | |
| 6) [Fluidd] | |
"""
)[1:]
print(menu, end="")
def backup_klipper(self, **kwargs):
backup_klipper_dir()
def backup_moonraker(self, **kwargs):
backup_moonraker_dir()
def backup_printer_config(self, **kwargs):
backup_printer_config_dir()
def backup_moonraker_db(self, **kwargs):
backup_moonraker_db_dir()
def backup_mainsail(self, **kwargs):
backup_mainsail_data()
def backup_fluidd(self, **kwargs):
pass
def backup_klipperscreen(self, **kwargs):
pass
def backup_telegram_bot(self, **kwargs):
pass

View File

@@ -13,7 +13,7 @@ import subprocess
import sys import sys
import textwrap import textwrap
from abc import abstractmethod, ABC from abc import abstractmethod, ABC
from typing import Dict, Any, Literal, Union, Callable, Type from typing import Dict, Any, Literal, Union, Callable
from kiauh.core.menus import QUIT_FOOTER, BACK_FOOTER, BACK_HELP_FOOTER from kiauh.core.menus import QUIT_FOOTER, BACK_FOOTER, BACK_HELP_FOOTER
from kiauh.utils.constants import ( from kiauh.utils.constants import (

View File

@@ -9,10 +9,10 @@
# This file may be distributed under the terms of the GNU GPLv3 license # # This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= # # ======================================================================= #
import json
import textwrap
import importlib import importlib
import inspect import inspect
import json
import textwrap
from pathlib import Path from pathlib import Path
from typing import List, Dict from typing import List, Dict

View File

@@ -11,11 +11,11 @@
import textwrap import textwrap
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.klipper import klipper_setup from kiauh.components.klipper import klipper_setup
from kiauh.components.mainsail import mainsail_setup from kiauh.components.mainsail import mainsail_setup
from kiauh.components.moonraker import moonraker_setup from kiauh.components.moonraker import moonraker_setup
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT

View File

@@ -11,18 +11,19 @@
import textwrap import textwrap
from kiauh.components.klipper.klipper_utils import get_klipper_status
from kiauh.components.log_uploads.menus.log_upload_menu import LogUploadMenu
from kiauh.components.mainsail.mainsail_utils import get_mainsail_status
from kiauh.components.moonraker.moonraker_utils import get_moonraker_status
from kiauh.core.menus import QUIT_FOOTER from kiauh.core.menus import QUIT_FOOTER
from kiauh.core.menus.advanced_menu import AdvancedMenu from kiauh.core.menus.advanced_menu import AdvancedMenu
from kiauh.core.menus.backup_menu import BackupMenu
from kiauh.core.menus.base_menu import BaseMenu from kiauh.core.menus.base_menu import BaseMenu
from kiauh.core.menus.extensions_menu import ExtensionsMenu from kiauh.core.menus.extensions_menu import ExtensionsMenu
from kiauh.core.menus.install_menu import InstallMenu from kiauh.core.menus.install_menu import InstallMenu
from kiauh.core.menus.remove_menu import RemoveMenu from kiauh.core.menus.remove_menu import RemoveMenu
from kiauh.core.menus.settings_menu import SettingsMenu from kiauh.core.menus.settings_menu import SettingsMenu
from kiauh.core.menus.update_menu import UpdateMenu from kiauh.core.menus.update_menu import UpdateMenu
from kiauh.components.klipper.klipper_utils import get_klipper_status
from kiauh.components.log_uploads.menus.log_upload_menu import LogUploadMenu
from kiauh.components.mainsail.mainsail_utils import get_mainsail_status
from kiauh.components.moonraker.moonraker_utils import get_moonraker_status
from kiauh.utils.constants import ( from kiauh.utils.constants import (
COLOR_MAGENTA, COLOR_MAGENTA,
COLOR_CYAN, COLOR_CYAN,
@@ -33,6 +34,7 @@ from kiauh.utils.constants import (
) )
# noinspection PyMethodMayBeStatic
class MainMenu(BaseMenu): class MainMenu(BaseMenu):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
@@ -43,7 +45,7 @@ class MainMenu(BaseMenu):
"2": UpdateMenu, "2": UpdateMenu,
"3": RemoveMenu, "3": RemoveMenu,
"4": AdvancedMenu, "4": AdvancedMenu,
"5": None, "5": BackupMenu,
"e": ExtensionsMenu, "e": ExtensionsMenu,
"s": SettingsMenu, "s": SettingsMenu,
}, },

View File

@@ -11,11 +11,11 @@
import textwrap import textwrap
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.klipper.menus.klipper_remove_menu import KlipperRemoveMenu from kiauh.components.klipper.menus.klipper_remove_menu import KlipperRemoveMenu
from kiauh.components.mainsail.menus.mainsail_remove_menu import MainsailRemoveMenu from kiauh.components.mainsail.menus.mainsail_remove_menu import MainsailRemoveMenu
from kiauh.components.moonraker.menus.moonraker_remove_menu import MoonrakerRemoveMenu from kiauh.components.moonraker.menus.moonraker_remove_menu import MoonrakerRemoveMenu
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.utils.constants import COLOR_RED, RESET_FORMAT from kiauh.utils.constants import COLOR_RED, RESET_FORMAT

View File

@@ -11,8 +11,6 @@
import textwrap import textwrap
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.components.klipper.klipper_setup import update_klipper from kiauh.components.klipper.klipper_setup import update_klipper
from kiauh.components.klipper.klipper_utils import ( from kiauh.components.klipper.klipper_utils import (
get_klipper_status, get_klipper_status,
@@ -24,6 +22,8 @@ from kiauh.components.mainsail.mainsail_utils import (
) )
from kiauh.components.moonraker.moonraker_setup import update_moonraker from kiauh.components.moonraker.moonraker_setup import update_moonraker
from kiauh.components.moonraker.moonraker_utils import get_moonraker_status from kiauh.components.moonraker.moonraker_utils import get_moonraker_status
from kiauh.core.menus import BACK_FOOTER
from kiauh.core.menus.base_menu import BaseMenu
from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT, COLOR_YELLOW, COLOR_WHITE from kiauh.utils.constants import COLOR_GREEN, RESET_FORMAT, COLOR_YELLOW, COLOR_WHITE

View File

@@ -11,7 +11,6 @@
from pathlib import Path from pathlib import Path
EXT_MODULE_NAME = "gcode_shell_command.py" EXT_MODULE_NAME = "gcode_shell_command.py"
MODULE_PATH = Path(__file__).resolve().parent MODULE_PATH = Path(__file__).resolve().parent
MODULE_ASSETS = MODULE_PATH.joinpath("assets") MODULE_ASSETS = MODULE_PATH.joinpath("assets")

View File

@@ -3,27 +3,31 @@
# Copyright (C) 2019 Eric Callahan <arksine.code@gmail.com> # Copyright (C) 2019 Eric Callahan <arksine.code@gmail.com>
# #
# This file may be distributed under the terms of the GNU GPLv3 license. # This file may be distributed under the terms of the GNU GPLv3 license.
import logging
import os import os
import shlex import shlex
import subprocess import subprocess
import logging
class ShellCommand: class ShellCommand:
def __init__(self, config): def __init__(self, config):
self.name = config.get_name().split()[-1] self.name = config.get_name().split()[-1]
self.printer = config.get_printer() self.printer = config.get_printer()
self.gcode = self.printer.lookup_object('gcode') self.gcode = self.printer.lookup_object("gcode")
cmd = config.get('command') cmd = config.get("command")
cmd = os.path.expanduser(cmd) cmd = os.path.expanduser(cmd)
self.command = shlex.split(cmd) self.command = shlex.split(cmd)
self.timeout = config.getfloat('timeout', 2., above=0.) self.timeout = config.getfloat("timeout", 2.0, above=0.0)
self.verbose = config.getboolean('verbose', True) self.verbose = config.getboolean("verbose", True)
self.proc_fd = None self.proc_fd = None
self.partial_output = "" self.partial_output = ""
self.gcode.register_mux_command( self.gcode.register_mux_command(
"RUN_SHELL_COMMAND", "CMD", self.name, "RUN_SHELL_COMMAND",
"CMD",
self.name,
self.cmd_RUN_SHELL_COMMAND, self.cmd_RUN_SHELL_COMMAND,
desc=self.cmd_RUN_SHELL_COMMAND_help) desc=self.cmd_RUN_SHELL_COMMAND_help,
)
def _process_output(self, eventime): def _process_output(self, eventime):
if self.proc_fd is None: if self.proc_fd is None:
@@ -33,11 +37,11 @@ class ShellCommand:
except Exception: except Exception:
pass pass
data = self.partial_output + data.decode() data = self.partial_output + data.decode()
if '\n' not in data: if "\n" not in data:
self.partial_output = data self.partial_output = data
return return
elif data[-1] != '\n': elif data[-1] != "\n":
split = data.rfind('\n') + 1 split = data.rfind("\n") + 1
self.partial_output = data[split:] self.partial_output = data[split:]
data = data[:split] data = data[:split]
else: else:
@@ -45,16 +49,19 @@ class ShellCommand:
self.gcode.respond_info(data) self.gcode.respond_info(data)
cmd_RUN_SHELL_COMMAND_help = "Run a linux shell command" cmd_RUN_SHELL_COMMAND_help = "Run a linux shell command"
def cmd_RUN_SHELL_COMMAND(self, params): def cmd_RUN_SHELL_COMMAND(self, params):
gcode_params = params.get('PARAMS','') gcode_params = params.get("PARAMS", "")
gcode_params = shlex.split(gcode_params) gcode_params = shlex.split(gcode_params)
reactor = self.printer.get_reactor() reactor = self.printer.get_reactor()
try: try:
proc = subprocess.Popen( proc = subprocess.Popen(
self.command + gcode_params, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) self.command + gcode_params,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
except Exception: except Exception:
logging.exception( logging.exception("shell_command: Command {%s} failed" % (self.name))
"shell_command: Command {%s} failed" % (self.name))
raise self.gcode.error("Error running command {%s}" % (self.name)) raise self.gcode.error("Error running command {%s}" % (self.name))
if self.verbose: if self.verbose:
self.proc_fd = proc.stdout.fileno() self.proc_fd = proc.stdout.fileno()
@@ -64,7 +71,7 @@ class ShellCommand:
endtime = eventtime + self.timeout endtime = eventtime + self.timeout
complete = False complete = False
while eventtime < endtime: while eventtime < endtime:
eventtime = reactor.pause(eventtime + .05) eventtime = reactor.pause(eventtime + 0.05)
if proc.poll() is not None: if proc.poll() is not None:
complete = True complete = True
break break

View File

@@ -109,7 +109,7 @@ class GcodeShellCmdExtension(BaseExtension):
bm = BackupManager() bm = BackupManager()
for instance in instances: for instance in instances:
bm.backup_file( bm.backup_file(
[instance.cfg_file], instance.cfg_file,
custom_filename=f"{instance.suffix}.printer.cfg", custom_filename=f"{instance.suffix}.printer.cfg",
) )

View File

@@ -11,8 +11,11 @@
from pathlib import Path from pathlib import Path
from kiauh.core.backup_manager import BACKUP_ROOT_DIR
MODULE_PATH = Path(__file__).resolve().parent MODULE_PATH = Path(__file__).resolve().parent
INVALID_CHOICE = "Invalid choice. Please select a valid value." INVALID_CHOICE = "Invalid choice. Please select a valid value."
PRINTER_CFG_BACKUP_DIR = BACKUP_ROOT_DIR.joinpath("printer-cfg-backups")
# ================== NGINX =====================# # ================== NGINX =====================#
NGINX_SITES_AVAILABLE = Path("/etc/nginx/sites-available") NGINX_SITES_AVAILABLE = Path("/etc/nginx/sites-available")

View File

@@ -13,8 +13,10 @@ from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Dict, Literal, List, Type, Union from typing import Dict, Literal, List, Type, Union
from kiauh.components.klipper.klipper import Klipper
from kiauh.core.instance_manager.base_instance import BaseInstance from kiauh.core.instance_manager.base_instance import BaseInstance
from kiauh.core.instance_manager.instance_manager import InstanceManager from kiauh.core.instance_manager.instance_manager import InstanceManager
from kiauh.utils import PRINTER_CFG_BACKUP_DIR
from kiauh.utils.constants import ( from kiauh.utils.constants import (
COLOR_CYAN, COLOR_CYAN,
RESET_FORMAT, RESET_FORMAT,
@@ -116,3 +118,20 @@ def get_install_status_webui(
return f"{COLOR_RED}Not installed!{RESET_FORMAT}" return f"{COLOR_RED}Not installed!{RESET_FORMAT}"
else: else:
return f"{COLOR_YELLOW}Incomplete!{RESET_FORMAT}" return f"{COLOR_YELLOW}Incomplete!{RESET_FORMAT}"
def backup_printer_config_dir():
# local import to prevent circular import
from kiauh.core.backup_manager.backup_manager import BackupManager
im = InstanceManager(Klipper)
instances: List[Klipper] = im.instances
bm = BackupManager()
for instance in instances:
name = f"config-{instance.data_dir_name}"
bm.backup_directory(
name,
source=instance.cfg_dir,
target=PRINTER_CFG_BACKUP_DIR,
)

View File

@@ -285,7 +285,7 @@ def download_progress(block_num, block_size, total_size) -> None:
mb = 1024 * 1024 mb = 1024 * 1024
progress = int(percent / 5) progress = int(percent / 5)
remaining = "-" * (20 - progress) remaining = "-" * (20 - progress)
dl = f"\rDownloading: [{'#' * progress}{remaining}]{percent:.2f}% ({downloaded/mb:.2f}/{total_size/mb:.2f}MB)" dl = f"\rDownloading: [{'#' * progress}{remaining}]{percent:.2f}% ({downloaded / mb:.2f}/{total_size / mb:.2f}MB)"
sys.stdout.write(dl) sys.stdout.write(dl)
sys.stdout.flush() sys.stdout.flush()