[lorax 2/7] dnf: remove files from installed packages

Brian C. Lane bcl at redhat.com
Wed Feb 11 18:40:07 UTC 2015


This is a workaround for a current dnf bug, it doesn't update the state
of the packages after they are installed so we tear down the base dnf
object and create a new one pointing to the installroot.

There is an additional issue with the list of files returned, hawkey and
dnf don't appear to make a distinction between files, dirs and ghosted
dirs like yum did, this can result in too much being removed (eg. all of
/etc/selinux/) so we only remove files not directories.
---
 src/pylorax/__init__.py    |  1 +
 src/pylorax/ltmpl.py       | 32 +++++++++++++++++++++++---------
 src/pylorax/treebuilder.py |  8 ++++++++
 src/sbin/lorax             |  2 +-
 4 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/pylorax/__init__.py b/src/pylorax/__init__.py
index 44b180b..8a46c06 100644
--- a/src/pylorax/__init__.py
+++ b/src/pylorax/__init__.py
@@ -302,6 +302,7 @@ class Lorax(BaseLoraxClass):
         rb.create_runtime(joinpaths(installroot,runtime),
                           compression=compression, compressargs=compressargs,
                           size=size)
+        rb.finished()
 
         logger.info("preparing to build output tree and boot images")
         treebuilder = TreeBuilder(product=self.product, arch=self.arch,
diff --git a/src/pylorax/ltmpl.py b/src/pylorax/ltmpl.py
index f5d6f33..5e8c267 100644
--- a/src/pylorax/ltmpl.py
+++ b/src/pylorax/ltmpl.py
@@ -169,8 +169,14 @@ class LoraxTemplateRunner(object):
         return joinpaths(self.inroot, path)
 
     def _filelist(self, *pkgs):
-        pkglist = self.dbo.doPackageLists(pkgnarrow="installed", patterns=pkgs)
-        return set([f for pkg in pkglist for f in pkg.files])
+        """ Return the list of files in the packages """
+        pkglist = []
+        for pkg_glob in pkgs:
+            pkglist += list(self.dbo.sack.query().installed().filter(name__glob=pkg_glob))
+
+        # dnf/hawkey doesn't make any distinction between file, dir or ghost like yum did
+        # so only return the files.
+        return set(f for pkg in pkglist for f in pkg.files if not os.path.isdir(self._out(f)))
 
     def _getsize(self, *files):
         return sum(os.path.getsize(self._out(f)) for f in files if os.path.isfile(self._out(f)))
@@ -513,7 +519,6 @@ class LoraxTemplateRunner(object):
                 logger.error("The transaction process has ended abruptly: %s", e)
                 queue.put(('quit', str(e)))
 
-        self.dbo.reset()
         try:
             logger.info("Checking dependencies")
             self.dbo.resolve()
@@ -551,13 +556,22 @@ class LoraxTemplateRunner(object):
         logger.info("Performing post-installation setup tasks")
         process.join()
 
-        # verify if all packages that were supposed to be installed,
-        # are really installed
-        errs = [t.po for t in self.dbo.tsInfo if not self.dbo.rpmdb.contains(po=t.po)]
-        for po in errs:
-            logger.error("package '%s' was not installed", po)
-
+        # close down the base and re-init it to pick up changes
         self.dbo.close()
+        del self.dbo
+
+        self.dbo = dnf.Base()
+        conf = self.dbo.conf
+        # Point inside the installroot
+        conf.installroot = self.outroot
+        conf.prepend_installroot('persistdir')
+        conf.debuglevel = 10
+        conf.errorlevel = 0
+        RELEASEVER = dnf.rpm.detect_releasever(self.dbo.conf.installroot)
+        self.dbo.conf.substitutions['releasever'] = RELEASEVER
+        self.dbo.read_all_repos()
+        self.dbo.fill_sack(load_system_repo=False)
+        self.dbo.read_comps()
 
     def removefrom(self, pkg, *globs):
         '''
diff --git a/src/pylorax/treebuilder.py b/src/pylorax/treebuilder.py
index 5a56233..5fac135 100644
--- a/src/pylorax/treebuilder.py
+++ b/src/pylorax/treebuilder.py
@@ -84,6 +84,7 @@ class RuntimeBuilder(object):
         self.add_template_vars = add_template_vars or {}
         self._installpkgs = installpkgs or []
         self._runner.defaults = self.vars
+        self.dbo.reset()
 
     def _install_branding(self):
         release = None
@@ -173,6 +174,13 @@ class RuntimeBuilder(object):
         imgutils.mksquashfs(workdir, outfile, compression, compressargs)
         remove(workdir)
 
+    def finished(self):
+        """ Done using RuntimeBuilder
+
+        Close the dnf base object
+        """
+        self.dbo.close()
+
 class TreeBuilder(object):
     '''Builds the arch-specific boot images.
     inroot should be the installtree root (the newly-built runtime dir)'''
diff --git a/src/sbin/lorax b/src/sbin/lorax
index bfc47e3..748d417 100755
--- a/src/sbin/lorax
+++ b/src/sbin/lorax
@@ -250,7 +250,7 @@ def get_dnf_base_object(installroot, repositories, mirrorlists=None,
     conf.cachedir = cachedir
 
     # Turn off logging to the console
-    conf.debuglevel = 0
+    conf.debuglevel = 10
     conf.errorlevel = 0
     dnfbase.logging.setup_from_dnf_conf(conf)
 
-- 
2.1.0



More information about the anaconda-patches mailing list