Bash-Snippets/transfer/transfer

174 lines
5.0 KiB
Plaintext
Raw Normal View History

2017-08-03 07:43:20 +02:00
#!/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