Rewrite backup-android to use bash arrays
This commit is contained in:
parent
a38b691403
commit
758e27bd51
@ -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
|
||||||
|
49
env.dist
49
env.dist
@ -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" "&&" "${@}"
|
||||||
|
}
|
||||||
|
@ -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" -- "$@"
|
|
Loading…
Reference in New Issue
Block a user