This commit is contained in:
arcolinuxz 2024-07-02 08:38:31 +02:00
parent 92433c3100
commit 14531bc829
11 changed files with 806 additions and 569 deletions

View file

@ -25,7 +25,7 @@ These kernels are considerably out of date and have shown to fail to install pro
## What happens if a kernel installation fails
The application will show a message that it has encountered an issue, and the log inside the progress window, should have the information required to understand why.
In the event of a failure, the application will try to reinstall the kernel using the version previously installed.
In the event of a failure, the application will attempt to reinstall the kernel using the version previously installed.
# Community based kernels
@ -64,10 +64,6 @@ By default, the application will use `bootctl` to distinguish which bootloader (
`grub-mkconfig` is run to update the grub.cfg file.
## systemd-boot
`bootctl --no-variables ---graceful update` is run to update systemd-boot entries
# Advanced settings
## Bootloader settings
@ -118,12 +114,16 @@ community = [
{ name = "linux-nitrous", description = "Modified Linux kernel optimized for Skylake and newer, compiled using clang", headers = "linux-nitrous-headers", repository = "chaotic-aur" },
]
[logging]
# Logging is either info or debug
loglevel = "info"
# custom bootloader example
#[bootloader]
#name = "grub"
#grub_config = "/boot/grub/grub.cfg"
```
## Adding new community based kernels
Further Kernels can be added using the same format.
@ -140,6 +140,11 @@ Using the Update switch inside Advanced Settings, will force the application to
This cache file may take a little while to generate since archived Arch kernel package data is being retrieved from the ALA.
Once the cache file is in place, the application also queries the RESTful API using https://archlinux.org/packages/search/json to search for package updates.
It extracts the `last_update` and compares it against the cache timestamp.
That way the application will include the latest kernel versions.
# Logs
Logs can be found inside `/var/log/archlinux-kernel-manager`

View file

@ -75,6 +75,11 @@ label#label_active_kernel {
font-size: 12px;
}
label#label_flowbox_message{
padding: 10px 10px 10px 10px;
font-size: medium;
}
label#label_stack_kernel {
font-size: 20px;
font-weight: 600;

View file

@ -25,6 +25,10 @@ community = [
{ name = "linux-nitrous", description = "Modified Linux kernel optimized for Skylake and newer, compiled using clang", headers = "linux-nitrous-headers", repository = "chaotic-aur" },
]
[logging]
# Logging is either info or debug
loglevel = "info"
# Custom bootloader example
# Only systemd-boot or grub are valid names
# When using grub also set grub_config

View file

@ -25,7 +25,7 @@ class Kernel:
.date()
)
if datetime_value_other > datetime_value_self:
if datetime_value_other >= datetime_value_self:
return datetime_value_other

File diff suppressed because it is too large Load diff

View file

@ -273,6 +273,8 @@ class FlowBox(Gtk.FlowBox):
)
message = None
title = None
downgrade = False
community_repo = False
if fn.check_pacman_lockfile() is False:
# switch widget is currently toggled off
@ -284,38 +286,65 @@ class FlowBox(Gtk.FlowBox):
inst_kernel.version
> kernel.version.split("%s-" % inst_kernel.name)[1]
):
downgrade = True
title = "Downgrading %s kernel" % kernel.name
else:
downgrade = False
title = "Upgrading %s kernel" % kernel.name
break
if title is None:
title = "Kernel install"
title = "Kernel installation"
if self.source == "community":
message = "This will install <b>%s-%s</b> - Is this ok ?" % (
message = (
"<span foreground='orange'><b>Community kernel selected - this may break your system</b></span>\n"
"Confirm the install of <b>%s-%s</b>"
% (
kernel.name,
kernel.version,
)
)
# check if the community pacman repo is configured
if fn.check_pacman_repo(kernel.repository) is True:
community_repo = True
else:
community_repo = False
fn.logger.error(
"%s pacman repo is not configured" % kernel.repository
)
elif self.source == "official":
message = "Confirm the install of <b>%s-%s</b>" % (
kernel.name,
kernel.version,
)
elif self.source == "official":
message = (
"This will install <b>%s</b> - Is this ok ?" % kernel.version
)
message_window = FlowBoxMessageWindow(
title=title,
message=message,
action="install",
kernel=kernel,
transient_for=self.manager_gui,
textview=self.manager_gui.textview,
textbuffer=self.manager_gui.textbuffer,
switch=switch,
source=self.source,
manager_gui=self.manager_gui,
)
message_window.present()
if community_repo is False and self.source == "community":
mw = MessageWindow(
title="Cannot find %s pacman repo" % kernel.repository,
message="Enable the pacman repository then retry the installation",
transient_for=self.manager_gui,
detailed_message=False,
)
mw.present()
else:
message_window = FlowBoxMessageWindow(
title=title,
message=message,
action="install",
kernel=kernel,
transient_for=self.manager_gui,
textview=self.manager_gui.textview,
textbuffer=self.manager_gui.textbuffer,
switch=switch,
source=self.source,
manager_gui=self.manager_gui,
downgrade=downgrade,
)
message_window.present()
return True
# switch widget is currently toggled on
@ -327,17 +356,18 @@ class FlowBox(Gtk.FlowBox):
if len(installed_kernels) > 1:
if self.source == "community":
message = "This will remove <b>%s-%s</b> - Is this ok ?" % (
message = "Confirm the removal of <b>%s-%s</b>" % (
kernel.name,
kernel.version,
)
elif self.source == "official":
message = (
"This will remove <b>%s</b> - Is this ok ?" % kernel.version
message = "Confirm the removal of <b>%s-%s</b>" % (
kernel.name,
kernel.version,
)
message_window = FlowBoxMessageWindow(
title="Kernel uninstall",
title="Kernel uninstallation",
message=message,
action="uninstall",
kernel=kernel,
@ -347,6 +377,7 @@ class FlowBox(Gtk.FlowBox):
switch=switch,
source=self.source,
manager_gui=self.manager_gui,
downgrade=downgrade,
)
message_window.present()
return True
@ -361,7 +392,6 @@ class FlowBox(Gtk.FlowBox):
title="Warning: Uninstall aborted",
message=f"You only have 1 kernel installed\n"
f"<b>{kernel.name} {kernel.version}</b> is currently active\n",
image_path="images/48x48/akm-remove.png",
transient_for=self.manager_gui,
detailed_message=False,
)
@ -378,7 +408,6 @@ class FlowBox(Gtk.FlowBox):
message="Pacman lockfile found, which indicates another pacman process is running",
transient_for=self.manager_gui,
detailed_message=False,
image_path="images/48x48/akm-warning.png",
)
msg_win.present()
return True
@ -496,6 +525,7 @@ class FlowBoxInstalled(Gtk.FlowBox):
switch=None,
source=None,
manager_gui=self.manager_gui,
downgrade=None,
)
message_window.present()
else:
@ -507,7 +537,6 @@ class FlowBoxInstalled(Gtk.FlowBox):
title="Warning: Uninstall aborted",
message=f"You only have 1 kernel installed\n"
f"<b>{installed_kernel.name} {installed_kernel.version}</b>\n",
image_path="images/48x48/akm-remove.png",
transient_for=self.manager_gui,
detailed_message=False,
)
@ -526,6 +555,7 @@ class FlowBoxMessageWindow(Gtk.Window):
switch,
source,
manager_gui,
downgrade,
**kwargs,
):
super().__init__(**kwargs)
@ -552,6 +582,7 @@ class FlowBoxMessageWindow(Gtk.Window):
self.action = action
self.switch = switch
self.source = source
self.downgrade = downgrade
vbox_flowbox_message = Gtk.Box.new(
orientation=Gtk.Orientation.VERTICAL, spacing=10

View file

@ -465,7 +465,10 @@ class KernelStack:
label_warning = Gtk.Label(xalign=0, yalign=0)
label_warning.set_name("label_community_warning")
if len(self.manager_gui.community_kernels) == 0:
if (
self.manager_gui.community_kernels is not None
and len(self.manager_gui.community_kernels) == 0
):
label_warning.set_markup(
f"<b>Cannot find any supported unofficial pacman repository's</b>\n"
f"<b>Add the Chaotic-AUR pacman repository to access Community based kernels</b>"
@ -529,7 +532,10 @@ class KernelStack:
# vbox_search_entry.append(search_entry_community)
# widget.append(vbox_search_entry)
if len(self.manager_gui.community_kernels) > 0:
if (
self.manager_gui.community_kernels is not None
and len(self.manager_gui.community_kernels) > 0
):
self.flowbox_community = FlowBox(
self.manager_gui.community_kernels,
self.manager_gui.active_kernel,

View file

@ -28,9 +28,6 @@ class ManagerGUI(Gtk.ApplicationWindow):
if self.app_version == "${app_version}":
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)
self.set_default_size(950, 650)
@ -50,10 +47,6 @@ class ManagerGUI(Gtk.ApplicationWindow):
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,
@ -62,6 +55,10 @@ class ManagerGUI(Gtk.ApplicationWindow):
except Exception as e:
fn.logger.error(e)
while self.default_context.pending():
fn.time.sleep(0.1)
self.default_context.iteration(True)
hbox_notify_revealer = Gtk.Box(
orientation=Gtk.Orientation.HORIZONTAL, spacing=20
)
@ -88,6 +85,9 @@ class ManagerGUI(Gtk.ApplicationWindow):
config_data = fn.setup_config(self)
fn.logger.info("Version = %s" % self.app_version)
fn.logger.info("Distro = %s" % fn.distro.id())
if "bootloader" in config_data.keys():
if config_data["bootloader"]["name"] is not None:
self.bootloader = config_data["bootloader"]["name"].lower()
@ -185,11 +185,11 @@ class ManagerGUI(Gtk.ApplicationWindow):
self.vbox.append(self.notify_revealer)
self.installed_kernels = fn.get_installed_kernels()
if self.installed_kernels is not None:
fn.logger.info("Installed kernels = %s" % len(self.installed_kernels))
self.active_kernel = fn.get_active_kernel()
fn.logger.info("Installed kernels = %s" % len(self.installed_kernels))
self.refresh_cache = False
self.refresh_cache = fn.get_latest_kernel_updates(self)
@ -207,7 +207,6 @@ class ManagerGUI(Gtk.ApplicationWindow):
message=f"The specified Grub config file: {self.bootloader_grub_cfg} does not exist\n"
f"This will cause an issue when updating the bootloader\n"
f"Update the configuration file/use the Advanced Settings to change this\n",
image_path="images/48x48/akm-error.png",
detailed_message=False,
transient_for=self,
)
@ -222,7 +221,6 @@ class ManagerGUI(Gtk.ApplicationWindow):
message=f"Cannot select systemd-boot, UEFI boot mode is not available\n"
f"Update the configuration file\n"
f"Or use the Advanced Settings to change this\n",
image_path="images/48x48/akm-warning.png",
detailed_message=False,
transient_for=self,
)
@ -289,28 +287,26 @@ class ManagerGUI(Gtk.ApplicationWindow):
sync_err = fn.sync_package_db()
if sync_err is not None:
fn.logger.error("Pacman db synchronization failed")
print(
"---------------------------------------------------------------------------"
)
# fn.logger.error("Pacman db synchronization failed")
GLib.idle_add(
self.show_sync_db_message_dialog,
self.show_sync_window,
sync_err,
priority=GLib.PRIORITY_DEFAULT,
)
return False
else:
fn.logger.info("Pacman DB synchronization completed")
return True
def show_sync_db_message_dialog(self, sync_err):
def show_sync_window(self, sync_err):
mw = MessageWindow(
title="Error - Pacman db synchronization",
message=f"Pacman db synchronization failed\n"
f"Failed to run 'pacman -Syu'\n"
f"{sync_err}\n",
image_path="images/48x48/akm-warning.png",
transient_for=self,
detailed_message=True,
)
@ -367,25 +363,27 @@ class ManagerGUI(Gtk.ApplicationWindow):
self.start_get_kernels_threads()
self.pacman_db_sync()
if self.pacman_db_sync() is False:
fn.logger.error("Pacman DB synchronization failed")
else:
fn.logger.debug("Adding community kernels to UI")
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,),
)
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()
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()
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()
@ -507,36 +505,39 @@ class ManagerGUI(Gtk.ApplicationWindow):
# 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()
if self.pacman_db_sync() is False:
fn.logger.error("Pacman DB synchronization failed")
else:
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()
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()
self.kernel_stack.add_community_kernels_to_stack(reload=False)
while self.default_context.pending():
self.default_context.iteration(True)
fn.time.sleep(0.3)
self.queue_load_progress.put(1)
fn.logger.debug("Adding installed kernels to UI")
self.kernel_stack.add_installed_kernels_to_stack(reload=False)
while self.default_context.pending():
self.default_context.iteration(True)
fn.time.sleep(0.1)

View file

@ -9,10 +9,10 @@ base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
class MessageWindow(Gtk.Window):
def __init__(self, title, message, image_path, detailed_message, **kwargs):
def __init__(self, title, message, detailed_message, **kwargs):
super().__init__(**kwargs)
# self.set_title(title=title)
self.set_title(title=title)
self.set_modal(modal=True)
self.set_resizable(False)
icon_name = "akm-tux"
@ -34,14 +34,7 @@ class MessageWindow(Gtk.Window):
vbox_message = Gtk.Box.new(orientation=Gtk.Orientation.VERTICAL, spacing=10)
vbox_message.set_name("vbox_flowbox_message")
image = Gtk.Picture.new_for_filename(os.path.join(base_dir, image_path))
image.set_content_fit(content_fit=Gtk.ContentFit.SCALE_DOWN)
image.set_halign(Gtk.Align.START)
hbox_image = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
# hbox_image.append(image)
hbox_message = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
self.set_child(child=vbox_message)
@ -65,26 +58,25 @@ class MessageWindow(Gtk.Window):
scrolled_window.set_child(textview)
hbox_image.append(scrolled_window)
hbox_message.append(scrolled_window)
self.set_size_request(700, 500)
self.set_resizable(True)
else:
label_message = Gtk.Label(xalign=0, yalign=0)
label_message = Gtk.Label(xalign=0.5, yalign=0.5)
label_message.set_markup("%s" % message)
label_message.set_name("label_flowbox_message")
hbox_image.append(image)
hbox_image.append(label_message)
hbox_message.append(label_message)
vbox_message.append(hbox_image)
vbox_message.append(hbox_message)
button_ok = Gtk.Button.new_with_label("OK")
button_ok.set_size_request(100, 30)
button_ok.set_halign(Gtk.Align.END)
button_ok.connect("clicked", self.on_button_ok_clicked)
hbox_buttons = Gtk.Box.new(orientation=Gtk.Orientation.HORIZONTAL, spacing=20)
hbox_buttons = Gtk.Box.new(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
hbox_buttons.set_halign(Gtk.Align.END)
hbox_buttons.append(button_ok)

View file

@ -1,4 +1,5 @@
import random
import shutil
import sys
import gi
import os
@ -27,7 +28,7 @@ class ProgressWindow(Gtk.Window):
self.set_title(title=title)
self.set_modal(modal=True)
self.set_resizable(True)
self.set_size_request(700, 300)
self.set_size_request(700, 250)
self.connect("close-request", self.on_close)
self.textview = textview
@ -88,6 +89,8 @@ class ProgressWindow(Gtk.Window):
image_settings = None
self.local_modules_version = None
if action == "install":
image_settings = Gtk.Image.new_from_file(
os.path.join(base_dir, "images/48x48/akm-install.png")
@ -105,16 +108,6 @@ class ProgressWindow(Gtk.Window):
% (self.kernel.name, self.kernel.version)
)
# get kernel version from pacman
self.installed_kernel_version = fn.get_kernel_version(self.kernel.name)
if self.installed_kernel_version is not None:
fn.logger.debug(
"Installed kernel version = %s" % self.installed_kernel_version
)
else:
fn.logger.debug("Nothing to remove .. previous kernel not installed")
image_settings.set_halign(Gtk.Align.START)
image_settings.set_icon_size(Gtk.IconSize.LARGE)
@ -237,6 +230,7 @@ class ProgressWindow(Gtk.Window):
self.present()
self.linux_headers = None
self.restore_kernel = None
if (
self.source == "official"
@ -244,6 +238,7 @@ class ProgressWindow(Gtk.Window):
or action == "uninstall"
and self.source == "official"
):
fn.logger.info("Official kernel selected")
if kernel.name == "linux":
self.linux_headers = "linux-headers"
if kernel.name == "linux-rt":
@ -273,19 +268,17 @@ class ProgressWindow(Gtk.Window):
kernel.file_format,
),
]
# in the event an install goes wrong, fallback and reinstall previous kernel
if self.source == "official":
self.restore_kernel = None
# in the event an install goes wrong, fallback and reinstall previous kernel
for inst_kernel in fn.get_installed_kernels():
if inst_kernel.name == self.kernel.name:
self.restore_kernel = inst_kernel
break
if self.restore_kernel:
self.local_modules_version = fn.get_kernel_modules_version(
self.restore_kernel.name, "local"
)
fn.logger.info("Restore kernel = %s" % self.restore_kernel.name)
fn.logger.info(
"Restore kernel version = %s" % self.restore_kernel.version
@ -294,6 +287,9 @@ class ProgressWindow(Gtk.Window):
fn.logger.info("No previous %s kernel installed" % self.kernel.name)
else:
fn.logger.info("Community kernel, no kernel restore available")
self.local_modules_version = fn.get_kernel_modules_version(
self.kernel.name, "local"
)
if fn.check_pacman_lockfile() is False:
th_monitor_messages_queue = fn.threading.Thread(
@ -416,7 +412,6 @@ class ProgressWindow(Gtk.Window):
mw = MessageWindow(
title="Pacman process running",
message="Pacman is busy processing a transaction .. please wait",
image_path="images/48x48/akm-progress.png",
transient_for=self,
detailed_message=False,
)
@ -430,7 +425,6 @@ class ProgressWindow(Gtk.Window):
mw = MessageWindow(
title="Pacman process running",
message="Pacman is busy processing a transaction .. please wait",
image_path="images/48x48/akm-progress.png",
transient_for=self,
detailed_message=False,
)
@ -442,15 +436,32 @@ class ProgressWindow(Gtk.Window):
def check_kernel_state(self):
returncode = None
kernel = None
action = None
while True:
items = self.kernel_state_queue.get()
try:
if items is not None:
returncode, action, kernel = items
if items is not None:
returncode, action = items
try:
if returncode == 0:
self.errors_found = False
fn.logger.info("Kernel %s completed" % action)
self.label_status.set_markup(
"<span foreground='orange'><b>Kernel %s completed</b></span>"
% self.action
)
self.label_title.set_markup("<b>Kernel %s completed</b>" % action)
if fn.kernel_initrd(self) == 1:
self.errors_found = True
self.kernel_fail(action)
else:
fn.update_bootloader(self)
if returncode == 0:
self.label_notify_revealer.set_text(
"Kernel %s completed" % action
)
@ -458,170 +469,163 @@ class ProgressWindow(Gtk.Window):
fn.logger.info("Kernel %s completed" % action)
if returncode == 1:
self.errors_found = True
self.label_notify_revealer.set_text("Kernel %s failed" % action)
self.reveal_notify()
fn.logger.error("Kernel %s failed" % action)
event = "%s <b>[ERROR]: Kernel %s failed</b>\n" % (
fn.datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
action,
)
self.messages_queue.put(event)
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
self.label_status.set_markup(
"<span foreground='orange'><b>Kernel %s failed - see logs above</b></span>"
% action
"<span foreground='orange'><b>Kernel %s completed</b></span>"
% self.action
)
self.label_title.set_markup(
"<b>Kernel %s completed</b>" % action
)
# undo action here if action == install
if (
action == "install"
and self.restore_kernel is not None
and self.source == "official"
):
event = (
"%s<b> [INFO]: Attempting to undo previous Linux package changes</b>\n"
% (
fn.datetime.datetime.now().strftime(
"%Y-%m-%d-%H-%M-%S"
),
)
)
self.messages_queue.put(event)
self.restore = True
fn.logger.info(
"Installation failed, attempting removal of previous Linux package changes"
)
self.set_title("Kernel installation failed")
self.label_spinner_progress.set_markup(
"<b>Please wait restoring kernel %s</b>"
% self.restore_kernel.version
)
fn.uninstall(self)
fn.logger.info(
"Restoring previously installed kernel %s"
% self.restore_kernel.version
)
self.official_kernels = [
"%s/packages/l/%s/%s-%s-x86_64%s"
% (
fn.archlinux_mirror_archive_url,
self.restore_kernel.name,
self.restore_kernel.name,
self.restore_kernel.version,
".pkg.tar.zst",
),
"%s/packages/l/%s/%s-%s-x86_64%s"
% (
fn.archlinux_mirror_archive_url,
self.linux_headers,
self.linux_headers,
self.restore_kernel.version,
".pkg.tar.zst",
),
]
self.errors_found = False
fn.install_archive_kernel(self)
self.set_title("Kernel installation failed")
self.label_status.set_markup(
f"<span foreground='orange'><b>Kernel %s failed - see logs above</b></span>\n"
% action
)
else:
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
self.set_title("Kernel installation failed")
self.label_title.set_markup("<b>Install failed</b>")
#
# self.label_progress_window_desc.set_markup(
# f"<b>This window can be now closed</b>\n"
# f"<b>A reboot is recommended when Linux packages have changed</b>"
# )
# break
else:
if (
returncode == 0
and "-headers" in kernel
or action == "uninstall"
or action == "install"
and self.errors_found is False
):
fn.update_bootloader(self)
self.update_installed_list()
self.update_official_list()
if len(self.manager_gui.community_kernels) > 0:
self.update_community_list()
if self.restore == False:
self.label_title.set_markup(
"<b>Kernel %s completed</b>" % action
)
self.label_status.set_markup(
"<span foreground='orange'><b>Kernel %s completed</b></span>"
% action
)
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
self.label_progress_window_desc.set_markup(
f"<b>This window can be now closed</b>\n"
f"<b>A reboot is recommended when Linux packages have changed</b>"
)
else:
self.label_title.set_markup(
"<b>Kernel %s failed</b>" % action
)
self.label_status.set_markup(
"<span foreground='orange'><b>Kernel %s failed</b></span>"
% action
)
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
self.label_progress_window_desc.set_markup(
f"<b>This window can be now closed</b>\n"
f"<b>Previous kernel restored due to failure</b>\n"
f"<b>A reboot is recommended when Linux packages have changed</b>"
)
# # else:
# self.spinner.set_spinning(False)
# self.hbox_spinner.hide()
#
# self.label_progress_window_desc.set_markup(
# f"<b>This window can be now closed</b>\n"
# f"<b>A reboot is recommended when Linux packages have changed</b>"
# )
break
elif returncode == 1:
self.errors_found = True
self.kernel_fail(action)
else:
self.restore = None
fn.kernel_initrd(self)
fn.update_bootloader(self)
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
if self.errors_found is True:
self.label_status.set_markup(
f"<span foreground='orange'><b>Kernel %s failed - see logs above</b></span>\n"
% action
)
break
#
# else:
# break
except Exception as e:
fn.logger.error("Exception in check_kernel_state(): %s" % e)
finally:
self.kernel_state_queue.task_done()
if os.path.exists(self.lockfile):
os.unlink(self.lockfile)
finally:
self.kernel_state_queue.task_done()
self.update_installed_list()
self.update_official_list()
if len(self.manager_gui.community_kernels) > 0:
self.update_community_list()
while self.manager_gui.default_context.pending():
self.manager_gui.default_context.iteration(True)
fn.time.sleep(0.3)
self.spinner.set_spinning(False)
self.hbox_spinner.hide()
if self.errors_found is True:
event = (
"%s [ERROR]: Problems encountered with the last transaction, see logs"
% (fn.datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),)
)
self.messages_queue.put(event)
else:
event = "%s [INFO]: A reboot is recommended" % (
fn.datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
)
self.messages_queue.put(event)
if os.path.exists("/usr/lib/modules/build"):
shutil.rmtree("/usr/lib/modules/build", ignore_errors=True)
break
def kernel_fail(self, action):
self.errors_found = True
self.label_notify_revealer.set_text("Kernel %s failed" % action)
self.reveal_notify()
fn.logger.error("Kernel %s failed" % action)
self.label_title.set_markup("<b>Kernel %s failed</b>" % action)
self.label_status.set_markup(
"<span foreground='orange'><b>Kernel %s failed - see logs above</b></span>"
% action
)
# self.action = "uninstall"
fn.logger.info(
"Installation failed, attempting removal of previous Linux package changes"
)
event = "%s [INFO]: Reverting package changes made\n" % (
fn.datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
)
self.label_spinner_progress.set_markup(
"<b>Please wait reverting package changes</b>"
)
self.messages_queue.put(event)
self.label_title.set_markup("<b>Kernel install failed</b>")
self.action = "uninstall"
fn.uninstall(self)
if self.restore_kernel is not None and self.source == "official":
self.restore = True
self.label_spinner_progress.set_markup(
"<b>Please wait restoring kernel %s</b>" % self.restore_kernel.version
)
fn.logger.info(
"Restoring previously installed kernel %s" % self.restore_kernel.version
)
event = "%s [INFO]: Restoring previously installed kernel %s\n" % (
fn.datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
self.restore_kernel.version,
)
self.messages_queue.put(event)
self.official_kernels = [
"%s/packages/l/%s/%s-%s-x86_64%s"
% (
fn.archlinux_mirror_archive_url,
self.restore_kernel.name,
self.restore_kernel.name,
self.restore_kernel.version,
".pkg.tar.zst",
),
"%s/packages/l/%s/%s-%s-x86_64%s"
% (
fn.archlinux_mirror_archive_url,
self.linux_headers,
self.linux_headers,
self.restore_kernel.version,
".pkg.tar.zst",
),
]
self.errors_found = False
self.action = "install"
fn.install_archive_kernel(self)
self.label_title.set_markup("<b>Kernel restored due to failure</b>")
# elif self.source == "community":
# GLib.idle_add(
# fn.show_mw,
# self,
# "System changes",
# f"Kernel {self.action} failed\n"
# f"<b>There have been errors, please review the logs</b>\n",
# "images/48x48/akm-warning.png",
# priority=GLib.PRIORITY_DEFAULT,
# )
def update_installed_list(self):
self.manager_gui.installed_kernels = fn.get_installed_kernels()

View file

@ -491,7 +491,6 @@ class SettingsWindow(Gtk.Window):
mw = MessageWindow(
title="Legacy boot detected",
message="Cannot select systemd-boot, UEFI boot mode is not available",
image_path="images/48x48/akm-warning.png",
transient_for=self,
detailed_message=False,
)
@ -544,7 +543,6 @@ class SettingsWindow(Gtk.Window):
% self.text_entry_bootloader_file.get_buffer()
.get_text()
.strip(),
image_path="images/48x48/akm-warning.png",
transient_for=self,
detailed_message=False,
)