Files
flees/code/templates/flip

271 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
set -e
_help() {
SELF=$( basename "$0" )
echo "Flees Clipboard v.{{ version }}
Usage: $SELF [command] [name] [filename]
Commands:
(l)ist [default] List names of clipboards
(r)ead Read from clipboard, write to stdout or file
(w)rite Save to clipboard, read from stdin/file/folder
(d)elete Delete an entry
url Get the direct share url
upload Get URL for uploads [no arguments]
update Update flip client [no arguments]
self Get URL to install this client to another computer
autocomplete Get Bash autocompletion script
Name: Any string for the clipboard name. default: 0
Filename:
When reading from clipboard:
File or folder to write the clipboard contents. If omitted: stdout
When writing to clipboard:
File or folder to read from. If omitted: stdin
Shorthand:
echo my data | $SELF file.ext # writes data with name: file.ext
$SELF file.ext | cat - # prints the contents of file: file.ext
$SELF w file.ext # sends file keeping its name
$SELF r file.ext # download and save file with the same name
Config:
set: FLEES_ROOTURL, FLEES_SHARE, FLEES_TOKEN
"
exit
}
_load_config() {
FLEES_SHARE="${FLEES_SHARE:-{{ name }}}"
FLEES_TOKEN="${FLEES_TOKEN:-{{ token }}}"
FLEES_ROOTURL="${FLEES_ROOTURL:-{{ rooturl }}}"
}
_update_client() {
[[ -n "$FLEES_TOKEN" ]] && [[ -n "$FLEES_SHARE" ]] && {
sharetoken="/$FLEES_SHARE/$FLEES_TOKEN"
}
echo "Current version:"
"$0" --help | head -n 1
echo "Updating from $FLEES_ROOTURL"
curl -fLo "$0" "$FLEES_ROOTURL/script/flip$sharetoken"
err=$?
chmod +x "$0"
echo "Downloaded version:"
"$0" --help | head -n 1
exit $err
}
_list() {
curl -s "$FLEES_ROOTURL/file/ls/$FLEES_SHARE/$FLEES_TOKEN"
printf "\n"
}
_simple_list() {
curl -s "$FLEES_ROOTURL/file/list/$FLEES_SHARE/$FLEES_TOKEN"
printf "\n"
}
_write() {
# no file mentioned, use the name as file
[[ -z "$FILE" ]] && {
[[ -e "$NAME" ]] && {
# NAME is actually the file, reverse roles
FILE="$NAME"
NAME=$( basename "$NAME" )
}
}
# stdin is open, use stdin
[ -t 0 ] || stream_in=1
[ -t 0 ] && [[ -z "$FILE" ]] && {
_msg File to read needed, or use stdin
exit 1
}
_msg "Writing $NAME"
[[ "$stream_in" -eq 1 ]] && {
_write_stdin "$NAME"
} || {
[[ -d "$FILE" ]] && {
[[ "${NAME,,}" = *".tar" ]] || NAME="${NAME}".tar
_write_folder "$NAME" "$FILE"
} || {
_write_file "$NAME" "$FILE"
}
}
}
_write_folder() { # name, file
tar c "$2" | curl -F "file=@-;filename=$1" "${FLEES_ROOTURL}upload/${FLEES_SHARE}/${FLEES_TOKEN}" | cat -
}
_write_file() { # name, file
curl -F "file=@$2;filename=$1" "${FLEES_ROOTURL}upload/${FLEES_SHARE}/${FLEES_TOKEN}" | cat -
}
_write_stdin() { # name
cat - | curl -F "file=@-;filename=$1" "${FLEES_ROOTURL}upload/${FLEES_SHARE}/${FLEES_TOKEN}"
}
_read() {
[[ "$FILE" = "-" ]] && stream_out=1
[ -t 1 ] || stream_out=1
[[ "$stream_out" -eq 1 ]] && {
_read_stdout "$NAME"
return
}
# no file mentioned, use the name as file
[[ -z "$FILE" ]] && {
[[ -n "$NAME" ]] && {
FILE=$( basename "$NAME" )
}
[[ -e "$FILE" ]] && {
echo "'$FILE' already exists, not overwriting"
exit 1
}
}
_read_file "$NAME" "$FILE"
}
_read_file() { # name, file
curl "$FLEES_ROOTURL/download/$FLEES_SHARE/$FLEES_TOKEN/$1" -o "$2"
}
_read_stdout() { # name
curl -s "$FLEES_ROOTURL/download/$FLEES_SHARE/$FLEES_TOKEN/$1"
}
_delete() { # name
read -p "Sure to delete: $1 ? Break to exit " foo
exitcode=$( curl -s "$FLEES_ROOTURL/file/delete/$FLEES_SHARE/$FLEES_TOKEN/$1" )
if [[ ! "$exitcode" = "OK" ]]; then
echo "Failed deletion"
fi
}
_url() { # name
curl -s "$FLEES_ROOTURL/file/direct/$FLEES_SHARE/$FLEES_TOKEN/$1"
echo ''
}
_upload_url() {
echo "This information is a security risk, watch where it's shared"
echo "# python2 <( curl -s $FLEES_ROOTURL/script/upload_split/$FLEES_SHARE/$FLEES_TOKEN ) file_to_upload.ext"
exit
}
_self_url() {
SELF=$( basename "$0" )
echo "This information is a security risk, watch where it's shared!"
echo ""
echo "# curl -fLo $SELF $FLEES_ROOTURL/script/flip/$FLEES_SHARE/$FLEES_TOKEN && chmod +x $SELF"
exit
}
_msg() {
echo "$@" >&2
}
_get_name() {
[[ "$ARG1" = "$CMD" ]] && {
NAME="$ARG2"
} || {
NAME="$ARG1"
}
[[ -z "$NAME" ]] && [[ ! "$CMD" = delete ]] && NAME=0
return 0
}
_get_file() {
[[ "$ARG1" = "$NAME" ]] && {
FILE="$ARG2"
}
[[ "$ARG2" = "$NAME" ]] && {
FILE="$ARG3"
}
return 0
}
_get_completer() {
self=$( basename $( readlink -f "$0" ) )
echo '_FLIP_EXEC_complete() {
local curr_arg
curr_arg=${COMP_WORDS[COMP_CWORD]}
if [[ $COMP_CWORD -eq 1 ]]; then
COMPREPLY=( $(compgen -W "help autocomplete list read write delete url update upload self" -- $curr_arg ) );
fi
if [[ $COMP_CWORD -eq 2 ]]; then
case ${COMP_WORDS[$(( $COMP_CWORD - 1 ))]} in
r*|url|d*)
local remotelist=$( eval FLIP_EXEC simplelist )
COMPREPLY=( $(compgen -W "$remotelist" -- $curr_arg ) );
;;
w*)
COMPREPLY=( $(compgen -f -d -- $curr_arg ) );
;;
esac
fi
if [[ $COMP_CWORD -eq 3 ]]; then
COMPREPLY=( $(compgen -f -d -- $curr_arg ) );
fi
}
complete -F _FLIP_EXEC_complete FLIP_EXEC
# Run me as: source <( FLIP_EXEC autocomplete )
' | sed "s,FLIP_EXEC,$self,g"
exit 0
}
_load_config
for (( i=1; i<=$#; i++ )); do
[[ "${!i}" = "-h" ]] && _help
[[ "${!i}" = "--help" ]] && _help
done
ARG1="$1"
ARG2="$2"
ARG3="$3"
CMD=list
# if stdout redirected, default to read
[ -t 1 ] || CMD=read
# if stdin comes from stream, default to write
[ -t 0 ] || CMD=write
[[ "$1" = "r" || "$1" = "read" ]] && { CMD=read; ARG1=$CMD; }
[[ "$1" = "w" || "$1" = "write" ]] && { CMD=write; ARG1=$CMD; }
[[ "$1" = "d" || "$1" = "delete" || "$1" = "del" ]] && { CMD=delete; ARG1=$CMD; }
[[ "$1" = "l" || "$1" = "list" ]] && { CMD=list; ARG1=$CMD; }
[[ "$1" = "simplelist" ]] && { CMD=simple_list; ARG1=$CMD; }
[[ "$1" = "autocomplete" ]] && { _get_completer; }
[[ "$1" = "url" ]] && { CMD=url; ARG1=$CMD; }
[[ "$1" = "update" ]] && { _update_client; }
[[ "$1" = "upload" ]] && { _upload_url; }
[[ "$1" = "self" ]] && { _self_url; }
[[ "$1" = "h" || "$1" = "help" ]] && _help
[[ "$CMD" = list ]] && {
_list
exit $?
}
[[ "$CMD" = simple_list ]] && {
_simple_list
exit $?
}
_get_name
_get_file
[[ "$CMD" = read ]] && {
_read
exit $?
}
[[ "$CMD" = delete ]] && {
_delete "$NAME"
exit $?
}
[[ "$CMD" = write ]] && {
_write
exit $?
}
[[ "$CMD" = url ]] && {
_url "$NAME"
exit $?
}