Busybox upgrades sometimes fail, especially if there is a major distribution
upgrade and all packages need to be updated.  Success is highly dependent
on the package upgrade order.

Commit [1] attempts to ensure a shell is still present by adding an
alternative to /bin/sh if busybox is the only shell.  However, if busybox
is not the only shell present and the other shells are upgrading, it may
then be possible that all shells will be removed during the upgrade process.

Commit [2] creates temporary symbolic links for all the busybox links during
busybox's postinst step.  However, this is too late in the process as some
packages attempt to use 'rm' and 'sed' after update-alternatives removes the
old links and prior to when busybox's postinst step runs.

This fix is similar to [2] but runs during the preinst step.  For opkg,
this is the first step that is guaranteed to run from the new package (prerm
is run from the old package) and will therefore be a backwards-compatible fix
for upgrading older systems.

Copies the existing busybox binary and the busybox.links files to a temporary
directory and then creates alternative links for all installed busybox
commands.  The temporary links and directory are cleaned up during the
postinst step.

RFC: This works for me, but there may be room for improvement.  I don't know
if the current pkg_prerm steps are necessary anymore.  However, in my testing
I did need the links for update-alternatives to work in the preinst step. I
am also not certain if the populate_packages_updatealternatives_append
step is necessary anymore.  I have also only tested this fix on dunfell, as
I don't have a working image based on master yet.  It may be more appropriate
for this to go to master and then be backported to dunfell, but I would need
assistance in testing.

[1] 
https://git.openembedded.org/openembedded-core/commit/meta/recipes-core/busybox/busybox.inc?id=a9d2af8f5b3da8239cf00a52883ca596a19ea23a
[2] 
https://git.openembedded.org/openembedded-core/commit/meta/recipes-core/busybox/busybox.inc?id=3a035bd0a06a6ded4d0ce7e35a3bce42245727d2

Signed-off-by: Bryan Evenson <beven...@melinkcorp.com>
---
 meta/recipes-core/busybox/busybox.inc | 57 ++++++++++++++++++++++++++-
 1 file changed, 55 insertions(+), 2 deletions(-)

diff --git a/meta/recipes-core/busybox/busybox.inc 
b/meta/recipes-core/busybox/busybox.inc
index e0522be729..c85402411b 100644
--- a/meta/recipes-core/busybox/busybox.inc
+++ b/meta/recipes-core/busybox/busybox.inc
@@ -441,12 +441,28 @@ pkg_postinst_${PN}_prepend () {
 }
 
 pkg_postinst_${PN}_append () {
-        # If busybox exists in the remove directory it is because it was the 
only shell left.
         if [ "x$D" = "x" ] ; then
+           # If busybox exists in the remove directory it is because it was 
the only shell left.
            if [ "x$BUSYBOX" != "x" ] ; then
               update-alternatives --remove sh $BUSYBOX
-              rm -f $BUSYBOX
            fi
+           # Remove the temporary alternatives
+           for busybox_preinstdir in /tmp/busyboxpreinst-*; do
+               if [ "$busybox_preinstdir" != '/tmp/busyboxpreinst-*' ] ; then
+                  BUSYBOX_PREINST_DIR="$busybox_preinstdir"
+                  BUSYBOX="$BUSYBOX_PREINST_DIR/busybox"
+                  if [ -e $BUSYBOX ] ; then
+                      for suffix in "" ".nosuid" ".suid"; do
+                          if [ -e $BUSYBOX_PREINST_DIR/busybox.links$suffix ] 
; then
+                              while read link; do
+                                  update-alternatives --remove $($BUSYBOX 
basename $link) $BUSYBOX
+                              done < $BUSYBOX_PREINST_DIR/busybox.links$suffix
+                          fi
+                      done
+                  fi
+                  rm -rf $BUSYBOX_PREINST_DIR
+               fi
+           done
         fi
 } 
 
@@ -480,6 +496,43 @@ pkg_prerm_${PN} () {
         fi
 }
 
+pkg_preinst_${PN} () {
+        # Create a temporary copy the busybox binary and the links files.  
Then,
+        # install an alternative link for all the links.  Other packages use 
these
+        # commands during their upgrade process.  This ensures the links are 
available
+        # to all the other packages.  We do this in the preinst step because 
it is
+        # the first step guaranteed to be used from the new package.  The 
prerm is
+        # used from the old package.  Placing this here ensures it runs on 
upgrade even
+        # on older systems.
+        
+        if [ "x$D" = "x" ] ; then
+           # update-alternatives may need the links from commands added in the 
prerm step
+           # to operate.  Make sure we can get to that path.
+           for busybox_rmdir in /tmp/busyboxrm-*; do
+               if [ "$busybox_rmdir" != '/tmp/busyboxrm-*' ] ; then
+                  export PATH=$busybox_rmdir:$PATH
+               fi
+           done
+
+           # Create a temporary directory for the busybox binary and the link 
lists
+           BUSYBOX=${base_bindir}/busybox
+           BUSYBOX_TMP_DIR=`$BUSYBOX mktemp -d /tmp/busyboxpreinst-XXXXXX`
+           BUSYBOX_TMP_LOC="$BUSYBOX_TMP_DIR/busybox"
+           $BUSYBOX cp $BUSYBOX $BUSYBOX_TMP_LOC
+
+           # Go through all the links and install an alternative that points 
to the temporary
+           # busybox binary.
+           for suffix in "" ".nosuid" ".suid"; do
+               if [ -e ${sysconfdir}/busybox.links$suffix ] ; then
+                   $BUSYBOX cp ${sysconfdir}/busybox.links$suffix 
$BUSYBOX_TMP_DIR
+                   while read link; do
+                       update-alternatives --install $link $($BUSYBOX basename 
$link) $BUSYBOX_TMP_LOC 1
+                   done < $BUSYBOX_TMP_DIR/busybox.links$suffix
+               fi
+           done
+        fi
+}
+
 pkg_postrm_${PN} () {
         # Add path to remove dir in case we removed our only grep
         if [ "x$D" = "x" ] ; then
-- 
2.17.1
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#159985): 
https://lists.openembedded.org/g/openembedded-core/message/159985
Mute This Topic: https://lists.openembedded.org/mt/87919018/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to