summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oe/package_manager.py58
-rw-r--r--meta/lib/oe/rootfs.py64
2 files changed, 59 insertions, 63 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'):
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 600a685d68..f8f717c050 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -92,10 +92,6 @@ class Rootfs(object, metaclass=ABCMeta):
92 self.d.getVar('PACKAGE_FEED_ARCHS')) 92 self.d.getVar('PACKAGE_FEED_ARCHS'))
93 93
94 94
95 @abstractmethod
96 def _handle_intercept_failure(self, failed_script):
97 pass
98
99 """ 95 """
100 The _cleanup() method should be used to clean-up stuff that we don't really 96 The _cleanup() method should be used to clean-up stuff that we don't really
101 want to end up on target. For example, in the case of RPM, the DB locks. 97 want to end up on target. For example, in the case of RPM, the DB locks.
@@ -197,7 +193,7 @@ class Rootfs(object, metaclass=ABCMeta):
197 193
198 execute_pre_post_process(self.d, rootfs_post_install_cmds) 194 execute_pre_post_process(self.d, rootfs_post_install_cmds)
199 195
200 self._run_intercepts() 196 self.pm.run_intercepts()
201 197
202 execute_pre_post_process(self.d, post_process_cmds) 198 execute_pre_post_process(self.d, post_process_cmds)
203 199
@@ -283,50 +279,6 @@ class Rootfs(object, metaclass=ABCMeta):
283 # Remove the package manager data files 279 # Remove the package manager data files
284 self.pm.remove_packaging_data() 280 self.pm.remove_packaging_data()
285 281
286 def _postpone_to_first_boot(self, postinst_intercept_hook):
287 with open(postinst_intercept_hook) as intercept:
288 registered_pkgs = None
289 for line in intercept.read().split("\n"):
290 m = re.match("^##PKGS:(.*)", line)
291 if m is not None:
292 registered_pkgs = m.group(1).strip()
293 break
294
295 if registered_pkgs is not None:
296 bb.note("The postinstalls for the following packages "
297 "will be postponed for first boot: %s" %
298 registered_pkgs)
299
300 # call the backend dependent handler
301 self._handle_intercept_failure(registered_pkgs)
302
303
304 def _run_intercepts(self):
305 intercepts_dir = self.pm.intercepts_dir
306
307 bb.note("Running intercept scripts:")
308 os.environ['D'] = self.image_rootfs
309 os.environ['STAGING_DIR_NATIVE'] = self.d.getVar('STAGING_DIR_NATIVE')
310 for script in os.listdir(intercepts_dir):
311 script_full = os.path.join(intercepts_dir, script)
312
313 if script == "postinst_intercept" or not os.access(script_full, os.X_OK):
314 continue
315
316 if script == "delay_to_first_boot":
317 self._postpone_to_first_boot(script_full)
318 continue
319
320 bb.note("> Executing %s intercept ..." % script)
321
322 try:
323 output = subprocess.check_output(script_full, stderr=subprocess.STDOUT)
324 if output: bb.note(output.decode("utf-8"))
325 except subprocess.CalledProcessError as e:
326 bb.warn("The postinstall intercept hook '%s' failed, details in log.do_rootfs" % script)
327 bb.note("Exit code %d. Output:\n%s" % (e.returncode, e.output.decode("utf-8")))
328 self._postpone_to_first_boot(script_full)
329
330 def _run_ldconfig(self): 282 def _run_ldconfig(self):
331 if self.d.getVar('LDCONFIGDEPEND'): 283 if self.d.getVar('LDCONFIGDEPEND'):
332 bb.note("Executing: ldconfig -r" + self.image_rootfs + "-c new -v") 284 bb.note("Executing: ldconfig -r" + self.image_rootfs + "-c new -v")
@@ -519,14 +471,6 @@ class RpmRootfs(Rootfs):
519 self._log_check_warn() 471 self._log_check_warn()
520 self._log_check_error() 472 self._log_check_error()
521 473
522 def _handle_intercept_failure(self, registered_pkgs):
523 rpm_postinsts_dir = self.image_rootfs + self.d.expand('${sysconfdir}/rpm-postinsts/')
524 bb.utils.mkdirhier(rpm_postinsts_dir)
525
526 # Save the package postinstalls in /etc/rpm-postinsts
527 for pkg in registered_pkgs.split():
528 self.pm.save_rpmpostinst(pkg)
529
530 def _cleanup(self): 474 def _cleanup(self):
531 self.pm._invoke_dnf(["clean", "all"]) 475 self.pm._invoke_dnf(["clean", "all"])
532 476
@@ -707,9 +651,6 @@ class DpkgRootfs(DpkgOpkgRootfs):
707 src_postinst_dir = self.d.expand("${IMAGE_ROOTFS}/var/lib/dpkg/info") 651 src_postinst_dir = self.d.expand("${IMAGE_ROOTFS}/var/lib/dpkg/info")
708 return self._save_postinsts_common(dst_postinst_dir, src_postinst_dir) 652 return self._save_postinsts_common(dst_postinst_dir, src_postinst_dir)
709 653
710 def _handle_intercept_failure(self, registered_pkgs):
711 self.pm.mark_packages("unpacked", registered_pkgs.split())
712
713 def _log_check(self): 654 def _log_check(self):
714 self._log_check_warn() 655 self._log_check_warn()
715 self._log_check_error() 656 self._log_check_error()
@@ -978,9 +919,6 @@ class OpkgRootfs(DpkgOpkgRootfs):
978 src_postinst_dir = self.d.expand("${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/info") 919 src_postinst_dir = self.d.expand("${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/info")
979 return self._save_postinsts_common(dst_postinst_dir, src_postinst_dir) 920 return self._save_postinsts_common(dst_postinst_dir, src_postinst_dir)
980 921
981 def _handle_intercept_failure(self, registered_pkgs):
982 self.pm.mark_packages("unpacked", registered_pkgs.split())
983
984 def _log_check(self): 922 def _log_check(self):
985 self._log_check_warn() 923 self._log_check_warn()
986 self._log_check_error() 924 self._log_check_error()