Support to install preload package when updating rpm.
authorwanchao-xu <wanchao.xu@samsung.com>
Mon, 2 Sep 2024 01:22:23 +0000 (09:22 +0800)
committerwanchao-xu <wanchao.xu@samsung.com>
Tue, 3 Sep 2024 02:29:44 +0000 (10:29 +0800)
Change-Id: I9a5eba7267a08d88d80ef054ee4eac583e20c745
Signed-off-by: wanchao-xu <wanchao.xu@samsung.com>
plugins/backend/zypppkgmgr.py

index 52a725ec9802162c7ac1ba03f0dea34c12582e9d..88742c634dbfe52ea9b13da64b316c966f3d7a4b 100644 (file)
@@ -668,6 +668,8 @@ class Zypp(BackendPlugin):
 
         try:
             self.installPkgs(dlpkgs)
+            if update_only:
+                self.installPreloadPkg()
         except (RepoError, RpmError):
             raise
         except Exception as e:
@@ -1008,6 +1010,53 @@ class Zypp(BackendPlugin):
             self.show_unresolved_dependencies_msg(unresolved_dependencies)
             raise RepoError("Unresolved dependencies, transaction failed.")
 
+    def installPreloadPkg(self):
+        def mychroot():
+            os.chroot(self.instroot)
+            os.chdir("/")
+
+        script = """#!/bin/bash
+if [ -f /usr/bin/install_preload_pkg ]; then
+  install_preload_pkg
+  if [ -f /tmp/.preload_install_error ]; then
+    if [ ! -d /tmp/.postscript/error ]; then
+      mkdir -p /tmp/.postscript/error
+    fi
+      echo 'preload install failed' > /tmp/.postscript/error/%{name}_error
+  else
+    if [ -f /usr/bin/pkgcmd ]; then
+      pkgcmd -l --global 1>&2
+    fi
+  fi
+else
+  echo 'pkgmgr-tool is not installed'
+fi
+exit 0
+"""
+        if os.path.exists(self.instroot + "/tmp"):
+            shutil.rmtree(self.instroot + "/tmp")
+        os.mkdir(self.instroot + "/tmp", 0o755)
+        (fd, path) = tempfile.mkstemp(prefix="install_preload_pkg-",
+                                      dir=self.instroot + "/tmp")
+        os.write(fd, script.encode())
+        os.close(fd)
+        os.chmod(path, 0o700)
+
+        try:
+            script_path = "/tmp/" + os.path.basename(path)
+            p = subprocess.Popen(['/bin/bash', script_path],
+                                 preexec_fn=mychroot,
+                                 stdout=subprocess.PIPE,
+                                 stderr=subprocess.STDOUT)
+            while p.poll() == None:
+                msger.info(p.stdout.readline().strip().decode())
+            if p.returncode != 0:
+                raise CreatorError("Failed to install preload packages")
+        except OSError as msg:
+            raise CreatorError("Failed to install preload packages : %s" % msg)
+        finally:
+            os.unlink(path)
+
     def uninstallPkgs(self, package_objects):
         def mychroot():
             os.chroot(self.instroot)