Move ssh functionality to plugin.
This commit is contained in:
parent
f07741a8d5
commit
58923c867f
4 changed files with 74 additions and 54 deletions
67
tarback.sh
67
tarback.sh
|
@ -7,6 +7,7 @@ XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
||||||
|
|
||||||
TARBACK_REMOTE_DEFAULT=
|
TARBACK_REMOTE_DEFAULT=
|
||||||
TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT=
|
TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT=
|
||||||
|
TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND_DEFAULT=
|
||||||
# shellcheck disable=SC2016 # disable variable not expanding hint
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
||||||
TARBACK_TAR_CREATE_COMMAND_DEFAULT='tar c -C "$1" .'
|
TARBACK_TAR_CREATE_COMMAND_DEFAULT='tar c -C "$1" .'
|
||||||
# shellcheck disable=SC2016 # disable variable not expanding hint
|
# shellcheck disable=SC2016 # disable variable not expanding hint
|
||||||
|
@ -26,6 +27,7 @@ TARBACK_REMOTE="${TARBACK_REMOTE:-$TARBACK_REMOTE_DEFAULT}"
|
||||||
# maybe the command needs to be transformed before being passed to the
|
# maybe the command needs to be transformed before being passed to the
|
||||||
# remote command, see _transform_ssh_command for an example
|
# remote command, see _transform_ssh_command for an example
|
||||||
TARBACK_TRANSFORM_REMOTE_COMMAND="${TARBACK_TRANSFORM_REMOTE_COMMAND:-$TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT}"
|
TARBACK_TRANSFORM_REMOTE_COMMAND="${TARBACK_TRANSFORM_REMOTE_COMMAND:-$TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT}"
|
||||||
|
TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND="${TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND:-$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND_DEFAULT}"
|
||||||
TARBACK_TAR_CREATE_COMMAND="${TARBACK_TAR_CREATE_COMMAND:-$TARBACK_TAR_CREATE_COMMAND_DEFAULT}"
|
TARBACK_TAR_CREATE_COMMAND="${TARBACK_TAR_CREATE_COMMAND:-$TARBACK_TAR_CREATE_COMMAND_DEFAULT}"
|
||||||
TARBACK_TAR_CREATE_COMMAND_FILE="${TARBACK_TAR_CREATE_COMMAND_FILE:-$TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT}"
|
TARBACK_TAR_CREATE_COMMAND_FILE="${TARBACK_TAR_CREATE_COMMAND_FILE:-$TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT}"
|
||||||
TARBACK_TAR_EXTRACT_COMMAND="${TARBACK_TAR_EXTRACT_COMMAND:-$TARBACK_TAR_EXTRACT_COMMAND_DEFAULT}"
|
TARBACK_TAR_EXTRACT_COMMAND="${TARBACK_TAR_EXTRACT_COMMAND:-$TARBACK_TAR_EXTRACT_COMMAND_DEFAULT}"
|
||||||
|
@ -45,40 +47,19 @@ _transform_split_name() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
_transform_ssh_command() {
|
|
||||||
command_name="$(echo "$TARBACK_REMOTE" | awk '{print $1}')"
|
|
||||||
if echo "$command_name" | grep -q 'ssh'; then
|
|
||||||
echo "'$1'"
|
|
||||||
else
|
|
||||||
echo "$1"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
_transform_remote() {
|
_transform_remote() {
|
||||||
r="$1"
|
r="$1"
|
||||||
# TODO add more transformers
|
if [ -n "$TARBACK_TRANSFORM_REMOTE_COMMAND" ]; then
|
||||||
for t in _transform_ssh_command "$TARBACK_TRANSFORM_REMOTE_COMMAND"; do
|
r="$("$TARBACK_TRANSFORM_REMOTE_COMMAND" "$r")"
|
||||||
[ -z "$t" ] && continue # skip empty transformers
|
|
||||||
r="$("$t" "$r")"
|
|
||||||
done
|
|
||||||
echo "$r"
|
|
||||||
}
|
|
||||||
|
|
||||||
_transform_argument_ssh() {
|
|
||||||
command_name="$(echo "$TARBACK_REMOTE" | awk '{print $1}')"
|
|
||||||
if echo "$command_name" | grep -q 'ssh'; then
|
|
||||||
echo "'$(printf '%s' "$1" | sed "s/'/'\\\\''/g")'"
|
|
||||||
else
|
|
||||||
echo "$1"
|
|
||||||
fi
|
fi
|
||||||
|
echo "$r"
|
||||||
}
|
}
|
||||||
|
|
||||||
_transform_argument() {
|
_transform_argument() {
|
||||||
a="$1"
|
a="$1"
|
||||||
for t in _transform_argument_ssh; do
|
if [ -n "$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND" ]; then
|
||||||
[ -z "$t" ] && continue # skip empty transformers
|
a="$("$TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND" "$a")"
|
||||||
a="$("$t" "$a")"
|
fi
|
||||||
done
|
|
||||||
echo "$a"
|
echo "$a"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +74,7 @@ _create() {
|
||||||
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND_FILE"
|
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND_FILE"
|
||||||
fi
|
fi
|
||||||
tarback_tar_create_command="$(_transform_remote "$tarback_tar_create_command")"
|
tarback_tar_create_command="$(_transform_remote "$tarback_tar_create_command")"
|
||||||
$TARBACK_REMOTE sh -c "$tarback_tar_create_command" - "$(_transform_argument_ssh "$src")" \
|
$TARBACK_REMOTE sh -c "$tarback_tar_create_command" - "$(_transform_argument "$src")" \
|
||||||
| $TARBACK_COMPRESSION \
|
| $TARBACK_COMPRESSION \
|
||||||
| $TARBACK_SPLIT "$dst"
|
| $TARBACK_SPLIT "$dst"
|
||||||
}
|
}
|
||||||
|
@ -113,7 +94,7 @@ _restore() {
|
||||||
tarback_tar_extract_command="$(_transform_remote "$tarback_tar_extract_command")"
|
tarback_tar_extract_command="$(_transform_remote "$tarback_tar_extract_command")"
|
||||||
$TARBACK_MERGE "$src"* \
|
$TARBACK_MERGE "$src"* \
|
||||||
| $TARBACK_COMPRESSION --decompress --stdout \
|
| $TARBACK_COMPRESSION --decompress --stdout \
|
||||||
| $TARBACK_REMOTE sh -c "$tarback_tar_extract_command" - "$(_transform_argument_ssh "$dst")"
|
| $TARBACK_REMOTE sh -c "$tarback_tar_extract_command" - "$(_transform_argument "$dst")"
|
||||||
}
|
}
|
||||||
|
|
||||||
restore() {
|
restore() {
|
||||||
|
@ -124,25 +105,27 @@ short_options='p:'
|
||||||
while getopts "$short_options" arg; do
|
while getopts "$short_options" arg; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
p)
|
p)
|
||||||
# source plugin file
|
for p in $(echo "$OPTARG" | tr ',' ' '); do
|
||||||
sourced=false
|
# source plugin file(s)
|
||||||
for loc in $TARBACK_PLUGIN_SEARCH_PATH; do
|
sourced=false
|
||||||
if [ -e "$loc/tarback/$OPTARG.sh" ]; then
|
for loc in $TARBACK_PLUGIN_SEARCH_PATH; do
|
||||||
# shellcheck disable=SC1090 # disable cannot follow source
|
if [ -e "$loc/tarback/$p.sh" ]; then
|
||||||
. "$loc/tarback/$OPTARG.sh"
|
# shellcheck disable=SC1090 # disable cannot follow source
|
||||||
sourced=true
|
. "$loc/tarback/$p.sh"
|
||||||
break
|
sourced=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if ! "$sourced"; then
|
||||||
|
echo "couldn't find plugin $p" >&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if ! "$sourced"; then
|
|
||||||
echo "couldn't find plugin $OPTARG" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "unknown option $1" >&2
|
echo "unknown option $1" >&2
|
||||||
exit 1
|
#exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
37
tarback/ssh.sh
Normal file
37
tarback/ssh.sh
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
_tarback_plugin_ssh_transform_ssh_command() {
|
||||||
|
command_name="$(echo "$TARBACK_REMOTE" | awk '{print $1}')"
|
||||||
|
if echo "$command_name" | grep -q 'ssh'; then
|
||||||
|
echo "'$1'"
|
||||||
|
else
|
||||||
|
echo "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_tarback_plugin_ssh_transform_ssh_argument() {
|
||||||
|
command_name="$(echo "$TARBACK_REMOTE" | awk '{print $1}')"
|
||||||
|
if echo "$command_name" | grep -q 'ssh'; then
|
||||||
|
echo "'$(printf '%s' "$1" | sed "s/'/'\\\\''/g")'"
|
||||||
|
else
|
||||||
|
echo "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
short_options='p:s:'
|
||||||
|
while getopts "$short_options" arg; do
|
||||||
|
case "$arg" in
|
||||||
|
s)
|
||||||
|
TARBACK_REMOTE="$OPTARG"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "unknown option $1" >&2
|
||||||
|
#exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
TARBACK_TRANSFORM_REMOTE_COMMAND=_tarback_plugin_ssh_transform_ssh_command
|
||||||
|
TARBACK_TRANSFORM_REMOTE_ARGUMENT_COMMAND=_tarback_plugin_ssh_transform_ssh_argument
|
||||||
|
|
|
@ -8,24 +8,24 @@ export TARBACK_REMOTE='ssh localhost'
|
||||||
|
|
||||||
# archive whole directory
|
# archive whole directory
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
./tarback.sh create "$workdir/source" "$workdir/dest/source.tar.xz"
|
./tarback.sh -p ssh create "$workdir/source" "$workdir/dest/source.tar.xz"
|
||||||
./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore"
|
./tarback.sh -p ssh restore "$workdir/dest/source.tar.xz" "$workdir/restore"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
||||||
# archive single file
|
# archive single file
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
filename="$(basename "$(find "$workdir/source" -type f)")"
|
filename="$(basename "$(find "$workdir/source" -type f)")"
|
||||||
./tarback.sh create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
./tarback.sh -p ssh create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
||||||
./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
./tarback.sh -p ssh restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
||||||
# split archive
|
# split archive
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
filename="$(basename "$(find "$workdir/source" -type f)")"
|
filename="$(basename "$(find "$workdir/source" -type f)")"
|
||||||
TARBACK_SPLIT="split -b 10 -" ./tarback.sh create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p ssh create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
||||||
TARBACK_SPLIT="split -b 10 -" ./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p ssh restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
[ "$(ls -1 "$workdir/dest/"*.part* | wc -l)" -gt 1 ]
|
[ "$(ls -1 "$workdir/dest/"*.part* | wc -l)" -gt 1 ]
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
|
@ -8,24 +8,24 @@ export TARBACK_REMOTE='ssh localhost'
|
||||||
|
|
||||||
# archive whole directory
|
# archive whole directory
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
./tarback.sh -p docker create "$workdir/source" "$workdir/dest/source.tar.xz"
|
./tarback.sh -p ssh,docker create "$workdir/source" "$workdir/dest/source.tar.xz"
|
||||||
./tarback.sh -p docker restore "$workdir/dest/source.tar.xz" "$workdir/restore"
|
./tarback.sh -p ssh,docker restore "$workdir/dest/source.tar.xz" "$workdir/restore"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
||||||
# archive single file
|
# archive single file
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
filename="$(basename "$(find "$workdir/source" -type f)")"
|
filename="$(basename "$(find "$workdir/source" -type f)")"
|
||||||
./tarback.sh -p docker create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
./tarback.sh -p ssh,docker create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
||||||
./tarback.sh -p docker restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
./tarback.sh -p ssh,docker restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
||||||
# split archive
|
# split archive
|
||||||
workdir="$(create_directories)"
|
workdir="$(create_directories)"
|
||||||
filename="$(basename "$(find "$workdir/source" -type f)")"
|
filename="$(basename "$(find "$workdir/source" -type f)")"
|
||||||
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p docker create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p ssh,docker create "$workdir/source/$filename" "$workdir/dest/source.tar.xz"
|
||||||
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p docker restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
TARBACK_SPLIT="split -b 10 -" ./tarback.sh -p ssh,docker restore "$workdir/dest/source.tar.xz" "$workdir/restore/$filename"
|
||||||
diff "$workdir/source" "$workdir/restore"
|
diff "$workdir/source" "$workdir/restore"
|
||||||
[ "$(ls -1 "$workdir/dest/"*.part* | wc -l)" -gt 1 ]
|
[ "$(ls -1 "$workdir/dest/"*.part* | wc -l)" -gt 1 ]
|
||||||
rm -rf "$workdir"
|
rm -rf "$workdir"
|
||||||
|
|
Loading…
Reference in a new issue