Rewrite backup-android to use bash arrays

This commit is contained in:
Austen Adler 2019-11-29 11:03:15 -05:00
parent a38b691403
commit 758e27bd51
3 changed files with 85 additions and 41 deletions

View File

@ -1,5 +1,6 @@
#!/data/data/com.termux/files/usr/bin/bash #!/data/data/com.termux/files/usr/bin/bash
# Initialize # Initialize
# if [ -z "$STY" ]; then exec screen -m -S backup-android /bin/bash "$0"; fi
ABSPATH="$(readlink -f "$BASH_SOURCE")" ABSPATH="$(readlink -f "$BASH_SOURCE")"
set -x set -x
cd "${ABSPATH%/*}" || { echo "Cannot change directory" >&2; exit 1; } cd "${ABSPATH%/*}" || { echo "Cannot change directory" >&2; exit 1; }
@ -8,48 +9,51 @@ test -f ./env && source ./env || { echo "Unable to source user variables in $PWD
# From https://serverfault.com/a/799198 # From https://serverfault.com/a/799198
# Since Termux has no uuidgen command, we need to create one randomly # Since Termux has no uuidgen command, we need to create one randomly
function uuidgen() { function uuidgen() {
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}' od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
} }
# From https://unix.stackexchange.com/a/27014 # From https://unix.stackexchange.com/a/27014
function time_diff { function time_diff {
# Find the time difference between the two arguments (in seconds) # Find the time difference between the two arguments (in seconds)
local T="$(( "$1" - "$2" ))" local T="$(( "$1" - "$2" ))"
local D=$((T/60/60/24)) local D=$((T/60/60/24))
local H=$((T/60/60%24)) local H=$((T/60/60%24))
local M=$((T/60%60)) local M=$((T/60%60))
local S=$((T%60)) local S=$((T%60))
(( $D > 0 )) && printf '%dd ' $D (( $D > 0 )) && printf '%dd ' $D
(( $H > 0 )) && printf '%dh ' $H (( $H > 0 )) && printf '%dh ' $H
(( $M > 0 )) && printf '%dm ' $M (( $M > 0 )) && printf '%dm ' $M
(( $D > 0 || $H > 0 || $M > 0 )) && printf 'and ' (( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
printf '%ds\n' $S printf '%ds\n' $S
} }
function prune() { function prune() {
test -z "$PRUNE_COMMAND" && return if [ -z "$PRUNE_COMMAND" ]; then
./run_remote.sh cd "$DESTINATION_LOCATION" "&&" $PRUNE_COMMAND "$BORG_REPO" echo "Not pruning" >&2
return
fi
run_remote "${PRUNE_COMMAND[@]}" "$BORG_REPO"
} }
function backup() { function backup() {
# First, we need to rsync our changes to the host # First, we need to rsync our changes to the host
echo "Running rsync..." echo "Running rsync..."
local RETRIES=10 local RETRIES=10
while (( RETRIES > 0 )); do while (( RETRIES > 0 )); do
# Try to rsync # Try to rsync
$RSYNC_COMMAND "$SOURCE_LOCATION" "$REMOTE_HOST:$DESTINATION_LOCATION" && break "${RSYNC_COMMAND[@]}" "$SOURCE_LOCATION" "$REMOTE_HOST:$DESTINATION_LOCATION" && break
(( RETRIES-- )) (( RETRIES-- ))
echo "rsync failed. Retrying $RETRIES more times. Sleeping 10s" echo "rsync failed. Retrying $RETRIES more times. Sleeping 10s"
sleep 10s sleep 10s
done done
if (( RETRIES == 0 )); then if (( RETRIES == 0 )); then
# We exceeded the retry limit. Fail # We exceeded the retry limit. Fail
return 1 return 1
fi fi
# Next, instruct the host to create a borg # Next, instruct the host to create a borg
echo "Running borg..." echo "Running borg..."
./run_remote.sh cd "$DESTINATION_LOCATION" "&&" pwd "&&" $BORG_COMMAND "$BORG_REPO::$HOSTNAME-$(uuidgen)" . || return 2 run_remote "${CREATE_COMMAND[@]}" "$BORG_REPO::$HOSTNAME-$(uuidgen)" . || return 2
} }
# Take wakelock so we don't fall asleep # Take wakelock so we don't fall asleep
@ -68,10 +72,12 @@ echo "Completed $(date +%F-%T)"
echo "Duration: $DURATION" echo "Duration: $DURATION"
if (( RESULT == 0 )); then if (( RESULT == 0 )); then
termux-notification --title "Backup completed successfully in $DURATION" termux-notification --title "Backup completed successfully in $DURATION"
else else
termux-notification --title "Backup failed in $DURATION" termux-notification --title "Backup failed in $DURATION"
fi fi
# Remove our wakelock # Remove our wakelock
termux-wake-unlock termux-wake-unlock
printf "^c to exit"
cat

View File

@ -1,8 +1,51 @@
RSYNC_COMMAND="rsync --partial --info=progress2 --progress --verbose --no-i-r -a --exclude=/syncthing --exclude=/Movies --exclude=.thumbnails --exclude=/Android --exclude=/Download/Images --delete" EXCLUDES=(
"/syncthing"
"/Movies"
".thumbnails"
"/Android"
"/Download/Images"
)
RSYNC_COMMAND=(
rsync
--partial
--info=progress2
--verbose
--no-i-r
-a
--delete
"${EXCLUDES[@]/#/--exclude=}"
)
SOURCE_LOCATION="/storage/emulated/0/" SOURCE_LOCATION="/storage/emulated/0/"
HOSTNAME="android-phone" HOSTNAME="android-phone"
REMOTE_HOST="user@example.com" REMOTE_HOST="user@example.com"
DESTINATION_LOCATION="~/tmp/borg/$HOSTNAME/" DESTINATION_LOCATION="~/tmp/borg/$HOSTNAME/"
BORG_COMMAND="borg create --verbose --progress --stats --one-file-system --exclude-caches --compression auto,lzma"
BORG_REPO="runner2:borg/$HOSTNAME" BORG_REPO="runner2:borg/$HOSTNAME"
# PRUNE_COMMAND="borg prune -v --list --keep-daily 7 --keep-weekly 4 --keep-monthly 2" BORG_COMMAND=(
borg
--remote-path borg1
--verbose
--progress
)
CREATE_COMMAND=(
"${BORG_COMMAND[@]}"
create
--stats
--one-file-system
--exclude-caches
--compression=auto,lzma
)
PRUNE_COMMAND=(
"${BORG_COMMAND[@]}"
prune
--list
--keep-daily=7
--keep-weekly=4
--keep-monthly=2
)
run_remote() {
if (( $# == 0 )); then
echo "No arguments given to run_remote" >&2
return 1
fi
ssh "$REMOTE_HOST" -- "cd" "$DESTINATION_LOCATION" "&&" "pwd" "&&" "${@}"
}

View File

@ -1,5 +0,0 @@
#!/data/data/com.termux/files/usr/bin/bash
ABSPATH="$(readlink -f "$BASH_SOURCE")"
cd "${ABSPATH%/*}" || { echo "Cannot change directory" >&2; exit 1; }
test -f ./env && source ./env || { echo "Unable to source user variables"; exit 1; }
ssh "$REMOTE_HOST" -- "$@"