taft/taft
2024-12-25 18:22:26 +01:00

99 lines
1.7 KiB
Bash

#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
progname=$0
error() {
for line in "$@"; do
printf '%s\n' "$progname: $line" 1>&2
done
exit 1
}
args=$(getopt --options p:P:vc: --longoptions=port:,path:,verbose,compress: --name "$progname" -- "$@")
eval set -- "$args"
port=1337
path=.
tarflags=()
ncflags=()
while true; do
case $1 in
(-p | --port)
port=$2
shift 2
;;
(-P | --path)
path=$2
shift 2
;;
(-v | --verbose)
tarflags+=(--verbose)
ncflags+=(-v)
shift
;;
(-c | --compress)
algo=$2
case $algo in
(none)
;;
(xz)
tarflags+=(--xz)
;;
(zstd)
tarflags+=(--zstd)
;;
(*)
error 'invalid compression algorithm'
;;
esac
shift 2
;;
(--)
shift
break
;;
esac
done
if (( $# == 0 )); then
error 'a subcommand is required'
fi
subcommand=$1
case $subcommand in
(send)
shift
if (( $# < 1 )); then
error 'the destination address is required'
fi
if (( $# > 1 )); then
error 'too many arguments'
fi
dest=$1
tar --create "${tarflags[@]}" -- "$path" | nc -q 1 "${ncflags[@]}" -- "$dest" "$port"
;;
(recv | receive)
shift
if (( $# > 0 )); then
error 'too many arguments'
fi
nc -q 1 -l -p "$port" "${ncflags[@]}" | tar --extract "${tarflags[@]}"
;;
(*)
error 'invalid subcommand'
;;
esac