udpate
This commit is contained in:
parent
92433c3100
commit
14531bc829
11 changed files with 806 additions and 569 deletions
17
README.md
17
README.md
|
@ -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`
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue