106 lines
2.1 KiB
Bash
Executable File
106 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
PORT=8080
|
|
CONFIG=$HOME/.config/rsync/rsync.conf
|
|
CACHE_DIR=$HOME/.cache/rsyncd
|
|
OPT_HTTP=false
|
|
|
|
IP=$(ip addr | awk '/state UP/ {getline; getline; $0=$2; gsub(/\/.*/, "");print; exit}')
|
|
|
|
usage () {
|
|
cat <<EOF>&2
|
|
Usage: ${0##*/} PATH
|
|
|
|
Share PATH over the network.
|
|
|
|
By default, startup an rsync daemon and share PATH as read-only under the
|
|
'files' module. Clients can sync with, for instance:
|
|
|
|
rsync -iavzzP rsync://$IP:$PORT/files DESTINATION
|
|
|
|
An HTTP server can be started instead.
|
|
|
|
Options:
|
|
|
|
-p PORT: Specify a port number (default: $PORT).
|
|
Must be above 1024 to run without privileges.
|
|
|
|
-H: Start an HTTP server instead.
|
|
|
|
EOF
|
|
}
|
|
|
|
while getopts ":hHp:" opt; do
|
|
case $opt in
|
|
h)
|
|
usage
|
|
exit ;;
|
|
H)
|
|
OPT_HTTP=true ;;
|
|
p)
|
|
PORT="$OPTARG" ;;
|
|
\?)
|
|
usage
|
|
exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
shift $(($OPTIND - 1))
|
|
|
|
[ $# -ne 1 ] && usage && exit 1
|
|
[ "$1" = "-h" ] && usage && exit
|
|
[ "$1" = "--" ] && shift
|
|
|
|
|
|
TARGET=$(realpath "$1")
|
|
|
|
share_rsync(){
|
|
mkdir -p "$(dirname "$CONFIG")" "$CACHE_DIR"
|
|
cat<<EOF>"$CONFIG"
|
|
pid file = $CACHE_DIR/rsyncd.pid
|
|
lock file = $CACHE_DIR/rsyncd.lock
|
|
log file = $CACHE_DIR/rsyncd.log
|
|
port = $PORT
|
|
use chroot = false
|
|
|
|
[files]
|
|
path = $TARGET
|
|
comment = Rsync share
|
|
read only = true
|
|
timeout = 300
|
|
|
|
EOF
|
|
|
|
rsync --daemon --config="$CONFIG" && \
|
|
echo >&2 "rsync daemon listening on $IP:$PORT"
|
|
}
|
|
|
|
share_woof() {
|
|
if command -v guix >/dev/null 2>&1; then
|
|
guix environment -C -N --expose="$TARGET"="$TARGET" --ad-hoc woof -- woof -c 9999 -p $PORT "$TARGET" || \
|
|
guix environment --ad-hoc woof -- woof -c 9999 -p $PORT "$TARGET"
|
|
else
|
|
woof -c 9999 -p $PORT "$TARGET"
|
|
fi
|
|
}
|
|
|
|
share_python() {
|
|
echo >&2 "Python HTTP server will listen on $IP:$PORT."
|
|
if command -v guix >/dev/null 2>&1; then
|
|
guix environment -C -N --expose="$TARGET"="$TARGET" --ad-hoc python -- \
|
|
python3 -m http.server -d "$TARGET" $PORT
|
|
elif command -v python3 >/dev/null 2>&1; then
|
|
python3 -m http.server -d "$TARGET" $PORT
|
|
else
|
|
python -m http.server -d "$TARGET" $PORT
|
|
fi
|
|
}
|
|
|
|
if [ -f "$TARGET" ]; then
|
|
share_woof "$TARGET"
|
|
elif $OPT_HTTP; then
|
|
share_python "$TARGET"
|
|
else
|
|
share_rsync
|
|
fi
|