diff --git a/usr/bin/archlinux-kernel-manager b/usr/bin/archlinux-kernel-manager index a62670d..3cfe365 100755 --- a/usr/bin/archlinux-kernel-manager +++ b/usr/bin/archlinux-kernel-manager @@ -72,9 +72,9 @@ case "$SESSION" in start_in_tty ;; *) - # anything here is an unknown session, most likely AKM will fail to load + # anything here is an unknown session, fallback to XDG_SESSION_TYPE echo "[INFO]: Display = $DISPLAY" - echo "[INFO]: Session could not be verified ... falling back to use XDG_SESSION_TYPE" + echo "[WARN]: Session could not be verified, using XDG_SESSION_TYPE" case "$XDG_SESSION_TYPE" in "wayland") diff --git a/usr/share/archlinux-kernel-manager/akm.css b/usr/share/archlinux-kernel-manager/akm.css index 69088b2..2f67a4b 100644 --- a/usr/share/archlinux-kernel-manager/akm.css +++ b/usr/share/archlinux-kernel-manager/akm.css @@ -57,7 +57,7 @@ box#vbox_header{ } box#hbox_warning{ - background-color: #4c8bf5; + background-color: #004085; color: white; font-family: 'Noto Sans', 'Helvetica', sans-serif; padding: 5px 5px 5px 5px; @@ -72,7 +72,7 @@ label#label_notify_revealer{ label#label_active_kernel { font-family: 'Noto Sans', 'Helvetica', sans-serif; - font-size: 11px; + font-size: 12px; } label#label_stack_kernel { diff --git a/usr/share/archlinux-kernel-manager/archlinux-kernel-manager.py b/usr/share/archlinux-kernel-manager/archlinux-kernel-manager.py index 88e2c83..9c2bf28 100755 --- a/usr/share/archlinux-kernel-manager/archlinux-kernel-manager.py +++ b/usr/share/archlinux-kernel-manager/archlinux-kernel-manager.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 import os - import gi import signal import libs.functions as fn @@ -18,8 +17,9 @@ app_name = "Arch Linux Kernel Manager" app_version = "${app_version}" app_name_dir = "archlinux-kernel-manager" app_id = "com.arcolinux.kernelmanager" -lock_file = "/tmp/akm.lock" -pid_file = "/tmp/akm.pid" +lock_file = "/tmp/.akm.lock" +progress_lock_file = "/tmp/.akm-progress.lock" +pid_file = "/tmp/.akm.pid" class Main(Gtk.Application): @@ -61,6 +61,8 @@ class Main(Gtk.Application): os.remove(lock_file) if os.path.exists(pid_file): os.remove(pid_file) + if os.path.exists(progress_lock_file): + os.remove(progress_lock_file) def signal_handler(sig, frame): diff --git a/usr/share/archlinux-kernel-manager/libs/Kernel.py b/usr/share/archlinux-kernel-manager/libs/Kernel.py index 2109b9b..69a1bcd 100644 --- a/usr/share/archlinux-kernel-manager/libs/Kernel.py +++ b/usr/share/archlinux-kernel-manager/libs/Kernel.py @@ -1,4 +1,4 @@ -# Store kernel data taken from +# Store kernel data from ALA, pacman sync db import datetime from datetime import datetime diff --git a/usr/share/archlinux-kernel-manager/libs/functions.py b/usr/share/archlinux-kernel-manager/libs/functions.py index d3ed11a..b8a8e87 100644 --- a/usr/share/archlinux-kernel-manager/libs/functions.py +++ b/usr/share/archlinux-kernel-manager/libs/functions.py @@ -14,6 +14,7 @@ import datetime import psutil import queue import pathlib +import locale import tomlkit from tomlkit import dumps, load from datetime import timedelta @@ -26,17 +27,17 @@ from libs.Kernel import Kernel, InstalledKernel, CommunityKernel gi.require_version("Gtk", "4.0") from gi.repository import GLib - base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) latest_archlinux_package_search_url = ( "https://archlinux.org/packages/search/json?name=${PACKAGE_NAME}" ) archlinux_mirror_archive_url = "https://archive.archlinux.org" -headers = {"Content-Type": "text/plain;charset=UTF-8"} +headers = { + "Content-Type": "text/plain;charset=UTF-8", + "User-Agent": "Mozilla/5.0 (Linux x86_64) Gecko Firefox", +} -dist_id = distro.id() -dist_name = distro.name() cache_days = 5 fetched_kernels_dict = {} @@ -102,6 +103,11 @@ ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch) +# set locale +locale.setlocale(locale.LC_ALL, "C.utf8") +locale_env = os.environ +locale_env["LC_ALL"] = "C.utf8" + # ===================================================== # CHECK FOR KERNEL UPDATES @@ -274,12 +280,17 @@ def permissions(dst): shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=locale_env, ) for x in groups.stdout.decode().split(" "): if "gid" in x: g = x.split("(")[1] group = g.replace(")", "").strip() - subprocess.call(["chown", "-R", sudo_username + ":" + group, dst], shell=False) + subprocess.call( + ["chown", "-R", sudo_username + ":" + group, dst], + shell=False, + env=locale_env, + ) except Exception as e: logger.error("Exception in permissions(): %s" % e) @@ -422,6 +433,7 @@ def install_archive_kernel(self): stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -592,23 +604,23 @@ def read_cache(self): # any kernels older than 2 years # (currently linux v4.x or earlier) are deemed eol so ignore them - # if ( - # datetime.datetime.now().year - # - datetime.datetime.strptime( - # k["last_modified"], "%d-%b-%Y %H:%M" - # ).year - # <= 2 - # ): - cached_kernels_list.append( - Kernel( - k["name"], - k["headers"], - k["version"], - k["size"], - k["last_modified"], - k["file_format"], + if ( + datetime.datetime.now().year + - datetime.datetime.strptime( + k["last_modified"], "%d-%b-%Y %H:%M" + ).year + <= 2 + ): + cached_kernels_list.append( + Kernel( + k["name"], + k["headers"], + k["version"], + k["size"], + k["last_modified"], + k["file_format"], + ) ) - ) name = None headers = None @@ -634,25 +646,30 @@ def read_cache(self): # get latest versions of the official kernels def get_latest_versions(self): + logger.info("Getting latest kernel information") + kernel_versions = {} try: - kernel_versions = {} + for kernel in supported_kernels_dict: check_cmd_str = ["pacman", "-Si", kernel] - process_kernel_query = subprocess.Popen( + with subprocess.Popen( check_cmd_str, - shell=False, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - out, err = process_kernel_query.communicate(timeout=process_timeout) - - if process_kernel_query.returncode == 0: - for line in out.decode("utf-8").splitlines(): - if line.startswith("Version :"): - kernel_versions[kernel] = line.split("Version :")[1] + stderr=subprocess.STDOUT, + bufsize=1, + universal_newlines=True, + env=locale_env, + ) as process: + while True: + if process.poll() is not None: break + for line in process.stdout: + if line.strip().replace(" ", "").startswith("Version:"): + kernel_versions[kernel] = ( + line.strip().replace(" ", "").split("Version:")[1] + ) + break self.kernel_versions_queue.put(kernel_versions) @@ -721,7 +738,6 @@ def parse_archive_html(response, linux_kernel): def wait_for_response(response_queue): while True: - # time.sleep(0.1) items = response_queue.get() # error break from loop @@ -782,15 +798,11 @@ def get_official_kernels(self): for kernel in response_content: parse_archive_html(response_content[kernel], kernel) - if len(fetched_kernels_dict) > 0: # and self.refresh_cache is True: + if len(fetched_kernels_dict) > 0: write_cache() read_cache(self) self.queue_kernels.put(cached_kernels_list) - # elif self.refresh_cache is False: - # logger.info("Cache already processed") - # read_cache(self) - # self.queue_kernels.put(cached_kernels_list) else: logger.error("Failed to retrieve Linux Kernel list") @@ -887,18 +899,22 @@ def check_kernel_installed(name): check_cmd_str = ["pacman", "-Q", name] logger.debug("Running cmd = %s" % check_cmd_str) process_kernel_query = subprocess.Popen( - check_cmd_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE + check_cmd_str, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=locale_env, ) out, err = process_kernel_query.communicate(timeout=process_timeout) - logger.debug(out.decode("utf-8")) - if process_kernel_query.returncode == 0: for line in out.decode("utf-8").splitlines(): if line.split(" ")[0] == name: + # logger.debug("Kernel installed") return True else: + # logger.debug("Kernel is not installed") return False return False @@ -971,6 +987,7 @@ def uninstall(self): stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -1069,6 +1086,7 @@ def get_community_kernels(self): shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=locale_env, ) out, err = process_kernel_query.communicate(timeout=process_timeout) version = None @@ -1139,6 +1157,7 @@ def install_community_kernel(self): stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -1159,8 +1178,6 @@ def install_community_kernel(self): error = True if check_kernel_installed(self.kernel.name) and error is False: - logger.info("Kernel = installed") - self.kernel_state_queue.put((0, "install", self.kernel.name)) event = "%s [INFO]: Installation of %s completed\n" % ( @@ -1171,8 +1188,6 @@ def install_community_kernel(self): self.messages_queue.put(event) else: - logger.error("Kernel = install failed") - self.kernel_state_queue.put((1, "install", self.kernel.name)) event = "%s [ERROR]: Installation of %s failed\n" % ( @@ -1213,6 +1228,7 @@ def get_pacman_repos(): stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -1233,8 +1249,13 @@ def get_installed_kernel_info(package_name): query_str = ["pacman", "-Qi", package_name] try: + process_kernel_query = subprocess.Popen( - query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE + query_str, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=locale_env, ) out, err = process_kernel_query.communicate(timeout=process_timeout) install_size = None @@ -1264,36 +1285,41 @@ def get_installed_kernels(): installed_kernels = [] try: - process_kernel_query = subprocess.Popen( - query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) + with subprocess.Popen( + query_str, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + env=locale_env, + ) as process: + while True: + if process.poll() is not None: + break + for line in process.stdout: + if line.lower().strip().startswith("linux"): + package_name = line.split(" ")[0].strip() + package_version = line.split(" ")[1].strip() - out, err = process_kernel_query.communicate(timeout=process_timeout) - if process_kernel_query.returncode == 0: - for line in out.decode("utf-8").splitlines(): - if line.lower().strip().startswith("linux"): - package_name = line.split(" ")[0] - package_version = line.split(" ")[1] + if ( + package_name in supported_kernels_dict + or package_name in community_kernels_dict + ): + install_size, install_date = get_installed_kernel_info( + package_name + ) + installed_kernel = InstalledKernel( + package_name, + package_version, + install_date, + install_size, + ) - if ( - package_name in supported_kernels_dict - or package_name in community_kernels_dict - ): - install_size, install_date = get_installed_kernel_info( - package_name - ) - installed_kernel = InstalledKernel( - package_name, - package_version, - install_date, - install_size, - ) - - installed_kernels.append(installed_kernel) - - return installed_kernels + installed_kernels.append(installed_kernel) except Exception as e: logger.error("Exception in get_installed_kernels(): %s" % e) + finally: + return installed_kernels # ====================================================================== @@ -1307,7 +1333,11 @@ def get_active_kernel(): try: process_kernel_query = subprocess.Popen( - query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE + query_str, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=locale_env, ) out, err = process_kernel_query.communicate(timeout=process_timeout) @@ -1339,6 +1369,7 @@ def sync_package_db(): stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=process_timeout, + env=locale_env, ) if process_sync.returncode == 0: @@ -1367,6 +1398,7 @@ def get_boot_loader(): timeout=process_timeout, universal_newlines=True, bufsize=1, + env=locale_env, ) if process.returncode == 0: @@ -1376,9 +1408,14 @@ def get_boot_loader(): if "grub" in product.lower(): logger.info("bootctl product reports booted with grub") return "grub" - if "systemd-boot" in product.lower(): - logger.info("bootcl product reports booted with systemd-boot") + elif "systemd-boot" in product.lower(): + logger.info("bootctl product reports booted with systemd-boot") return "systemd-boot" + else: + # "n/a" in product + logger.info("bootctl product reports n/a, using default grub") + return "grub" + elif line.strip().startswith("Not booted with EFI"): # noqa # bios logger.info( @@ -1411,6 +1448,7 @@ def get_kernel_version(kernel): timeout=process_timeout, universal_newlines=True, bufsize=1, + env=locale_env, ) if process.returncode == 0: @@ -1440,14 +1478,20 @@ def get_kernel_version(kernel): def run_process(self): error = False - + self.stdout_lines = [] logger.debug("Running process = %s" % " ".join(self.cmd)) + event = "%s [INFO]: Running %s\n" % ( + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"), + " ".join(self.cmd), + ) + self.messages_queue.put(event) with subprocess.Popen( self.cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -1458,9 +1502,8 @@ def run_process(self): print(line.strip()) for log in self.stdout_lines: - if "error" in log or "errors" in log: + if "error" in log or "errors" in log or "failed" in log: self.errors_found = True - error = True if error is True: @@ -1485,29 +1528,49 @@ def run_process(self): # grub - grub-mkconfig /boot/grub/grub.cfg # systemd-boot - bootctl update def update_bootloader(self): + logger.info("Updating bootloader") cmds = [] error = False self.stdout_lines = [] if self.action == "install": image = "images/48x48/akm-install.png" - if self.installed_kernel_version is not None: - for self.cmd in [ - ["kernel-install", "add-all"], - ["kernel-install", "remove", self.installed_kernel_version], + # ["kernel-install", "add-all", "--verbose"], + [ + "kernel-install", + "add", + self.installed_kernel_version, + "/lib/modules/%s/vmlinuz" % self.installed_kernel_version, + ], + [ + "kernel-install", + "remove", + self.installed_kernel_version, + ], ]: run_process(self) else: - self.cmd = ["kernel-install", "add-all"] + # self.cmd = ["kernel-install", "add-all", "--verbose"]. + self.installed_kernel_version = get_kernel_version(self.kernel.name) + self.cmd = [ + "kernel-install", + "add", + self.installed_kernel_version, + "/lib/modules/%s/vmlinuz" % self.installed_kernel_version, + ] run_process(self) else: image = "images/48x48/akm-remove.png" if self.installed_kernel_version is not None: - self.cmd = ["kernel-install", "remove", self.installed_kernel_version] + self.cmd = [ + "kernel-install", + "remove", + self.installed_kernel_version, + ] run_process(self) try: @@ -1559,6 +1622,7 @@ def update_bootloader(self): stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True, + env=locale_env, ) as process: while True: if process.poll() is not None: @@ -1661,10 +1725,14 @@ def update_bootloader(self): image, priority=GLib.PRIORITY_DEFAULT, ) + if os.path.exists(self.lockfile): + os.unlink(self.lockfile) # else: # logger.error("Bootloader update cannot continue, failed to set command.") except Exception as e: logger.error("Exception in update_bootloader(): %s" % e) + if os.path.exists(self.lockfile): + os.unlink(self.lockfile) # ====================================================================== diff --git a/usr/share/archlinux-kernel-manager/ui/FlowBox.py b/usr/share/archlinux-kernel-manager/ui/FlowBox.py index 6051e7c..142cd5b 100644 --- a/usr/share/archlinux-kernel-manager/ui/FlowBox.py +++ b/usr/share/archlinux-kernel-manager/ui/FlowBox.py @@ -54,7 +54,6 @@ class FlowBox(Gtk.FlowBox): def flowbox_community(self): for community_kernel in self.kernel: self.kernels.append(community_kernel) - self.kernel_count += 1 if len(self.kernels) > 0: diff --git a/usr/share/archlinux-kernel-manager/ui/KernelStack.py b/usr/share/archlinux-kernel-manager/ui/KernelStack.py index 6760403..765792a 100644 --- a/usr/share/archlinux-kernel-manager/ui/KernelStack.py +++ b/usr/share/archlinux-kernel-manager/ui/KernelStack.py @@ -135,7 +135,7 @@ class KernelStack: label_active_installed_kernel.set_selectable(True) label_active_installed_kernel.set_markup( - "Active kernel: %s" % self.manager_gui.active_kernel + "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_installed_kernel.set_halign(Gtk.Align.START) self.manager_gui.vbox_active_installed_kernel.append( @@ -235,7 +235,7 @@ class KernelStack: label_active_kernel.set_name("label_active_kernel") label_active_kernel.set_selectable(True) label_active_kernel.set_markup( - "Active kernel: %s" % self.manager_gui.active_kernel + "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_kernel.set_halign(Gtk.Align.START) @@ -250,7 +250,7 @@ class KernelStack: self.flowbox_stacks.append(self.flowbox_official_kernel) - vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) + vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) vbox_flowbox.set_name("vbox_flowbox_%s" % kernel) # vbox_flowbox.set_halign(align=Gtk.Align.FILL) vbox_flowbox.append(self.flowbox_official_kernel) @@ -424,7 +424,7 @@ class KernelStack: label_active_kernel.set_name("label_active_kernel") label_active_kernel.set_selectable(True) label_active_kernel.set_markup( - "Active kernel: %s" % self.manager_gui.active_kernel + "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_kernel.set_halign(Gtk.Align.START) @@ -464,10 +464,18 @@ class KernelStack: label_warning = Gtk.Label(xalign=0, yalign=0) label_warning.set_name("label_community_warning") - label_warning.set_markup( - f"These are user produced content\n" - f"Any use of the provided files is at your own risk" - ) + + if len(self.manager_gui.community_kernels) == 0: + label_warning.set_markup( + f"Cannot find any supported unofficial pacman repository's\n" + f"Add the Chaotic-AUR pacman repository to access Community based kernels" + ) + else: + label_warning.set_markup( + f"These kernels are user produced content\n" + f"These kernels may not work on your hardware\n" + f"Any use of the provided files is at your own risk" + ) hbox_warning.append(label_warning) @@ -477,6 +485,21 @@ class KernelStack: if stack_child is not None: for stack_widget in stack_child: + if stack_widget.get_name() == "hbox_warning": + for w in stack_widget: + if w.get_name() == "label_community_warning": + if len(self.manager_gui.community_kernels) == 0: + w.set_markup( + f"Cannot find any supported unofficial pacman repository's\n" + f"Add the Chaotic-AUR pacman repository to access Community based kernels" + ) + else: + w.set_markup( + f"These kernels are user produced content\n" + f"These kernels may not work on your hardware\n" + f"Any use of the provided files is at your own risk" + ) + break if stack_widget.get_name() == "label_stack_count": stack_widget.set_markup( "%s Available kernels" @@ -495,37 +518,33 @@ class KernelStack: vbox_flowbox = scrolled_window_community.get_child().get_child() for widget in vbox_flowbox: - if widget.get_name() != "vbox_no_community": - widget.remove_all() - else: - if len(self.manager_gui.community_kernels) > 0: - # widget.hide() - for box_widget in widget: - box_widget.hide() + widget.remove_all() - vbox_search_entry = Gtk.Box( - orientation=Gtk.Orientation.VERTICAL, spacing=5 - ) + # scrolled_window_community.hide() - vbox_search_entry.append(search_entry_community) - # widget.append(hbox_warning) - widget.append(vbox_search_entry) + # vbox_search_entry = Gtk.Box( + # orientation=Gtk.Orientation.VERTICAL, spacing=5 + # ) + # + # vbox_search_entry.append(search_entry_community) + # widget.append(vbox_search_entry) - self.flowbox_community = FlowBox( - self.manager_gui.community_kernels, - self.manager_gui.active_kernel, - self.manager_gui, - "community", - ) - vbox_flowbox.append(self.flowbox_community) + if len(self.manager_gui.community_kernels) > 0: + self.flowbox_community = FlowBox( + self.manager_gui.community_kernels, + self.manager_gui.active_kernel, + self.manager_gui, + "community", + ) + vbox_flowbox.append(self.flowbox_community) - while self.manager_gui.default_context.pending(): - # fn.time.sleep(0.1) - self.manager_gui.default_context.iteration(True) + # while self.manager_gui.default_context.pending(): + # # fn.time.sleep(0.1) + # self.manager_gui.default_context.iteration(True) else: self.flowbox_community = None - vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) + vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) # vbox_flowbox.set_halign(align=Gtk.Align.FILL) if len(self.manager_gui.community_kernels) == 0: @@ -619,6 +638,7 @@ class KernelStack: if vbox_search_entry is not None: vbox_kernels.append(vbox_search_entry) + vbox_kernels.append(hbox_sep_kernels) scrolled_window_community.set_child(vbox_flowbox) diff --git a/usr/share/archlinux-kernel-manager/ui/ManagerGUI.py b/usr/share/archlinux-kernel-manager/ui/ManagerGUI.py index a8120d5..4a2857e 100644 --- a/usr/share/archlinux-kernel-manager/ui/ManagerGUI.py +++ b/usr/share/archlinux-kernel-manager/ui/ManagerGUI.py @@ -29,6 +29,7 @@ class ManagerGUI(Gtk.ApplicationWindow): self.app_version = "dev" fn.logger.info("Version = %s" % self.app_version) + fn.logger.info("Distro = %s" % fn.distro.id()) self.set_title(app_name) self.set_resizable(True) @@ -47,6 +48,20 @@ class ManagerGUI(Gtk.ApplicationWindow): # community kernels queue for threading self.queue_community_kernels = fn.Queue() + self.splash_screen = SplashScreen(app_name) + + while self.default_context.pending(): + fn.time.sleep(0.1) + self.default_context.iteration(True) + + try: + fn.Thread( + target=self.wait_for_gui_load, + daemon=True, + ).start() + except Exception as e: + fn.logger.error(e) + hbox_notify_revealer = Gtk.Box( orientation=Gtk.Orientation.HORIZONTAL, spacing=20 ) @@ -62,19 +77,9 @@ class ManagerGUI(Gtk.ApplicationWindow): hbox_notify_revealer.append(self.label_notify_revealer) - self.splash_screen = SplashScreen(app_name) - - try: - fn.Thread( - target=self.wait_for_gui_load, - daemon=True, - ).start() - except Exception as e: - fn.logger.error(e) - - while self.default_context.pending(): - fn.time.sleep(0.1) - self.default_context.iteration(True) + # while self.default_context.pending(): + # fn.time.sleep(0.1) + # self.default_context.iteration(True) self.bootloader = None self.bootloader_grub_cfg = None @@ -276,30 +281,6 @@ class ManagerGUI(Gtk.ApplicationWindow): self.official_kernels = self.queue_kernels.get() self.queue_kernels.task_done() - fn.logger.info("Starting pacman db synchronization thread") - self.queue_load_progress.put("Starting pacman db synchronization") - - self.pacman_db_sync() - - fn.logger.info("Starting get community kernels thread") - self.queue_load_progress.put("Getting community based Linux kernels") - - try: - thread_get_community_kernels = fn.Thread( - name=fn.thread_get_community_kernels, - target=fn.get_community_kernels, - daemon=True, - args=(self,), - ) - - thread_get_community_kernels.start() - - except Exception as e: - fn.logger.error("Exception in thread_get_community_kernels: %s" % e) - finally: - self.community_kernels = self.queue_community_kernels.get() - self.queue_community_kernels.task_done() - # ===================================================== # PACMAN DB SYNC # ===================================================== @@ -339,8 +320,9 @@ class ManagerGUI(Gtk.ApplicationWindow): # keep splash screen open, until main gui is loaded def wait_for_gui_load(self): while True: - fn.time.sleep(0.2) + # fn.time.sleep(0.2) status = self.queue_load_progress.get() + if status == 1: GLib.idle_add( self.splash_screen.destroy, @@ -385,6 +367,26 @@ class ManagerGUI(Gtk.ApplicationWindow): self.start_get_kernels_threads() + self.pacman_db_sync() + + fn.logger.debug("Adding community kernels to UI") + + try: + thread_get_community_kernels = fn.Thread( + name=fn.thread_get_community_kernels, + target=fn.get_community_kernels, + daemon=True, + args=(self,), + ) + + thread_get_community_kernels.start() + + except Exception as e: + fn.logger.error("Exception in thread_get_community_kernels: %s" % e) + finally: + self.community_kernels = self.queue_community_kernels.get() + self.queue_community_kernels.task_done() + self.installed_kernels = fn.get_installed_kernels() self.label_notify_revealer.set_text("Refreshing official kernels") @@ -499,10 +501,37 @@ class ManagerGUI(Gtk.ApplicationWindow): # add official kernel flowbox fn.logger.debug("Adding official kernels to UI") + self.kernel_stack.add_official_kernels_to_stack(reload=False) + # fn.logger.debug("Adding community kernels to UI") + # self.kernel_stack.add_community_kernels_to_stack(reload=False) + + self.queue_load_progress.put(1) + + fn.logger.info("Starting pacman db synchronization") + + self.pacman_db_sync() + fn.logger.debug("Adding community kernels to UI") - self.kernel_stack.add_community_kernels_to_stack(reload=False) + + try: + thread_get_community_kernels = fn.Thread( + name=fn.thread_get_community_kernels, + target=fn.get_community_kernels, + daemon=True, + args=(self,), + ) + + thread_get_community_kernels.start() + + except Exception as e: + fn.logger.error("Exception in thread_get_community_kernels: %s" % e) + finally: + self.community_kernels = self.queue_community_kernels.get() + self.queue_community_kernels.task_done() + fn.logger.debug("Adding community kernels to UI") + self.kernel_stack.add_community_kernels_to_stack(reload=False) fn.logger.debug("Adding installed kernels to UI") self.kernel_stack.add_installed_kernels_to_stack(reload=False) @@ -510,7 +539,4 @@ class ManagerGUI(Gtk.ApplicationWindow): while self.default_context.pending(): self.default_context.iteration(True) - fn.time.sleep(0.3) - - self.queue_load_progress.put(1) - fn.logger.info("Kernel manager UI loaded") + fn.time.sleep(0.1) diff --git a/usr/share/archlinux-kernel-manager/ui/ProgressWindow.py b/usr/share/archlinux-kernel-manager/ui/ProgressWindow.py index 6a75fbb..188a820 100644 --- a/usr/share/archlinux-kernel-manager/ui/ProgressWindow.py +++ b/usr/share/archlinux-kernel-manager/ui/ProgressWindow.py @@ -1,3 +1,4 @@ +import random import sys import gi import os @@ -26,7 +27,7 @@ class ProgressWindow(Gtk.Window): self.set_title(title=title) self.set_modal(modal=True) self.set_resizable(True) - self.set_size_request(700, 400) + self.set_size_request(700, 300) self.connect("close-request", self.on_close) self.textview = textview @@ -34,9 +35,19 @@ class ProgressWindow(Gtk.Window): self.kernel_state_queue = fn.Queue() self.messages_queue = fn.Queue() + + # create temp file to lock the close button + self.lockfile = "/tmp/.akm-progress.lock" + if os.path.exists(self.lockfile): + os.unlink(self.lockfile) + + with open(self.lockfile, "w") as f: + f.write("") + self.kernel = kernel self.timeout_id = None self.errors_found = False + self.restore_kernel = None self.action = action self.switch = switch @@ -164,10 +175,10 @@ class ProgressWindow(Gtk.Window): ) self.hbox_spinner = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.hbox_spinner.append(self.label_spinner_progress) self.hbox_spinner.append(self.spinner) + self.hbox_spinner.append(self.label_spinner_progress) - vbox_padding = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20) + vbox_padding = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) vbox_padding.set_valign(Gtk.Align.END) label_padding = Gtk.Label(xalign=0, yalign=0) @@ -220,7 +231,7 @@ class ProgressWindow(Gtk.Window): vbox_progress.append(self.scrolled_window) vbox_progress.append(self.hbox_spinner) vbox_progress.append(self.label_status) - vbox_progress.append(vbox_padding) + # vbox_progress.append(vbox_padding) vbox_progress.append(hbox_button_close) self.present() @@ -401,7 +412,7 @@ class ProgressWindow(Gtk.Window): self.timeout_id = GLib.timeout_add(3000, self.timeout) def on_button_close_response(self, widget): - if fn.check_pacman_process(self): + if fn.check_pacman_process(self) or os.path.exists(self.lockfile): mw = MessageWindow( title="Pacman process running", message="Pacman is busy processing a transaction .. please wait", @@ -415,7 +426,7 @@ class ProgressWindow(Gtk.Window): self.destroy() def on_close(self, data): - if fn.check_pacman_process(self): + if fn.check_pacman_process(self) or os.path.exists(self.lockfile): mw = MessageWindow( title="Pacman process running", message="Pacman is busy processing a transaction .. please wait", @@ -468,18 +479,22 @@ class ProgressWindow(Gtk.Window): # undo action here if action == install - event = ( - "%s [INFO]: Attempting to undo previous Linux package changes\n" - % ( - fn.datetime.datetime.now().strftime( - "%Y-%m-%d-%H-%M-%S" - ), + if ( + action == "install" + and self.restore_kernel is not None + and self.source == "official" + ): + event = ( + "%s [INFO]: Attempting to undo previous Linux package changes\n" + % ( + fn.datetime.datetime.now().strftime( + "%Y-%m-%d-%H-%M-%S" + ), + ) ) - ) - self.messages_queue.put(event) + self.messages_queue.put(event) - if action == "install" and self.restore_kernel is not None: self.restore = True fn.logger.info( "Installation failed, attempting removal of previous Linux package changes" @@ -523,14 +538,19 @@ class ProgressWindow(Gtk.Window): f"Kernel %s failed - see logs above\n" % action ) + else: - # self.spinner.set_spinning(False) - # self.hbox_spinner.hide() - # - # self.label_progress_window_desc.set_markup( - # f"This window can be now closed\n" - # f"A reboot is recommended when Linux packages have changed" - # ) + self.spinner.set_spinning(False) + self.hbox_spinner.hide() + + self.set_title("Kernel installation failed") + self.label_title.set_markup("Install failed") + + # + # self.label_progress_window_desc.set_markup( + # f"This window can be now closed\n" + # f"A reboot is recommended when Linux packages have changed" + # ) # break else: @@ -597,6 +617,8 @@ class ProgressWindow(Gtk.Window): break except Exception as e: fn.logger.error("Exception in check_kernel_state(): %s" % e) + if os.path.exists(self.lockfile): + os.unlink(self.lockfile) finally: self.kernel_state_queue.task_done() diff --git a/usr/share/archlinux-kernel-manager/ui/SettingsWindow.py b/usr/share/archlinux-kernel-manager/ui/SettingsWindow.py index f5b827e..048cf2f 100644 --- a/usr/share/archlinux-kernel-manager/ui/SettingsWindow.py +++ b/usr/share/archlinux-kernel-manager/ui/SettingsWindow.py @@ -180,8 +180,6 @@ class SettingsWindow(Gtk.Window): vbox_community_warning = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=10 ) - vbox_community_warning.set_name("box") - image_warning = Gtk.Image.new_from_file( os.path.join(base_dir, "images/48x48/akm-warning.png") ) @@ -190,14 +188,15 @@ class SettingsWindow(Gtk.Window): image_warning.set_halign(Gtk.Align.START) hbox_warning = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - hbox_warning.set_name("box") + hbox_warning.set_name("hbox_warning") hbox_warning.append(image_warning) label_pacman_no_community = Gtk.Label(xalign=0, yalign=0) + label_pacman_no_community.set_name("label_community_warning") label_pacman_no_community.set_markup( f"Cannot find any supported unofficial pacman repository's\n" - f"Add unofficial pacman repository's to use community based kernels" + f"Add the Chaotic-AUR pacman repository to access Community based kernels" ) hbox_warning.append(label_pacman_no_community) @@ -459,7 +458,7 @@ class SettingsWindow(Gtk.Window): while True: self.kernel_versions = self.kernel_versions_queue.get() - if self.kernel_versions is not None: + if self.kernel_versions is not None and len(self.kernel_versions) > 0: break self.kernel_versions_queue.task_done()