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()