222 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
| #!/bin/bash
 | |
| set -e
 | |
| 
 | |
| ############################################################
 | |
| # Help                                                     #
 | |
| ############################################################
 | |
| help()
 | |
| {
 | |
|    # Display Help
 | |
|    echo "Send files or text with PairDrop via command-line interface."
 | |
|    echo "Current domain: ${DOMAIN}"
 | |
|    echo
 | |
|    echo "Usage:"
 | |
|    echo -e "Open PairDrop:\t\t$(basename "$0")"
 | |
|    echo -e "Send files:\t\t$(basename "$0") file/directory"
 | |
|    echo -e "Send text:\t\t$(basename "$0") -t \"text\""
 | |
|    echo -e "Specify domain:\t\t$(basename "$0") -d \"https://pairdrop.net/\""
 | |
|    echo -e "Show this help text:\t$(basename "$0") (-h|--help)"
 | |
| }
 | |
| 
 | |
| openPairDrop()
 | |
| {
 | |
|   url="$DOMAIN"
 | |
|   if [[ -n $params ]];then
 | |
|     url="${url}?${params}"
 | |
|   fi
 | |
|   if [[ -n $hash ]];then
 | |
|     url="${url}#${hash}"
 | |
|   fi
 | |
| 
 | |
|   echo "PairDrop is opening at $DOMAIN"
 | |
|   if [[ $OS == "Windows" ]];then
 | |
|     start "$url"
 | |
|   elif [[ $OS == "Mac" ]];then
 | |
|     open "$url"
 | |
|   elif [[ $OS == "WSL" || $OS == "WSL2" ]];then
 | |
|     powershell.exe /c "Start-Process ${url}"
 | |
|   else
 | |
|     xdg-open "$url"
 | |
|   fi
 | |
| 
 | |
| 
 | |
|   exit
 | |
| 
 | |
| }
 | |
| 
 | |
| setOs()
 | |
| {
 | |
|   unameOut=$(uname -a)
 | |
|   case "${unameOut}" in
 | |
|       *Microsoft*)     OS="WSL";; #must be first since Windows subsystem for linux will have Linux in the name too
 | |
|       *microsoft*)     OS="WSL2";; #WARNING: My v2 uses ubuntu 20.4 at the moment slightly different name may not always work
 | |
|       Linux*)          OS="Linux";;
 | |
|       Darwin*)         OS="Mac";;
 | |
|       CYGWIN*)         OS="Cygwin";;
 | |
|       MINGW*)          OS="Windows";;
 | |
|       *Msys)           OS="Windows";;
 | |
|       *)               OS="UNKNOWN:${unameOut}"
 | |
|   esac
 | |
| }
 | |
| 
 | |
| specifyDomain()
 | |
| {
 | |
|   [[ ! $1 = http* ]] || [[ ! $1 = */ ]] && echo "Incorrect format. Specify domain like https://pairdrop.net/" && exit
 | |
|   echo "DOMAIN=${1}" > "$CONFIGPATH"
 | |
|   echo -e "Domain is now set to:\n$1\n"
 | |
| }
 | |
| 
 | |
| sendText()
 | |
| {
 | |
|     params="base64text=hash"
 | |
|     hash=$(echo -n "${OPTARG}" | base64)
 | |
| 
 | |
|     if [[ $(echo -n "$hash" | wc -m) -gt 32600 ]];then
 | |
|       params="base64text=paste"
 | |
|       if [[ $OS == "Windows" || $OS == "WSL" || $OS == "WSL2" ]];then
 | |
|         echo -n "$hash" | clip.exe
 | |
|       elif [[ $OS == "Mac" ]];then
 | |
|         echo -n "$hash" | pbcopy
 | |
|       else
 | |
|         (echo -n "$hash" | xclip) || echo "You need to install xclip for sending bigger files from cli"
 | |
|       fi
 | |
|       hash=
 | |
|     fi
 | |
| 
 | |
|     openPairDrop
 | |
|     exit
 | |
| }
 | |
| 
 | |
| sendFiles()
 | |
| {
 | |
|   params="base64zip=hash"
 | |
|   if [[ $1 == */ ]]; then
 | |
|     path="${1::-1}"
 | |
|   else
 | |
|     path=$1
 | |
|   fi
 | |
|   zipPath="${path}_pairdrop.zip"
 | |
|   zipPath=${zipPath// /_}
 | |
| 
 | |
|   [[ -a "$zipPath" ]] && echo "Cannot overwrite $zipPath. Please remove first." && exit
 | |
| 
 | |
|   if [[ -d $path ]]; then
 | |
|     zipPathTemp="${path}_pairdrop_temp.zip"
 | |
|     [[ -a "$zipPathTemp" ]] && echo "Cannot overwrite $zipPathTemp. Please remove first." && exit
 | |
|     echo "Processing directory..."
 | |
| 
 | |
|     # Create zip files temporarily to send directory
 | |
|     if [[ $OS == "Windows" ]];then
 | |
|           powershell.exe -Command "Compress-Archive -Path ${path} -DestinationPath ${zipPath}"
 | |
|           echo "Compress-Archive -Path ${zipPath} -DestinationPath ${zipPathTemp}"
 | |
|           powershell.exe -Command "Compress-Archive -Path ${zipPath} -DestinationPath ${zipPathTemp}"
 | |
|     else
 | |
|           zip -q -b /tmp/ -r "$zipPath" "$path"
 | |
|           zip -q -b /tmp/ "$zipPathTemp" "$zipPath"
 | |
|     fi
 | |
| 
 | |
|     if [[ $OS == "Mac" ]];then
 | |
|       hash=$(base64 -i "$zipPathTemp")
 | |
|     else
 | |
|       hash=$(base64 -w 0 "$zipPathTemp")
 | |
|     fi
 | |
| 
 | |
|     # remove temporary temp file
 | |
|     rm "$zipPathTemp"
 | |
|   else
 | |
|     echo "Processing file..."
 | |
| 
 | |
|     # Create zip file temporarily to send file
 | |
| 
 | |
|     if [[ $OS == "Windows" ]];then
 | |
|       powershell.exe -Command "Compress-Archive -Path ${path} -DestinationPath ${zipPath} -CompressionLevel Optimal"
 | |
|     else
 | |
|       zip -q -b /tmp/ "$zipPath" "$path"
 | |
|     fi
 | |
|     if [[ $OS == "Mac" ]];then
 | |
|       hash=$(base64 -i "$zipPath")
 | |
|     else
 | |
|       hash=$(base64 -w 0 "$zipPath")
 | |
|     fi
 | |
|   fi
 | |
| 
 | |
|   # remove temporary temp file
 | |
|   rm "$zipPath"
 | |
| 
 | |
|   if [[ $(echo -n "$hash" | wc -m) -gt 32600 ]];then
 | |
|     params="base64zip=paste"
 | |
|     if [[ $OS == "Windows" || $OS == "WSL" || $OS == "WSL2" ]];then
 | |
|       echo -n "$hash" | clip.exe
 | |
|     elif [[ $OS == "Mac" ]];then
 | |
|       echo -n "$hash" | pbcopy
 | |
|     else
 | |
|       (echo -n "$hash" | xclip) || echo "You need to install xclip for sending bigger files from cli"
 | |
|     fi
 | |
|     hash=
 | |
|   fi
 | |
| 
 | |
| 
 | |
|   openPairDrop
 | |
|   exit
 | |
| }
 | |
| 
 | |
| ############################################################
 | |
| ############################################################
 | |
| # Main program                                             #
 | |
| ############################################################
 | |
| ############################################################
 | |
| SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
 | |
| 
 | |
| pushd . > '/dev/null';
 | |
| SCRIPTPATH="${BASH_SOURCE[0]:-$0}";
 | |
| 
 | |
| while [ -h "$SCRIPTPATH" ];
 | |
| do
 | |
|     cd "$( dirname -- "$SCRIPTPATH"; )";
 | |
|     SCRIPTPATH="$( readlink -f -- "$SCRIPTPATH"; )";
 | |
| done
 | |
| 
 | |
| cd "$( dirname -- "$SCRIPTPATH"; )" > '/dev/null';
 | |
| SCRIPTPATH="$( pwd; )";
 | |
| popd  > '/dev/null';
 | |
| 
 | |
| CONFIGPATH="${SCRIPTPATH}/.pairdrop-cli-config"
 | |
| 
 | |
| [ ! -f "$CONFIGPATH" ] &&
 | |
|  specifyDomain "https://pairdrop.net/" &&
 | |
|  [ ! -f "$CONFIGPATH" ] &&
 | |
|  echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file"
 | |
| 
 | |
| [ ! -f "$CONFIGPATH" ] || export "$(grep -v '^#' "$CONFIGPATH" | xargs)"
 | |
| 
 | |
| setOs
 | |
| ############################################################
 | |
| # Process the input options. Add options as needed.        #
 | |
| ############################################################
 | |
| # Get the options
 | |
| # open PairDrop if no options are given
 | |
| [[ $# -eq 0 ]] && openPairDrop && exit
 | |
| 
 | |
| #  display help and exit if first argument is "--help" or more than 2 arguments are given
 | |
| [ "$1" == "--help" ] || [[ $# -gt 2 ]] && help && exit
 | |
| 
 | |
| while getopts "d:ht:*" option; do
 | |
|     case $option in
 | |
|       d) # specify domain
 | |
|         specifyDomain "$2"
 | |
|         exit;;
 | |
|       t) # Send text
 | |
|         sendText
 | |
|         exit;;
 | |
|       h | ?) # display help and exit
 | |
|         help
 | |
|         exit;;
 | |
|       esac
 | |
| done
 | |
| 
 | |
| # Send file(s)
 | |
| # display help and exit if 2 arguments are given or if file does not exist
 | |
| [[ $# -eq 2 ]] || [[ ! -a $1 ]] && help && exit
 | |
| 
 | |
| sendFiles "$1"
 |