slcl-upload/slcl-upload

144 lines
2.1 KiB
Plaintext
Raw Normal View History

2023-11-22 23:12:41 +01:00
#! /bin/bash
# Use of bash is required because "upload_dir" is recursive and
# thus needs local variables.
set -eu
usage()
{
printf "$0 <srcdir> <dstdir> <url>\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
2023-11-23 11:41:33 +01:00
src="$1"
dir="$2"
url="$3"
2023-11-22 23:12:41 +01:00
echo Username: >&2
2023-11-23 11:41:33 +01:00
IFS= read -r user
2023-11-22 23:12:41 +01:00
2023-11-23 11:41:33 +01:00
if printf '%s' "$user" | grep -qe '[[:space:]]'
2023-11-22 23:12:41 +01:00
then
echo Username cannot contain whitespaces >&2
exit 1
fi
2023-11-23 11:41:33 +01:00
ttycfg=$(stty -g)
trap "stty $ttycfg" INT QUIT TERM EXIT
2023-11-22 23:12:41 +01:00
stty -echo
echo Password: >&2
2023-11-23 11:41:33 +01:00
IFS= read -r pwd
2023-11-22 23:12:41 +01:00
stty echo
# Force newline
echo
2023-11-23 11:41:33 +01:00
cookie="$(mktemp)"
2023-11-22 23:12:41 +01:00
cleanup()
{
2023-11-23 11:41:33 +01:00
rm -f $cookie
2023-11-22 23:12:41 +01:00
}
slcl_mkdir()
{
if ! curl --head \
--fail-with-body \
--no-progress-meter \
-s \
2023-11-23 11:41:33 +01:00
-b "$cookie" \
2023-11-22 23:12:41 +01:00
-o /dev/null \
2023-11-23 11:41:33 +01:00
"$(escape_url "$url/user$2/$1/")"
2023-11-22 23:12:41 +01:00
then
curl -X POST \
--fail-with-body \
2023-11-23 11:41:33 +01:00
-b "$cookie" \
2023-11-22 23:12:41 +01:00
--data-urlencode "name=$1" --data-urlencode "dir=$2/" \
2023-11-23 11:41:33 +01:00
"$url/mkdir"
2023-11-22 23:12:41 +01:00
fi
}
trap cleanup EXIT
curl -X POST \
--fail-with-body \
2023-11-23 11:41:33 +01:00
-c "$cookie" \
--data-urlencode "username=$user" --data-urlencode "password=$pwd" \
"$url/login"
2023-11-22 23:12:41 +01:00
2023-11-23 11:41:33 +01:00
level=0
2023-11-22 23:12:41 +01:00
upload_dir()
{
2023-11-23 11:41:33 +01:00
local src="$1"
local dir="$2"
local n=$(cd "$1" && ls -A | wc -l)
local i=1
2023-11-22 23:12:41 +01:00
2023-11-23 11:41:33 +01:00
test $n -eq 0 && return
2023-11-22 23:12:41 +01:00
2023-11-23 11:41:33 +01:00
level=$(($level + 1))
2023-11-22 23:12:41 +01:00
while read f
do
2023-11-23 11:41:33 +01:00
for l in $(seq $level)
2023-11-22 23:12:41 +01:00
do
printf "-"
done
2023-11-23 11:41:33 +01:00
printf " [%d/%d] %s -> %s " "$i" "$n" "$f" "$dir$src/"
2023-11-22 23:12:41 +01:00
2023-11-23 11:41:33 +01:00
if test -d "$src/$f"
2023-11-22 23:12:41 +01:00
then
printf "[entering directory]\n"
2023-11-23 11:41:33 +01:00
slcl_mkdir "$f" "$dir$src"
upload_dir "$src/$f" "$dir"
elif ! test -f "$src/$f"
2023-11-22 23:12:41 +01:00
then
printf "[not a file]\n"
elif curl --head \
--fail-with-body \
--no-progress-meter \
-s \
2023-11-23 11:41:33 +01:00
-b "$cookie" \
2023-11-22 23:12:41 +01:00
-o /dev/null \
2023-11-23 11:41:33 +01:00
"$(escape_url "$url/user$dir$src/$f")"
2023-11-22 23:12:41 +01:00
then
printf "[skipping]\n"
else
while ! curl -X POST \
--fail-with-body \
2023-11-23 11:41:33 +01:00
-b "$cookie" \
-F dir="$dir$src/" \
-F "file=@$src/$f;filename=$(basename -- "$f")" \
2023-11-23 11:41:33 +01:00
"$(escape_url "$url/upload")"
2023-11-22 23:12:41 +01:00
do
printf "[retrying]"
sleep 5
done
printf "[done]\n"
fi
2023-11-23 11:41:33 +01:00
i=$(($i + 1))
2023-11-22 23:12:41 +01:00
done <<-EOF
$(cd "$1" && ls -A)
2023-11-22 23:12:41 +01:00
EOF
2023-11-23 11:41:33 +01:00
level=$(($level - 1))
2023-11-22 23:12:41 +01:00
}
2023-11-23 11:41:33 +01:00
slcl_mkdir "$src" "$dir"
upload_dir "$src" "$dir"