summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/package_manager.py
diff options
context:
space:
mode:
authorAlexander Kanavin <alexander.kanavin@linux.intel.com>2018-04-03 18:45:20 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-04-05 14:49:07 +0100
commitae661039394f3e056d02c7e1f1d79511d82cb99b (patch)
tree73b2632b263583c3232ac2a788446e827985ae9a /meta/lib/oe/package_manager.py
parent19cd7a1776df6610cf9721275d6ef69115f9426a (diff)
downloadpoky-ae661039394f3e056d02c7e1f1d79511d82cb99b.tar.gz
package_manager.py: move intercept running logic from rootfs class to PackageManager class
This allows running the intercepts when creating SDKs, which previously wasn't possible, as SDK code does not use the rootfs class, and calls into PackageManager methods directly. (From OE-Core rev: f830388c5e9125f385a42acd7365d1235967b57c) Signed-off-by: Alexander Kanavin <alexander.kanavin@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r--meta/lib/oe/package_manager.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index b95b3b96a8..61df06d4f0 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -349,6 +349,54 @@ class PackageManager(object, metaclass=ABCMeta):
349 shutil.copytree(postinst_intercepts_dir, self.intercepts_dir) 349 shutil.copytree(postinst_intercepts_dir, self.intercepts_dir)
350 350
351 @abstractmethod 351 @abstractmethod
352 def _handle_intercept_failure(self, failed_script):
353 pass
354
355 def _postpone_to_first_boot(self, postinst_intercept_hook):
356 with open(postinst_intercept_hook) as intercept:
357 registered_pkgs = None
358 for line in intercept.read().split("\n"):
359 m = re.match("^##PKGS:(.*)", line)
360 if m is not None:
361 registered_pkgs = m.group(1).strip()
362 break
363
364 if registered_pkgs is not None:
365 bb.note("If an image is being built, the postinstalls for the following packages "
366 "will be postponed for first boot: %s" %
367 registered_pkgs)
368
369 # call the backend dependent handler
370 self._handle_intercept_failure(registered_pkgs)
371
372
373 def run_intercepts(self):
374 intercepts_dir = self.intercepts_dir
375
376 bb.note("Running intercept scripts:")
377 os.environ['D'] = self.target_rootfs
378 os.environ['STAGING_DIR_NATIVE'] = self.d.getVar('STAGING_DIR_NATIVE')
379 for script in os.listdir(intercepts_dir):
380 script_full = os.path.join(intercepts_dir, script)
381
382 if script == "postinst_intercept" or not os.access(script_full, os.X_OK):
383 continue
384
385 if script == "delay_to_first_boot":
386 self._postpone_to_first_boot(script_full)
387 continue
388
389 bb.note("> Executing %s intercept ..." % script)
390
391 try:
392 output = subprocess.check_output(script_full, stderr=subprocess.STDOUT)
393 if output: bb.note(output.decode("utf-8"))
394 except subprocess.CalledProcessError as e:
395 bb.warn("The postinstall intercept hook '%s' failed, details in log.do_rootfs" % script)
396 bb.note("Exit code %d. Output:\n%s" % (e.returncode, e.output.decode("utf-8")))
397 self._postpone_to_first_boot(script_full)
398
399 @abstractmethod
352 def update(self): 400 def update(self):
353 """ 401 """
354 Update the package manager package database. 402 Update the package manager package database.
@@ -897,6 +945,14 @@ class RpmPM(PackageManager):
897 open(saved_script_name, 'w').write(output) 945 open(saved_script_name, 'w').write(output)
898 os.chmod(saved_script_name, 0o755) 946 os.chmod(saved_script_name, 0o755)
899 947
948 def _handle_intercept_failure(self, registered_pkgs):
949 rpm_postinsts_dir = self.target_rootfs + self.d.expand('${sysconfdir}/rpm-postinsts/')
950 bb.utils.mkdirhier(rpm_postinsts_dir)
951
952 # Save the package postinstalls in /etc/rpm-postinsts
953 for pkg in registered_pkgs.split():
954 self.save_rpmpostinst(pkg)
955
900 def extract(self, pkg): 956 def extract(self, pkg):
901 output = self._invoke_dnf(["repoquery", "--queryformat", "%{location}", pkg]) 957 output = self._invoke_dnf(["repoquery", "--queryformat", "%{location}", pkg])
902 pkg_name = output.splitlines()[-1] 958 pkg_name = output.splitlines()[-1]
@@ -1000,6 +1056,8 @@ class OpkgDpkgPM(PackageManager):
1000 1056
1001 return tmp_dir 1057 return tmp_dir
1002 1058
1059 def _handle_intercept_failure(self, registered_pkgs):
1060 self.mark_packages("unpacked", registered_pkgs.split())
1003 1061
1004class OpkgPM(OpkgDpkgPM): 1062class OpkgPM(OpkgDpkgPM):
1005 def __init__(self, d, target_rootfs, config_file, archs, task_name='target'): 1063 def __init__(self, d, target_rootfs, config_file, archs, task_name='target'):