X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=debian%2Fbusybox-power.postinst;h=0dd43bcf6b7242317b55e01c29583f55c604e6ff;hb=88992e2fc7ed03fec61cccd4c20ecd5ca15766b4;hp=6f603a38d2948c1064106e7ee29c90ed580dab24;hpb=767be848f1b4e13be3181cf4ad5e5f676a2e41f5;p=busybox-power diff --git a/debian/busybox-power.postinst b/debian/busybox-power.postinst index 6f603a3..0dd43bc 100644 --- a/debian/busybox-power.postinst +++ b/debian/busybox-power.postinst @@ -1,15 +1,191 @@ -#!/bin/sh -set -e +#!/opt/busybox-power/busybox.power sh +# A script to replace /bin/busybox and create missing symlinks to its applets. +# +# The target directories for BusyBox' applets are defined in the "applets" file. +# This script will only create symbolic links when 1) they do not already exist +# in the filesystem, and 2) the BusyBox binary supports the applet. A list of +# all made symbolic links is written out to the file "busybox-power.symlinks", +# which will be used during uninstallation of busybox-power. +# +# NB The BusyBox binary needs to support the install applet. +# +# By Dennis Groenen +# GPLv3 licensed +# -/opt/busybox-power/busybox.power sh /opt/busybox-power/install-binary.sh +INSTALLDIR="/opt/busybox-power" +EXECPWR="$INSTALLDIR/busybox.power" +DISTBIN="/bin/busybox.distrib" -# Workaround for bug 5317 -line="trap exit SIGHUP #by busybox-power" -if ! grep -F -q "$line" /etc/profile; then - echo "$line" >> /etc/profile -fi +VERBOSE="0" +SYMLINK="1" + +INSTBINARY_SHA1=`$EXECPWR sha1sum $EXECPWR | $EXECPWR awk '{ print $1 }'` +ORIGBINARY_SHA1=`$EXECPWR sha1sum /bin/busybox | $EXECPWR awk '{ print $1 }'` + +# Load shared functions +source $INSTALLDIR/functions + +# Check whether the applets file exists +CHECK_APPLETSFILE() { + if test ! -e $INSTALLDIR/applets; then + echo "error: cannot find list of defined applets" + exit 1 + fi +} + +# Check whether symlinks have been made before +CHECK_SYMLINKSFILE() { + if test -e $INSTALLDIR/busybox-power.symlinks; then + ECHO_VERBOSE "symlinks are already made, skipping creation" + SYMLINK="0" + fi +} + +# Backup the original BusyBox binary +BACKUP() { + if test ! -e /bin/busybox; then + # Scratchbox does not ship with BusyBox by default + return + fi + + if test "$INSTBINARY_SHA1" != "$ORIGBINARY_SHA1"; then + $EXECPWR cp -a /bin/busybox $DISTBIN + $EXECPWR sha1sum $DISTBIN | $EXECPWR awk '{ print $1 }' \ + > $INSTALLDIR/busybox.distrib.sha1 + GETBBVERSION > $INSTALLDIR/busybox.distrib.version + fi +} + +# Rollback procedure for Harmattan based devices +ROLLBACK_HARMATTAN() { + echo -e "\nWarning: an error has occured! Rolling back..." + $EXECPWR cp -af $TMPBINBAK /bin/busybox + $EXECPWR cp -a $TMPHASHBAK /var/lib/aegis/refhashlist + echo "End of roll-back" + exit 1 +} + +# Overwrite the installed binary with the enhanced binary +# dpkg-divert is disallowed on Harmattan, do not use it there! +INSTALL() { + case $ENVIRONMENT in + SDK|DIABLO|FREMANTLE) + # Divert in postinst instead of preinst, we don't want to leave Maemo + # without /bin/busybox for a short period of time + /usr/sbin/dpkg-divert --package busybox-power --add \ + --divert $DISTBIN /bin/busybox + $EXECPWR cp -f $EXECPWR /bin/busybox + ;; + HARMATTAN) + TMPHASHBAK=`$EXECPWR mktemp` + TMPBINBAK=`$EXECPWR mktemp` + ORIGINCHECK=`GETORIGINCHECK_STATUS` + + # Useful information for Harmattan-based devices + ECHO_VERBOSE "refhashlist backup: $TMPHASHBAK" + ECHO_VERBOSE "busybox backup: $TMPBINBAK" + ECHO_VERBOSE "instbinary: $INSTBINARY_SHA1" + ECHO_VERBOSE "origbinary: $ORIGBINARY_SHA1" + ECHO_VERBOSE "device mode: $DEVICEMODE" + ECHO_VERBOSE "origincheck: $ORIGINCHECK" + + if test $ORIGINCHECK -eq 1; then + SETORIGINCHECK_STATUS 0; fi + + $EXECPWR cp -a /bin/busybox $TMPBINBAK || exit 1 + $EXECPWR cp -a /var/lib/aegis/refhashlist $TMPHASHBAK || exit 1 + $EXECPWR cp -af $EXECPWR /bin/busybox || ROLLBACK_HARMATTAN + $EXECPWR sed -i "s/$ORIGBINARY_SHA1/$INSTBINARY_SHA1/" /var/lib/aegis/refhashlist || ROLLBACK_HARMATTAN + /usr/bin/accli -c tcb-sign -F /var/lib/aegis/refhashlist < /var/lib/aegis/refhashlist || ROLLBACK_HARMATTAN + /usr/sbin/validator-init + + if test $ORIGINCHECK -eq 1; then + SETORIGINCHECK_STATUS 1; fi + + $EXECPWR rm $TMPBINBAK + $EXECPWR rm $TMPHASHBAK + ;; + esac +} -# Set SUID bit on /bin/busybox. Privileges are automatically dropped for -# applets that do not require the SUID bit to be set -chmod u+s /bin/busybox +# Create missing symlinks to the enhanced binary +SYMLINK() { + # Load defined BusyBox applets + source $INSTALLDIR/applets + + # Get a list of supported applets by busybox-power + if test -d /tmp/busybox-power; then + $EXECPWR rm -Rf /tmp/busybox-power; fi + $EXECPWR mkdir -p /tmp/busybox-power + $EXECPWR --install -s /tmp/busybox-power + $EXECPWR ls /tmp/busybox-power/ > $INSTALLDIR/applets_supported + $EXECPWR rm -Rf /tmp/busybox-power + + # Prepare file that will keep track of installed symlinks by busybox-power + echo "# Automatically generated by busybox-power. DO NOT EDIT" > $INSTALLDIR/busybox-power.symlinks + echo -e "\nDESTINATIONS=\"$DESTINATIONS\"" >> $INSTALLDIR/busybox-power.symlinks + echo -e "\n# Installed symlinks" >> $INSTALLDIR/busybox-power.symlinks + + # Walk through all possible destinations + for DESTDIR in $DESTINATIONS; do + # Enable us to see all entries in $DESTINATION as variables + eval "APPLICATIONS=\$$DESTDIR" + + # Set destination directory accordingly + case $DESTDIR in + DEST_BIN) + DIR="/bin" + ;; + DEST_SBIN) + DIR="/sbin" + ;; + DEST_USRBIN) + DIR="/usr/bin" + ;; + DEST_USRSBIN) + DIR="/usr/sbin" + ;; + esac + + # Keep track of installed symlinks per destination + SYMLINKS="$DESTDIR=\"" + + ECHO_VERBOSE "\nSymlinking applets in $DIR" + # Walk through all applications from the current destination + for APP in $APPLICATIONS; do + # The following code is executed for all applets in the current destination + if test ! -e $DIR/$APP; then + # Check whether the applet is supported by the busybox binary + if `$EXECPWR grep -Fq "$APP" $INSTALLDIR/applets_supported`; then + ECHO_VERBOSE "Symlinking: /bin/busybox -> $DIR/$APP" + $EXECPWR ln -s /bin/busybox $DIR/$APP + SYMLINKS="$SYMLINKS $APP" + fi + fi + done + + # Write out installed symlinks + echo "$SYMLINKS\"" >> $INSTALLDIR/busybox-power.symlinks + done + + $EXECPWR rm $INSTALLDIR/applets_supported +} + +### Codepath ### +ECHO_VERBOSE "busybox-power: verbose mode" +ECHO_VERBOSE " binary: $EXECPWR" +ECHO_VERBOSE " version string: `$EXECPWR | $EXECPWR head -n 1`" +CHECK_ENV && ECHO_VERBOSE " environment: $ENVIRONMENT" + +CHECK_APPLETSFILE +CHECK_SYMLINKSFILE +if test "$ENVIRONMENT" != "SDK"; then + CHECK_ROOT +fi +BACKUP +INSTALL +if test $SYMLINK == 1; then + SYMLINK +fi