mirror of
https://github.com/dw-0/kiauh.git
synced 2025-12-24 16:23:36 +05:00
Merge branch 'refs/heads/kiauh-v6-dev' into feat/obico-for-v6
This commit is contained in:
@@ -13,7 +13,12 @@ from typing import List
|
|||||||
|
|
||||||
from core.instance_manager.base_instance import BaseInstance
|
from core.instance_manager.base_instance import BaseInstance
|
||||||
from core.menus.base_menu import print_back_footer
|
from core.menus.base_menu import print_back_footer
|
||||||
from utils.constants import COLOR_CYAN, COLOR_GREEN, COLOR_YELLOW, RESET_FORMAT
|
from utils.constants import (
|
||||||
|
COLOR_CYAN,
|
||||||
|
COLOR_GREEN,
|
||||||
|
COLOR_YELLOW,
|
||||||
|
RESET_FORMAT,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
@@ -29,7 +34,7 @@ def print_instance_overview(
|
|||||||
show_index=False,
|
show_index=False,
|
||||||
show_select_all=False,
|
show_select_all=False,
|
||||||
):
|
):
|
||||||
dialog = "/=======================================================\\\n"
|
dialog = "╔═══════════════════════════════════════════════════════╗\n"
|
||||||
if show_headline:
|
if show_headline:
|
||||||
d_type = (
|
d_type = (
|
||||||
"Klipper instances"
|
"Klipper instances"
|
||||||
@@ -37,13 +42,13 @@ def print_instance_overview(
|
|||||||
else "printer directories"
|
else "printer directories"
|
||||||
)
|
)
|
||||||
headline = f"{COLOR_GREEN}The following {d_type} were found:{RESET_FORMAT}"
|
headline = f"{COLOR_GREEN}The following {d_type} were found:{RESET_FORMAT}"
|
||||||
dialog += f"|{headline:^64}|\n"
|
dialog += f"║{headline:^64}║\n"
|
||||||
dialog += "|-------------------------------------------------------|\n"
|
dialog += "╟───────────────────────────────────────────────────────╢\n"
|
||||||
|
|
||||||
if show_select_all:
|
if show_select_all:
|
||||||
select_all = f"{COLOR_YELLOW}a) Select all{RESET_FORMAT}"
|
select_all = f"{COLOR_YELLOW}a) Select all{RESET_FORMAT}"
|
||||||
dialog += f"| {select_all:<63}|\n"
|
dialog += f"║ {select_all:<63}║\n"
|
||||||
dialog += "| |\n"
|
dialog += "║ ║\n"
|
||||||
|
|
||||||
for i, s in enumerate(instances):
|
for i, s in enumerate(instances):
|
||||||
if display_type is DisplayType.SERVICE_NAME:
|
if display_type is DisplayType.SERVICE_NAME:
|
||||||
@@ -51,7 +56,8 @@ def print_instance_overview(
|
|||||||
else:
|
else:
|
||||||
name = s.data_dir
|
name = s.data_dir
|
||||||
line = f"{COLOR_CYAN}{f'{i})' if show_index else '●'} {name}{RESET_FORMAT}"
|
line = f"{COLOR_CYAN}{f'{i})' if show_index else '●'} {name}{RESET_FORMAT}"
|
||||||
dialog += f"| {line:<63}|\n"
|
dialog += f"║ {line:<63}║\n"
|
||||||
|
dialog += "╟───────────────────────────────────────────────────────╢\n"
|
||||||
|
|
||||||
print(dialog, end="")
|
print(dialog, end="")
|
||||||
print_back_footer()
|
print_back_footer()
|
||||||
@@ -62,13 +68,14 @@ def print_select_instance_count_dialog():
|
|||||||
line2 = f"{COLOR_YELLOW}Setting up too many instances may crash your system.{RESET_FORMAT}"
|
line2 = f"{COLOR_YELLOW}Setting up too many instances may crash your system.{RESET_FORMAT}"
|
||||||
dialog = textwrap.dedent(
|
dialog = textwrap.dedent(
|
||||||
f"""
|
f"""
|
||||||
/=======================================================\\
|
╔═══════════════════════════════════════════════════════╗
|
||||||
| Please select the number of Klipper instances to set |
|
║ Please select the number of Klipper instances to set ║
|
||||||
| up. The number of Klipper instances will determine |
|
║ up. The number of Klipper instances will determine ║
|
||||||
| the amount of printers you can run from this host. |
|
║ the amount of printers you can run from this host. ║
|
||||||
| |
|
║ ║
|
||||||
| {line1:<63}|
|
║ {line1:<63}║
|
||||||
| {line2:<63}|
|
║ {line2:<63}║
|
||||||
|
╟───────────────────────────────────────────────────────╢
|
||||||
"""
|
"""
|
||||||
)[1:]
|
)[1:]
|
||||||
|
|
||||||
@@ -81,71 +88,16 @@ def print_select_custom_name_dialog():
|
|||||||
line2 = f"{COLOR_YELLOW}Only alphanumeric characters are allowed!{RESET_FORMAT}"
|
line2 = f"{COLOR_YELLOW}Only alphanumeric characters are allowed!{RESET_FORMAT}"
|
||||||
dialog = textwrap.dedent(
|
dialog = textwrap.dedent(
|
||||||
f"""
|
f"""
|
||||||
/=======================================================\\
|
╔═══════════════════════════════════════════════════════╗
|
||||||
| You can now assign a custom name to each instance. |
|
║ You can now assign a custom name to each instance. ║
|
||||||
| If skipped, each instance will get an index assigned |
|
║ If skipped, each instance will get an index assigned ║
|
||||||
| in ascending order, starting at index '1'. |
|
║ in ascending order, starting at index '1'. ║
|
||||||
| |
|
║ ║
|
||||||
| {line1:<63}|
|
║ {line1:<63}║
|
||||||
| {line2:<63}|
|
║ {line2:<63}║
|
||||||
|
╟───────────────────────────────────────────────────────╢
|
||||||
"""
|
"""
|
||||||
)[1:]
|
)[1:]
|
||||||
|
|
||||||
print(dialog, end="")
|
print(dialog, end="")
|
||||||
print_back_footer()
|
print_back_footer()
|
||||||
|
|
||||||
|
|
||||||
def print_missing_usergroup_dialog(missing_groups) -> None:
|
|
||||||
line1 = f"{COLOR_YELLOW}WARNING: Your current user is not in group:{RESET_FORMAT}"
|
|
||||||
line2 = f"{COLOR_CYAN}● tty{RESET_FORMAT}"
|
|
||||||
line3 = f"{COLOR_CYAN}● dialout{RESET_FORMAT}"
|
|
||||||
line4 = f"{COLOR_YELLOW}INFO:{RESET_FORMAT}"
|
|
||||||
line5 = f"{COLOR_YELLOW}Relog required for group assignments to take effect!{RESET_FORMAT}"
|
|
||||||
|
|
||||||
dialog = textwrap.dedent(
|
|
||||||
f"""
|
|
||||||
/=======================================================\\
|
|
||||||
| {line1:<63}|
|
|
||||||
"""
|
|
||||||
)[1:]
|
|
||||||
|
|
||||||
if "tty" in missing_groups:
|
|
||||||
dialog += f"| {line2:<63}|\n"
|
|
||||||
if "dialout" in missing_groups:
|
|
||||||
dialog += f"| {line3:<63}|\n"
|
|
||||||
|
|
||||||
dialog += textwrap.dedent(
|
|
||||||
f"""
|
|
||||||
| |
|
|
||||||
| It is possible that you won't be able to successfully |
|
|
||||||
| connect and/or flash the controller board without |
|
|
||||||
| your user being a member of that group. |
|
|
||||||
| If you want to add the current user to the group(s) |
|
|
||||||
| listed above, answer with 'Y'. Else skip with 'n'. |
|
|
||||||
| |
|
|
||||||
| {line4:<63}|
|
|
||||||
| {line5:<63}|
|
|
||||||
\\=======================================================/
|
|
||||||
"""
|
|
||||||
)[1:]
|
|
||||||
|
|
||||||
print(dialog, end="")
|
|
||||||
|
|
||||||
|
|
||||||
def print_update_warn_dialog() -> None:
|
|
||||||
line1 = f"{COLOR_YELLOW}WARNING:{RESET_FORMAT}"
|
|
||||||
line2 = f"{COLOR_YELLOW}Do NOT continue if there are ongoing prints running!{RESET_FORMAT}"
|
|
||||||
line3 = f"{COLOR_YELLOW}All Klipper instances will be restarted during the {RESET_FORMAT}"
|
|
||||||
line4 = f"{COLOR_YELLOW}update process and ongoing prints WILL FAIL.{RESET_FORMAT}"
|
|
||||||
dialog = textwrap.dedent(
|
|
||||||
f"""
|
|
||||||
/=======================================================\\
|
|
||||||
| {line1:<63}|
|
|
||||||
| {line2:<63}|
|
|
||||||
| {line3:<63}|
|
|
||||||
| {line4:<63}|
|
|
||||||
\\=======================================================/
|
|
||||||
"""
|
|
||||||
)[1:]
|
|
||||||
|
|
||||||
print(dialog, end="")
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ from components.klipper import (
|
|||||||
KLIPPER_REQUIREMENTS_TXT,
|
KLIPPER_REQUIREMENTS_TXT,
|
||||||
)
|
)
|
||||||
from components.klipper.klipper import Klipper
|
from components.klipper.klipper import Klipper
|
||||||
from components.klipper.klipper_dialogs import print_update_warn_dialog
|
|
||||||
from components.klipper.klipper_utils import (
|
from components.klipper.klipper_utils import (
|
||||||
add_to_existing,
|
add_to_existing,
|
||||||
backup_klipper_dir,
|
backup_klipper_dir,
|
||||||
@@ -39,7 +38,7 @@ from core.settings.kiauh_settings import KiauhSettings
|
|||||||
from utils.common import check_install_dependencies
|
from utils.common import check_install_dependencies
|
||||||
from utils.git_utils import git_clone_wrapper, git_pull_wrapper
|
from utils.git_utils import git_clone_wrapper, git_pull_wrapper
|
||||||
from utils.input_utils import get_confirm
|
from utils.input_utils import get_confirm
|
||||||
from utils.logger import Logger
|
from utils.logger import DialogType, Logger
|
||||||
from utils.sys_utils import (
|
from utils.sys_utils import (
|
||||||
cmd_sysctl_manage,
|
cmd_sysctl_manage,
|
||||||
create_python_venv,
|
create_python_venv,
|
||||||
@@ -139,7 +138,16 @@ def install_klipper_packages(klipper_dir: Path) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def update_klipper() -> None:
|
def update_klipper() -> None:
|
||||||
print_update_warn_dialog()
|
Logger.print_dialog(
|
||||||
|
DialogType.WARNING,
|
||||||
|
[
|
||||||
|
"Do NOT continue if there are ongoing prints running!",
|
||||||
|
"All Klipper instances will be restarted during the update process and "
|
||||||
|
"ongoing prints WILL FAIL.",
|
||||||
|
],
|
||||||
|
end="",
|
||||||
|
)
|
||||||
|
|
||||||
if not get_confirm("Update Klipper now?"):
|
if not get_confirm("Update Klipper now?"):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ from components.klipper import (
|
|||||||
from components.klipper.klipper import Klipper
|
from components.klipper.klipper import Klipper
|
||||||
from components.klipper.klipper_dialogs import (
|
from components.klipper.klipper_dialogs import (
|
||||||
print_instance_overview,
|
print_instance_overview,
|
||||||
print_missing_usergroup_dialog,
|
|
||||||
print_select_custom_name_dialog,
|
print_select_custom_name_dialog,
|
||||||
print_select_instance_count_dialog,
|
print_select_instance_count_dialog,
|
||||||
)
|
)
|
||||||
@@ -201,18 +200,29 @@ def klipper_to_multi_conversion(new_name: str) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def check_user_groups():
|
def check_user_groups():
|
||||||
current_groups = [grp.getgrgid(gid).gr_name for gid in os.getgroups()]
|
user_groups = [grp.getgrgid(gid).gr_name for gid in os.getgroups()]
|
||||||
|
missing_groups = [g for g in user_groups if g == "tty" or g == "dialout"]
|
||||||
missing_groups = []
|
|
||||||
if "tty" not in current_groups:
|
|
||||||
missing_groups.append("tty")
|
|
||||||
if "dialout" not in current_groups:
|
|
||||||
missing_groups.append("dialout")
|
|
||||||
|
|
||||||
if not missing_groups:
|
if not missing_groups:
|
||||||
return
|
return
|
||||||
|
|
||||||
print_missing_usergroup_dialog(missing_groups)
|
Logger.print_dialog(
|
||||||
|
DialogType.ATTENTION,
|
||||||
|
[
|
||||||
|
"Your current user is not in group:",
|
||||||
|
*[f"● {g}" for g in missing_groups],
|
||||||
|
"\n\n",
|
||||||
|
"It is possible that you won't be able to successfully connect and/or "
|
||||||
|
"flash the controller board without your user being a member of that "
|
||||||
|
"group. If you want to add the current user to the group(s) listed above, "
|
||||||
|
"answer with 'Y'. Else skip with 'n'.",
|
||||||
|
"\n\n",
|
||||||
|
"INFO:",
|
||||||
|
"Relog required for group assignments to take effect!",
|
||||||
|
],
|
||||||
|
end="",
|
||||||
|
)
|
||||||
|
|
||||||
if not get_confirm(f"Add user '{CURRENT_USER}' to group(s) now?"):
|
if not get_confirm(f"Add user '{CURRENT_USER}' to group(s) now?"):
|
||||||
log = "Skipped adding user to required groups. You might encounter issues."
|
log = "Skipped adding user to required groups. You might encounter issues."
|
||||||
Logger.warn(log)
|
Logger.warn(log)
|
||||||
|
|||||||
@@ -25,16 +25,16 @@ def print_moonraker_overview(
|
|||||||
headline = f"{COLOR_GREEN}The following instances were found:{RESET_FORMAT}"
|
headline = f"{COLOR_GREEN}The following instances were found:{RESET_FORMAT}"
|
||||||
dialog = textwrap.dedent(
|
dialog = textwrap.dedent(
|
||||||
f"""
|
f"""
|
||||||
/=======================================================\\
|
╔═══════════════════════════════════════════════════════╗
|
||||||
|{headline:^64}|
|
║{headline:^64}║
|
||||||
|-------------------------------------------------------|
|
╟───────────────────────────────────────────────────────╢
|
||||||
"""
|
"""
|
||||||
)[1:]
|
)[1:]
|
||||||
|
|
||||||
if show_select_all:
|
if show_select_all:
|
||||||
select_all = f"{COLOR_YELLOW}a) Select all{RESET_FORMAT}"
|
select_all = f"{COLOR_YELLOW}a) Select all{RESET_FORMAT}"
|
||||||
dialog += f"| {select_all:<63}|\n"
|
dialog += f"║ {select_all:<63}║\n"
|
||||||
dialog += "| |\n"
|
dialog += "║ ║\n"
|
||||||
|
|
||||||
instance_map = {
|
instance_map = {
|
||||||
k.get_service_file_name(): (
|
k.get_service_file_name(): (
|
||||||
@@ -49,18 +49,19 @@ def print_moonraker_overview(
|
|||||||
mr_name = instance_map.get(k)
|
mr_name = instance_map.get(k)
|
||||||
m = f"<-> {mr_name}" if mr_name != "" else ""
|
m = f"<-> {mr_name}" if mr_name != "" else ""
|
||||||
line = f"{COLOR_CYAN}{f'{i})' if show_index else '●'} {k} {m} {RESET_FORMAT}"
|
line = f"{COLOR_CYAN}{f'{i})' if show_index else '●'} {k} {m} {RESET_FORMAT}"
|
||||||
dialog += f"| {line:<63}|\n"
|
dialog += f"║ {line:<63}║\n"
|
||||||
|
|
||||||
warn_l1 = f"{COLOR_YELLOW}PLEASE NOTE: {RESET_FORMAT}"
|
warn_l1 = f"{COLOR_YELLOW}PLEASE NOTE: {RESET_FORMAT}"
|
||||||
warn_l2 = f"{COLOR_YELLOW}If you select an instance with an existing Moonraker{RESET_FORMAT}"
|
warn_l2 = f"{COLOR_YELLOW}If you select an instance with an existing Moonraker{RESET_FORMAT}"
|
||||||
warn_l3 = f"{COLOR_YELLOW}instance, that Moonraker instance will be re-created!{RESET_FORMAT}"
|
warn_l3 = f"{COLOR_YELLOW}instance, that Moonraker instance will be re-created!{RESET_FORMAT}"
|
||||||
warning = textwrap.dedent(
|
warning = textwrap.dedent(
|
||||||
f"""
|
f"""
|
||||||
| |
|
║ ║
|
||||||
|-------------------------------------------------------|
|
╟───────────────────────────────────────────────────────╢
|
||||||
| {warn_l1:<63}|
|
║ {warn_l1:<63}║
|
||||||
| {warn_l2:<63}|
|
║ {warn_l2:<63}║
|
||||||
| {warn_l3:<63}|
|
║ {warn_l3:<63}║
|
||||||
|
╟───────────────────────────────────────────────────────╢
|
||||||
"""
|
"""
|
||||||
)[1:]
|
)[1:]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user