127 lines
2.6 KiB
Bash
Executable File
127 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
# sos upload <server> <label:tag> <file>
|
|
|
|
# example:
|
|
# sos upload tools.dropshell.app file:latest ./file.txt
|
|
|
|
# this will upload the file to the server, and return the download URL
|
|
|
|
|
|
function show_help() {
|
|
cat << EOF
|
|
|
|
sos is a script to upload files to a simple object storage server.
|
|
|
|
Usage:
|
|
sos upload <server> <label:tag> <file>
|
|
|
|
Example:
|
|
sos upload tools.dropshell.app file:latest ./file.txt
|
|
|
|
This will upload the file to the server, and return the download URL
|
|
EOF
|
|
exit 0
|
|
}
|
|
|
|
function die() {
|
|
echo "FATAL:"
|
|
echo "$@"
|
|
exit 1
|
|
}
|
|
|
|
function datetime() {
|
|
date -u +"%Y.%m%d.%H%M"
|
|
}
|
|
|
|
|
|
function upload() {
|
|
if [ "$#" -ne 3 ]; then
|
|
echo "Usage: sos upload <server> <label:tag> <file>"
|
|
exit 1
|
|
fi
|
|
|
|
server=$1
|
|
label=$2
|
|
file=$3
|
|
|
|
[ -f "$file" ] || die "File not found: $file"
|
|
|
|
|
|
# upload the file
|
|
TARGET_URL="https://$server/upload"
|
|
echo "Uploading $file to $TARGET_URL"
|
|
|
|
DATETIME=$(datetime)
|
|
|
|
# if the label doesn't have a tag, add :lastest
|
|
[[ "$label" =~ : ]] || label="$label:latest"
|
|
label_base=$(echo "$label" | cut -d':' -f1)
|
|
|
|
LABELTAGS=(
|
|
"$label"
|
|
"$label_base:$DATETIME"
|
|
"$label_base:latest"
|
|
)
|
|
# deduplicate the labeltags
|
|
mapfile -t LABELTAGS < <(printf "%s\n" "${LABELTAGS[@]}" | sort -u)
|
|
LABELTAGS_JSON=$(printf '"%s",' "${LABELTAGS[@]}")
|
|
LABELTAGS_JSON="[${LABELTAGS_JSON%,}]"
|
|
|
|
METADATA_JSON=$(cat <<EOF
|
|
{
|
|
"labeltags": $LABELTAGS_JSON,
|
|
"description": "Uploaded by sos",
|
|
"version": "$DATETIME"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
TOKENPATH="$HOME/.config/sos/write_token.txt"
|
|
if [ ! -f "$TOKENPATH" ]; then
|
|
die "Token file not found: $TOKENPATH. Please create it and put your write token in it."
|
|
fi
|
|
WRITE_TOKEN=$(cat "$TOKENPATH")
|
|
|
|
HASH=""
|
|
|
|
curl --progress-bar -X PUT \
|
|
-H "Authorization: Bearer ${WRITE_TOKEN}" \
|
|
-F "file=@${file}" \
|
|
-F "metadata=${METADATA_JSON}" \
|
|
"$TARGET_URL" \
|
|
|| die "Failed to upload $file to $TARGET_URL"
|
|
|
|
echo " "
|
|
echo " "
|
|
|
|
JSON1=$(eval "curl -s \"https://$server/hash/$label\"")
|
|
HASH=$(echo "$JSON1" | jq -r '.hash')
|
|
|
|
JSON2=$(eval "curl -s \"https://$server/meta/$HASH\"") || die "Failed to get meta for $HASH"
|
|
FILENAME=$(echo "$JSON2" | jq -r '.metadata.filename')
|
|
|
|
echo "Metadata:"
|
|
echo "$JSON2" | jq
|
|
|
|
echo " "
|
|
|
|
echo "Download URL: https://$server/$label > $FILENAME"
|
|
echo "Alternative: https://$server/$HASH > $FILENAME"
|
|
}
|
|
|
|
# if no arguments, show help
|
|
[ "$#" -gt 0 ] || show_help
|
|
|
|
CMD="$1"
|
|
shift
|
|
|
|
if [ "$CMD" == "upload" ]; then
|
|
upload "$@"
|
|
exit $?
|
|
fi
|
|
|
|
die "Unknown command: $CMD"
|