mirror of
https://tildegit.org/tomasino/pb.git
synced 2024-12-23 03:25:18 +01:00
175 lines
4.5 KiB
Bash
Executable File
175 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# init variables
|
|
version="v2023.12.04"
|
|
ENDPOINT="https://envs.sh"
|
|
flag_options=":hvcfe:s:"
|
|
long_flag_options="help,version,color,file,extension:,server:"
|
|
flag_version=0
|
|
flag_help=0
|
|
flag_file=0
|
|
flag_colors=0
|
|
flag_ext=0
|
|
data=""
|
|
EXT=""
|
|
|
|
# help message available via func
|
|
show_help() {
|
|
cat > /dev/stdout << END
|
|
pb [options] filename
|
|
or
|
|
(command-with-stdout) | pb
|
|
|
|
Uploads a file or data to the tilde 0x0 paste bin
|
|
|
|
OPTIONAL FLAGS:
|
|
-h | --help) Show this help
|
|
-v | --version) Show current version number
|
|
-f | --file) Explicitly interpret stdin as filename
|
|
-c | --color) Pretty color output
|
|
-s | --server server_address) Use alternative pastebin server address
|
|
-e | --extension bin_extension) Specify file extension used in the upload
|
|
END
|
|
}
|
|
|
|
show_usage() {
|
|
cat > /dev/stdout << END
|
|
usage: pb [-hfvcux] [-s server_address] filename
|
|
END
|
|
}
|
|
|
|
# helper for program exit, supports error codes and messages
|
|
die () {
|
|
msg="$1"
|
|
code="$2"
|
|
# exit code defaults to 1
|
|
if printf "%s" "${code}" | grep -q '^[0-9]+$'; then
|
|
code=1
|
|
fi
|
|
# output message to stdout or stderr based on code
|
|
if [ -n "${msg}" ]; then
|
|
if [ "${code}" -eq 0 ]; then
|
|
printf "%s\\n" "${msg}"
|
|
else
|
|
printf "%s%s%s\\n" "$ERROR" "${msg}" "$RESET" >&2
|
|
fi
|
|
fi
|
|
exit "${code}"
|
|
}
|
|
|
|
# attempt to parse options or die
|
|
if ! PARSED_ARGUMENTS=$(getopt -a -n pb -o ${flag_options} --long ${long_flag_options} -- "$@"); then
|
|
printf "pb: unknown option\\n"
|
|
show_usage
|
|
exit 2
|
|
fi
|
|
|
|
# For debugging: echo "PARSED_ARGUMENTS is $PARSED_ARGUMENTS"
|
|
eval set -- "$PARSED_ARGUMENTS"
|
|
while :
|
|
do
|
|
case "$1" in
|
|
-h | --help) flag_help=1 ; shift ;;
|
|
-v | --version) flag_version=1 ; shift ;;
|
|
-c | --color) flag_color=1 ; shift ;;
|
|
-f | --file) flag_file=1 ; shift ;;
|
|
-e | --extension) flag_ext=1; EXT="$2" ; shift 2 ;;
|
|
-s | --server) ENDPOINT="$2" ; shift 2 ;;
|
|
--) shift; break ;;
|
|
*) echo "Unexpected option: $1 - this should not happen."
|
|
show_usage ; die 3 ;;
|
|
esac
|
|
done
|
|
|
|
# display current version
|
|
if [ ${flag_version} -gt 0 ]; then
|
|
printf "%s\\n" "${version}"
|
|
die "" 0
|
|
fi
|
|
|
|
# display help
|
|
if [ ${flag_help} -gt 0 ]; then
|
|
show_help
|
|
die "" 0
|
|
fi
|
|
|
|
# is not interactive shell, use stdin
|
|
if [ -t 0 ]; then
|
|
flag_file=1
|
|
else
|
|
if [ ${flag_ext} -gt 0 ]; then
|
|
# short-circuit stdin access to ensure binary data is transferred to curl
|
|
curl -sF"file=@-;filename=null.${EXT}" "${ENDPOINT}" < /dev/stdin
|
|
exit 0
|
|
else
|
|
data="$(cat < /dev/stdin )"
|
|
fi
|
|
fi
|
|
|
|
# if data variable is empty (not a pipe) use params as fallback
|
|
if [ -z "$data" ]; then
|
|
data="$*"
|
|
fi
|
|
|
|
# Colors
|
|
if [ ${flag_colors} -gt 0 ]; then
|
|
SUCCESS=$(tput setaf 190)
|
|
ERROR=$(tput setaf 196)
|
|
RESET=$(tput sgr0)
|
|
else
|
|
SUCCESS=""
|
|
ERROR=""
|
|
RESET=""
|
|
fi
|
|
|
|
if [ ${flag_file} -gt 0 ]; then
|
|
# file mode
|
|
if [ -z "${data}" ]; then
|
|
# if no data
|
|
# print error message
|
|
printf "%sProvide data to upload%s\\n" "$ERROR" "$RESET"
|
|
elif [ ! -f "${data}" ]; then
|
|
# file not found with name provided
|
|
# print error messagse
|
|
printf "%s%s%s\\tFile not found.%s\\n" "$RESET" "${data}" "$ERROR" "$RESET"
|
|
# attempt to split data string (multi-line?) and upload each string as file
|
|
for f in ${data}; do
|
|
# if there's nothing to parse, skip this loop
|
|
if [ "$f" = "$data" ]; then
|
|
break;
|
|
fi
|
|
# check if file exists
|
|
if [ -f "${f}" ]; then
|
|
if [ ${flag_ext} -gt 0 ]; then
|
|
# send file to endpoint masked with new extension
|
|
result=$(curl -sF"file=@${f};filename=null.${EXT}" "${ENDPOINT}")
|
|
else
|
|
# send file to endpoint
|
|
result=$(curl -sF"file=@${f}" "${ENDPOINT}")
|
|
fi
|
|
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
|
|
else
|
|
# print error message
|
|
printf "%sFile not found.%s\\n" "$ERROR" "$RESET"
|
|
fi
|
|
done
|
|
else
|
|
# data available in file
|
|
# send file to endpoint
|
|
result=$(curl -sF"file=@${data}" "${ENDPOINT}")
|
|
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
|
|
fi
|
|
else
|
|
# non-file mode
|
|
if [ -z "${data}" ]; then
|
|
# if no data
|
|
# print error message
|
|
printf "%sNo data found for upload. Please try again.%s\\n" "$ERROR" "$RESET"
|
|
else
|
|
# data available
|
|
# send data to endpoint
|
|
result=$(printf "%s" "${data}" | curl -sF"file=@-;filename=null.txt" "${ENDPOINT}")
|
|
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
|
|
fi
|
|
fi
|