1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-09 17:39:31 +00:00

image.bbclass: add fall-back functionality when running intercepts

If an intercept script fails, it would be helpful to fall-back to
running the postinstall on target's first boot. In order to achieve
that, the postinstalls that install a host intercept hook will have to
return 1, so that the postinstall is marked as unpacked only. If the
intercept hook fails, then we're ok, the postinstalls will be run on
target anyway. If it succeeds, then mark the packages as installed.

This logic was chosen mainly because of rpm backend which saves the
failed postinstalls in /etc/rpm-postinsts. Hence, in order to mark the
packages as installed, all we have to do is delete the scriptlets from
there.

(From OE-Core rev: ed8ac4ee43132ae974794038821f7ca5465ae556)

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Laurentiu Palcu
2013-02-12 18:12:37 +02:00
committed by Richard Purdie
parent 7306dbea6d
commit 6cca7efa6f
+37 -6
View File
@@ -194,13 +194,41 @@ run_intercept_scriptlets () {
cd ${WORKDIR}/intercept_scripts cd ${WORKDIR}/intercept_scripts
echo "Running intercept scripts:" echo "Running intercept scripts:"
for script in *; do for script in *; do
if [ "$script" = "*" ]; then break; fi [ "$script" = "*" ] && break
[ "$script" = "postinst_intercept" ] || [ ! -x "$script" ] && continue
echo "> Executing $script" echo "> Executing $script"
chmod +x $script ./$script || (echo "WARNING: intercept script \"$script\" failed, falling back to running postinstalls at first boot" && continue)
./$script #
if [ $? -ne 0 ]; then # If we got here, than the intercept was successful. Next, we must
echo "ERROR: intercept script \"$script\" failed!" # mark the postinstalls as "installed". For rpm is a little bit
fi # different, we just have to delete the saved postinstalls from
# /etc/rpm-postinsts
#
pkgs="$(cat ./$script|grep "^##PKGS"|cut -d':' -f2)" || continue
case ${IMAGE_PKGTYPE} in
"rpm")
for pi in ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts/*; do
pkg_name="$(cat $pi|sed -n -e "s/^.*postinst_intercept $script \([^ ]*\).*/\1/p")"
if [ -n "$pkg_name" -a -n "$(echo "$pkgs"|grep " $pkg_name ")" ]; then
rm $pi
fi
done
# move to the next intercept script
continue
;;
"ipk")
status_file="${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/status"
;;
"deb")
status_file="${IMAGE_ROOTFS}/var/lib/dpkg/status"
;;
esac
# the next piece of code is run only for ipk/dpkg
sed_expr=""
for p in $pkgs; do
sed_expr="$sed_expr -e \"/^Package: ${p}$/,/^Status: install.* unpacked$/ {s/unpacked/installed/}\""
done
eval sed -i $sed_expr $status_file
done done
fi fi
} }
@@ -223,6 +251,9 @@ fakeroot do_rootfs () {
cp ${COREBASE}/meta/files/deploydir_readme.txt ${DEPLOY_DIR_IMAGE}/README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt || true cp ${COREBASE}/meta/files/deploydir_readme.txt ${DEPLOY_DIR_IMAGE}/README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt || true
# copy the intercept scripts
cp ${COREBASE}/scripts/postinst-intercepts/* ${WORKDIR}/intercept_scripts/
# If "${IMAGE_ROOTFS}/dev" exists, then the device had been made by # If "${IMAGE_ROOTFS}/dev" exists, then the device had been made by
# the previous build # the previous build
if [ "${USE_DEVFS}" != "1" -a ! -r "${IMAGE_ROOTFS}/dev" ]; then if [ "${USE_DEVFS}" != "1" -a ! -r "${IMAGE_ROOTFS}/dev" ]; then