From be228210bd8837a8afbc84aa4ba03e4e64b66d77 Mon Sep 17 00:00:00 2001 From: dw-0 Date: Wed, 1 May 2024 21:33:12 +0200 Subject: [PATCH] refactor: use utils to handle service actions Signed-off-by: Dominik Willner --- .../components/webui_client/client_remove.py | 2 +- .../core/instance_manager/instance_manager.py | 41 +++---------------- kiauh/utils/filesystem_utils.py | 35 ++++++++-------- kiauh/utils/system_utils.py | 13 +++--- 4 files changed, 29 insertions(+), 62 deletions(-) diff --git a/kiauh/components/webui_client/client_remove.py b/kiauh/components/webui_client/client_remove.py index 745954c..b6350f0 100644 --- a/kiauh/components/webui_client/client_remove.py +++ b/kiauh/components/webui_client/client_remove.py @@ -49,7 +49,7 @@ def run_client_removal( client_name = client.name remove_client_dir(client) remove_nginx_config(client_name) - remove_nginx_logs(client_name) + remove_nginx_logs(client_name, kl_instances) section = f"update_manager {client_name}" remove_config_section(section, mr_instances) diff --git a/kiauh/core/instance_manager/instance_manager.py b/kiauh/core/instance_manager/instance_manager.py index 0879484..02df91f 100644 --- a/kiauh/core/instance_manager/instance_manager.py +++ b/kiauh/core/instance_manager/instance_manager.py @@ -15,6 +15,7 @@ from typing import List, Optional, Union, TypeVar from core.instance_manager.base_instance import BaseInstance from utils.constants import SYSTEMD from utils.logger import Logger +from utils.system_utils import control_systemd_service T = TypeVar(name="T", bound=BaseInstance, covariant=True) @@ -108,14 +109,7 @@ class InstanceManager: def enable_instance(self) -> None: Logger.print_status(f"Enabling {self.instance_service_full} ...") try: - command = [ - "sudo", - "systemctl", - "enable", - self.instance_service_full, - ] - if subprocess.run(command, check=True): - Logger.print_ok(f"{self.instance_service_full} enabled.") + control_systemd_service(self.instance_service_full, "enable") except subprocess.CalledProcessError as e: Logger.print_error(f"Error enabling service {self.instance_service_full}:") Logger.print_error(f"{e}") @@ -123,14 +117,7 @@ class InstanceManager: def disable_instance(self) -> None: Logger.print_status(f"Disabling {self.instance_service_full} ...") try: - command = [ - "sudo", - "systemctl", - "disable", - self.instance_service_full, - ] - if subprocess.run(command, check=True): - Logger.print_ok(f"{self.instance_service_full} disabled.") + control_systemd_service(self.instance_service_full, "disable") except subprocess.CalledProcessError as e: Logger.print_error(f"Error disabling {self.instance_service_full}:") Logger.print_error(f"{e}") @@ -138,14 +125,7 @@ class InstanceManager: def start_instance(self) -> None: Logger.print_status(f"Starting {self.instance_service_full} ...") try: - command = [ - "sudo", - "systemctl", - "start", - self.instance_service_full, - ] - if subprocess.run(command, check=True): - Logger.print_ok(f"{self.instance_service_full} started.") + control_systemd_service(self.instance_service_full, "start") except subprocess.CalledProcessError as e: Logger.print_error(f"Error starting {self.instance_service_full}:") Logger.print_error(f"{e}") @@ -153,14 +133,7 @@ class InstanceManager: def restart_instance(self) -> None: Logger.print_status(f"Restarting {self.instance_service_full} ...") try: - command = [ - "sudo", - "systemctl", - "restart", - self.instance_service_full, - ] - if subprocess.run(command, check=True): - Logger.print_ok(f"{self.instance_service_full} restarted.") + control_systemd_service(self.instance_service_full, "restart") except subprocess.CalledProcessError as e: Logger.print_error(f"Error restarting {self.instance_service_full}:") Logger.print_error(f"{e}") @@ -178,9 +151,7 @@ class InstanceManager: def stop_instance(self) -> None: Logger.print_status(f"Stopping {self.instance_service_full} ...") try: - command = ["sudo", "systemctl", "stop", self.instance_service_full] - if subprocess.run(command, check=True): - Logger.print_ok(f"{self.instance_service_full} stopped.") + control_systemd_service(self.instance_service_full, "stop") except subprocess.CalledProcessError as e: Logger.print_error(f"Error stopping {self.instance_service_full}:") Logger.print_error(f"{e}") diff --git a/kiauh/utils/filesystem_utils.py b/kiauh/utils/filesystem_utils.py index dbf5b51..e4ad4e8 100644 --- a/kiauh/utils/filesystem_utils.py +++ b/kiauh/utils/filesystem_utils.py @@ -11,14 +11,13 @@ import re import shutil -import subprocess from pathlib import Path from zipfile import ZipFile +from subprocess import run, check_output, CalledProcessError, PIPE, DEVNULL from typing import List from components.klipper.klipper import Klipper -from core.instance_manager.instance_manager import InstanceManager from utils import ( NGINX_SITES_AVAILABLE, MODULE_PATH, @@ -38,9 +37,9 @@ def check_file_exist(file_path: Path, sudo=False) -> bool: if sudo: try: command = ["sudo", "find", file_path] - subprocess.check_output(command, stderr=subprocess.DEVNULL) + check_output(command, stderr=DEVNULL) return True - except subprocess.CalledProcessError: + except CalledProcessError: return False else: if file_path.exists(): @@ -54,8 +53,8 @@ def create_symlink(source: Path, target: Path, sudo=False) -> None: cmd = ["ln", "-sf", source, target] if sudo: cmd.insert(0, "sudo") - subprocess.run(cmd, stderr=subprocess.PIPE, check=True) - except subprocess.CalledProcessError as e: + run(cmd, stderr=PIPE, check=True) + except CalledProcessError as e: Logger.print_error(f"Failed to create symlink: {e}") raise @@ -63,8 +62,8 @@ def create_symlink(source: Path, target: Path, sudo=False) -> None: def remove_file(file_path: Path, sudo=False) -> None: try: cmd = f"{'sudo ' if sudo else ''}rm -f {file_path}" - subprocess.run(cmd, stderr=subprocess.PIPE, check=True, shell=True) - except subprocess.CalledProcessError as e: + run(cmd, stderr=PIPE, check=True, shell=True) + except CalledProcessError as e: log = f"Cannot remove file {file_path}: {e.stderr.decode()}" Logger.print_error(log) raise @@ -90,8 +89,8 @@ def copy_upstream_nginx_cfg() -> None: target = NGINX_CONFD.joinpath("upstreams.conf") try: command = ["sudo", "cp", source, target] - subprocess.run(command, stderr=subprocess.PIPE, check=True) - except subprocess.CalledProcessError as e: + run(command, stderr=PIPE, check=True) + except CalledProcessError as e: log = f"Unable to create upstreams.conf: {e.stderr.decode()}" Logger.print_error(log) raise @@ -106,8 +105,8 @@ def copy_common_vars_nginx_cfg() -> None: target = NGINX_CONFD.joinpath("common_vars.conf") try: command = ["sudo", "cp", source, target] - subprocess.run(command, stderr=subprocess.PIPE, check=True) - except subprocess.CalledProcessError as e: + run(command, stderr=PIPE, check=True) + except CalledProcessError as e: log = f"Unable to create upstreams.conf: {e.stderr.decode()}" Logger.print_error(log) raise @@ -135,8 +134,8 @@ def create_nginx_cfg(name: str, port: int, root_dir: Path) -> None: target = NGINX_SITES_AVAILABLE.joinpath(name) try: command = ["sudo", "mv", tmp, target] - subprocess.run(command, stderr=subprocess.PIPE, check=True) - except subprocess.CalledProcessError as e: + run(command, stderr=PIPE, check=True) + except CalledProcessError as e: log = f"Unable to create '{target}': {e.stderr.decode()}" Logger.print_error(log) raise @@ -182,19 +181,17 @@ def remove_nginx_config(name: str) -> None: remove_file(NGINX_SITES_AVAILABLE.joinpath(name), True) remove_file(NGINX_SITES_ENABLED.joinpath(name), True) - except subprocess.CalledProcessError as e: + except CalledProcessError as e: log = f"Unable to remove NGINX config '{name}':\n{e.stderr.decode()}" Logger.print_error(log) -def remove_nginx_logs(name: str) -> None: +def remove_nginx_logs(name: str, instances: List[Klipper]) -> None: Logger.print_status(f"Removing NGINX logs for {name.capitalize()} ...") try: remove_file(Path(f"/var/log/nginx/{name}-access.log"), True) remove_file(Path(f"/var/log/nginx/{name}-error.log"), True) - im = InstanceManager(Klipper) - instances: List[Klipper] = im.instances if not instances: return @@ -202,5 +199,5 @@ def remove_nginx_logs(name: str) -> None: remove_file(instance.log_dir.joinpath(f"{name}-access.log")) remove_file(instance.log_dir.joinpath(f"{name}-error.log")) - except (OSError, subprocess.CalledProcessError) as e: + except (OSError, CalledProcessError) as e: Logger.print_error(f"Unable to remove NGINX logs:\n{e}") diff --git a/kiauh/utils/system_utils.py b/kiauh/utils/system_utils.py index bdd3527..3ebdf0d 100644 --- a/kiauh/utils/system_utils.py +++ b/kiauh/utils/system_utils.py @@ -21,9 +21,9 @@ from typing import List, Literal import select +from utils.filesystem_utils import check_file_exist from utils.input_utils import get_confirm from utils.logger import Logger -from utils.filesystem_utils import check_file_exist def kill(opt_err_msg: str = "") -> None: @@ -240,8 +240,7 @@ def mask_system_service(service_name: str) -> None: :return: None """ try: - command = ["sudo", "systemctl", "mask", service_name] - run(command, stderr=PIPE, check=True) + control_systemd_service(service_name, "mask") except CalledProcessError as e: log = f"Unable to mask system service {service_name}: {e.stderr.decode()}" Logger.print_error(log) @@ -330,7 +329,7 @@ def set_nginx_permissions() -> None: def control_systemd_service( - name: str, action: Literal["start", "stop", "restart", "disable"] + name: str, action: Literal["start", "stop", "restart", "enable", "disable", "mask"] ) -> None: """ Helper method to execute several actions for a specific systemd service. | @@ -339,12 +338,12 @@ def control_systemd_service( :return: None """ try: - Logger.print_status(f"{action.capitalize()} {name}.service ...") - command = ["sudo", "systemctl", action, f"{name}.service"] + Logger.print_status(f"{action.capitalize()} {name} ...") + command = ["sudo", "systemctl", action, name] run(command, stderr=PIPE, check=True) Logger.print_ok("OK!") except CalledProcessError as e: - log = f"Failed to {action} {name}.service: {e.stderr.decode()}" + log = f"Failed to {action} {name}: {e.stderr.decode()}" Logger.print_error(log) raise