1
0
mirror of https://tildegit.org/tomasino/pb.git synced 2024-11-20 03:25:54 +01:00
tomasino-pb/pb

201 lines
4.3 KiB
Plaintext
Raw Normal View History

2018-08-15 05:25:07 +02:00
#!/bin/sh
# init variables
version="v.2020.01.20"
2018-08-16 06:34:13 +02:00
ENDPOINT="https://ttm.sh"
flag_options="hvcufs::x"
2018-08-15 05:25:07 +02:00
flag_version=0
flag_help=0
flag_file=0
flag_url=0
flag_shortlist=0
2018-08-16 02:43:40 +02:00
flag_colors=0
2018-08-15 05:25:07 +02:00
data=""
# help message available via func
2018-08-15 05:25:07 +02:00
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 Show this help
-v Show current version number
-f Explicitly interpret stdin as filename
2018-08-16 02:43:40 +02:00
-c Pretty color output
-u Shorten URL
2018-08-15 05:25:07 +02:00
-s server_address Use alternative pastebin server address
END
}
# helper for program exit, supports error codes and messages
2018-08-15 05:25:07 +02:00
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
2019-01-28 21:55:40 +01:00
if [ -n "${msg}" ]; then
2018-08-15 05:25:07 +02:00
if [ "${code}" -eq 0 ]; then
printf "%s\\n" "${msg}"
else
2020-01-20 12:50:29 +01:00
printf "%s%s%s\\n" "$ERROR" "${msg}" "$RESET" >&2
2018-08-15 05:25:07 +02:00
fi
fi
exit "${code}"
}
# is not interactive shell, use stdin
if [ -t 0 ]; then
flag_file=1
else
data="$(cat < /dev/stdin )"
fi
# attempt to parse options or die
2018-08-15 05:25:07 +02:00
if ! parsed=$(getopt ${flag_options} "$@"); then
die "Invalid input" 2
fi
# handle options
2018-08-15 05:25:07 +02:00
eval set -- "${parsed}"
while true; do
case "$1" in
-h)
flag_help=1
;;
-v)
flag_version=1
;;
2018-08-16 02:43:40 +02:00
-c)
flag_colors=1
;;
2018-08-15 05:25:07 +02:00
-f)
flag_file=1
;;
-s)
shift
2018-08-16 18:29:06 +02:00
ENDPOINT="$1"
2018-08-15 05:25:07 +02:00
;;
-u)
flag_url=1
;;
-x)
flag_shortlist=1
;;
2018-08-15 05:25:07 +02:00
--)
shift
break
;;
*)
die "Internal error: $1" 3
;;
esac
2018-08-16 18:49:14 +02:00
shift
2018-08-15 05:25:07 +02:00
done
# if data variable is empty (not a pipe) use params as fallback
2018-08-15 05:25:07 +02:00
if [ -z "$data" ]; then
data="$*"
fi
# display current version
2018-08-15 05:25:07 +02:00
if [ ${flag_version} -gt 0 ]; then
printf "%s\\n" "${version}"
die "" 0
fi
# display help
2018-08-15 05:25:07 +02:00
if [ ${flag_help} -gt 0 ]; then
show_help
die "" 0
fi
# shortlist used for bash command completion
if [ ${flag_shortlist} -gt 0 ]; then
out="-f -v -h -s -c -u"
2018-08-15 05:57:16 +02:00
lsresults="$(ls)"
die "${out} ${lsresults}" 0
fi
# Colors
if [ ${flag_colors} -gt 0 ]; then
SUCCESS=$(tput setaf 190)
ERROR=$(tput setaf 196)
RESET=$(tput sgr0)
else
SUCCESS=""
ERROR=""
RESET=""
fi
# URL shortening reference
# If URL mode detected, process URL shortener and end processing without
# checking for a file to upload to the pastebin
if [ ${flag_url} -gt 0 ]; then
if [ -z "${data}" ]; then
# if no data
# print error message
printf "%sProvide URL to shorten%s\\n" "$ERROR" "$RESET"
else
# shorten URL and print results
2020-01-20 12:50:29 +01:00
result=$(curl -sF"shorten=${data}" "${ENDPOINT}")
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
fi
die "" 0
fi
2018-08-15 05:25:07 +02:00
if [ ${flag_file} -gt 0 ]; then
# file mode
2018-08-15 05:25:07 +02:00
if [ -z "${data}" ]; then
# if no data
# print error message
printf "%sProvide data to upload%s\\n" "$ERROR" "$RESET"
2018-08-15 05:25:07 +02:00
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
2018-08-15 05:25:07 +02:00
# if there's nothing to parse, skip this loop
if [ "$f" = "$data" ]; then
break;
fi
# check if file exists
2018-08-15 05:25:07 +02:00
if [ -f "${f}" ]; then
# send file to endpoint
2020-01-20 12:50:29 +01:00
result=$(curl -sF"file=@${f}" "${ENDPOINT}")
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
2018-08-15 05:25:07 +02:00
else
# print error message
printf "%sFile not found.%s\\n" "$ERROR" "$RESET"
2018-08-15 05:25:07 +02:00
fi
done
else
# data available in file
# send file to endpoint
2020-01-20 12:50:29 +01:00
result=$(curl -sF"file=@${data}" "${ENDPOINT}")
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
2018-08-15 05:25:07 +02:00
fi
else
# non-file mode
2018-08-15 05:25:07 +02:00
if [ -z "${data}" ]; then
# if no data
# print error message
printf "%sNo data found for upload. Please try again.%s\\n" "$ERROR" "$RESET"
2018-08-15 05:25:07 +02:00
else
# data available
# send data to endpoint, print short url
2020-01-20 12:50:29 +01:00
result=$(printf "%s" "${data}" | curl -sF"file=@-;filename=null.txt" "${ENDPOINT}")
printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET"
2018-08-15 05:25:07 +02:00
fi
fi