Hi Bryan, Sorry, maybe I didn't fully understand the use-case. Are you trying to upgrade the busybox on demand? If yes, that is not a good idea.
I'm little bit scary about doing "export PATH=$busybox_rmdir:$PATH" and creating a custom locks is not a good at all. Cheers, Andrej On Fri, 2022-01-21 at 13:29 +0000, Bryan Evenson wrote: > All, > > Ping on this RFC. It works for me, but I have a feeling there is a > better way to do this. It still seems a little messy and could > probably be simplified for the same effect. > > Thanks, > Bryan > > > -----Original Message----- > > From: Bryan Evenson > > Sent: Thursday, December 23, 2021 9:50 AM > > To: openembedded-core@lists.openembedded.org > > Subject: [dunfell][PATCH RFC] busybox.inc: Create temporary busybox > > links > > during install > > > > 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=a9d2af8f5b3da8239cf00a52883ca596a19ea23 > > a > > [2] https://git.openembedded.org/openembedded- > > core/commit/meta/recipes- > > core/busybox/busybox.inc?id=3a035bd0a06a6ded4d0ce7e35a3bce42245727 > > d2 > > > > 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 (#160830): https://lists.openembedded.org/g/openembedded-core/message/160830 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] -=-=-=-=-=-=-=-=-=-=-=-