diff options
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r-- | meta/lib/oe/package_manager.py | 58 |
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 | ||
1004 | class OpkgPM(OpkgDpkgPM): | 1062 | class 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'): |