diff --git a/kiauh/components/klipper/klipper_setup.py b/kiauh/components/klipper/klipper_setup.py index 24db40b..e515dce 100644 --- a/kiauh/components/klipper/klipper_setup.py +++ b/kiauh/components/klipper/klipper_setup.py @@ -154,8 +154,8 @@ def setup_klipper_prerequesites() -> None: # install klipper dependencies and create python virtualenv try: install_klipper_packages() - create_python_venv(KLIPPER_ENV_DIR) - install_python_requirements(KLIPPER_ENV_DIR, KLIPPER_REQ_FILE) + if create_python_venv(KLIPPER_ENV_DIR): + install_python_requirements(KLIPPER_ENV_DIR, KLIPPER_REQ_FILE) except Exception: Logger.print_error("Error during installation of Klipper requirements!") raise diff --git a/kiauh/components/moonraker/moonraker_setup.py b/kiauh/components/moonraker/moonraker_setup.py index 1824d34..9485d06 100644 --- a/kiauh/components/moonraker/moonraker_setup.py +++ b/kiauh/components/moonraker/moonraker_setup.py @@ -150,9 +150,9 @@ def setup_moonraker_prerequesites() -> None: # install moonraker dependencies and create python virtualenv install_moonraker_packages() - create_python_venv(MOONRAKER_ENV_DIR) - install_python_requirements(MOONRAKER_ENV_DIR, MOONRAKER_REQ_FILE) - install_python_requirements(MOONRAKER_ENV_DIR, MOONRAKER_SPEEDUPS_REQ_FILE) + if create_python_venv(MOONRAKER_ENV_DIR): + install_python_requirements(MOONRAKER_ENV_DIR, MOONRAKER_REQ_FILE) + install_python_requirements(MOONRAKER_ENV_DIR, MOONRAKER_SPEEDUPS_REQ_FILE) def install_moonraker_packages() -> None: diff --git a/kiauh/extensions/obico/__init__.py b/kiauh/extensions/obico/__init__.py index 85d304a..a7e8031 100644 --- a/kiauh/extensions/obico/__init__.py +++ b/kiauh/extensions/obico/__init__.py @@ -31,3 +31,4 @@ OBICO_ENV_DIR = Path.home().joinpath("moonraker-obico-env") OBICO_SERVICE_TEMPLATE = MODULE_PATH.joinpath(f"assets/{OBICO_SERVICE_NAME}") OBICO_ENV_FILE_TEMPLATE = MODULE_PATH.joinpath(f"assets/{OBICO_ENV_FILE_NAME}") OBICO_LINK_SCRIPT = OBICO_DIR.joinpath("scripts/link.sh") +OBICO_REQ_FILE = OBICO_DIR.joinpath("requirements.txt") diff --git a/kiauh/extensions/obico/moonraker_obico_extension.py b/kiauh/extensions/obico/moonraker_obico_extension.py index 9399a97..121a4e4 100644 --- a/kiauh/extensions/obico/moonraker_obico_extension.py +++ b/kiauh/extensions/obico/moonraker_obico_extension.py @@ -23,6 +23,7 @@ from extensions.obico import ( OBICO_ENV_DIR, OBICO_MACROS_CFG_NAME, OBICO_REPO, + OBICO_REQ_FILE, OBICO_UPDATE_CFG_NAME, OBICO_UPDATE_CFG_SAMPLE_NAME, ) @@ -239,9 +240,8 @@ class ObicoExtension(BaseExtension): check_install_dependencies({*package_list}) # create virtualenv - create_python_venv(OBICO_ENV_DIR) - requirements = OBICO_DIR.joinpath("requirements.txt") - install_python_requirements(OBICO_ENV_DIR, requirements) + if create_python_venv(OBICO_ENV_DIR): + install_python_requirements(OBICO_ENV_DIR, OBICO_REQ_FILE) def _create_obico_macros_cfg(self, moonraker) -> None: macros_cfg = OBICO_DIR.joinpath(f"include_cfgs/{OBICO_MACROS_CFG_NAME}") diff --git a/kiauh/extensions/telegram_bot/__init__.py b/kiauh/extensions/telegram_bot/__init__.py index 4dd030f..2b43fc6 100644 --- a/kiauh/extensions/telegram_bot/__init__.py +++ b/kiauh/extensions/telegram_bot/__init__.py @@ -26,3 +26,4 @@ TG_BOT_ENV = Path.home().joinpath("moonraker-telegram-bot-env") # files TG_BOT_SERVICE_TEMPLATE = MODULE_PATH.joinpath(f"assets/{TG_BOT_SERVICE_NAME}") TG_BOT_ENV_FILE_TEMPLATE = MODULE_PATH.joinpath(f"assets/{TG_BOT_ENV_FILE_NAME}") +TG_BOT_REQ_FILE = TG_BOT_DIR.joinpath("scripts/requirements.txt") diff --git a/kiauh/extensions/telegram_bot/moonraker_telegram_bot_extension.py b/kiauh/extensions/telegram_bot/moonraker_telegram_bot_extension.py index 7690229..c85042b 100644 --- a/kiauh/extensions/telegram_bot/moonraker_telegram_bot_extension.py +++ b/kiauh/extensions/telegram_bot/moonraker_telegram_bot_extension.py @@ -14,7 +14,7 @@ from components.moonraker.moonraker import Moonraker from core.instance_manager.instance_manager import InstanceManager from core.logger import DialogType, Logger from extensions.base_extension import BaseExtension -from extensions.telegram_bot import TG_BOT_REPO +from extensions.telegram_bot import TG_BOT_REPO, TG_BOT_REQ_FILE from extensions.telegram_bot.moonraker_telegram_bot import ( TG_BOT_DIR, TG_BOT_ENV, @@ -161,9 +161,8 @@ class TelegramBotExtension(BaseExtension): check_install_dependencies({*package_list}) # create virtualenv - create_python_venv(TG_BOT_ENV) - requirements = TG_BOT_DIR.joinpath("scripts/requirements.txt") - install_python_requirements(TG_BOT_ENV, requirements) + if create_python_venv(TG_BOT_ENV): + install_python_requirements(TG_BOT_ENV, TG_BOT_REQ_FILE) def _patch_bot_update_manager(self, instances: List[Moonraker]) -> None: env_py = f"{TG_BOT_ENV}/bin/python" diff --git a/kiauh/utils/sys_utils.py b/kiauh/utils/sys_utils.py index 9db103d..61c48cb 100644 --- a/kiauh/utils/sys_utils.py +++ b/kiauh/utils/sys_utils.py @@ -87,11 +87,13 @@ def parse_packages_from_file(source_file: Path) -> List[str]: return packages -def create_python_venv(target: Path) -> None: +def create_python_venv(target: Path) -> bool: """ - Create a python 3 virtualenv at the provided target destination | + Create a python 3 virtualenv at the provided target destination. + Returns True if the virtualenv was created successfully. + Returns False if the virtualenv already exists, recreation was declined or creation failed. :param target: Path where to create the virtualenv at - :return: None + :return: bool """ Logger.print_status("Set up Python virtual environment ...") if not target.exists(): @@ -99,20 +101,25 @@ def create_python_venv(target: Path) -> None: cmd = ["virtualenv", "-p", "/usr/bin/python3", target.as_posix()] run(cmd, check=True) Logger.print_ok("Setup of virtualenv successful!") + return True except CalledProcessError as e: Logger.print_error(f"Error setting up virtualenv:\n{e}") - raise + return False else: - if get_confirm("Virtualenv already exists. Re-create?", default_choice=False): - try: - shutil.rmtree(target) - create_python_venv(target) - except OSError as e: - log = f"Error removing existing virtualenv: {e.strerror}" - Logger.print_error(log, False) - raise - else: + if not get_confirm( + "Virtualenv already exists. Re-create?", default_choice=False + ): Logger.print_info("Skipping re-creation of virtualenv ...") + return False + + try: + shutil.rmtree(target) + create_python_venv(target) + return True + except OSError as e: + log = f"Error removing existing virtualenv: {e.strerror}" + Logger.print_error(log, False) + return False def update_python_pip(target: Path) -> None: