From 0d9bf4b951877dc3fde54d2ffd0fcdaae72d972d Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Wed, 22 Nov 2023 23:12:41 +0100 Subject: [PATCH] First commit --- slcl-upload | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100755 slcl-upload diff --git a/slcl-upload b/slcl-upload new file mode 100755 index 0000000..f8aa339 --- /dev/null +++ b/slcl-upload @@ -0,0 +1,132 @@ +#! /bin/bash + +# Use of bash is required because "upload_dir" is recursive and +# thus needs local variables. + +set -eu + +usage() +{ + printf "$0 \n" +} + +escape_url() +{ + perl -MURI::Escape -e \ + 'print uri_escape shift, , q{^A-Za-z0-9\-._~/:}' -- "$1" +} + +if [ $# != 3 ] +then + usage >&2 + exit 1 +fi + +SRC="$1" +DIR="$2" +URL="$3" + +echo Username: >&2 +IFS= read -r USER + +if printf '%s' "$USER" | grep -qe '[[:space:]]' +then + echo Username cannot contain whitespaces >&2 + exit 1 +fi + +TTYCFG=$(stty -g) +trap "stty $TTYCFG" INT QUIT TERM EXIT +stty -echo +echo Password: >&2 +IFS= read -r PWD +stty echo +# Force newline +echo + +COOKIE="$(mktemp)" + +cleanup() +{ + rm -f $COOKIE +} + +slcl_mkdir() +{ + if ! curl --head \ + --fail-with-body \ + --no-progress-meter \ + -s \ + -b "$COOKIE" \ + -o /dev/null \ + "$(escape_url "$URL/user$2/$1/")" + then + curl -X POST \ + --fail-with-body \ + -b "$COOKIE" \ + --data-urlencode "name=$1" --data-urlencode "dir=$2/" \ + "$URL/mkdir" + fi +} + +#trap cleanup EXIT + +curl -X POST \ + --fail-with-body \ + -c "$COOKIE" \ + --data-urlencode "username=$USER" --data-urlencode "password=$PWD" \ + "$URL/login" + +upload_dir() +{ + local SRC="$1" + local DIR="$2" + local N=$(cd "$1" && ls | wc -l) + local I=1 + + test $N -eq 0 && return + + while read f + do + printf "[%d/%d] %s -> %s DIR=%s SRC=%s" "$I" "$N" "$f" "$DIR$SRC/" "$DIR" "$SRC" + + if test -d "$SRC/$f" + then + printf " [entering directory]\n" + slcl_mkdir "$f" "$DIR$SRC" + upload_dir "$SRC/$f" "$DIR" + elif ! test -f "$SRC/$f" + then + printf " [not a file]\n" + elif curl --head \ + --fail-with-body \ + --no-progress-meter \ + -s \ + -b "$COOKIE" \ + -o /dev/null \ + "$(escape_url "$URL/user/$SRC$DIR$f")" + then + printf " [skipping]\n" + else + while ! curl -X POST \ + --fail-with-body \ + -b "$COOKIE" \ + -F dir="$DIR$SRC/" \ + -F "file=@$SRC/$f;filename=$(basename "$f")" \ + "$(escape_url "$URL/upload")" + do + printf " [retrying]" >&2 + sleep 5 + done + + printf " [done]\n" + fi + + I=$(($I + 1)) + done <<-EOF + $(cd "$1" && ls) + EOF +} + +slcl_mkdir "$SRC" "$DIR" +upload_dir "$SRC" "$DIR"