e793a33a3c0f021de4ac67b6b83fb11b0abcdad3
[busybox-power] / debian / busybox-power.prerm
1 #!/bin/sh
2 # A script to restore /bin/busybox and delete the symlinks made during 
3 # installation.
4 #
5 # Symbolic links to applets are only removed if they are
6 # 1) created by the installer script ("install-binary.sh")
7 # 2) not replaced by a binary (i.e. they are still a symbolic link)
8 # 3) pointing to a busybox binary
9 #
10 # By Dennis Groenen <tj.groenen@gmail.com>
11 # GPLv3 licensed
12 #
13
14 INSTALLDIR="/opt/busybox-power"
15 EXECPWR="$INSTALLDIR/busybox.power"
16 DISTBIN="/bin/busybox.distrib"
17
18 VERBOSE="0"
19 MODIFIEDBIN="0"
20
21 INSTBINARY_SHA1=`sha1sum $EXECPWR | awk '{ print $1 }'`
22 if test -e $DISTBIN; then
23   ORIGBINARY_SHA1=`sha1sum $DISTBIN | awk '{ print $1 }'`; fi
24
25 # Load shared functions
26 source $INSTALLDIR/functions
27
28 # Check whether we can load the list of created symlinks during installation
29 CHECK_SYMLINKSFILE() {
30     if test ! -e $INSTALLDIR/busybox-power.symlinks; then
31       echo -e "Warning: cannot find the list of symlinks to be removed. No" \
32         "symlinks will be removed at all!\n" >> /tmp/busybox-power-error
33     fi
34 }
35
36 # Check the (integrity) of our BusyBox backup
37 CHECK_BACKUP() {
38     # Firstly, check whether the backup still exists
39     if test ! -e $DISTBIN; then
40       if test "$ENVIRONMENT" == "SDK"; then return; fi # SDK comes without BB
41       echo -e "Warning: the backup of the original BusyBox binary is missing!" \
42         "/bin/busybox will not be touched.\n" >> /tmp/busybox-power-error
43       return
44     fi
45
46     # Secondly, check the integrity of the backup
47     if test -e $INSTALLDIR/busybox.distrib.sha1; then
48       if test "`cat $INSTALLDIR/busybox.distrib.sha1`" != "$ORIGBINARY_SHA1"; then
49         if test -e $INSTALLDIR/busybox.distrib.version; then
50           if test "`cat $INSTALLDIR/busybox.distrib.version`" == "`GETBBVERSION`"; then
51             # The backup has been changed whilst busybox hasn't been upgraded
52             echo -e "Warning: the backup of the original BusyBox binary has" \
53               "been modified since installing busybox-power. Do not continue" \
54               "unless you're sure that $DISTBIN is not corrupted.\n" \
55               >> /tmp/busybox-power-error
56           fi
57         else
58           echo -e "Warning: the backup of the original BusyBox binary has" \
59           "been modified since installing busybox-power. We could not" \
60           "determine whether this is due to a BusyBox upgrade (e.g. by an" \
61           "(C)SSU update) or not. Do not continue unless either the latter is" \
62           "the case, or you're via other ways sure that $DISTBIN is not" \
63           "corrupted.\n" >> /tmp/busybox-power-error
64         fi
65       fi
66     else
67       echo -e "Warning: could not load the saved SHA1 checksum of the backup" \
68         "of the original BusyBox binary; the integrity of the backup of the" \
69         "original binary can not be guaranteed.\n" >> /tmp/busybox-power-error
70     fi
71 }
72
73 # Check whether /bin/busybox has been modified after bb-power's installation
74 # This always happens on Harmattan when it receives a BusyBox upgrade;
75 # dpkg-divert is disallowed on that platform
76 CHECK_INSTALLEDBIN() {
77     if test "$INSTBINARY_SHA1" != "`sha1sum /bin/busybox | awk '{ print $1 }'`"; then
78       MODIFIEDBIN="1"
79
80       if test "$ENVIRONMENT" == "HARMATTAN"; then
81         if test -e $INSTALLDIR/busybox.distrib.version; then
82           if test "`cat $INSTALLDIR/busybox.distrib.version`" != "`GETBBVERSION`"; then
83             # Harmattan received a BusyBox upgrade, do not disturb the user by
84             # warning that /bin/busybox has been modified
85             return
86           fi
87         fi
88         echo -e "Warning: /bin/busybox has been modified since installing" \
89           "busybox-power. This can be the result of a BusyBox upgrade (e.g." \
90           "by a Meego update). Your current /bin/busybox won't be touched." \
91           "Our backup of the original BusyBox binary will be left at" \
92           "$DISTBIN.\n" >> /tmp/busybox-power-error
93       else
94         echo -e "Warning: /bin/busybox has been modified since installing" \
95           "busybox-power. Your current /bin/busybox won't be touched and the" \
96           "diversion of /bin/busybox to $DISTBIN will not be removed.\n" \
97           >> /tmp/busybox-power-error
98       fi
99     fi
100 }
101
102 # Display encountered errors
103 DISPLAY_ERRORS() {
104     case $ENVIRONMENT in
105       SDK)
106         echo -e "\n\n-----------Attention!-----------"
107         cat /tmp/busybox-power-error
108         rm /tmp/busybox-power-error
109         echo "-> Please press [enter] to ignore the above errors/warnings."
110         echo "   Hit [ctrl-c] to break"
111         read 
112         ;;
113       DIABLO|FREMANTLE)
114         echo "Click \"I Agree\" to ignore the above errors/warnings. Ask for" \
115           "help if you don't know what to do." >> /tmp/busybox-power-error
116         echo "Please confirm the text on the screen of your device"
117         maemo-confirm-text "Attention!" /tmp/busybox-power-error
118         res=$?
119         rm /tmp/busybox-power-error
120         if test ! $res == 0; then exit 1; fi
121         ;;
122       HARMATTAN)
123         echo "Click \"I Agree\" to ignore the above errors/warnings. Ask for" \
124           "help if you don't know what to do." >> /tmp/busybox-power-error
125         echo "Please confirm the text on the screen of your device"
126         # We're too privileged to call meego-confirm-text...
127         # Our source is com.nokia.maemo, whilst m-c-t is from an unknown source
128         /usr/bin/aegis-exec meego-confirm-text "Attention!" \
129           /tmp/busybox-power-error > /dev/null 2>&1
130         res=$?
131         rm /tmp/busybox-power-error
132         if test ! $res == 0; then exit 1; fi
133         ;;
134       esac
135 }
136
137 # Rollback procedure for Harmattan based devices
138 ROLLBACK_HARMATTAN() {
139     echo -e "\nWarning: an error has occured! Rolling back..."
140     $EXECPWR cp -af $TMPBINBAK /bin/busybox
141     $EXECPWR cp -a $TMPHASHBAK /var/lib/aegis/refhashlist
142     echo "End of roll-back"
143     exit 1
144 }
145
146 # Uninstallation of the enhanced binary
147 UNINSTALL() {
148     if test $MODIFIEDBIN == 1; then
149       # /bin/busybox has been modified since installing busybox-power
150       # Leave both the file and the diversion in place
151       return
152     fi
153
154     case $ENVIRONMENT in
155       SDK|DIABLO|FREMANTLE)
156         if test -e $DISTBIN; then
157           cp -af $DISTBIN /bin/busybox
158           if test -e /bin/busybox; then
159             rm $DISTBIN; fi
160         elif test "$ENVIRONMENT" == "SDK"; then
161           # There was no /bin/busybox to begin with..
162           rm /bin/busybox
163         fi
164
165         /usr/sbin/dpkg-divert --remove /bin/busybox
166         ;;
167       HARMATTAN)
168         if ! test -e $DISTBIN; then return; fi
169
170         TMPHASHBAK=`$EXECPWR mktemp`
171         TMPBINBAK=`$EXECPWR mktemp`
172         ORIGINCHECK=`GETORIGINCHECK_STATUS`
173
174         # Useful information for Harmattan-based devices
175         ECHO_VERBOSE "refhashlist backup: $TMPHASHBAK"
176         ECHO_VERBOSE "busybox backup: $TMPBINBAK"
177         ECHO_VERBOSE "instbinary: $INSTBINARY_SHA1"
178         ECHO_VERBOSE "origbinary: $ORIGBINARY_SHA1"
179         ECHO_VERBOSE "device mode: $DEVICEMODE"
180         ECHO_VERBOSE "origincheck: $ORIGINCHECK"
181
182         if test $ORIGINCHECK -eq 1; then
183           SETORIGINCHECK_STATUS 0; fi
184
185         $EXECPWR cp -a /bin/busybox $TMPBINBAK || exit 1
186         $EXECPWR cp -a /var/lib/aegis/refhashlist $TMPHASHBAK || exit 1
187         $EXECPWR cp -af $DISTBIN /bin/busybox || ROLLBACK_HARMATTAN
188         $EXECPWR sed -i "s/$INSTBINARY_SHA1/$ORIGBINARY_SHA1/" /var/lib/aegis/refhashlist || ROLLBACK_HARMATTAN
189         /usr/bin/accli -c tcb-sign -F /var/lib/aegis/refhashlist < /var/lib/aegis/refhashlist || ROLLBACK_HARMATTAN
190         /usr/sbin/validator-init
191
192         if test $ORIGINCHECK -eq 1; then
193           SETORIGINCHECK_STATUS 1; fi
194
195         rm $TMPBINBAK
196         rm $TMPHASHBAK
197         rm $DISTBIN
198         ;;
199     esac
200 }
201
202 # Remove all symlinks that the installation script has made
203 UNSYMLINK() {
204     # Load list of installed symlinks
205     touch $INSTALLDIR/busybox-power.symlinks
206     source $INSTALLDIR/busybox-power.symlinks
207
208     # Walk through all possible destinations
209     for DESTDIR in $DESTINATIONS; do 
210       # Enable us to see all entries in $DESTINATIONS as variables
211       eval "APPLICATIONS=\$$DESTDIR"
212       # Set destination directory accordingly
213       case $DESTDIR in
214         DEST_BIN)
215           DIR="/bin"
216           ;;
217         DEST_SBIN)
218           DIR="/sbin"
219           ;;
220         DEST_USRBIN)
221           DIR="/usr/bin"
222           ;;
223         DEST_USRSBIN)
224           DIR="/usr/sbin"
225           ;;
226       esac
227
228       ECHO_VERBOSE "\nRemoving symlinks in $DIR"
229       # Walk through all applications from the current destination
230       for APP in $APPLICATIONS; do
231         # The following code is executed for every application in the current
232         # destination
233         if test -h $DIR/$APP; then 
234           # Good, this app is still a symbolic link ..
235           if test -n "`ls -l $DIR/$APP | grep busybox`"; then
236             ECHO_VERBOSE "Removing link: $DIR/$APP"
237             rm $DIR/$APP
238           fi
239         fi
240       done
241     done
242 }
243
244 # Action to be performed after restoring original busybox
245 CLEANUP() {
246     OLDFILES="busybox-power.symlinks
247       busybox.distrib.version
248       busybox.distrib.sha1"
249
250     for file in $OLDFILES; do
251       if test -e $INSTALLDIR/$file; then
252         rm $INSTALLDIR/$file
253       fi
254     done
255
256     # Clean up trap (from busybox-power <= 1.20.2power1)
257     # Should be removed by the old prerm, but may be left behind when that one
258     # fails and dpkg uses this one instead. Therefore, keep this cleanup
259     # included for a few busybox-power releases.
260     line="trap exit SIGHUP #by busybox-power"
261     if grep -F -q "$line" /etc/profile; then
262       sed "/$line/d" /etc/profile > /tmp/profile.sed
263       mv /tmp/profile.sed /etc/profile
264     fi
265 }
266
267 ### Codepath ###
268 ECHO_VERBOSE "busybox-power: verbose mode"
269 ECHO_VERBOSE "  binary: $EXECPWR"
270 ECHO_VERBOSE "  version string: `$EXECPWR | $EXECPWR head -n 1`"
271 CHECK_ENV && ECHO_VERBOSE "  environment: $ENVIRONMENT"
272
273 CHECK_SYMLINKSFILE
274 if test "$ENVIRONMENT" != "SDK"; then
275   CHECK_ROOT
276 fi
277 CHECK_BACKUP
278 CHECK_INSTALLEDBIN
279 if test -e /tmp/busybox-power-error; then
280   # An error has occured during the checks
281   DISPLAY_ERRORS
282 fi
283 UNSYMLINK
284 UNINSTALL
285 CLEANUP
286