[PATCH] Use the rpm database to find packages installed by package payloads

David Shea dshea at redhat.com
Fri Jan 23 15:41:41 UTC 2015


The previous PackagePayload implementations of kernelVersionList had a
problem in that they could miss kernels installed by packages not named
"kernel" (kernel-core, kernel-PAE, kernel-debug) and in that there may
be a difference between the package EVR and the version derived from
s/vmlinuz-// (because there's a +PAE or +debug in it or something).
---
 pyanaconda/packaging/__init__.py   | 19 +++++++++++++++++++
 pyanaconda/packaging/dnfpayload.py |  7 -------
 pyanaconda/packaging/yumpayload.py |  8 --------
 3 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/pyanaconda/packaging/__init__.py b/pyanaconda/packaging/__init__.py
index 2438b6f..2129347 100644
--- a/pyanaconda/packaging/__init__.py
+++ b/pyanaconda/packaging/__init__.py
@@ -35,6 +35,7 @@ import ConfigParser
 import shutil
 import time
 from glob import glob
+from fnmatch import fnmatch
 import threading
 import re
 
@@ -696,6 +697,24 @@ class PackagePayload(Payload):
         return kernels
 
     @property
+    def kernelVersionList(self):
+        # Find all installed rpms that provide 'kernel'
+        # Unlike the rpm imports in Payload, this one is mandatory
+        import rpm
+
+        files = []
+
+        ts = rpm.TransactionSet(iutil.getSysroot())
+        mi = ts.dbMatch('providename', 'kernel')
+        for hdr in mi:
+            # Find all /boot/vmlinuz- files and strip off vmlinuz-
+            files.extend((f.split("/")[-1][8:] for f in hdr.filenames
+                if fnmatch(f, "/boot/vmlinuz-*") or
+                   fnmatch(f, "/boot/efi/EFI/%s/vmlinuz-*" % self.instclass.efi_dir)))
+
+        return sorted(files, cmp=versionCmp)
+
+    @property
     def rpmMacros(self):
         """A list of (name, value) pairs to define as macros in the rpm transaction."""
         return self._rpm_macros
diff --git a/pyanaconda/packaging/dnfpayload.py b/pyanaconda/packaging/dnfpayload.py
index 6cea430..0fd3ac3 100644
--- a/pyanaconda/packaging/dnfpayload.py
+++ b/pyanaconda/packaging/dnfpayload.py
@@ -820,10 +820,3 @@ class DNFPayload(packaging.PackagePayload):
                 log.error(e)
 
         super(DNFPayload, self).postInstall()
-
-    @property
-    def kernelVersionList(self):
-        return ('%s-%s.%s' % (p.version, p.release, p.arch) for p in
-                sorted(self._base.sack.query().filter(name='kernel'),
-                       cmp=dnf.rpm.miscutils.compareEVR,
-                       key=lambda p: (p.epoch, p.version, p.release)))
diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 73caa49..742edad 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -988,14 +988,6 @@ reposdir=%s
             else:
                 return environment.groups
 
-    @property
-    def kernelVersionList(self):
-        with _yum_lock:
-            return ("%s-%s.%s" % (p.version, p.release, p.arch) for p in
-                    sorted(self._yum.pkgSack.searchNames(['kernel']),
-                           cmp=yum.rpmUtils.miscutils.compareEVR,
-                           key=lambda p: (p.epoch, p.version, p.release)))
-
     ###
     ### METHODS FOR WORKING WITH GROUPS
     ###
-- 
2.1.0



More information about the anaconda-patches mailing list