2023-02-17 02:35:13 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
2023-02-17 02:45:35 +01:00
|
|
|
set -eu
|
2023-02-17 02:35:13 +01:00
|
|
|
|
|
|
|
XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
|
|
|
|
XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
|
|
|
|
2023-02-17 02:45:35 +01:00
|
|
|
TARBACK_REMOTE_DEFAULT=
|
|
|
|
TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT=
|
2023-06-07 22:24:44 +02:00
|
|
|
TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND_DEFAULT=
|
2023-02-17 02:35:13 +01:00
|
|
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
2023-06-07 13:21:53 +02:00
|
|
|
TARBACK_TAR_CREATE_COMMAND_DEFAULT='tar c -C "$1" .'
|
2023-02-17 02:35:13 +01:00
|
|
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
2023-06-07 13:21:53 +02:00
|
|
|
TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT='tar c -C "$(dirname "$1")" "$(basename "$1")"'
|
|
|
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
|
|
|
TARBACK_TAR_EXTRACT_COMMAND_DEFAULT='tar x -C "$1"'
|
|
|
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
|
|
|
TARBACK_TAR_EXTRACT_COMMAND_FILE_DEFAULT='tar x -C "$(dirname "$1")"'
|
2023-02-17 02:45:35 +01:00
|
|
|
TARBACK_COMPRESSION_DEFAULT='xz'
|
|
|
|
TARBACK_SPLIT_DEFAULT="split -b $((128*1024*1024)) -"
|
|
|
|
TARBACK_MERGE_DEFAULT='cat'
|
|
|
|
TARBACK_PLUGIN_SEARCH_PATH_DEFAULT="$(dirname "$0"):$XDG_DATA_HOME:$XDG_DATA_DIRS"
|
|
|
|
|
2023-02-17 02:35:13 +01:00
|
|
|
|
2023-02-17 02:45:35 +01:00
|
|
|
# example: TARBACK_REMOTE="ssh myuser@myserver" ./tarback ...
|
|
|
|
TARBACK_REMOTE="${TARBACK_REMOTE:-$TARBACK_REMOTE_DEFAULT}"
|
|
|
|
# maybe the command needs to be transformed before being passed to the
|
|
|
|
# remote command, see _transform_ssh_command for an example
|
|
|
|
TARBACK_TRANSFORM_REMOTE_COMMAND="${TARBACK_TRANSFORM_REMOTE_COMMAND:-$TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT}"
|
2023-06-07 22:24:44 +02:00
|
|
|
TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND="${TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND:-$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND_DEFAULT}"
|
2023-02-17 02:45:35 +01:00
|
|
|
TARBACK_TAR_CREATE_COMMAND="${TARBACK_TAR_CREATE_COMMAND:-$TARBACK_TAR_CREATE_COMMAND_DEFAULT}"
|
2023-06-07 13:21:53 +02:00
|
|
|
TARBACK_TAR_CREATE_COMMAND_FILE="${TARBACK_TAR_CREATE_COMMAND_FILE:-$TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT}"
|
2023-02-17 02:45:35 +01:00
|
|
|
TARBACK_TAR_EXTRACT_COMMAND="${TARBACK_TAR_EXTRACT_COMMAND:-$TARBACK_TAR_EXTRACT_COMMAND_DEFAULT}"
|
2023-06-07 13:21:53 +02:00
|
|
|
TARBACK_TAR_EXTRACT_COMMAND_FILE="${TARBACK_TAR_EXTRACT_COMMAND_FILE:-$TARBACK_TAR_EXTRACT_COMMAND_FILE_DEFAULT}"
|
2023-02-17 02:45:35 +01:00
|
|
|
TARBACK_COMPRESSION="${TARBACK_COMPRESSION:-$TARBACK_COMPRESSION_DEFAULT}"
|
|
|
|
TARBACK_SPLIT="${TARBACK_SPLIT:-$TARBACK_SPLIT_DEFAULT}"
|
|
|
|
TARBACK_MERGE="${TARBACK_MERGE:-$TARBACK_MERGE_DEFAULT}"
|
|
|
|
TARBACK_PLUGIN_SEARCH_PATH="${TARBACK_PLUGIN_SEARCH_PATH:-$TARBACK_PLUGIN_SEARCH_PATH_DEFAULT}"
|
2023-02-17 02:35:13 +01:00
|
|
|
TARBACK_PLUGIN_SEARCH_PATH="$(echo "$TARBACK_PLUGIN_SEARCH_PATH" | tr ':' '\n')"
|
|
|
|
|
|
|
|
_transform_split_name() {
|
|
|
|
command_name="$(echo "$TARBACK_SPLIT" | awk '{print $1}')"
|
|
|
|
if echo "$command_name" | grep -q 'split'; then
|
|
|
|
echo "$1.part"
|
|
|
|
else
|
|
|
|
echo "$1"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
_transform_remote() {
|
|
|
|
r="$1"
|
2023-06-07 22:24:44 +02:00
|
|
|
if [ -n "$TARBACK_TRANSFORM_REMOTE_COMMAND" ]; then
|
|
|
|
r="$("$TARBACK_TRANSFORM_REMOTE_COMMAND" "$r")"
|
2023-06-07 21:53:14 +02:00
|
|
|
fi
|
2023-06-07 22:24:44 +02:00
|
|
|
echo "$r"
|
2023-06-07 21:53:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
_transform_argument() {
|
|
|
|
a="$1"
|
2023-06-07 22:24:44 +02:00
|
|
|
if [ -n "$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND" ]; then
|
|
|
|
a="$("$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND" "$a")"
|
|
|
|
fi
|
2023-06-07 21:53:14 +02:00
|
|
|
echo "$a"
|
|
|
|
}
|
|
|
|
|
2023-06-07 13:21:53 +02:00
|
|
|
_create() {
|
2023-02-17 02:35:13 +01:00
|
|
|
# $1 ... src
|
|
|
|
# $2 ... dst
|
|
|
|
src="$1"
|
|
|
|
dst="$(_transform_split_name "$2")"
|
2023-06-07 13:21:53 +02:00
|
|
|
if [ -d "$src" ]; then
|
|
|
|
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND"
|
|
|
|
else
|
|
|
|
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND_FILE"
|
|
|
|
fi
|
|
|
|
tarback_tar_create_command="$(_transform_remote "$tarback_tar_create_command")"
|
2023-06-07 22:24:44 +02:00
|
|
|
$TARBACK_REMOTE sh -c "$tarback_tar_create_command" - "$(_transform_argument "$src")" \
|
2023-02-17 02:35:13 +01:00
|
|
|
| $TARBACK_COMPRESSION \
|
|
|
|
| $TARBACK_SPLIT "$dst"
|
|
|
|
}
|
|
|
|
|
2023-06-07 13:21:53 +02:00
|
|
|
create() {
|
|
|
|
_create "$@"
|
|
|
|
}
|
|
|
|
|
|
|
|
_restore() {
|
2023-02-17 02:35:13 +01:00
|
|
|
src="$(_transform_split_name "$1")"
|
|
|
|
dst="$2"
|
2023-06-07 13:21:53 +02:00
|
|
|
if [ ! -e "$dst" ] && [ -d "$(dirname "$dst")" ]; then
|
|
|
|
tarback_tar_extract_command="$TARBACK_TAR_EXTRACT_COMMAND_FILE"
|
|
|
|
else
|
|
|
|
tarback_tar_extract_command="$TARBACK_TAR_EXTRACT_COMMAND"
|
|
|
|
fi
|
|
|
|
tarback_tar_extract_command="$(_transform_remote "$tarback_tar_extract_command")"
|
2023-02-17 02:35:13 +01:00
|
|
|
$TARBACK_MERGE "$src"* \
|
|
|
|
| $TARBACK_COMPRESSION --decompress --stdout \
|
2023-06-07 22:24:44 +02:00
|
|
|
| $TARBACK_REMOTE sh -c "$tarback_tar_extract_command" - "$(_transform_argument "$dst")"
|
2023-02-17 02:35:13 +01:00
|
|
|
}
|
|
|
|
|
2023-06-07 13:21:53 +02:00
|
|
|
restore() {
|
|
|
|
_restore "$@"
|
|
|
|
}
|
|
|
|
|
2023-02-17 02:35:13 +01:00
|
|
|
short_options='p:'
|
|
|
|
while getopts "$short_options" arg; do
|
|
|
|
case "$arg" in
|
|
|
|
p)
|
2023-06-07 22:24:44 +02:00
|
|
|
for p in $(echo "$OPTARG" | tr ',' ' '); do
|
|
|
|
# source plugin file(s)
|
|
|
|
sourced=false
|
|
|
|
for loc in $TARBACK_PLUGIN_SEARCH_PATH; do
|
|
|
|
if [ -e "$loc/tarback/$p.sh" ]; then
|
|
|
|
# shellcheck disable=SC1090 # disable cannot follow source
|
|
|
|
. "$loc/tarback/$p.sh"
|
|
|
|
sourced=true
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
if ! "$sourced"; then
|
|
|
|
echo "couldn't find plugin $p" >&2
|
|
|
|
exit 1
|
2023-02-17 02:35:13 +01:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
shift 2
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "unknown option $1" >&2
|
2023-06-07 22:24:44 +02:00
|
|
|
#exit 1
|
2023-02-17 02:35:13 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
case "$1" in
|
|
|
|
create)
|
|
|
|
shift
|
|
|
|
if [ "$#" -eq 2 ]; then
|
|
|
|
create "$@"
|
|
|
|
else
|
|
|
|
echo 'not enough arguments, expected 2: src dest' >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
restore)
|
|
|
|
shift
|
|
|
|
if [ "$#" -eq 2 ]; then
|
|
|
|
restore "$@"
|
|
|
|
else
|
|
|
|
echo 'not enough arguments, expected 2: src dest' >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|