From bd1aa1ae2bd7ee24de77a1d464f832545eaef104 Mon Sep 17 00:00:00 2001 From: dw-0 Date: Sun, 3 Mar 2024 11:04:06 +0100 Subject: [PATCH] refactor(klipper): add existing client configs to example config upon creation Signed-off-by: Dominik Willner --- kiauh/components/klipper/klipper_setup.py | 7 +++- kiauh/components/klipper/klipper_utils.py | 15 ++++++-- .../client_config/client_config_setup.py | 34 +++++++++++++------ kiauh/components/webui_client/client_setup.py | 4 +-- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/kiauh/components/klipper/klipper_setup.py b/kiauh/components/klipper/klipper_setup.py index e9761e9..e417c38 100644 --- a/kiauh/components/klipper/klipper_setup.py +++ b/kiauh/components/klipper/klipper_setup.py @@ -11,6 +11,9 @@ from pathlib import Path +from components.webui_client.client_config.client_config_setup import ( + get_existing_client_config, +) from kiauh import KIAUH_CFG from components.klipper import ( EXIT_KLIPPER_SETUP, @@ -180,5 +183,7 @@ def create_klipper_instance(name: str, create_example_cfg: bool) -> None: kl_im.create_instance() kl_im.enable_instance() if create_example_cfg: - create_example_printer_cfg(new_instance) + # if a client-config is installed, include it in the new example cfg + client_configs = get_existing_client_config() + create_example_printer_cfg(new_instance, client_configs) kl_im.start_instance() diff --git a/kiauh/components/klipper/klipper_utils.py b/kiauh/components/klipper/klipper_utils.py index e2ff73a..dfc749b 100644 --- a/kiauh/components/klipper/klipper_utils.py +++ b/kiauh/components/klipper/klipper_utils.py @@ -16,7 +16,7 @@ import shutil import subprocess import textwrap from pathlib import Path -from typing import List, Union, Literal, Dict +from typing import List, Union, Literal, Dict, Optional from components.klipper import ( MODULE_PATH, @@ -33,6 +33,7 @@ from components.klipper.klipper_dialogs import ( ) from components.moonraker.moonraker import Moonraker from components.moonraker.moonraker_utils import moonraker_to_multi_conversion +from components.webui_client import ClientData from core.backup_manager.backup_manager import BackupManager from core.config_manager.config_manager import ConfigManager from core.instance_manager.base_instance import BaseInstance @@ -261,7 +262,9 @@ def get_highest_index(instance_list: List[Klipper]) -> int: return max(indices) -def create_example_printer_cfg(instance: Klipper) -> None: +def create_example_printer_cfg( + instance: Klipper, client_configs: Optional[List[ClientData]] = None +) -> None: Logger.print_status(f"Creating example printer.cfg in '{instance.cfg_dir}'") if instance.cfg_file.is_file(): Logger.print_info(f"'{instance.cfg_file}' already exists.") @@ -277,7 +280,15 @@ def create_example_printer_cfg(instance: Klipper) -> None: cm = ConfigManager(target) cm.set_value("virtual_sdcard", "path", str(instance.gcodes_dir)) + + # include existing client configs in the example config + if client_configs is not None and len(client_configs) > 0: + for c in client_configs: + section = c.get("client_config").get("printer_cfg_section") + cm.config.add_section(section=section) + cm.write_config() + Logger.print_ok(f"Example printer.cfg created in '{instance.cfg_dir}'") diff --git a/kiauh/components/webui_client/client_config/client_config_setup.py b/kiauh/components/webui_client/client_config/client_config_setup.py index d893198..5f8b17a 100644 --- a/kiauh/components/webui_client/client_config/client_config_setup.py +++ b/kiauh/components/webui_client/client_config/client_config_setup.py @@ -12,7 +12,7 @@ import shutil import subprocess from pathlib import Path -from typing import List, get_args +from typing import List, get_args, Union, Set from kiauh import KIAUH_CFG from components.klipper.klipper import Klipper @@ -40,7 +40,7 @@ def install_client_config(client_name: ClientName) -> None: client_config: ClientConfigData = client.get("client_config") d_name = client_config.get("display_name") - if check_existing_client_config_install(client_name): + if config_for_other_client_exist(client_name): Logger.print_info("Another Client-Config is already installed! Skipped ...") return @@ -80,19 +80,31 @@ def install_client_config(client_name: ClientName) -> None: Logger.print_ok(f"{d_name} installation complete!", start="\n") -def check_existing_client_config_install(client_name: ClientName) -> bool: - # check if any other client-configs are present - # as they can conflict each other, or are at least - # redundant to have, so we skip the installation - client_list = list(get_args(ClientName)) - client_list.remove(client_name) - for c in client_list: +def config_for_other_client_exist(client_to_ignore: ClientName) -> bool: + """ + Check if any other client configs are present on the system. + It is usually not harmful, but chances are they can conflict each other. + Multiple client configs are, at least, redundant to have them installed + :param client_to_ignore: The client name to ignore for the check + :return: True, if other client configs were found, else False + """ + + clients = set([c["name"] for c in get_existing_client_config()]) + clients = clients - {client_to_ignore} + + return True if len(clients) > 0 else False + + +def get_existing_client_config() -> List[ClientData]: + clients = list(get_args(ClientName)) + installed_client_configs: List[ClientData] = [] + for c in clients: c_data: ClientData = load_client_data(c) c_config_data: ClientConfigData = c_data.get("client_config") if c_config_data.get("dir").exists(): - return True + installed_client_configs.append(c_data) - return False + return installed_client_configs def download_client_config(client_config: ClientConfigData) -> None: diff --git a/kiauh/components/webui_client/client_setup.py b/kiauh/components/webui_client/client_setup.py index e2a4ae3..84762ca 100644 --- a/kiauh/components/webui_client/client_setup.py +++ b/kiauh/components/webui_client/client_setup.py @@ -21,7 +21,7 @@ from components.webui_client import ( from components.moonraker.moonraker import Moonraker from components.webui_client.client_config.client_config_setup import ( install_client_config, - check_existing_client_config_install, + config_for_other_client_exist, ) from components.webui_client.client_dialogs import ( print_moonraker_not_found_dialog, @@ -100,7 +100,7 @@ def install_client(client_name: ClientName) -> None: if ( kl_instances and not client_config.get("dir").exists() - and not check_existing_client_config_install(client.get("name")) + and not config_for_other_client_exist(client_to_ignore=client.get("name")) ): print_install_client_config_dialog(client) question = f"Download the recommended {client_config.get('display_name')}?"