summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/package_manager.py
diff options
context:
space:
mode:
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'):