7de1d8b70f
There is not need for a bootloader file to create an uninstall firmware so one needs to provide a model. Also cleanup the install script a bit by factoring message into a function, also print them to the log so that the user can report what was printed on the screen easily. The uninstall script is quite trivial, it remounts the rootfs and restores the backed up OF to its right place. Change-Id: I1f5c0efeb965fdc7fe17f45c2753c0f52c34f7f1
157 lines
3.9 KiB
Bash
157 lines
3.9 KiB
Bash
#!/bin/sh
|
|
|
|
# NOTE: busybox is using ash, a very posix and very pedantic shell, make sure
|
|
# you test your scripts with
|
|
# busybox sh -n <script>
|
|
# and if you really, really don't want to download busybox to try it, then go
|
|
# ahead and brick your device
|
|
|
|
# The updater script on the NWZ has a major bug/feature:
|
|
# it does NOT clear the update flag if the update scrit fails
|
|
# thus causing a update/reboot loop and a bricked device
|
|
# always clear to make sure we don't end up being screwed
|
|
nvpflag fup 0xFFFFFFFF
|
|
|
|
# go to /tmp
|
|
cd /tmp
|
|
|
|
# get content partition path
|
|
CONTENTS="/contents"
|
|
CONTENTS_PART=`mount | grep contents | awk '{ print $1 }'`
|
|
|
|
# print a message to the screen and also on the standard output
|
|
# lcdprint x,y msg
|
|
lcdprint ()
|
|
{
|
|
echo $2
|
|
lcdmsg -f /usr/local/bin/font_08x12.bmp -l $1 "$2"
|
|
}
|
|
|
|
# clear screen
|
|
lcdmsg -c ""
|
|
lcdprint 0,3 "Contents partition:\n$CONTENTS_PART"
|
|
|
|
# We need to remount the contents partition in read-write mode be able to
|
|
# write something on it
|
|
lcdprint 0,6 "Remount $CONTENTS rw"
|
|
mount -o remount,rw $CONTENTS_PART $CONTENTS
|
|
if [ "$?" != 0 ]; then
|
|
lcdprint 0,15 "ERROR: remount failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# redirect all output to a log file
|
|
exec > "$CONTENTS/install_dualboot_log.txt" 2>&1
|
|
|
|
# import constants
|
|
. /install_script/constant.txt
|
|
_UPDATE_FN_=`nvpstr ufn`
|
|
ROOTFS_TMP_DIR=/tmp/rootfs
|
|
SPIDERAPP_PATH=$ROOTFS_TMP_DIR/usr/local/bin/SpiderApp
|
|
|
|
# mount root partition
|
|
lcdprint 0,7 "Mount root filesystem"
|
|
mkdir $ROOTFS_TMP_DIR
|
|
if [ "$?" != 0 ]; then
|
|
lcdprint 0,15 "ERROR: mkdir failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# If there is an ext4 mounter, try it. Otherwise or on failure, try ext3 and
|
|
# then ext2.
|
|
# NOTE some platforms probably use an mtd and this might need some fixing
|
|
if [ -e /usr/local/bin/icx_mount.ext4 ]; then
|
|
/usr/local/bin/icx_mount.ext4 $COMMON_ROOTFS_PARTITION $ROOTFS_TMP_DIR
|
|
else
|
|
false
|
|
fi
|
|
if [ "$?" != 0 ]; then
|
|
mount -t ext3 $COMMON_ROOTFS_PARTITION $ROOTFS_TMP_DIR
|
|
fi
|
|
if [ "$?" != 0 ]; then
|
|
mount -t ext2 $COMMON_ROOTFS_PARTITION $ROOTFS_TMP_DIR
|
|
fi
|
|
if [ "$?" != 0 ]; then
|
|
lcdprint 0,15 "ERROR: mount failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# rename the previous main application unless there is already a copy
|
|
lcdprint 0,8 "Backup OF"
|
|
if [ ! -e $SPIDERAPP_PATH.of ]; then
|
|
mv $SPIDERAPP_PATH $SPIDERAPP_PATH.of
|
|
fi
|
|
|
|
# extract our payload: the second file in the upgrade is a tar file
|
|
# the files in the archive have paths of the form ./absolute/path and we extract
|
|
# it at the rootfs mount it, so it can create/overwrite any file
|
|
#
|
|
# we need a small trick here: we want to pipe directly the output of the decryption
|
|
# tool to tar, to avoid using space in /tmp/ or on the user partition
|
|
lcdprint 0,9 "Install rockbox"
|
|
FIFO_FILE=/tmp/rb.fifo
|
|
mkfifo $FIFO_FILE
|
|
if [ "$?" != 0 ]; then
|
|
umount "$ROOTFS_TMP_DIR"
|
|
lcdprint 0,15 "ERROR: cannot create fifo"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
fwpchk -f /contents/$_UPDATE_FN_.UPG -c -1 $FIFO_FILE &
|
|
#tar -tvf $FIFO_FILE
|
|
tar -C $ROOTFS_TMP_DIR -xvf $FIFO_FILE
|
|
if [ "$?" != 0 ]; then
|
|
umount "$ROOTFS_TMP_DIR"
|
|
lcdprint 0,15 "ERROR: extraction failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
# wait for fwpchk
|
|
wait
|
|
if [ "$?" != 0 ]; then
|
|
umount "$ROOTFS_TMP_DIR"
|
|
lcdprint 0,15 "ERROR: no file to extract"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# create a symlink from /.rockbox to /contents/.rockbox (see dualboot code
|
|
# for why)
|
|
lcdprint 0,10 "Create rockbox symlink"
|
|
rm -f "$ROOTFS_TMP_DIR/.rockbox"
|
|
ln -s "$CONTENTS/.rockbox" "$ROOTFS_TMP_DIR/.rockbox"
|
|
if [ "$?" != 0 ]; then
|
|
umount "$ROOTFS_TMP_DIR"
|
|
lcdprint 0,15 "ERROR: cannot create rockbox symlink"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# unmount root partition
|
|
lcdprint 0,11 "Unmount root filesystem"
|
|
sync
|
|
if [ "$?" != 0 ]; then
|
|
umount "$ROOTFS_TMP_DIR"
|
|
lcdprint 0,15 "ERROR: sync failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
umount $ROOTFS_TMP_DIR
|
|
if [ "$?" != 0 ]; then
|
|
lcdprint 0,15 "ERROR: umount failed"
|
|
sleep 3
|
|
exit 0
|
|
fi
|
|
|
|
# Success screen
|
|
lcdprint 0,15 "Rebooting in 3 seconds."
|
|
sleep 3
|
|
sync
|
|
|
|
echo "Installation successful"
|
|
# finish
|
|
exit 0
|