From bbb1f8a72872e63e99dd0563811060d639381ce0 Mon Sep 17 00:00:00 2001 From: Alex Epstein Date: Thu, 3 Aug 2017 01:43:20 -0400 Subject: [PATCH] Adding transfer --- transfer/transfer | 173 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100755 transfer/transfer diff --git a/transfer/transfer b/transfer/transfer new file mode 100755 index 0000000..182bc76 --- /dev/null +++ b/transfer/transfer @@ -0,0 +1,173 @@ +#!/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