diff --git a/mtdutils/Android.mk b/mtdutils/Android.mk index b6a5ae4..ff4ab3f 100644 --- a/mtdutils/Android.mk +++ b/mtdutils/Android.mk @@ -20,8 +20,15 @@ LOCAL_STATIC_LIBRARIES := libmtdutils LOCAL_SHARED_LIBRARIES := libcutils libc include $(BUILD_EXECUTABLE) +include $(CLEAR_VARS) +LOCAL_SRC_FILES := dump_image.c mtdutils.c mounts.c +LOCAL_MODULE := dump_image +LOCAL_MODULE_TAGS := eng +include $(BUILD_EXECUTABLE) + include $(CLEAR_VARS) LOCAL_SRC_FILES := flash_image.c +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLE LOCAL_MODULE := recovery_flash_image LOCAL_MODULE_TAGS := eng LOCAL_STATIC_LIBRARIES := libmtdutils libcutils libc @@ -33,6 +40,7 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_SRC_FILES := dump_image.c mtdutils.c mounts.c +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLE LOCAL_MODULE := recovery_dump_image LOCAL_MODULE_TAGS := eng LOCAL_STATIC_LIBRARIES := libcutils libc @@ -42,11 +50,5 @@ LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin ADDITIONAL_RECOVERY_EXECUTABLES += recovery_dump_image include $(BUILD_EXECUTABLE) -include $(CLEAR_VARS) -LOCAL_SRC_FILES := dump_image.c mtdutils.c mounts.c -LOCAL_MODULE := dump_image -LOCAL_MODULE_TAGS := eng -include $(BUILD_EXECUTABLE) - endif # TARGET_ARCH == arm endif # !TARGET_SIMULATOR diff --git a/nandroid/Android.mk b/nandroid/Android.mk index ae2e7fd..79acc32 100644 --- a/nandroid/Android.mk +++ b/nandroid/Android.mk @@ -4,7 +4,7 @@ ifeq ($(TARGET_ARCH),arm) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := recovery_nandroid -LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLE LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SRC_FILES := nandroid-mobile.sh LOCAL_MODULE_STEM := nandroid-mobile.sh @@ -14,10 +14,18 @@ include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := recovery_unyaffs LOCAL_MODULE_STEM := unyaffs +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLE LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_SRC_FILES := unyaffs.c LOCAL_STATIC_LIBRARIES := libc libcutils LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin +LOCAL_MODULE_SUBDIR := recovery +ADDITIONAL_RECOVERY_EXECUTABLES += recovery_unyaffs +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_MODULE := unyaffs +LOCAL_SRC_FILES := unyaffs.c include $(BUILD_EXECUTABLE) endif # TARGET_ARCH == arm diff --git a/nandroid/nandroid-mobile.sh b/nandroid/nandroid-mobile.sh index b5cae3d..9a9a824 100755 --- a/nandroid/nandroid-mobile.sh +++ b/nandroid/nandroid-mobile.sh @@ -1,23 +1,6 @@ #!/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 +# nandroid v2.1 - an Android backup tool for the G1 by infernix and brainaid # Requirements: @@ -26,10 +9,6 @@ # - 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: @@ -44,7 +23,7 @@ # 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): +# Logical steps (v2.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. @@ -76,612 +55,23 @@ 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? +echo "nandroid-mobile v2.1" -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` $@ +if [ "$1" == "" ]; then + echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]" + echo "- backup will store a full system backup on /sdcard/nandroid/$DEVICEID" + echo "- restore path will restore the last made backup for boot, system, recovery and data" + exit 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 " - $ECHO -n "or just 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 " - $ECHO -n "to find matches or just 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 + backup) 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" + echo "error: mkyaffs2image or mkyaffs2image-arm-uclibc not found in path" exit 1 fi fi @@ -689,331 +79,100 @@ if [ "$BACKUP" == 1 ]; then 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" + echo "error: dump_image or dump_image-arm-uclibc not found in path" exit 1 fi fi -fi - -if [ "$RESTORE" == 1 ]; then + break + ;; + restore) 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" + 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 + break + ;; +esac # 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" + echo "error: not running in recovery mode, aborting" exit 1 fi if [ "$DEVICEID" == "foo" ]; then - $ECHO "Error: device id not found in /proc/cmdline, aborting" + 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" + 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" +case $1 in + restore) + 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 - - # 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 " - $ECHO -n "or just 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" + RESTOREPATH=$2 + if [ ! -f $RESTOREPATH/nandroid.md5 ]; then + echo "error: $RESTOREPATH/nandroid.md5 not found, cannot verify backup data" exit 1 fi - if [ "`mount | grep system`" == "" ]; then - $ECHO "error: unable to mount /system, aborting" + umount /system 2>/dev/null + umount /data 2>/dev/null + if [ ! "`mount | grep data`" == "" ]; then + echo "error: unable to umount /data, aborting" + exit 1 + fi + if [ ! "`mount | grep system`" == "" ]; then + echo "error: unable to umount /system, aborting" exit 1 fi + echo "Verifying backup images..." 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" + 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 + echo "Flashing $image..." + $flash_image $image $image.img 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" + echo "Flashing system and data not currently supported" + echo "Restore done" exit 0 -fi + ;; + backup) + break + ;; + *) + echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]" + echo "- backup will store a full system backup on /sdcard/nandroid/$DEVICEID" + echo "- restore path will restore the last made backup for boot, system, recovery and data" + exit 1 + ;; +esac # 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" +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 @@ -1021,61 +180,17 @@ 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;; + 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" +DESTDIR="/sdcard/nandroid/$DEVICEID/$TIMESTAMP" if [ ! -d $DESTDIR ]; then mkdir -p $DESTDIR if [ ! -d $DESTDIR ]; then - $ECHO "error: cannot create $DESTDIR" + echo "error: cannot create $DESTDIR" umount /system 2>/dev/null umount /data 2>/dev/null umount /sdcard 2>/dev/null @@ -1084,7 +199,7 @@ if [ ! -d $DESTDIR ]; then else touch $DESTDIR/.nandroidwritable if [ ! -e $DESTDIR/.nandroidwritable ]; then - $ECHO "error: cannot write to $DESTDIR" + echo "error: cannot write to $DESTDIR" umount /system 2>/dev/null umount /data 2>/dev/null umount /sdcard 2>/dev/null @@ -1094,11 +209,11 @@ else fi # 3. -$ECHO "checking free space on sdcard" +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." + 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 @@ -1108,683 +223,71 @@ fi if [ -e /dev/mtd/mtd6ro ]; then - if [ "$NOSPLASH1" == 0 ]; then - $ECHO -n "Dumping splash1 from device over tcp to $DESTDIR/splash1.img..." + 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" + 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..." + 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 + echo "done" 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..." + 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 + $dump_image $image $DESTDIR/$image.img sync # 5b3 - echo "${DEVICEMD5} $DESTDIR/$image.img" | md5sum -c -s - $OUTPUT + echo "${DEVICEMD5} $DESTDIR/$image.img" | md5sum -c -s - if [ $? -eq 1 ]; then true else MD5RESULT=0 fi if [ "$ATTEMPT" == "5" ]; then - $ECHO "Fatal error while trying to dump $image, aborting." + echo "fatal error while trying to dump $image, aborting" umount /system umount /data umount /sdcard exit 1 fi done - $ECHO "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 + echo -n "Dumping $image to $DESTDIR/$image.img..." + $mkyaffs2image /$image $DESTDIR/$image.img sync - $ECHO "done" + 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..." +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" +echo "done" # 8. -$ECHO "unmounting system, data and sdcard" +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 +" - $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 " - $ECHO -n "or just 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 " - $ECHO -n "or just 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 + 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 +echo "Backup successful."