From 00b4d46db69abc724b596cef2c8d504648e088c3 Mon Sep 17 00:00:00 2001 From: yorick Barbanneau Date: Thu, 8 Nov 2018 00:37:08 +0100 Subject: [PATCH] First commit --- README.md | 20 +++++++ lib/message | 1 + restore.sh | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 README.md create mode 160000 lib/message create mode 100755 restore.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..77c5f96 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +Android Oandbackup restore script +--------------------------------- + +A simple bash script to restore application backuped with OandBackup on a rooted +Android Phone. This script can restore GPG encrypted backup. + +to use this script, clone the repo : + +```shell +git clone https://git.epha.se/ephase/oandbackup_restore +cd oandbackup_restore +git submodule init && git submodule update +``` + +This script is in devellopment, this is not a working version + +## Licence + +Do what you want and feel free to send me a message or offer me a beer if you +come near Bordeaux - France. diff --git a/lib/message b/lib/message new file mode 160000 index 0000000..e1f41d3 --- /dev/null +++ b/lib/message @@ -0,0 +1 @@ +Subproject commit e1f41d37fa105ea24749cf44d731c958ecfc2073 diff --git a/restore.sh b/restore.sh new file mode 100755 index 0000000..b362fe7 --- /dev/null +++ b/restore.sh @@ -0,0 +1,153 @@ +#!/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