nearly working nandroid, built against libc
diff --git a/nandroid/nandroid-mobile.sh b/nandroid/nandroid-mobile.sh
new file mode 100755
index 0000000..b5cae3d
--- /dev/null
+++ b/nandroid/nandroid-mobile.sh
@@ -0,0 +1,1790 @@
+#!/sbin/sh
+
+# nandroid v2.2.2 - an Android backup tool for the G1 by infernix and brainaid
+# restore capability added by cyanogen
+
+# pensive modified to allow to add prefixes to backups, and to restore specific backups
+# pensive added the ability to exclude various images from the restore/backup operations, allows to preserve the newer
+# recovery image if an older backup is being restored or to preserve user data. Also, saves space by not backing up
+# partitions which change rarely.
+# pensive added compressing backups and restoring compressed backups
+# pensive added fetching system updates directly from the web into /sdcard/update.zip
+# pensive added fetching system updates directly from the web into /cache and applying it.
+# pensive added moving *update*.zip from /sdcard/download where a browser puts it to /sdcard/update.zip
+# pensive added deletion of stale backups
+# pensive added backup for ext2 partition on the sdcard to switch roms
+# pensive added composite options --save NAME and --switchto NAME to switch ROMS
+# pensive added list backup anywhere on the sdcard
+# pensive added list updates (more precisely *.zip) anywhere on the sdcard
+# Amon_RA : ext restore -> added check if ext backup is existing
+# Amon_RA : ext restore -> added check if ext parition is existing
+
+# Requirements:
+
+# - a modded android in recovery mode (JF 1.3 will work by default)
+# - adb shell as root in recovery mode if not using a pre-made recovery image
+# - busybox in recovery mode
+# - dump_image-arm-uclibc compiled and in path on phone
+# - mkyaffs2image-arm-uclibc compiled and installed in path on phone
+# - flash_image-arm-uclibc compiled and in path on phone
+# - unyaffs-arm-uclibc compiled and in path on phone
+# - for [de]compression needs gzip or bzip2, part of the busybox
+# - wget for the wireless updates
+
+# Reference data:
+
+# dev: size erasesize name
+#mtd0: 00040000 00020000 "misc"
+#mtd1: 00500000 00020000 "recovery"
+#mtd2: 00280000 00020000 "boot"
+#mtd3: 04380000 00020000 "system"
+#mtd4: 04380000 00020000 "cache"
+#mtd5: 04ac0000 00020000 "userdata"
+#mtd6 is everything, dump splash1 with: dd if=/dev/mtd/mtd6ro of=/sdcard/splash1.img skip=19072 bs=2048 count=150
+
+# We don't dump misc or cache because they do not contain any useful data that we are aware of at this time.
+
+# Logical steps (v2.2.1):
+#
+# 0. test for a target dir and the various tools needed, if not found then exit with error.
+# 1. check "adb devices" for a device in recovery mode. set DEVICEID variable to the device ID. abort when not found.
+# 2. mount system and data partitions read-only, set up adb portforward and create destdir
+# 3. check free space on /cache, exit if less blocks than 20MB free
+# 4. push required tools to device in /cache
+# 5 for partitions boot recovery misc:
+# 5a get md5sum for content of current partition *on the device* (no data transfered)
+# 5b while MD5sum comparison is incorrect (always is the first time):
+# 5b1 dump current partition to a netcat session
+# 5b2 start local netcat to dump image to current dir
+# 5b3 compare md5sums of dumped data with dump in current dir. if correct, contine, else restart the loop (6b1)
+# 6 for partitions system data:
+# 6a get md5sum for tar of content of current partition *on the device* (no data transfered)
+# 6b while MD5sum comparison is incorrect (always is the first time):
+# 6b1 tar current partition to a netcat session
+# 6b2 start local netcat to dump tar to current dir
+# 6b3 compare md5sums of dumped data with dump in current dir. if correct, contine, else restart the loop (6b1)
+# 6c if i'm running as root:
+# 6c1 create a temp dir using either tempdir command or the deviceid in /tmp
+# 6c2 extract tar to tempdir
+# 6c3 invoke mkyaffs2image to create the img
+# 6c4 clean up
+# 7. remove tools from device /cache
+# 8. umount system and data on device
+# 9. print success.
+
+
+DEVICEID=foo
+RECOVERY=foo
+
+SUBNAME=""
+NORECOVERY=0
+NOBOOT=0
+NODATA=0
+NOSYSTEM=0
+NOMISC=0
+NOCACHE=0
+NOSPLASH1=0
+NOSPLASH2=0
+EXT2=0
+
+COMPRESS=0
+GETUPDATE=0
+RESTORE=0
+BACKUP=0
+DELETE=0
+WEBGET=0
+LISTBACKUP=0
+LISTUPDATE=0
+AUTOREBOOT=0
+AUTOAPPLY=0
+ITSANUPDATE=0
+ITSANIMAGE=0
+WEBGETSOURCE=""
+WEBGETTARGET="/sdcard"
+
+DEFAULTUPDATEPATH="/sdcard/download"
+
+DEFAULTWEBUPDATE=http://n0rp.chemlab.org/android/update-cm-3.6.8.1-signed.zip
+# There really should be a clone link always pointing to the latest
+#DEFAULTWEBUPDATE="http://n0rp.chemlab.org/android/latestupdate-signed.zip"
+DEFAULTWEBIMAGE=http://n0rp.chemlab.org/android/cm-recovery-1.4-signed.zip
+
+# Set up the default (for pensive at least) nameservers
+NAMESERVER1=64.46.128.3
+NAMESERVER2=64.46.128.4
+
+# WiFi works, rmnet0 setup ???
+# Do not know how to start the rmnet0 interface in recovery
+# If in normal mode "ifconfig rmnet0 down" kills rild too
+# /system/bin/rild& exits immediately, todo?
+
+
+DEVICEID=`cat /proc/cmdline | sed "s/.*serialno=//" | cut -d" " -f1`
+
+# This is the default repository for backups
+BACKUPPATH="/sdcard/nandroid/$DEVICEID"
+
+
+# Boot, Cache, Data, Ext2, Misc, Recovery, System, Splash1, Splash2
+# BACKUPLEGEND, If all the partitions are backed up it should be "CBDEMRS12"
+# Enables the user to figure at a glance what is in the backup
+BACKUPLEGEND=""
+
+# Normally we want tar to be verbose for confidence building.
+TARFLAGS="v"
+
+DEFAULTCOMPRESSOR=gzip
+DEFAULTEXT=.gz
+DEFAULTLEVEL="-1"
+
+ASSUMEDEFAULTUSERINPUT=0
+
+echo2log()
+{
+ if [ -e /cache/recovery/log ]; then
+ echo $1 >>/cache/recovery/log
+ else
+ echo $1 >/cache/recovery/log
+ fi
+}
+
+batteryAtLeast()
+{
+ REQUIREDLEVEL=$1
+ ENERGY=`cat /sys/class/power_supply/battery/capacity`
+ if [ "`cat /sys/class/power_supply/battery/status`" == "Charging" ]; then
+ ENERGY=100
+ fi
+ if [ ! $ENERGY -ge $REQUIREDLEVEL ]; then
+ $ECHO "Error: not enough battery power, need at least $REQUIREDLEVEL%."
+ $ECHO "Connect charger or USB power and try again"
+ exit 1
+ fi
+}
+
+if [ "`echo $0 | grep /sbin/nandroid-mobile.sh`" == "" ]; then
+ cp $0 /sbin
+ chmod 755 /sbin/`basename $0`
+ exec /sbin/`basename $0` $@
+fi
+
+
+# Hm, have to handle old options for the current UI
+case $1 in
+ restore)
+ shift
+ RESTORE=1
+ ;;
+ backup)
+ shift
+ BACKUP=1
+ ;;
+ --)
+ ;;
+esac
+
+ECHO=echo
+OUTPUT=""
+
+for option in $(getopt --name="nandroid-mobile v2.2.2" -l norecovery -l noboot -l nodata -l nosystem -l nocache -l nomisc -l nosplash1 -l nosplash2 -l subname: -l backup -l restore -l compress -l getupdate -l delete -l path -l webget: -l webgettarget: -l nameserver: -l nameserver2: -l bzip2: -l defaultinput -l autoreboot -l autoapplyupdate -l ext2 -l save: -l switchto: -l listbackup -l listupdate -l silent -l quiet -l help -- "cbruds:p:eql" "$@"); do
+ case $option in
+ --silent)
+ ECHO=echo2log
+ ASSUMEDEFAULTUSERINPUT=1
+ TARFLAGS=""
+ OUTPUT=>>/cache/recovery/log
+ shift
+ ;;
+ --quiet)
+ ECHO=echo2log
+ ASSUMEDEFAULTUSERINPUT=1
+ TARFLAGS=""
+ OUTPUT=>>/cache/recovery/log
+ shift
+ ;;
+ -q)
+ ECHO=echo2log
+ ASSUMEDEFAULTUSERINPUT=1
+ TARFLAGS=""
+ OUTPUT=>>/cache/recovery/log
+ shift
+ ;;
+ --help)
+ ECHO=echo
+ $ECHO "Usage: $0 {--backup|--restore|--getupdate|--delete|--compress|--bzip2:ARG|--webget:URL|--listbackup|--listupdate} [options]"
+ $ECHO ""
+ $ECHO "--help Display this help"
+ $ECHO ""
+ $ECHO "-s | --subname: SUBSTRING In case of --backup the SUBSTRING is"
+ $ECHO " the prefix used with backup name"
+ $ECHO " in case of --restore or -c|--compress|--bzip2 or"
+ $ECHO " --delete SUBSTRING specifies backups on which to"
+ $ECHO " operate"
+ $ECHO ""
+ $ECHO "-u | --getupdate Will search /sdcard/download for files named"
+ $ECHO " *update*.zip, will prompt the user"
+ $ECHO " to narrow the choice if more than one is found,"
+ $ECHO " and then move the latest, if not unique,"
+ $ECHO " to sdcard root /sdcard with the update.zip name"
+ $ECHO " It is assumed the browser was used to put the *.zip"
+ $ECHO " in the /sdcard/download folder. -p|--path option"
+ $ECHO " would override /sdcard/download with the path of your"
+ $ECHO " choosing."
+ $ECHO ""
+ $ECHO "-p | --path DIR Requires an ARGUMENT, which is the path to where "
+ $ECHO " the backups are stored, can be used"
+ $ECHO " when the default path /sdcard/nandroid/$DEVICEID "
+ $ECHO " needs to be changed"
+ $ECHO ""
+ $ECHO "-b | --backup Will store a full system backup on $BACKUPPATH"
+ $ECHO " One can suppress backup of any image however with options"
+ $ECHO " starting with --no[partionname]"
+ $ECHO ""
+ $ECHO "-e | --ext2 Preserve the contents of the ext2 partition along with"
+ $ECHO " the other partitions being backed up, to easily switch roms."
+ $ECHO ""
+ $ECHO "-r | --restore Will restore the last made backup which matches --subname"
+ $ECHO " ARGUMENT for boot, system, recovery and data"
+ $ECHO " unless suppressed by other options"
+ $ECHO " if no --subname is supplied and the user fails to"
+ $ECHO " provide any input then the latest backup is used"
+ $ECHO " When restoring compressed backups, the images will remain"
+ $ECHO " decompressed after the restore, you need to use -c|-compress"
+ $ECHO " or --bzip2 to compress the backup again"
+ $ECHO ""
+ $ECHO "-d | --delete Will remove backups whose names match --subname ARGUMENT"
+ $ECHO " Will allow to narrow down, will ask if the user is certain."
+ $ECHO " Removes one backup at a time, repeat to remove multiple backups"
+ $ECHO ""
+ $ECHO "-c | --compress Will operate on chosen backups to compress image files,"
+ $ECHO " resulting in saving of about 40MB out of 90+mb,"
+ $ECHO " i.e. up to 20 backups can be stored in 1 GIG, if this "
+ $ECHO " option is turned on with --backup, the resulting backup will"
+ $ECHO " be compressed, no effect if restoring since restore will"
+ $ECHO " automatically uncompress compressed images if space is available"
+ $ECHO ""
+ $ECHO "--bzip2: -# Turns on -c|--compress and uses bzip2 for compression instead"
+ $ECHO " of gzip, requires an ARG -[1-9] compression level"
+ $ECHO ""
+ $ECHO "--webget: URL|\"\" Requires an argument, a valid URL for an *update*.zip file"
+ $ECHO " If a null string is passed then the default URL is used"
+ $ECHO " Will also create an update.MD5sum file and update.name with the"
+ $ECHO " original file name."
+ $ECHO ""
+ $ECHO "--nameserver: IP addr Provide the first nameserver IP address, to override the default"
+ $ECHO ""
+ $ECHO "--nameserver2: IP addr Provide the second nameserver IP address, to override the default"
+ $ECHO ""
+ $ECHO "--webgettarget: DIR Target directory to deposit the fetched update, default is"
+ $ECHO " /sdcard"
+ $ECHO ""
+ $ECHO "--norecovery Will suppress restore/backup of the recovery partition"
+ $ECHO " If recovery.img was not part of the backup, no need to use this"
+ $ECHO " option as the nandroid will not attempt to restore it, same goes"
+ $ECHO " for all the options below"
+ $ECHO ""
+ $ECHO "--noboot Will suppress restore/backup of the boot partition"
+ $ECHO ""
+ $ECHO "--nodata Will suppress restore/backup of the data partition"
+ $ECHO ""
+ $ECHO "--nosystem Will suppress restore/backup of the system partition"
+ $ECHO ""
+ $ECHO "--nocache Will suppress restore/backup of the cache partition"
+ $ECHO ""
+ $ECHO "--nomisc Will suppress restore/backup of the misc partition"
+ $ECHO ""
+ $ECHO "--nosplash1 Will suppress restore/backup of the splash1 partition"
+ $ECHO ""
+ $ECHO "--nosplash2 Will suppress restore/backup of the splash2 partition"
+ $ECHO ""
+ $ECHO "--defaultinput Makes nandroid-mobile non-interactive, assumes default"
+ $ECHO " inputs from the user."
+ $ECHO ""
+ $ECHO "--autoreboot Automatically reboot the phone after a backup, especially"
+ $ECHO " useful when the compression options are on -c|--compress| "
+ $ECHO " --bzip2 -level since the compression op takes time and"
+ $ECHO " you may want to go to sleep or do something else, and"
+ $ECHO " when a backup is over you want the calls and mms coming"
+ $ECHO " through, right?"
+ $ECHO ""
+ $ECHO "--autoapplyupdate Once the specific update is downloaded or chosen from the"
+ $ECHO " sdcard, apply it immediately. This option is valid as a "
+ $ECHO " modifier for either --webget or --getupdate options."
+ $ECHO ""
+ $ECHO "-e|--ext2 Save the contents of ext2 partition in the backup folder too."
+ $ECHO " Enables to keep different sets of apps for different ROMS and"
+ $ECHO " switch easily between them."
+ $ECHO ""
+ $ECHO "--save: ROMTAG Preserve EVERYTHING under ROMTAG name, a composite option,"
+ $ECHO " it uses several other options."
+ $ECHO ""
+ $ECHO "--switchto: ROMTAG Restores your entire environment including app2sd apps, cache"
+ $ECHO " to the ROM environment named ROMTAG."
+ $ECHO ""
+ $ECHO "-q|--quiet|--silent Direct all the output to the recovery log, and assume default"
+ $ECHO " user inputs."
+ $ECHO ""
+ $ECHO "-l|--listbackup Will search the entire SDCARD for backup folders and will dump"
+ $ECHO " the list to stdout for use by the UI. Should be run with --silent"
+ $ECHO ""
+ $ECHO "--listupdate Will search the entire SDCARD for updates and will dump"
+ $ECHO " the list to stdout for use by the UI. Should be run with --silent"
+ exit 0
+ ;;
+ --norecovery)
+ NORECOVERY=1
+ #$ECHO "No recovery"
+ shift
+ ;;
+ --noboot)
+ NOBOOT=1
+ #$ECHO "No boot"
+ shift
+ ;;
+ --nodata)
+ NODATA=1
+ #$ECHO "No data"
+ shift
+ ;;
+ --nosystem)
+ NOSYSTEM=1
+ #$ECHO "No system"
+ shift
+ ;;
+ --nocache)
+ NOCACHE=1
+ #$ECHO "No cache"
+ shift
+ ;;
+ --nomisc)
+ NOMISC=1
+ #$ECHO "No misc"
+ shift
+ ;;
+ --nosplash1)
+ NOSPLASH1=1
+ #$ECHO "No splash1"
+ shift
+ ;;
+ --nosplash2)
+ NOSPLASH2=1
+ #$ECHO "No splash2"
+ shift
+ ;;
+ --backup)
+ BACKUP=1
+ #$ECHO "backup"
+ shift
+ ;;
+ -b)
+ BACKUP=1
+ #$ECHO "backup"
+ shift
+ ;;
+ -e)
+ EXT2=1
+ shift
+ ;;
+ --ext2)
+ EXT2=1
+ shift
+ ;;
+ --restore)
+ RESTORE=1
+ #$ECHO "restore"
+ shift
+ ;;
+ -r)
+ RESTORE=1
+ #$ECHO "restore"
+ shift
+ ;;
+ --compress)
+ COMPRESS=1
+ #$ECHO "Compress"
+ shift
+ ;;
+ -c)
+ COMPRESS=1
+ #$ECHO "Compress"
+ shift
+ ;;
+ --bzip2)
+ COMPRESS=1
+ DEFAULTCOMPRESSOR=bzip2
+ DEFAULTEXT=.bz2
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ DEFAULTLEVEL="$2"
+ shift
+ ;;
+ --getupdate)
+ GETUPDATE=1
+ shift
+ ;;
+ -u)
+ GETUPDATE=1
+ shift
+ ;;
+ --subname)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ #$ECHO $2
+ SUBNAME="$2"
+ shift
+ ;;
+ -s)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ #$ECHO $2
+ SUBNAME="$2"
+ shift
+ ;;
+ --path)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ #$ECHO $2
+ BACKUPPATH="$2"
+ DEFAULTUPDATEPATH="$2"
+ shift 2
+ ;;
+ -p)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ #$ECHO $2
+ BACKUPPATH="$2"
+ shift 2
+ ;;
+ --delete)
+ DELETE=1
+ shift
+ ;;
+ -d)
+ DELETE=1
+ shift
+ ;;
+ --webgettarget)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ WEBGETTARGET="$2"
+ shift
+ ;;
+ --webget)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ #$ECHO "WEBGET"
+ # if the argument is "" stick with the default: /sdcard
+ if [ ! "$2" == "" ]; then
+ WEBGETSOURCE="$2"
+ fi
+ WEBGET=1
+ shift
+ ;;
+ --nameserver)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ NAMESERVER1="$2"
+ shift
+ ;;
+ --nameserver2)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ NAMESERVER2="$2"
+ shift
+ ;;
+ --defaultinput)
+ ASSUMEDEFAULTUSERINPUT=1
+ shift
+ ;;
+ --autoreboot)
+ AUTOREBOOT=1
+ shift
+ ;;
+ --autoapplyupdate)
+ AUTOAPPLY=1
+ shift
+ ;;
+ --save)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ SUBNAME="$2"
+ BACKUP=1
+ ASSUMEDEFAULTUSERINPUT=1
+ EXT2=1
+ COMPRESS=1
+ shift
+ ;;
+ --switchto)
+ if [ "$2" == "$option" ]; then
+ shift
+ fi
+ SUBNAME="$2"
+ RESTORE=1
+ ASSUMEDEFAULTUSERINPUT=1
+ EXT2=1
+ shift
+ ;;
+ -l)
+ shift
+ LISTBACKUP=1
+ ;;
+ --listbackup)
+ shift
+ LISTBACKUP=1
+ ;;
+ --listupdate)
+ shift
+ LISTUPDATE=1
+ ;;
+ --)
+ shift
+ break
+ ;;
+ esac
+done
+
+$ECHO ""
+$ECHO "nandroid-mobile v2.2.1"
+$ECHO ""
+
+let OPS=$BACKUP
+let OPS=$OPS+$RESTORE
+let OPS=$OPS+$DELETE
+let OPS=$OPS+$WEBGET
+let OPS=$OPS+$GETUPDATE
+let OPS=$OPS+$LISTBACKUP
+let OPS=$OPS+$LISTUPDATE
+
+if [ "$OPS" -ge 2 ]; then
+ ECHO=echo
+ $ECHO "--backup, --restore, --delete, --webget, --getupdate, --listbackup, --listupdate are mutually exclusive operations."
+ $ECHO "Please, choose one and only one option!"
+ $ECHO "Aborting."
+ exit 1
+fi
+
+let OPS=$OPS+$COMPRESS
+
+if [ "$OPS" -lt 1 ]; then
+ ECHO=echo
+ $ECHO "Usage: $0 {-b|--backup|-r|--restore|-d|--delete|-u|--getupdate|--webget|-c|--compress|--bzip2 -level|-l|--listbackup|--listupdate} [options]"
+ $ECHO "At least one operation must be defined, try $0 --help for more information."
+ exit 0
+fi
+
+
+if [ "$LISTBACKUP" == 1 ]; then
+ umount /sdcard 2>/dev/null
+ mount /sdcard 2>/dev/null
+ CHECK=`mount | grep /sdcard`
+ if [ "$CHECK" == "" ]; then
+ echo "Error: sdcard not mounted, aborting."
+ exit 1
+ else
+ find /sdcard | grep nandroid.md5 | sed s/.gz//g | sed s/.bz2//g | sed s/nandroid.md5//g
+ umount /sdcard 2>/dev/null
+ exit 0
+ fi
+fi
+
+if [ "$LISTUPDATE" == 1 ]; then
+ umount /sdcard 2>/dev/null
+ mount /sdcard 2>/dev/null
+ CHECK=`mount | grep /sdcard`
+ if [ "$CHECK" == "" ]; then
+ echo "Error: sdcard not mounted, aborting."
+ exit 1
+ else
+ find /sdcard | grep .zip
+ umount /sdcard 2>/dev/null
+ exit 0
+ fi
+fi
+
+# Make sure it exists
+touch /cache/recovery/log
+
+
+if [ "$AUTOAPPLY" == 1 -a "$WEBGET" == 0 -a "$GETUPDATE" == 0 ]; then
+ ECHO=echo
+ $ECHO "The --autoapplyupdate option is valid only in conjunction with --webget or --getupdate."
+ $ECHO "Aborting."
+ exit 1
+fi
+
+if [ "$COMPRESS" == 1 ]; then
+ $ECHO "Compressing with $DEFAULTCOMPRESSOR, level $DEFAULTLEVEL"
+fi
+
+if [ "$WEBGET" == 1 ]; then
+ $ECHO "Fetching $WEBGETSOURCE to target folder: $WEBGETTARGET"
+fi
+
+if [ ! "$SUBNAME" == "" ]; then
+ if [ "$BACKUP" == 1 ]; then
+ if [ "$COMPRESS" == 1 ]; then
+ $ECHO "Using $SUBNAME- prefix to create a compressed backup folder"
+ else
+ $ECHO "Using $SUBNAME- prefix to create a backup folder"
+ fi
+ else
+ if [ "$RESTORE" == 1 -o "$DELETE" == 1 -o "$COMPRESS" == 1 ]; then
+ $ECHO "Searching for backup directories, matching $SUBNAME, to delete or restore"
+ $ECHO "or compress"
+ $ECHO ""
+ fi
+ fi
+else
+ if [ "$BACKUP" == 1 ]; then
+ $ECHO "Using G1 keyboard, enter a prefix substring and then <CR>"
+ $ECHO -n "or just <CR> to accept default: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read SUBNAME
+ else
+ $ECHO "Accepting default."
+ fi
+ $ECHO ""
+ if [ "$COMPRESS" == 1 ]; then
+ $ECHO "Using $SUBNAME- prefix to create a compressed backup folder"
+ else
+ $ECHO "Using $SUBNAME- prefix to create a backup folder"
+ fi
+ $ECHO ""
+ else
+ if [ "$RESTORE" == 1 -o "$DELETE" == 1 -o "$COMPRESS" == 1 ]; then
+ $ECHO "Using G1 keyboard, enter a directory name substring and then <CR>"
+ $ECHO -n "to find matches or just <CR> to accept default: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read SUBNAME
+ else
+ $ECHO "Accepting default."
+ fi
+ $ECHO ""
+ $ECHO "Using $SUBNAME string to search for matching backup directories"
+ $ECHO ""
+ fi
+ fi
+fi
+
+if [ "$BACKUP" == 1 ]; then
+ mkyaffs2image=`which mkyaffs2image`
+ if [ "$mkyaffs2image" == "" ]; then
+ mkyaffs2image=`which mkyaffs2image-arm-uclibc`
+ if [ "$mkyaffs2image" == "" ]; then
+ $ECHO "error: mkyaffs2image or mkyaffs2image-arm-uclibc not found in path"
+ exit 1
+ fi
+ fi
+ dump_image=`which dump_image`
+ if [ "$dump_image" == "" ]; then
+ dump_image=`which dump_image-arm-uclibc`
+ if [ "$dump_image" == "" ]; then
+ $ECHO "error: dump_image or dump_image-arm-uclibc not found in path"
+ exit 1
+ fi
+ fi
+fi
+
+if [ "$RESTORE" == 1 ]; then
+ flash_image=`which flash_image`
+ if [ "$flash_image" == "" ]; then
+ flash_image=`which flash_image-arm-uclibc`
+ if [ "$flash_image" == "" ]; then
+ $ECHO "error: flash_image or flash_image-arm-uclibc not found in path"
+ exit 1
+ fi
+ fi
+ unyaffs=`which unyaffs`
+ if [ "$unyaffs" == "" ]; then
+ unyaffs=`which unyaffs-arm-uclibc`
+ if [ "$unyaffs" == "" ]; then
+ $ECHO "error: unyaffs or unyaffs-arm-uclibc not found in path"
+ exit 1
+ fi
+ fi
+fi
+if [ "$COMPRESS" == 1 ]; then
+ compressor=`busybox | grep $DEFAULTCOMPRESSOR`
+ if [ "$compressor" == "" ]; then
+ $ECHO "Warning: busybox/$DEFAULTCOMPRESSOR is not found"
+ $ECHO "No compression operations will be performed"
+ COMPRESS=0
+ else
+ $ECHO "Found $DEFAULTCOMPRESSOR, will compress the backup"
+ fi
+fi
+
+# 1
+DEVICEID=`cat /proc/cmdline | sed "s/.*serialno=//" | cut -d" " -f1`
+RECOVERY=`cat /proc/cmdline | grep "androidboot.mode=recovery"`
+if [ "$RECOVERY" == "foo" ]; then
+ $ECHO "Error: Must be in recovery mode, aborting"
+ exit 1
+fi
+if [ "$DEVICEID" == "foo" ]; then
+ $ECHO "Error: device id not found in /proc/cmdline, aborting"
+ exit 1
+fi
+if [ ! "`id -u 2>/dev/null`" == "0" ]; then
+ if [ "`whoami 2>&1 | grep 'uid 0'`" == "" ]; then
+ $ECHO "Error: must run as root, aborting"
+ exit 1
+ fi
+fi
+
+
+if [ "$RESTORE" == 1 ]; then
+ batteryAtLeast 30
+# ENERGY=`cat /sys/class/power_supply/battery/capacity`
+# if [ "`cat /sys/class/power_supply/battery/status`" == "Charging" ]; then
+# ENERGY=100
+# fi
+# if [ ! $ENERGY -ge 30 ]; then
+# $ECHO "Error: not enough battery power"
+# $ECHO "Connect charger or USB power and try again"
+# exit 1
+# fi
+
+
+ umount /sdcard 2>/dev/null
+ mount /sdcard 2>/dev/null
+ if [ "`mount | grep sdcard`" == "" ]; then
+ $ECHO "error: unable to mount /sdcard, aborting"
+ exit 1
+ fi
+
+ # find the latest backup, but show the user other options
+ $ECHO ""
+ $ECHO "Looking for the latest backup, will display other choices!"
+ $ECHO ""
+
+ RESTOREPATH=`ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | tail -1`
+ $ECHO " "
+
+ if [ "$RESTOREPATH" = "" ];
+ then
+ $ECHO "Error: no backups found"
+ exit 2
+ else
+ $ECHO "Default backup is the latest: $RESTOREPATH"
+ $ECHO ""
+ $ECHO "Other available backups are: "
+ $ECHO ""
+ ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | grep -v $RESTOREPATH $OUTPUT
+ $ECHO ""
+ $ECHO "Using G1 keyboard, enter a unique name substring to change it and <CR>"
+ $ECHO -n "or just <CR> to accept: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read SUBSTRING
+ else
+ $ECHO "Accepting default."
+ SUBSTRING=""
+ fi
+ $ECHO ""
+
+ if [ ! "$SUBSTRING" == "" ]; then
+ RESTOREPATH=`ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | grep $SUBSTRING | tail -1`
+ else
+ RESTOREPATH=`ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | tail -1`
+ fi
+ if [ "$RESTOREPATH" = "" ]; then
+ $ECHO "Error: no matching backups found, aborting"
+ exit 2
+ fi
+ fi
+
+ $ECHO "Restore path: $RESTOREPATH"
+ $ECHO ""
+
+ umount /system /data 2>/dev/null
+ mount /system 2>/dev/null
+ mount /data 2>/dev/null
+ if [ "`mount | grep data`" == "" ]; then
+ $ECHO "error: unable to mount /data, aborting"
+ exit 1
+ fi
+ if [ "`mount | grep system`" == "" ]; then
+ $ECHO "error: unable to mount /system, aborting"
+ exit 1
+ fi
+
+ CWD=$PWD
+ cd $RESTOREPATH
+
+ DEFAULTEXT=""
+ if [ `ls *.bz2 2>/dev/null|wc -l` -ge 1 ]; then
+ DEFAULTCOMPRESSOR=bzip2
+ DEFAULTDECOMPRESSOR=bunzip2
+ DEFAULTEXT=.bz2
+ fi
+ if [ `ls *.gz 2>/dev/null|wc -l` -ge 1 ]; then
+ DEFAULTCOMPRESSOR=gzip
+ DEFAULTDECOMPRESSOR=gunzip
+ DEFAULTEXT=.gz
+ fi
+
+ if [ ! -f $RESTOREPATH/nandroid.md5$DEFAULTEXT ]; then
+ $ECHO "error: $RESTOREPATH/nandroid.md5 not found, cannot verify backup data"
+ exit 1
+ fi
+
+ if [ `ls *.bz2 2>/dev/null|wc -l` -ge 1 -o `ls *.gz 2>/dev/null|wc -l` -ge 1 ]; then
+ $ECHO "This backup is compressed with $DEFAULTCOMPRESSOR."
+
+ # Make sure that $DEFAULT[DE]COMPRESSOR exists
+ if [ `busybox | grep $DEFAULTCOMPRESSOR | wc -l` -le 0 -a\
+ `busybox | grep $DEFAULTDECOMPRESSOR | wc -l` -le 0 ]; then
+
+ $ECHO "You do not have either the $DEFAULTCOMPRESSOR or the $DEFAULTDECOMPRESSOR"
+ $ECHO "to unpack this backup, cleaning up and aborting!"
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+ exit 1
+ fi
+ $ECHO "Checking free space /sdcard for the decompression operation."
+ FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
+ # we need about 100MB for gzip to uncompress the files
+ if [ $FREEBLOCKS -le 100000 ]; then
+ $ECHO "Error: not enough free space available on sdcard (need about 100mb)"
+ $ECHO "to perform restore from the compressed images, aborting."
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+ exit 1
+ fi
+ $ECHO "Decompressing images, please wait...."
+ $ECHO ""
+ # Starting from the largest while we still have more space to reduce
+ # space requirements
+ $DEFAULTCOMPRESSOR -d `ls -S *$DEFAULTEXT`
+ $ECHO "Backup images decompressed"
+ $ECHO ""
+ fi
+
+ $ECHO "Verifying backup images..."
+ md5sum -c nandroid.md5
+ if [ $? -eq 1 ]; then
+ $ECHO "Error: md5sum mismatch, aborting"
+ exit 1
+ fi
+
+ if [ `ls boot* 2>/dev/null | wc -l` == 0 ]; then
+ NOBOOT=1
+ fi
+ if [ `ls recovery* 2>/dev/null | wc -l` == 0 ]; then
+ NORECOVERY=1
+ fi
+ if [ `ls data* 2>/dev/null | wc -l` == 0 ]; then
+ NODATA=1
+ fi
+ if [ `ls system* 2>/dev/null | wc -l` == 0 ]; then
+ NOSYSTEM=1
+ fi
+ # Amon_RA : If there's no ext backup set EXT2 to 0 so ext2 restore doesn't start
+ if [ `ls ext2* 2>/dev/null | wc -l` == 0 ]; then
+ EXT2=0
+ fi
+
+ for image in boot recovery; do
+ if [ "$NOBOOT" == "1" -a "$image" == "boot" ]; then
+ $ECHO ""
+ $ECHO "Not flashing boot image!"
+ $ECHO ""
+ continue
+ fi
+ if [ "$NORECOVERY" == "1" -a "$image" == "recovery" ]; then
+ $ECHO ""
+ $ECHO "Not flashing recovery image!"
+ $ECHO ""
+ continue
+ fi
+ $ECHO "Flashing $image..."
+ $flash_image $image $image.img $OUTPUT
+ done
+
+ for image in data system; do
+ if [ "$NODATA" == "1" -a "$image" == "data" ]; then
+ $ECHO ""
+ $ECHO "Not restoring data image!"
+ $ECHO ""
+ continue
+ fi
+ if [ "$NOSYSTEM" == "1" -a "$image" == "system" ]; then
+ $ECHO ""
+ $ECHO "Not restoring system image!"
+ $ECHO ""
+ continue
+ fi
+ $ECHO "Erasing /$image..."
+ cd /$image
+ rm -rf * 2>/dev/null
+ $ECHO "Unpacking $image image..."
+ $unyaffs $RESTOREPATH/$image.img $OUTPUT
+ cd /
+ sync
+ umount /$image
+ done
+
+ if [ "$EXT2" == 1 ]; then
+ # Amon_RA : Check if there's an ext partition before starting to restore
+ if [ -e /dev/block/mmcblk0p2 ]; then
+ $ECHO "Restoring the ext2 contents."
+ CWD=`pwd`
+ cd /
+
+ if [ `mount | grep /system | wc -l` == 0 ]; then
+ mount /system
+ else
+ mount -o rw,remount /system
+ fi
+
+ if [ `mount | grep /system/sd | wc -l` == 0 ]; then
+ mount /system/sd
+ fi
+
+ cd $CWD
+ CHECK=`mount | grep /system/sd`
+
+ if [ "$CHECK" == "" ]; then
+ $ECHO "Warning: --ext2 specified but unable to mount the ext2 partition."
+ $ECHO "Warning: your phone may be in an inconsistent state on reboot."
+ exit 1
+ else
+ CWD=`pwd`
+ cd /system/sd
+ # Depending on whether the ext2 backup is compressed we do either or.
+ if [ -e $RESTOREPATH/ext2.tar ]; then
+ rm -rf * 2>/dev/null
+ tar -x$TARFLAGS -f $RESTOREPATH/ext2.tar
+ else
+ if [ -e $RESTOREPATH/ext2.tgz ]; then
+ rm -rf * 2>/dev/null
+ tar -x$TARFLAGS -zf $RESTOREPATH/ext2.tgz
+ else
+ if [ -e $RESTOREPATH/ext2.tar.bz2 ]; then
+ rm -rf * 2>/dev/null
+ tar -x$TARFLAGS -jf $RESTOREPATH/ext2.tar.bz2
+ else
+ $ECHO "Warning: --ext2 specified but cannot find the ext2 backup."
+ $ECHO "Warning: your phone may be in an inconsistent state on reboot."
+ fi
+ fi
+ fi
+ cd $CWD
+ sync
+ umount /system/sd
+ umount /system
+
+ fi
+ else
+ # Amon_RA : Just display a warning
+ $ECHO "Warning: --ext2 specified but ext2 partition present on sdcard"
+ $ECHO "Warning: your phone may be in an inconsistent state on reboot."
+ fi
+ fi
+ $ECHO "Restore done"
+ exit 0
+fi
+
+# 2.
+if [ "$BACKUP" == 1 ]; then
+
+ if [ "$COMPRESS" == 1 ]; then
+ ENERGY=`cat /sys/class/power_supply/battery/capacity`
+ if [ "`cat /sys/class/power_supply/battery/status`" == "Charging" ]; then
+ ENERGY=100
+ fi
+ if [ ! $ENERGY -ge 30 ]; then
+ $ECHO "Warning: Not enough battery power to perform compression."
+ COMPRESS=0
+ $ECHO "Turning off compression option, you can compress the backup later"
+ $ECHO "with the compression options."
+ fi
+ fi
+
+$ECHO "mounting system and data read-only, sdcard read-write"
+umount /system 2>/dev/null
+umount /data 2>/dev/null
+umount /sdcard 2>/dev/null
+mount -o ro /system || FAIL=1
+mount -o ro /data || FAIL=2
+mount /sdcard || mount /dev/block/mmcblk0 /sdcard || FAIL=3
+case $FAIL in
+ 1) $ECHO "Error mounting system read-only"; umount /system /data /sdcard; exit 1;;
+ 2) $ECHO "Error mounting data read-only"; umount /system /data /sdcard; exit 1;;
+ 3) $ECHO "Error mounting sdcard read-write"; umount /system /data /sdcard; exit 1;;
+esac
+
+if [ ! "$SUBNAME" == "" ]; then
+ SUBNAME=$SUBNAME-
+fi
+
+# Identify the backup with what partitions have been backed up
+if [ "$NOBOOT" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"B"
+fi
+if [ "$NOCACHE" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"C"
+fi
+if [ "$NODATA" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"D"
+fi
+if [ "$EXT2" == 1 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"E"
+fi
+if [ "$NOMISC" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"M"
+fi
+if [ "$NORECOVERY" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"R"
+fi
+if [ "$NOSYSTEM" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"S"
+fi
+
+if [ ! -e /dev/mtd/mtd6ro ]; then
+ NOSPLASH1=1
+ NOSPLASH2=1
+fi
+
+if [ "$NOSPLASH1" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"1"
+fi
+if [ "$NOSPLASH2" == 0 ]; then
+ BACKUPLEGEND=$BACKUPLEGEND"2"
+fi
+
+if [ ! "$BACKUPLEGEND" == "" ]; then
+ BACKUPLEGEND=$BACKUPLEGEND-
+fi
+
+
+TIMESTAMP="`date +%Y%m%d-%H%M`"
+DESTDIR="$BACKUPPATH/$SUBNAME$BACKUPLEGEND$TIMESTAMP"
+if [ ! -d $DESTDIR ]; then
+ mkdir -p $DESTDIR
+ if [ ! -d $DESTDIR ]; then
+ $ECHO "error: cannot create $DESTDIR"
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+ exit 1
+ fi
+else
+ touch $DESTDIR/.nandroidwritable
+ if [ ! -e $DESTDIR/.nandroidwritable ]; then
+ $ECHO "error: cannot write to $DESTDIR"
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+ exit 1
+ fi
+ rm $DESTDIR/.nandroidwritable
+fi
+
+# 3.
+$ECHO "checking free space on sdcard"
+FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
+# we need about 130MB for the dump
+if [ $FREEBLOCKS -le 130000 ]; then
+ $ECHO "Error: not enough free space available on sdcard (need 130mb), aborting."
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+ exit 1
+fi
+
+
+
+if [ -e /dev/mtd/mtd6ro ]; then
+ if [ "$NOSPLASH1" == 0 ]; then
+ $ECHO -n "Dumping splash1 from device over tcp to $DESTDIR/splash1.img..."
+ dd if=/dev/mtd/mtd6ro of=$DESTDIR/splash1.img skip=19072 bs=2048 count=150 2>/dev/null
+ $ECHO "done"
+ sleep 1s
+ else
+ $ECHO "Dump of the splash1 image suppressed."
+ fi
+ if [ "$NOSPLASH2" == 0 ]; then
+ $ECHO -n "Dumping splash2 from device over tcp to $DESTDIR/splash2.img..."
+ dd if=/dev/mtd/mtd6ro of=$DESTDIR/splash2.img skip=19456 bs=2048 count=150 2>/dev/null
+ $ECHO "done"
+ else
+ $ECHO "Dump of the splash2 image suppressed."
+ fi
+fi
+
+
+# 5.
+for image in boot recovery misc; do
+
+ case $image in
+ boot)
+ if [ "$NOBOOT" == 1 ]; then
+ $ECHO "Dump of the boot partition suppressed."
+ continue
+ fi
+ ;;
+ recovery)
+ if [ "$NORECOVERY" == 1 ]; then
+ $ECHO "Dump of the recovery partition suppressed."
+ continue
+ fi
+ ;;
+ misc)
+ if [ "$NOMISC" == 1 ]; then
+ $ECHO "Dump of the misc partition suppressed."
+ continue
+ fi
+ ;;
+ esac
+
+ # 5a
+ DEVICEMD5=`$dump_image $image - | md5sum | awk '{ print $1 }'`
+ sleep 1s
+ MD5RESULT=1
+ # 5b
+ $ECHO -n "Dumping $image to $DESTDIR/$image.img..."
+ ATTEMPT=0
+ while [ $MD5RESULT -eq 1 ]; do
+ let ATTEMPT=$ATTEMPT+1
+ # 5b1
+ $dump_image $image $DESTDIR/$image.img $OUTPUT
+ sync
+ # 5b3
+ echo "${DEVICEMD5} $DESTDIR/$image.img" | md5sum -c -s - $OUTPUT
+ if [ $? -eq 1 ]; then
+ true
+ else
+ MD5RESULT=0
+ fi
+ if [ "$ATTEMPT" == "5" ]; then
+ $ECHO "Fatal error while trying to dump $image, aborting."
+ umount /system
+ umount /data
+ umount /sdcard
+ exit 1
+ fi
+ done
+ $ECHO "done"
+done
+
+# 6
+for image in system data cache; do
+ case $image in
+ system)
+ if [ "$NOSYSTEM" == 1 ]; then
+ $ECHO "Dump of the system partition suppressed."
+ continue
+ fi
+ ;;
+ data)
+ if [ "$NODATA" == 1 ]; then
+ $ECHO "Dump of the data partition suppressed."
+ continue
+ fi
+ ;;
+ cache)
+ if [ "$NOCACHE" == 1 ]; then
+ $ECHO "Dump of the cache partition suppressed."
+ continue
+ fi
+ ;;
+ esac
+
+ # 6a
+ $ECHO -n "Dumping $image to $DESTDIR/$image.img..."
+ $mkyaffs2image /$image $DESTDIR/$image.img $OUTPUT
+ sync
+ $ECHO "done"
+done
+
+# Backing up the ext2 partition, not really for the backup but to switch ROMS and apps at the same time.
+
+if [ "$EXT2" == 1 ]; then
+ $ECHO "Storing the ext2(Apps, Dalvik-cache) contents in the backup folder."
+
+ CHECK1=`mount | grep /system`
+ if [ "$CHECK1" == "" ]; then
+ mount /system 2>/dev/null
+ fi
+ CHECK2=`mount | grep /system/sd`
+ if [ "$CHECK2" == "" ]; then
+ mount /system/sd 2>/dev/null
+ fi
+
+ CHECK1=`mount | grep /system`
+ CHECK2=`mount | grep /system/sd`
+ if [ "$CHECK1" == "" -o "$CHECK2" == "" ]; then
+ $ECHO "Warning: --ext2 specified but unable to mount the ext2 partition."
+ exit 1
+ else
+
+ CWD=`pwd`
+ cd /system/sd
+ # Depending on the whether we want it compressed we do either or.
+ if [ "$COMPRESS" == 0 ]; then
+ tar -cvf $DESTDIR/ext2.tar ./
+ else
+ if [ "$DEFAULTCOMPRESSOR" == "bzip2" ]; then
+ tar -cvjf $DESTDIR/ext2.tar.bz2 ./
+ else
+ tar -cvzf $DESTDIR/ext2.tgz ./
+ fi
+ fi
+ cd $CWD
+ umount /system/sd
+ fi
+fi
+
+
+# 7.
+$ECHO -n "generating md5sum file..."
+CWD=$PWD
+cd $DESTDIR
+md5sum *img > nandroid.md5
+
+# 7b.
+if [ "$COMPRESS" == 1 ]; then
+ $ECHO "Compressing the backup, may take a bit of time, please wait..."
+ $ECHO "checking free space on sdcard for the compression operation."
+ FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
+ # we need about 70MB for the intermediate storage needs
+ if [ $FREEBLOCKS -le 70000 ]; then
+ $ECHO "error: not enough free space available on sdcard for compression operation (need 70mb)"
+ $ECHO "leaving this backup uncompressed."
+ else
+ # we are already in $DESTDIR, start compression from the smallest files
+ # to maximize space for the largest's compression, less likely to fail.
+ # To decompress reverse the order.
+ $DEFAULTCOMPRESSOR $DEFAULTLEVEL `ls -S -r * | grep -v ext2`
+ fi
+fi
+
+cd $CWD
+$ECHO "done"
+
+# 8.
+$ECHO "unmounting system, data and sdcard"
+umount /system
+umount /data
+umount /sdcard
+
+# 9.
+$ECHO "Backup successful."
+if [ "$AUTOREBOOT" == 1 ]; then
+ reboot
+fi
+exit 0
+fi
+
+
+# ----------------------------------GETTING UPDATES DIRECT FROM THE WEB USING WIFI-------------
+
+if [ "$WEBGET" == 1 ]; then
+ $ECHO "mounting system and data read-only, sdcard read-write"
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+
+ # Since we are in recovery, these file-systems have to be mounted
+ $ECHO "Mounting /system and /data for starting WiFi"
+ mount -o ro /system || FAIL=1
+ # Need to write to this system to setup nameservers for the wifi
+ mount -o rw /data || FAIL=2
+ mount /sdcard || mount /dev/block/mmcblk0 /sdcard || FAIL=3
+
+ case $FAIL in
+ 1) $ECHO "Error mounting system read-only"; umount /system /data /sdcard; exit 1;;
+ 2) $ECHO "Error mounting data read-write"; umount /system /data /sdcard; exit 1;;
+ 3) $ECHO "Error mounting sdcard read-write"; umount /system /data /sdcard; exit 1;;
+ esac
+
+ if [ "$WEBGETSOURCE" == "" ]; then
+ # Set the URL to the current latest update
+ if [ "$ITSANUPDATE" == 1 ]; then
+ WEBGETSOURCE=$DEFAULTWEBUPDATE
+ else
+ WEBGETSOURCE=$DEFAULTWEBIMAGE
+ fi
+ fi
+
+ if [ "$AUTOAPPLY" == 0 ]; then
+ # Need to check space on sdcard only if we dump the update there.
+ $ECHO "Checking free space on sdcard for the update download."
+ FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
+ # we need about 50MB for the storage needs
+ if [ $FREEBLOCKS -le 50000 ]; then
+ $ECHO "Error: not enough free space available on sdcard for the update operation (need 50mb)"
+ $ECHO "Please free up space before invoking this option again."
+ $ECHO "Cleaning up, unmounting file systems, aborting."
+ umount /system /data /sdcard
+ exit 1
+ fi
+ fi
+
+ if [ ! `basename $WEBGETSOURCE` == `basename $WEBGETSOURCE .zip` ]; then
+ # It is a zip, not img.
+ ITSANUPDATE=1
+ else
+ if [ ! `basename $WEBGETSOURCE` == `basename $WEBGETSOURCE .img` ]; then
+ # It is an img file.
+ ITSANIMAGE=1
+ else
+ # Unknown file type
+ $ECHO "Unknown file type, cleaning up, aborting."
+ umount /system /data /sdcard
+ exit 1
+ fi
+ fi
+
+
+ if [ "$ITSANUPDATE" == 1 -a "$AUTOAPPLY" == 0 ]; then
+ # Move the previous update aside, if things go badly with the new update, it is good
+ # to have the last one still around :-)
+
+ # If we cannot figure out what the file name used to be, create this new one with a time stamp
+ OLDNAME="OLD-update-`date +%Y%m%d-%H%M`"
+
+ if [ -e $WEBGETTARGET/update.zip ]; then
+ $ECHO "There is already an update.zip in $WEBGETTARGET, backing it up to"
+ if [ -e $WEBGETTARGET/update.name ]; then
+ OLDNAME=`cat $WEBGETTARGET/update.name`
+ # Backup the name file (presumably contains the old name of the update.zip
+ mv -f $WEBGETTARGET/update.name $WEBGETTARGET/`basename $OLDNAME .zip`.name
+ fi
+ $ECHO "`basename $OLDNAME .zip`.zip"
+ mv -f $WEBGETTARGET/update.zip $WEBGETTARGET/`basename $OLDNAME .zip`.zip
+
+ # Backup the MD5sum file
+ if [ -e $WEBGETTARGET/update.MD5sum ]; then
+ mv -f $WEBGETTARGET/update.MD5sum $WEBGETTARGET/`basename $OLDNAME .zip`.MD5sum
+ fi
+ fi
+ fi
+
+ $ECHO "Starting WiFI, please wait..."
+ insmod /system/lib/modules/wlan.ko
+
+ wlan_loader -f /system/etc/wifi/Fw1251r1c.bin -e /proc/calibration -i /system/etc/wifi/tiwlan.ini
+
+ CWD=`pwd`
+ cd /data/local/tmp
+
+ wpa_supplicant -f -Dtiwlan0 -itiwlan0 -c/data/misc/wifi/wpa_supplicant.conf&
+
+ sleep 5
+ $ECHO "wpa_supplicant started"
+ $ECHO ""
+
+ echo "nameserver $NAMESERVER1" >/etc/resolv.conf
+ echo "nameserver $NAMESERVER2" >>/etc/resolv.conf
+
+ #We want the wifi to assign a dynamic address
+ $ECHO "Starting DHCPCD server (dynamic address assignment)"
+ # -BKL flags????
+ dhcpcd -d tiwlan0 2>/dev/null &
+
+ # Have to wait for it to init stuff
+ sleep 10
+
+
+ CHECK1=`ps | grep -v grep | grep dhcpcd`
+ CHECK2=`ps | grep -v grep | grep wpa_supplicant`
+ if [ "$CHECK1" == "" -o "$CHECK2" == "" ]; then
+ $ECHO "Error: wpa_supplicant or DHCPCD server is not running, cleaning up, aborting"
+ rm -- -Dtiwlan0
+ cd $CWD
+
+ $ECHO "unmounting /system, /data and /sdcard"
+ umount /system
+ umount /data
+ umount /sdcard
+ exit 2
+ fi
+
+ $ECHO "DHCPCD server started"
+ $ECHO ""
+
+ $ECHO "WiFi is running!"
+ $ECHO ""
+
+ if [ "$AUTOAPPLY" == 1 ]; then
+ $ECHO "Autoapply is on, retrieving the update into /cache/`basename $WEBGETSOURCE`"
+
+ wget -O /cache/`basename $WEBGETSOURCE` $WEBGETSOURCE $OUTPUT
+
+ if [ ! -e /cache/recovery ]; then
+ mkdir /cache/recovery
+ chmod 777 /cache/recovery
+ fi
+ if [ -e /cache/recovery/command ]; then
+ echo "--update_package=CACHE:`basename $WEBGETSOURCE`" >>/cache/recovery/command
+ else
+ echo "--update_package=CACHE:`basename $WEBGETSOURCE`" >/cache/recovery/command
+ fi
+ chmod 555 /cache/recovery/command
+ # Once rebooted the update will be applied.
+
+ else
+
+ if [ "$ITSANUPDATE" == 1 ]; then
+ $ECHO "Retrieving system update into $WEBGETTARGET/update.zip, please wait..."
+ wget -O $WEBGETTARGET/update.zip $WEBGETSOURCE $OUTPUT
+
+ echo "`basename $WEBGETSOURCE`" > $WEBGETTARGET/update.name
+ $ECHO ""
+ $ECHO "Update retrieved, if concerned, please compare the md5sum with the number"
+ $ECHO "you see on the web page, if it is NOT the same, the retrieval"
+ $ECHO "has failed and has to be repeated."
+ $ECHO ""
+ $ECHO `md5sum $WEBGETTARGET/update.zip | tee $WEBGETTARGET/update.MD5sum`
+ $ECHO ""
+ $ECHO "MD5sum has been stored in $WEBGETTARGET/update.MD5sum"
+ else
+ $ECHO "Retrieving the image into $WEBGETTARGET/`basename $WEBGETSOURCE`, please wait..."
+ wget -O $WEBGETTARGET/`basename $WEBGETSOURCE` $WEBGETSOURCE $OUTPUT
+ $ECHO ""
+ $ECHO "$WEBGETSOURCE retrieved, if concerned, please compare the md5sum with the number"
+ $ECHO "you see on the web page, if it is NOT the same, the retrieval"
+ $ECHO "has failed and has to be repeated."
+ $ECHO ""
+ md5sum $WEBGETTARGET/`basename $WEBGETSOURCE` | tee $WEBGETTARGET/`basename $WEBGETSOURCE .img`.MD5sum $OUTPUT
+ $ECHO ""
+ $ECHO "MD5sum has been stored in $WEBGETTARGET/`basename $WEBGETSOURCE .img`.MD5sum"
+ $ECHO ""
+ $ECHO -n "Would you like to flash this image into boot or recovery? (or no for no flash) "
+ read ANSWER
+ if [ "$ANSWER" == "boot" ]; then
+ $ECHO "Flashing $WEBGETTARGET/`basename $WEBGETSOURCE` into the boot partition."
+ $flash_image boot $WEBGETTARGET/`basename $WEBGETSOURCE`
+ else
+ if [ "$ANSWER" == "recovery" ]; then
+ $ECHO "Moving $WEBGETTARGET/`basename $WEBGETSOURCE` into the /data/recovery.img"
+ $ECHO "and /system/recovery.img"
+ cp -f $WEBGETTARGET/`basename $WEBGETSOURCE` /data/recovery.img
+ mount -o rw,remount /system
+ cp -f $WEBGETTARGET/`basename $WEBGETSOURCE` /system/recovery.img
+ $ECHO "Depending on the settings of your specific ROM, the recovery.img will be"
+ $ECHO "flashed at the normal bootup time either from /system or /data."
+ else
+ $ECHO "Not flashing the image."
+ fi
+ fi
+ fi
+ $ECHO ""
+
+ fi
+
+ $ECHO "Shutting down DHCPCD service and wpa_supplicant"
+ killall -TERM dhcpcd
+ TEMPVAR=`ps | grep -v grep | grep wpa_supplicant`
+ TEMPVAR=`echo $TEMPVAR | cut -f 1 -d ' '`
+ kill -TERM $TEMPVAR
+
+ while true; do
+ CHECK=`ps | grep -v grep | grep dhcpcd`
+ if [ ! "$CHECK" == "" ]; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ while true; do
+ CHECK=`ps | grep -v grep | grep wpa_supplicant`
+ if [ ! "$CHECK" == "" ]; then
+ sleep 1
+ else
+ break
+ fi
+ done
+ #sleep 5
+
+ $ECHO "Cleaning up..."
+ # Looks like cannot clean up wlan module since chdir is missing
+ #rmmod wlan
+ rm -- -Dtiwlan0
+ cd $CWD
+
+ $ECHO "unmounting /system, /data and /sdcard"
+ umount /system
+ umount /data
+ umount /sdcard
+
+ if [ "$AUTOAPPLY" == 1 ]; then
+ $ECHO "Auto apply update is on, rebooting into recovery to apply the update."
+ $ECHO "When the update is complete reboot into the normal mode."
+ $ECHO "The device will reboot and the update will be applied in 10 seconds!"
+ sleep 10
+ reboot recovery
+ else
+ if [ "$ITSANUPDATE" == 1 ]; then
+ $ECHO "If you put the update into a folder other than /sdcard you need to use --getupdate to"
+ $ECHO "prepare the update for application."
+ $ECHO "You may want to execute 'reboot recovery' and choose update option to flash the update."
+ $ECHO "Or in the alternative, shutdown your phone with reboot -p, and then press <CAMERA>+<POWER>"
+ $ECHO "to initiate a normal system update procedure, if you have stock SPL."
+ fi
+ exit 0
+ fi
+fi
+
+# -------------------------------------DELETION, COMPRESSION OF BACKUPS---------------------------------
+if [ "$COMPRESS" == 1 -o "$DELETE" == 1 ]; then
+ $ECHO "Unmounting /system and /data to be on the safe side, mounting /sdcard read-write."
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+
+ FAIL=0
+ # Since we are in recovery, these file-system have to be mounted
+ $ECHO "Mounting /sdcard to look for backups."
+ mount /sdcard || mount /dev/block/mmcblk0 /sdcard || FAIL=1
+
+ if [ "$FAIL" == 1 ]; then
+ $ECHO "Error mounting /sdcard read-write, cleaning up..."; umount /system /data /sdcard; exit 1
+ fi
+
+ $ECHO "The current size of /sdcard FAT32 filesystem is `du /sdcard | tail -1 | cut -f 1 -d '/'`Kb"
+ $ECHO ""
+
+ # find the oldest backup, but show the user other options
+ $ECHO "Looking for the oldest backup to delete, newest to compress,"
+ $ECHO "will display all choices!"
+ $ECHO ""
+ $ECHO "Here are the backups you have picked within this repository $BACKUPPATH:"
+
+ if [ "$DELETE" == 1 ]; then
+ RESTOREPATH=`ls -td $BACKUPPATH/*$SUBNAME* 2>/dev/null | tail -1`
+ ls -td $BACKUPPATH/*$SUBNAME* 2>/dev/null $OUTPUT
+ else
+ RESTOREPATH=`ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | tail -1`
+ ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null $OUTPUT
+ fi
+ $ECHO " "
+
+ if [ "$RESTOREPATH" = "" ]; then
+ $ECHO "Error: no backups found"
+ exit 2
+ else
+ if [ "$DELETE" == 1 ]; then
+ $ECHO "Default backup to delete is the oldest: $RESTOREPATH"
+ $ECHO ""
+ $ECHO "Other candidates for deletion are: "
+ ls -td $BACKUPPATH/*$SUBNAME* 2>/dev/null | grep -v $RESTOREPATH $OUTPUT
+ fi
+ if [ "$COMPRESS" == 1 ]; then
+ $ECHO "Default backup to compress is the latest: $RESTOREPATH"
+ $ECHO ""
+ $ECHO "Other candidates for compression are: "
+ ls -trd $BACKUPPATH/*$SUBNAME* 2>/dev/null | grep -v $RESTOREPATH $OUTPUT
+ fi
+
+ $ECHO ""
+ $ECHO "Using G1 keyboard, enter a unique name substring to change it and <CR>"
+ $ECHO -n "or just <CR> to accept: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read SUBSTRING
+ else
+ $ECHO "Accepting default."
+ SUBSTRING=""
+ fi
+
+ if [ ! "$SUBSTRING" == "" ]; then
+ RESTOREPATH=`ls -td $BACKUPPATH/*$SUBNAME* 2>/dev/null | grep $SUBSTRING | tail -1`
+ else
+ RESTOREPATH=`ls -td $BACKUPPATH/*$SUBNAME* 2>/dev/null | tail -1`
+ fi
+ if [ "$RESTOREPATH" = "" ]; then
+ $ECHO "Error: no matching backup found, aborting"
+ exit 2
+ fi
+ fi
+
+ if [ "$DELETE" == 1 ]; then
+ $ECHO "Deletion path: $RESTOREPATH"
+ $ECHO ""
+ $ECHO "WARNING: Deletion of a backup is an IRREVERSIBLE action!!!"
+ $ECHO -n "Are you absolutely sure? {yes | YES | Yes | no | NO | No}: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read ANSWER
+ else
+ ANSWER=yes
+ $ECHO "Accepting default."
+ fi
+ $ECHO ""
+ if [ "$ANSWER" == "yes" -o "$ANSWER" == "YES" -o "$ANSWER" == "Yes" ]; then
+ rm -rf $RESTOREPATH
+ $ECHO ""
+ $ECHO "$RESTOREPATH has been permanently removed from your SDCARD."
+ $ECHO "Post deletion size of the /sdcard FAT32 filesystem is `du /sdcard | tail -1 | cut -f 1 -d '/'`Kb"
+ else
+ if [ "$ANSWER" == "no" -o "$ANSWER" == "NO" -o "$ANSWER" == "No" ]; then
+ $ECHO "The chosen backup will NOT be removed."
+ else
+ $ECHO "Invalid answer: assuming NO."
+ fi
+ fi
+ fi
+
+ if [ "$COMPRESS" == 1 ]; then
+
+ CWD=`pwd`
+ cd $RESTOREPATH
+
+ if [ `ls *.bz2 2>/dev/null|wc -l` -ge 1 -o `ls *.gz 2>/dev/null|wc -l` -ge 1 ]; then
+ $ECHO "This backup is already compressed, cleaning up, aborting..."
+ cd $CWD
+ umount /sdcard 2>/dev/null
+ exit 0
+ fi
+
+ $ECHO "checking free space on sdcard for the compression operation."
+ FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
+ # we need about 70MB for the intermediate storage needs
+ if [ $FREEBLOCKS -le 70000 ]; then
+ $ECHO "Error: not enough free space available on sdcard for compression operation (need 70mb)"
+ $ECHO "leaving this backup uncompressed."
+ else
+ # we are already in $DESTDIR, start compression from the smallest files
+ # to maximize space for the largest's compression, less likely to fail.
+ # To decompress reverse the order.
+ $ECHO "Pre compression size of the /sdcard FAT32 filesystem is `du /sdcard | tail -1 | cut -f 1 -d '/'`Kb"
+ $ECHO ""
+ $ECHO "Compressing the backup may take a bit of time, please wait..."
+ $DEFAULTCOMPRESSOR $DEFAULTLEVEL `ls -S -r *`
+ $ECHO ""
+ $ECHO "Post compression size of the /sdcard FAT32 filesystem is `du /sdcard | tail -1 | cut -f 1 -d '/'`Kb"
+ fi
+ fi
+
+ $ECHO "Cleaning up."
+ cd $CWD
+ umount /sdcard 2>/dev/null
+ exit 0
+
+fi
+
+if [ "$GETUPDATE" == 1 ]; then
+ $ECHO "Unmounting /system and /data to be on the safe side, mounting /sdcard read-write."
+ umount /system 2>/dev/null
+ umount /data 2>/dev/null
+ umount /sdcard 2>/dev/null
+
+ FAIL=0
+ # Since we are in recovery, these file-system have to be mounted
+ $ECHO "Mounting /sdcard to look for updates to flash."
+ mount /sdcard || mount /dev/block/mmcblk0 /sdcard || FAIL=1
+
+ if [ "$FAIL" == 1 ]; then
+ $ECHO "Error mounting /sdcard read-write, cleaning up..."; umount /system /data /sdcard; exit 1
+ fi
+
+ $ECHO "The current size of /sdcard FAT32 filesystem is `du /sdcard | tail -1 | cut -f 1 -d '/'`Kb"
+ $ECHO ""
+
+ # find all the files with update in them, but show the user other options
+ $ECHO "Looking for all *update*.zip candidate files to flash."
+ $ECHO ""
+ $ECHO "Here are the updates limited by the subname $SUBNAME found"
+ $ECHO "within the repository $DEFAULTUPDATEPATH:"
+ $ECHO ""
+ RESTOREPATH=`ls -trd $DEFAULTUPDATEPATH/*$SUBNAME*.zip 2>/dev/null | grep update | tail -1`
+ if [ "$RESTOREPATH" == "" ]; then
+ $ECHO "Error: found no matching updates, cleaning up, aborting..."
+ umount /sdcard 2>/dev/null
+ exit 2
+ fi
+ ls -trd $DEFAULTUPDATEPATH/*$SUBNAME*.zip 2>/dev/null | grep update $OUTPUT
+ $ECHO ""
+ $ECHO "The default update is the latest $RESTOREPATH"
+ $ECHO ""
+ $ECHO "Using G1 keyboard, enter a unique name substring to change it and <CR>"
+ $ECHO -n "or just <CR> to accept: "
+ if [ "$ASSUMEDEFAULTUSERINPUT" == 0 ]; then
+ read SUBSTRING
+ else
+ $ECHO "Accepting default."
+ SUBSTRING=""
+ fi
+ $ECHO ""
+
+ if [ ! "$SUBSTRING" == "" ]; then
+ RESTOREPATH=`ls -trd $DEFAULTUPDATEPATH/*$SUBNAME*.zip 2>/dev/null | grep update | grep $SUBSTRING | tail -1`
+ else
+ RESTOREPATH=`ls -trd $DEFAULTUPDATEPATH/*$SUBNAME*.zip 2>/dev/null | grep update | tail -1`
+ fi
+ if [ "$RESTOREPATH" = "" ]; then
+ $ECHO "Error: no matching backups found, aborting"
+ exit 2
+ fi
+
+ if [ "$RESTOREPATH" == "/sdcard/update.zip" ]; then
+ $ECHO "You chose update.zip, it is ready for flashing, there nothing to do."
+ else
+
+ # Things seem ok so far.
+
+ # Move the previous update aside, if things go badly with the new update, it is good
+ # have the last one still around :-)
+
+ # If we cannot figure out what the file name used to be, create this new one with a time stamp
+ OLDNAME="OLD-update-`date +%Y%m%d-%H%M`"
+
+ if [ -e /sdcard/update.zip ]; then
+ $ECHO "There is already an update.zip in /sdcard, backing it up to"
+ if [ -e /sdcard/update.name ]; then
+ OLDNAME=`cat /sdcard/update.name`
+ # Backup the name file (presumably contains the old name of the update.zip
+ mv -f /sdcard/update.name /sdcard/`basename $OLDNAME .zip`.name
+ fi
+ $ECHO "`basename $OLDNAME .zip`.zip"
+ mv -f /sdcard/update.zip /sdcard/`basename $OLDNAME .zip`.zip
+
+ # Backup the MD5sum file
+ if [ -e /sdcard/update.MD5sum ]; then
+ mv -f /sdcard/update.MD5sum /sdcard/`basename $OLDNAME .zip`.MD5sum
+ fi
+ fi
+
+ if [ -e $DEFAULTUPDATEPATH/`basename $RESTOREPATH .zip`.MD5sum ]; then
+ mv -f $DEFAULTUPDATEPATH/`basename $RESTOREPATH .zip`.MD5sum /sdcard/update.MD5sum
+ else
+ $ECHO `md5sum $RESTOREPATH | tee /sdcard/update.MD5sum`
+ $ECHO ""
+ $ECHO "MD5sum has been stored in /sdcard/update.MD5sum"
+ $ECHO ""
+ fi
+ if [ -e $DEFAULTUPDATEPATH/`basename $RESTOREPATH .zip`.name ]; then
+ mv -f $DEFAULTUPDATEPATH/`basename $RESTOREPATH .zip`.name /sdcard/update.name
+ else
+ echo "`basename $RESTOREPATH`" > /sdcard/update.name
+ fi
+
+ mv -i $RESTOREPATH /sdcard/update.zip
+
+
+ $ECHO "Your file $RESTOREPATH has been moved to the root of sdcard, and is ready for flashing!!!"
+
+ fi
+
+ $ECHO "You may want to execute 'reboot recovery' and then choose the update option to flash the update."
+ $ECHO "Or in the alternative, shutdown your phone with reboot -p, and then press <CAMERA>+<POWER> to"
+ $ECHO "initiate a standard update procedure if you have stock SPL."
+ $ECHO ""
+ $ECHO "Cleaning up and exiting."
+ umount /sdcard 2>/dev/null
+ exit 0
+fi