207 lines
5.6 KiB
Bash
207 lines
5.6 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="temp_${zipPath}"
|
|
[[ -a "$zipPathTemp" ]] && echo "Cannot overwrite $zipPathTemp. Please remove first." && exit
|
|
echo "Processing directory..."
|
|
|
|
# Create zip files temporarily to send directory
|
|
zip -q -b /tmp/ -r "$zipPath" "$path"
|
|
zip -q -b /tmp/ "$zipPathTemp" "$zipPath"
|
|
|
|
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
|
|
zip -q -b /tmp/ "$zipPath" "$path"
|
|
|
|
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"
|