#!/bin/bash set -euo pipefail # get dropshell TEMP_DIR=$(mktemp -d) ARCH=$(uname -m) curl -L -s -o "${TEMP_DIR}/dropshell" "https://getbin.xyz/dropshell.${ARCH}" || die "Failed to download dropshell" chmod +x "${TEMP_DIR}/dropshell" trap 'rm -rf "${TEMP_DIR}"' EXIT DROPSHELL="${TEMP_DIR}/dropshell" function show_help() { cat << EOF sos is a script to upload files to a simple object storage server. Usage: sos upload [label:tag ...] Example: sos upload tools.dropshell.app ./file.txt file:latest This will upload the file to the server, and return the download URL. Environment variables: SOS_WRITE_TOKEN: The write token to use for the upload. If not set, the script will look in $HOME/.config/sos/write_token.txt. EOF exit 0 } function die() { echo "FATAL:" echo "$@" exit 1 } function datetime() { date -u +"%Y.%m%d.%H%M" } function upload() { if [ "$#" -lt 3 ]; then echo "Usage: sos upload [label:tag ...]" exit 1 fi server=$1 file=$2 first_label=$3 LABELTAGS=("$first_label") [[ "$first_label" =~ : ]] || die "Label $first_label does not contain a tag!" shift 3 for label in "$@"; do [[ "$label" =~ : ]] || die "Label $label does not contain a tag!" LABELTAGS+=("$label") done # check if file contains : [[ ! "$file" =~ : ]] || die "File contains : - this is not allowed!" [ -f "$file" ] || die "File not found: $file" # upload the file TARGET_URL="https://$server/upload" echo "Uploading $file to $TARGET_URL" DATETIME=$(datetime) # deduplicate the labeltags mapfile -t LABELTAGS < <(printf "%s\n" "${LABELTAGS[@]}" | sort -u) LABELTAGS_JSON=$(printf '"%s",' "${LABELTAGS[@]}") LABELTAGS_JSON="[${LABELTAGS_JSON%,}]" METADATA_JSON=$(cat < $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"