getpkg/sos/sos
2025-05-29 23:26:50 +12:00

107 lines
2.2 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 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"
# if the label doesn't have a tag, add :lastest
if [[ ! "$label" =~ : ]]; then
label="$label:latest"
fi
# upload the file
TARGET_URL="https://$server/upload"
echo "Uploading $file to $TARGET_URL"
METADATA_JSON=$(cat<<EOF
{
"labeltags": ["$label"],
"description": "Uploaded by sos"
}
EOF
)
echo "Metadata:"
echo "$METADATA_JSON | jq"
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=""
UPLOAD_RESPONSE=$(curl -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 "Repsonse:"
echo "$UPLOAD_RESPONSE"
HASH=$(echo "$UPLOAD_RESPONSE" | jq -r '.hash')
JSON2=$(eval "curl -s \"https://$server/meta/$HASH\"") || die "Failed to get meta for $HASH"
FILENAME=$(echo "$JSON2" | jq -r '.filename')
echo "Download URL: https://$server/$label > $FILENAME"
echo "Alternative: https://$server/$HASH > $FILENAME"
echo "Hash: $HASH"
}
# if no arguments, show help
[ "$#" -gt 0 ] || show_help
CMD="$1"
shift
if [ "$CMD" == "upload" ]; then
upload "$@"
exit $?
fi
die "Unknown command: $CMD"