diff --git a/usr/lib/linuxmint/mintUpdate/checkKernels.py b/usr/lib/linuxmint/mintUpdate/checkKernels.py
index 1f416cb5..9f414fe8 100755
--- a/usr/lib/linuxmint/mintUpdate/checkKernels.py
+++ b/usr/lib/linuxmint/mintUpdate/checkKernels.py
@@ -1,28 +1,32 @@
#!/usr/bin/python3
-
-import os
import subprocess
import apt
import sys
+import re
from gi.repository import Gio
try:
- current_version = subprocess.check_output("uname -r", shell = True).decode("utf-8").replace("-generic", "").strip()
-
settings = Gio.Settings("com.linuxmint.updates")
- kernel_type = "-generic"
if settings.get_boolean("use-lowlatency-kernels"):
kernel_type = "-lowlatency"
+ else:
+ kernel_type = "-generic"
+ current_version = subprocess.check_output("uname -r", shell = True).decode("utf-8").replace(kernel_type, "").strip()
cache = apt.Cache()
+ signed_kernels = ['']
+ r = re.compile(r'^(?:linux-image-)(?:unsigned-)?(\d.+?)' + kernel_type + '$')
for pkg in cache:
installed = 0
used = 0
installable = 0
pkg_version = ""
package = pkg.name
- if (package.startswith("linux-image-3") or package.startswith("linux-image-4")) and package.endswith(kernel_type):
- version = package.replace("linux-image-", "").replace("-generic", "").replace("-lowlatency", "")
+ if r.match(package):
+ version = r.sub(r'\1', package)
+ # filter duplicates (unsigned kernels where signed exists)
+ if version in signed_kernels:
+ continue
if pkg.is_installed:
installed = 1
pkg_version = pkg.installed.version
@@ -32,6 +36,12 @@
pkg_version = pkg.candidate.version
if version == current_version:
used = 1
+ if not pkg.candidate.origins[0].origin:
+ origin = 0
+ elif pkg.candidate.origins[0].origin == 'Ubuntu':
+ origin = 1
+ else:
+ origin = 2
# provide a representation of the version which helps sorting the kernels
version_array = pkg_version.replace("-", ".").split(".")
@@ -43,7 +53,9 @@
element = "0%s" % element
versions.append(element)
- resultString = "KERNEL###%s###%s###%s###%s###%s###%s" % (".".join(versions), version, pkg_version, installed, used, installable)
+ signed_kernels.append(version)
+
+ resultString = "KERNEL###%s###%s###%s###%s###%s###%s###%s" % (".".join(versions), version, pkg_version, installed, used, installable, origin)
print(resultString.encode("utf-8").decode('ascii', 'xmlcharrefreplace'))
except:
diff --git a/usr/lib/linuxmint/mintUpdate/kernelwindow.py b/usr/lib/linuxmint/mintUpdate/kernelwindow.py
index 49f51510..00c49240 100755
--- a/usr/lib/linuxmint/mintUpdate/kernelwindow.py
+++ b/usr/lib/linuxmint/mintUpdate/kernelwindow.py
@@ -2,13 +2,12 @@
import apt
import subprocess
import os
-import re
import tempfile
import threading
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GdkX11', '3.0') # Needed to get xid
-from gi.repository import Gtk, Gdk, GdkX11
+from gi.repository import Gtk
from Classes import KERNEL_PKG_NAMES
@@ -31,6 +30,8 @@ def run(self):
"--non-interactive", "--parent-window-id", "%s" % self.application.window.get_window().get_xid(), "-o", "Synaptic::closeZvt=true"]
f = tempfile.NamedTemporaryFile()
cache = apt.Cache()
+ if self.remove:
+ KERNEL_PKG_NAMES.append('linux-image-unsigned-VERSION-generic') # mainline, remove only
for name in KERNEL_PKG_NAMES:
name = name.replace("VERSION", self.version)
if name in cache:
@@ -51,7 +52,7 @@ def run(self):
f.close()
class KernelRow(Gtk.ListBoxRow):
- def __init__(self, version, pkg_version, text, installed, used, title, installable, window, application):
+ def __init__(self, version, pkg_version, text, installed, used, title, installable, origin, window, application):
Gtk.ListBoxRow.__init__(self)
self.application = application
@@ -92,24 +93,25 @@ def __init__(self, version, pkg_version, text, installed, used, title, installab
hidden_box.set_margin_bottom(6)
self.revealer.add(hidden_box)
- box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
- box.set_margin_bottom(6)
- hidden_box.pack_start(box, True, True, 0)
- link = Gtk.Label()
- link.set_markup("Bug reports" % version)
- link.set_line_wrap(True)
- box.pack_start(link, False, False, 2)
- link = Gtk.Label()
- changelog_version = pkg_version
- if "~" in pkg_version:
- changelog_version = pkg_version.split("~")[0]
- link.set_markup("Changelog" % changelog_version)
- link.set_line_wrap(True)
- box.pack_start(link, False, False, 2)
- link = Gtk.Label()
- link.set_markup("CVE Tracker")
- link.set_line_wrap(True)
- box.pack_start(link, False, False, 2)
+ if origin == "1":
+ box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+ box.set_margin_bottom(6)
+ hidden_box.pack_start(box, True, True, 0)
+ link = Gtk.Label()
+ link.set_markup("Bug reports" % version)
+ link.set_line_wrap(True)
+ box.pack_start(link, False, False, 2)
+ link = Gtk.Label()
+ changelog_version = pkg_version
+ if "~" in pkg_version:
+ changelog_version = pkg_version.split("~")[0]
+ link.set_markup("Changelog" % changelog_version)
+ link.set_line_wrap(True)
+ box.pack_start(link, False, False, 2)
+ link = Gtk.Label()
+ link.set_markup("CVE Tracker")
+ link.set_line_wrap(True)
+ box.pack_start(link, False, False, 2)
button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
button = Gtk.Button.new_with_label("")
@@ -191,17 +193,15 @@ def __init__(self, application):
builder.get_object("button_close").connect("clicked", self.hide_window)
- kernels = subprocess.check_output("/usr/lib/linuxmint/mintUpdate/checkKernels.py | sort -r | grep \"###\"", shell = True).decode("utf-8")
+ kernels = subprocess.check_output("/usr/lib/linuxmint/mintUpdate/checkKernels.py", shell = True).decode("utf-8")
kernels = kernels.split("\n")
+ kernels.sort(reverse = True)
kernel_list = []
pages_needed = []
for kernel in kernels:
values = kernel.split('###')
- if len(values) == 7:
- status = values[0]
- if status != "KERNEL":
- continue
- (status, version_id, version, pkg_version, installed, used, installable) = values
+ if len(values) == 8:
+ (status, version_id, version, pkg_version, installed, used, installable, origin) = values
installed = (installed == "1")
used = (used == "1")
title = ""
@@ -209,12 +209,14 @@ def __init__(self, application):
title = _("Active")
elif installed:
title = _("Installed")
+ if origin == "0":
+ title += " (local)"
installable = (installable == "1")
label = version
page_label = label.split(".")[0] + "." + label.split(".")[1]
- kernel_list.append([version, pkg_version, page_label, label, installed, used, title, installable])
+ kernel_list.append([version, pkg_version, page_label, label, installed, used, title, installable, origin])
if page_label not in pages_needed:
pages_needed.append(page_label)
@@ -230,11 +232,11 @@ def __init__(self, application):
# stack_switcher.add_titled(page, page)
for kernel in kernel_list:
- (version, pkg_version, page_label, label, installed, used, title, installable) = kernel
+ (version, pkg_version, page_label, label, installed, used, title, installable, origin) = kernel
if used:
current_label.set_markup("%s %s" % (_("You are currently using the following kernel:"), kernel[3]))
if page_label == page:
- row = KernelRow(version, pkg_version, label, installed, used, title, installable, self.window, self.application)
+ row = KernelRow(version, pkg_version, label, installed, used, title, installable, origin, self.window, self.application)
list_box.add(row)
list_box.connect("row_activated", self.on_row_activated)