174 lines
5.0 KiB
Plaintext
174 lines
5.0 KiB
Plaintext
|
#!/usr/bin/env bash
|
||
|
# Author: Alexander Epstein https://github.com/alexanderepstein
|
||
|
configuredDownloadClient=""
|
||
|
configuredUploadClient=""
|
||
|
configuredClient=""
|
||
|
currentVersion="1.17.3"
|
||
|
single="false"
|
||
|
down="false"
|
||
|
|
||
|
## This function determines which http get tool the system has installed and returns an error if there isnt one
|
||
|
getConfiguredDownloadClient()
|
||
|
{
|
||
|
if command -v curl &>/dev/null; then
|
||
|
configuredDownloadClient="curl"
|
||
|
elif command -v wget &>/dev/null; then
|
||
|
configuredDownloadClient="wget"
|
||
|
elif command -v fetch &>/dev/null; then
|
||
|
configuredDownloadClient="fetch"
|
||
|
else
|
||
|
echo "Error: Downloading with this tool reqires either curl, wget, or fetch to be installed." >&2
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
## Allows to call the users configured client without if statements everywhere
|
||
|
httpGet()
|
||
|
{
|
||
|
case "$configuredClient" in
|
||
|
curl) curl -A curl -s "$@" ;;
|
||
|
wget) wget -qO- "$@" ;;
|
||
|
httpie) http -b GET "$@" ;;
|
||
|
fetch) fetch -q "$@" ;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
## This function determines which http get tool the system has installed and returns an error if there isnt one
|
||
|
getConfiguredClient()
|
||
|
{
|
||
|
if command -v curl &>/dev/null; then
|
||
|
configuredClient="curl"
|
||
|
elif command -v wget &>/dev/null; then
|
||
|
configuredClient="wget"
|
||
|
elif command -v http &>/dev/null; then
|
||
|
configuredClient="httpie"
|
||
|
elif command -v fetch &>/dev/null; then
|
||
|
configuredClient="fetch"
|
||
|
else
|
||
|
echo "Error: This tool reqires either curl, wget, httpie or fetch to be installed." >&2
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
## This function determines which http get tool the system has installed and returns an error if there isnt one
|
||
|
getconfiguredUploadClient()
|
||
|
{
|
||
|
if command -v curl &>/dev/null; then
|
||
|
configuredUploadClient="curl"
|
||
|
elif command -v wget &>/dev/null; then
|
||
|
configuredUploadClient="wget"
|
||
|
else
|
||
|
echo "Error: Uploading with this tool reqires either curl or wget to be installed." >&2
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
## Allows to call the users configured client without if statements everywhere
|
||
|
httpDownload()
|
||
|
{
|
||
|
|
||
|
case "$configuredDownloadClient" in
|
||
|
curl) curl -A curl --progress -o "$tempOutputPath/$3" "https://transfer.sh/$2/$3" || { echo "Failure!"; return 1;};;
|
||
|
wget) wget --progress=dot -O "$tempOutputPath/$3" "https://transfer.sh/$2/$3" || { echo "Failure!"; return 1;} ;;
|
||
|
fetch) fetch -q -o "$tempOutputPath/$3" "https://transfer.sh/$2/$3" || { echo "Failure!"; return 1;};;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
checkInternet()
|
||
|
{
|
||
|
httpGet github.com > /dev/null 2>&1 || { echo "Error: no active internet connection" >&2; return 1; } # query github with a get request
|
||
|
}
|
||
|
|
||
|
singleDownload()
|
||
|
{
|
||
|
if [[ ! -d $1 && $1 != "" ]];then { echo "Error: invalid output directory"; exit 1;};fi
|
||
|
if [[ $1 == "" ]];then tempOutputPath=$(pwd)
|
||
|
else tempOutputPath=$1;fi
|
||
|
if [ -f "$tempOutputPath/$3" ];then
|
||
|
echo -n "File aleady exists at $tempOutputPath/$3, do you want to delete it? [Y/n] "
|
||
|
read -r answer
|
||
|
if [[ "$answer" == [Yy] ]] ;then
|
||
|
rm -f $tempOutputPath/$3
|
||
|
else
|
||
|
echo "Stopping download"
|
||
|
return 1
|
||
|
fi
|
||
|
fi
|
||
|
echo "Downloading $3"
|
||
|
httpDownload "$tempOutputPath" "$2" "$3"
|
||
|
echo "Success!"
|
||
|
}
|
||
|
|
||
|
httpSingleUpload()
|
||
|
{
|
||
|
case "$configuredUploadClient" in
|
||
|
curl) response=$(curl -A curl --progress --upload-file "$1" "https://transfer.sh/$2") || { echo "Failure!"; return 1;};;
|
||
|
wget) response=$(wget --progress=dot --method PUT --body-file="$1" "https://transfer.sh/$2") || { echo "Failure!"; return 1;} ;;
|
||
|
esac
|
||
|
echo -e "Success!\nFile uploaded to: $response"
|
||
|
}
|
||
|
|
||
|
|
||
|
singleUpload()
|
||
|
{
|
||
|
filePath=$(echo $1 | sed s:"~":$HOME:g)
|
||
|
if [ ! -f $filePath ];then { echo "Error: invalid file path"; return 1;}; fi
|
||
|
tempFileName=$(echo $1 | sed "s/.*\///")
|
||
|
tempFilePath=$(echo $1 | sed s:"~":$HOME:g)
|
||
|
echo "Uploading $tempFileName"
|
||
|
httpSingleUpload "$tempFilePath" "$tempFileName"
|
||
|
}
|
||
|
|
||
|
while getopts "s:d:uvh" opt; do
|
||
|
case "$opt" in
|
||
|
\?) echo "Invalid option: -$OPTARG" >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
h) usage
|
||
|
exit 0
|
||
|
;;
|
||
|
v) echo "Version $currentVersion"
|
||
|
exit 0
|
||
|
;;
|
||
|
u) update
|
||
|
exit 0
|
||
|
;;
|
||
|
d) down="true"
|
||
|
if [ $# -lt 4 ];then { echo "Error: not enough arguments for downloading a file, see the usage"; return 1;};fi
|
||
|
inputFilePath=$(echo "$*" | sed s/-d//g | cut -d " " -f 2)
|
||
|
inputID=$(echo "$*" | sed s/-d//g | cut -d " " -f 3)
|
||
|
inputFileName=$(echo "$*" | sed s/-d//g | cut -d " " -f 4)
|
||
|
;;
|
||
|
s) single="true"
|
||
|
inputFilePath=$(echo "$@" | sed s/-s//g)
|
||
|
;;
|
||
|
:) echo "Option -$OPTARG requires an argument." >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if $down && $single;then { echo "Error: upload and download are mutually exclusive";exit 1;};fi
|
||
|
|
||
|
if [[ $# == "0" ]]; then
|
||
|
usage
|
||
|
exit 0
|
||
|
elif [[ $1 == "help" ]]; then
|
||
|
usage
|
||
|
exit 0
|
||
|
elif [[ $1 == "update" ]]; then
|
||
|
update
|
||
|
exit 0
|
||
|
elif $single ;then
|
||
|
getConfiguredClient || exit 1
|
||
|
checkInternet || exit 1
|
||
|
getconfiguredUploadClient || exit 1
|
||
|
singleUpload "$inputFilePath" || exit 1
|
||
|
exit 0
|
||
|
elif $down;then
|
||
|
getConfiguredClient || exit 1
|
||
|
checkInternet || exit 1
|
||
|
getConfiguredDownloadClient || exit 1
|
||
|
singleDownload "$inputFilePath" "$inputID" "$inputFileName" || exit 1
|
||
|
exit 0
|
||
|
fi
|