feat: add completion-message to moonraker removal process

Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
dw-0
2024-12-27 15:21:57 +01:00
parent f225ed028d
commit 0c6c8bdabf
6 changed files with 88 additions and 53 deletions

View File

@@ -46,11 +46,14 @@ def run_klipper_removal(
Logger.print_info("No Klipper Services installed! Skipped ...")
if (remove_dir or remove_env) and unit_file_exists("klipper", suffix="service"):
completion_msg.text = [
"Some Klipper services are still installed:",
f"'{KLIPPER_DIR}' was not removed, even though selected for removal.",
f"'{KLIPPER_ENV_DIR}' was not removed, even though selected for removal.",
]
completion_msg.text.extend(
[
"\n\n",
"Some Klipper services are still installed:",
f"'{KLIPPER_DIR}' was not removed.",
f"'{KLIPPER_ENV_DIR}' was not removed.",
]
)
else:
if remove_dir:
Logger.print_status("Removing Klipper local repository ...")

View File

@@ -14,6 +14,7 @@ from typing import Type
from components.klipper import klipper_remove
from core.menus import FooterType, Option
from core.menus.base_menu import BaseMenu
from core.menus.utils.menu_utils import get_checkbox_state
from core.types.color import Color
@@ -47,11 +48,9 @@ class KlipperRemoveMenu(BaseMenu):
}
def print_menu(self) -> None:
checked = f"[{Color.apply('x', Color.CYAN)}]"
unchecked = "[ ]"
o1 = checked if self.remove_klipper_service else unchecked
o2 = checked if self.remove_klipper_dir else unchecked
o3 = checked if self.remove_klipper_env else unchecked
o1 = get_checkbox_state(self.remove_klipper_service)
o2 = get_checkbox_state(self.remove_klipper_dir)
o3 = get_checkbox_state(self.remove_klipper_env)
sel_state = f"{'Select'if not self.select_state else 'Deselect'} everything"
menu = textwrap.dedent(
f"""

View File

@@ -12,8 +12,9 @@ import textwrap
from typing import Type
from components.moonraker import moonraker_remove
from core.menus import Option
from core.menus import FooterType, Option
from core.menus.base_menu import BaseMenu
from core.menus.utils.menu_utils import get_checkbox_state
from core.types.color import Color
@@ -21,14 +22,17 @@ from core.types.color import Color
class MoonrakerRemoveMenu(BaseMenu):
def __init__(self, previous_menu: Type[BaseMenu] | None = None):
super().__init__()
self.title = "Remove Moonraker"
self.title_color = Color.RED
self.previous_menu: Type[BaseMenu] | None = previous_menu
self.footer_type = FooterType.BACK
self.remove_moonraker_service = False
self.remove_moonraker_dir = False
self.remove_moonraker_env = False
self.remove_moonraker_polkit = False
self.selection_state = False
self.select_state = False
def set_previous_menu(self, previous_menu: Type[BaseMenu] | None) -> None:
from core.menus.remove_menu import RemoveMenu
@@ -46,19 +50,18 @@ class MoonrakerRemoveMenu(BaseMenu):
}
def print_menu(self) -> None:
checked = f"[{Color.apply('x', Color.CYAN)}]"
unchecked = "[ ]"
o1 = checked if self.remove_moonraker_service else unchecked
o2 = checked if self.remove_moonraker_dir else unchecked
o3 = checked if self.remove_moonraker_env else unchecked
o4 = checked if self.remove_moonraker_polkit else unchecked
o1 = get_checkbox_state(self.remove_moonraker_service)
o2 = get_checkbox_state(self.remove_moonraker_dir)
o3 = get_checkbox_state(self.remove_moonraker_env)
o4 = get_checkbox_state(self.remove_moonraker_polkit)
sel_state = f"{'Select'if not self.select_state else 'Deselect'} everything"
menu = textwrap.dedent(
f"""
╟───────────────────────────────────────────────────────╢
║ Enter a number and hit enter to select / deselect ║
║ the specific option for removal. ║
╟───────────────────────────────────────────────────────╢
║ a) {self._get_selection_state_str():37}
║ a) {sel_state:49}
╟───────────────────────────────────────────────────────╢
║ 1) {o1} Remove Service ║
║ 2) {o2} Remove Local Repository ║
@@ -72,11 +75,11 @@ class MoonrakerRemoveMenu(BaseMenu):
print(menu, end="")
def toggle_all(self, **kwargs) -> None:
self.selection_state = not self.selection_state
self.remove_moonraker_service = self.selection_state
self.remove_moonraker_dir = self.selection_state
self.remove_moonraker_env = self.selection_state
self.remove_moonraker_polkit = self.selection_state
self.select_state = not self.select_state
self.remove_moonraker_service = self.select_state
self.remove_moonraker_dir = self.select_state
self.remove_moonraker_env = self.select_state
self.remove_moonraker_polkit = self.select_state
def toggle_remove_moonraker_service(self, **kwargs) -> None:
self.remove_moonraker_service = not self.remove_moonraker_service
@@ -97,32 +100,20 @@ class MoonrakerRemoveMenu(BaseMenu):
and not self.remove_moonraker_env
and not self.remove_moonraker_polkit
):
print(
Color.apply(
"Nothing selected! Select options to remove first.", Color.RED
)
)
msg = "Nothing selected! Select options to remove first."
print(Color.apply(msg, Color.RED))
return
moonraker_remove.run_moonraker_removal(
completion_msg = moonraker_remove.run_moonraker_removal(
self.remove_moonraker_service,
self.remove_moonraker_dir,
self.remove_moonraker_env,
self.remove_moonraker_polkit,
)
self.message_service.set_message(completion_msg)
self.remove_moonraker_service = False
self.remove_moonraker_dir = False
self.remove_moonraker_env = False
self.remove_moonraker_polkit = False
self._go_back()
def _get_selection_state_str(self) -> str:
return (
"Select everything" if not self.selection_state else "Deselect everything"
)
def _go_back(self, **kwargs) -> None:
if self.previous_menu is not None:
self.previous_menu().run()
self.select_state = False

View File

@@ -16,6 +16,8 @@ from components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR
from components.moonraker.moonraker import Moonraker
from core.instance_manager.instance_manager import InstanceManager
from core.logger import Logger
from core.services.message_service import Message
from core.types.color import Color
from utils.fs_utils import run_remove_routines
from utils.input_utils import get_selection_input
from utils.instance_utils import get_instances
@@ -27,7 +29,12 @@ def run_moonraker_removal(
remove_dir: bool,
remove_env: bool,
remove_polkit: bool,
) -> None:
) -> Message:
completion_msg = Message(
title="Moonraker Removal Process completed",
color=Color.GREEN,
)
instances = get_instances(Moonraker)
if remove_service:
@@ -35,27 +42,45 @@ def run_moonraker_removal(
if instances:
instances_to_remove = select_instances_to_remove(instances)
remove_instances(instances_to_remove)
instance_names = [i.service_file_path.stem for i in instances_to_remove]
txt = f"● Moonraker instances removed: {', '.join(instance_names)}"
completion_msg.text.append(txt)
else:
Logger.print_info("No Moonraker Services installed! Skipped ...")
delete_remaining: bool = remove_polkit or remove_dir or remove_env
if delete_remaining and unit_file_exists("moonraker", suffix="service"):
Logger.print_info("There are still other Moonraker services installed")
Logger.print_info(
"● Moonraker PolicyKit rules were not removed.", prefix=False
completion_msg.text.extend(
[
"\n\n",
"Some Moonraker services are still installed:",
"● Moonraker PolicyKit rules were not removed.",
f"'{MOONRAKER_DIR}' was not removed.",
f"'{MOONRAKER_ENV_DIR}' was not removed.",
]
)
Logger.print_info(f"'{MOONRAKER_DIR}' was not removed.", prefix=False)
Logger.print_info(f"'{MOONRAKER_ENV_DIR}' was not removed.", prefix=False)
else:
if remove_polkit:
Logger.print_status("Removing all Moonraker policykit rules ...")
remove_polkit_rules()
if remove_polkit_rules():
completion_msg.text.append("● Moonraker PolicyKit rules removed")
if remove_dir:
Logger.print_status("Removing Moonraker local repository ...")
run_remove_routines(MOONRAKER_DIR)
if run_remove_routines(MOONRAKER_DIR):
completion_msg.text.append("● Moonraker local repository removed")
if remove_env:
Logger.print_status("Removing Moonraker Python environment ...")
run_remove_routines(MOONRAKER_ENV_DIR)
if run_remove_routines(MOONRAKER_ENV_DIR):
completion_msg.text.append("● Moonraker Python environment removed")
if completion_msg.text:
completion_msg.text.insert(0, "The following actions were performed:")
else:
completion_msg.color = Color.YELLOW
completion_msg.centered = True
completion_msg.text = ["Nothing to remove."]
return completion_msg
def select_instances_to_remove(
@@ -97,19 +122,23 @@ def remove_instances(
delete_moonraker_env_file(instance)
def remove_polkit_rules() -> None:
def remove_polkit_rules() -> bool:
if not MOONRAKER_DIR.exists():
log = "Cannot remove policykit rules. Moonraker directory not found."
Logger.print_warn(log)
return
return False
try:
cmd = [f"{MOONRAKER_DIR}/scripts/set-policykit-rules.sh", "--clear"]
run(cmd, stderr=PIPE, stdout=DEVNULL, check=True)
result = run(cmd, stderr=PIPE, stdout=DEVNULL, check=True)
if result.returncode != 0:
raise CalledProcessError(result.returncode, cmd)
except CalledProcessError as e:
Logger.print_error(f"Error while removing policykit rules: {e}")
return False
Logger.print_ok("Policykit rules successfully removed!")
return True
def delete_moonraker_env_file(instance: Moonraker):

View File

View File

@@ -0,0 +1,13 @@
# ======================================================================= #
# 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 core.types.color import Color
def get_checkbox_state(checked: bool) -> str:
return f"[{Color.apply('x', Color.CYAN)}]" if checked else "[ ]"