#!/bin/bash source ./lib/message/message.sh DATADIR="/data/data" PHONE_TMPDIR="/sdcard/tmp" TMPDIR="/tmp/a_restore" SYSTEM_PART="/dev/block/mmcblk0p14" DEBUG=0 DRYRUN="" CURRENT_DIR=$(pwd) process_args () { while :; do case $1 in -h|-\?|--help) usage exit 0 ;; v|--version) show_version exit 0 ;; -d|--debug) DEBUG=1 ;; --dry-run) DRYRUN="echo" ;; *) debug "folder : $1" [[ ! -d "$1" ]] && error "You must specify a folder" "fatal" cd "$1" break esac shift done } usage () { msg "\n**Android App Restore script for oandbackup**\n" msg "This script restore backup made by oandbackup\n\n" msg "__USAGE__ :\n" msg "$0 -d --dry-run \n" msg "-d\t\tactivate debug mode\n" msg "--dry-mode\tdo nothing\n" msg "\n" } show_version () { msg "\nversion 0.01A\n" } clean () { msg "\n\nTerminating script ..." msg "\nCleaning phone temp directory : " $ADB_EXE shell "rm -rf $PHONE_TMPDIR" 2> /dev/null [[ $? -eq 0 ]] && msg "green" "Ok\n" || msg "red" "Error" msg "\nCleaning local temp directory : " rm -rf $TMPDIR [[ $? -eq 0 ]] && msg "green" "Ok\n" || msg "red" "Error\n" exit 0 } trap clean 2 process_args $@ GPG_EXE=$(which gpg) ADB_EXE=$(which adb) ZIP_EXE=$(which unzip) [[ -z $GPG_EXE ]] && error "gpg executable not found" [[ -z $ADB_EXE ]] && error "adb executable not found" [[ -z $ZIP_EXE ]] && error "unzip executable not found" if [ ! -z $DRYRUN ] then GPG_EXE="debug $GPG_EXE" ADB_EXE="debug $ADB_EXE" ZIP_EXE="debug $ZIP_EXE" fi $ADB_EXE shell "mkdir $PHONE_TMPDIR" 2> /dev/null msg "**Android Restore App**\n\n" msg "**Pass 1** Install Application\n" mkdir -p $TMPDIR for d in $(ls -d */) do mkdir -p ${TMPDIR}/${d} msg "\tInstall __${d}__ : " cd "$d" [[ -f base.apk.gpg ]] && $GPG_EXE --decrypt --no-verbose base.apk.gpg > ${TMPDIR}/${d}base.apk 2> /dev/null if [ -f ${TMPDIR}/${d}base.apk ] then $ADB_EXE push ${TMPDIR}/${d}base.apk ${PHONE_TMPDIR}/base.apk > /dev/null || (msg "red" "Error in adb push\n"; cd ..; continue) else msg "red" " no application to restore \n" cd .. continue fi #I've got some problem with adb install ... [[ -z $DRYRUN ]] && ret=$(adb install ${TMPDIR}/${d}base.apk) [[ "$ret" -eq "Success" ]] && msg "green" " installed\n" || msg "red" " error\n" $ADB_EXE shell "rm ${PHONE_TMPDIR}/base.apk" cd .. done msg "\nAll installations done, reboot phone into recovery\n" $ADB_EXE reboot recovery msg "When recovery is ready, press space to continue..." while true; do IFS= read -s -n1 -r key [[ $key == ' ' ]] && break done #Mount system partition to avoid error in ls $ADB_EXE shell "mount $SYSTEM_PART /system" sleep 2 msg "\n\n**Pass 2** Restore apps data\n" for d in $(ls -d */) do msg "\tRestore data for __${d}__ : " cd $d mkdir -p ${TMPDIR}/${d} datafile=$(find . -type f -name "*.zip.gpg") if [ -z $datafile ] then basename=$(basename ${d}).zip [[ -z $basename ]] && error "Can't found data file" else basename=$(basename $datafile .gpg) $GPG_EXE --no-verbose --decrypt $datafile > ${TMPDIR}/${d}$basename 2>/dev/null fi $ZIP_EXE -qq ${TMPDIR}/${d}$basename -d ${TMPDIR}/${d} || (msg "red" "Can't extract $basename\n"; cd ..; continue) #get app user and group user=$($ADB_EXE shell "ls -dla ${DATADIR}/${d}" | awk '{print $3}') if [ ! -z $user ] then msg "found user **$user** " $ADB_EXE push ${TMPDIR}/${d}${d}* $DATADIR/${d} >/dev/null $ADB_EXE shell "chown -R $user:$user ${DATADIR}/${d}*" && msg "green" "Done\n" || error "red" "can't chown\n" else warning "Can't found user" fi cd .. done clean