267 lines
5.7 KiB
Bash
Executable File
267 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
_help() {
|
|
SELF=$( basename "$0" )
|
|
echo "MFL CLI v.{{ version }}
|
|
Commands:
|
|
|
|
(l)ist [default] List names of files
|
|
(w)rite Save to share, read from stdin/file/folder
|
|
(d)elete Delete an entry
|
|
show Show details on file
|
|
upload Get URL for uploads [no arguments]
|
|
autocomplete Get Bash autocompletion script
|
|
update Update self
|
|
|
|
-d max days to keep (default 30)
|
|
-m max downloads to keep (default 9999, -1 to disable)
|
|
|
|
Filename:
|
|
When writing to share:
|
|
File or folder to read from. If omitted: stdin.
|
|
|
|
Usage:
|
|
echo my data | $SELF w file.ext # writes data with name: file.ext
|
|
$SELF w file.ext # sends file keeping its name
|
|
|
|
Config:
|
|
set: MFL_ROOTURL, MFL_TOKEN
|
|
"
|
|
exit
|
|
}
|
|
|
|
|
|
_load_config() {
|
|
MFL_TOKEN="${MFL_TOKEN:-{{ token }}}"
|
|
MFL_ROOTURL="${MFL_ROOTURL:-{{ rooturl }}}"
|
|
}
|
|
|
|
_update_client() {
|
|
echo "Current version:"
|
|
"$0" --help | head -n 1
|
|
echo "Updating from $MFL_ROOTURL"
|
|
curl -fLo "$0" -H "Secret: $MFL_TOKEN" "$MFL_ROOTURL/script/mfl"
|
|
err=$?
|
|
chmod +x "$0"
|
|
echo "Downloaded version:"
|
|
"$0" --help | head -n 1
|
|
exit $err
|
|
}
|
|
|
|
_list() {
|
|
curl -fL -s -w "\n" -s -H "Secret: $MFL_TOKEN" "$MFL_ROOTURL"/ls
|
|
}
|
|
|
|
_write() {
|
|
# stdin is open
|
|
[ -t 0 ] || {
|
|
stream_in=1
|
|
[[ -z "$NAME" ]] && {
|
|
_msg Output filename not set
|
|
exit 1
|
|
}
|
|
}
|
|
# no file mentioned, use the name as file
|
|
[[ -z "$FILE" ]] && {
|
|
[[ -e "$NAME" ]] && {
|
|
# NAME is actually the file, reverse roles
|
|
FILE="${NAME}"
|
|
NAME=$( basename "${NAME}" )
|
|
}
|
|
}
|
|
[[ -e "$FILE" ]] && {
|
|
# Input file exists, dont use stream
|
|
stream_in=0
|
|
}
|
|
|
|
[[ $stream_in -ne 1 ]] && [[ -z "$FILE" ]] && {
|
|
_msg File to read needed, or use stdin
|
|
exit 1
|
|
}
|
|
_msg "Writing $NAME"
|
|
[[ "$stream_in" -eq 1 ]] && {
|
|
_write_stdin "$NAME"
|
|
return $?
|
|
}
|
|
|
|
[[ -d "$FILE" ]] && {
|
|
[[ "${NAME,,}" = *".tar" ]] || NAME="${NAME}".tar
|
|
_write_folder "$NAME" "$FILE"
|
|
return $?
|
|
}
|
|
|
|
[[ -f "$FILE" ]] || {
|
|
_msg "No such file"
|
|
exit 1
|
|
}
|
|
_write_file "$NAME" "$FILE"
|
|
}
|
|
|
|
_write_folder() { # name, file
|
|
tar c "$2" | \
|
|
curl -fL -w "\n" -g --upload-file - \
|
|
-H "Name: $1" \
|
|
-H "Max-Downloads: $MAXDL" \
|
|
-H "Expires-Days: $MAXDAYS" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/upload | cat
|
|
}
|
|
_write_file() { # name, file
|
|
curl -fL -w "\n" -g --upload-file "$2" \
|
|
-H "Name: $1" \
|
|
-H "Max-Downloads: $MAXDL" \
|
|
-H "Expires-Days: $MAXDAYS" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/upload | cat
|
|
}
|
|
_write_stdin() { # name
|
|
cat - | \
|
|
curl -fL -w "\n" -g --upload-file - \
|
|
-H "Name: $1" \
|
|
-H "Max-Downloads: $MAXDL" \
|
|
-H "Expires-Days: $MAXDAYS" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/upload | cat
|
|
}
|
|
|
|
_delete() { # name
|
|
read -p "Sure to delete: $1 ? Break to exit " foo
|
|
curl -fL -s -w "\n" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/delete/"$1"
|
|
}
|
|
|
|
_details() { # name
|
|
curl -fL -s -w "\n" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/details/"$1"
|
|
}
|
|
|
|
_simple_list() {
|
|
curl -fL -s -w "\n" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/ls-simple
|
|
}
|
|
|
|
_maintain() {
|
|
curl -fL -s -w "\n" \
|
|
-H "Secret: $MFL_TOKEN" \
|
|
"$MFL_ROOTURL"/maintenance
|
|
}
|
|
|
|
|
|
_msg() {
|
|
echo "$@" >&2
|
|
}
|
|
|
|
|
|
_get_completer() {
|
|
self=$( basename $( readlink -f "$0" ) )
|
|
echo '_MFL_EXEC_complete() {
|
|
local curr_arg
|
|
curr_arg=${COMP_WORDS[COMP_CWORD]}
|
|
if [[ $COMP_CWORD -eq 1 ]]; then
|
|
COMPREPLY=( $(compgen -W "help autocomplete list write delete show update" -- $curr_arg ) );
|
|
fi
|
|
if [[ $COMP_CWORD -eq 2 ]]; then
|
|
case ${COMP_WORDS[$(( $COMP_CWORD - 1 ))]} in
|
|
delete|show)
|
|
local remotelist=$( eval MFL_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 _MFL_EXEC_complete MFL_EXEC
|
|
# Run me as: source <( MFL_EXEC autocomplete )
|
|
' | sed "s,MFL_EXEC,$self,g"
|
|
exit 0
|
|
}
|
|
|
|
_load_config
|
|
for (( i=1; i<=$#; i++ )); do
|
|
[[ "${!i}" = "-h" ]] && _help
|
|
[[ "${!i}" = "--help" ]] && _help
|
|
done
|
|
|
|
MAXDL=9999
|
|
MAXDAYS=30
|
|
CMD=list
|
|
# if stdin comes from stream, default to write
|
|
[ -t 0 ] || CMD=help
|
|
for (( i=2; i<=$#; i++ )); do
|
|
j=$(( i + 1 ))
|
|
[[ "${!i}" = "-m" ]] && { MAXDL=${!j}; i=$j; continue; }
|
|
[[ "${!i}" = "-d" ]] && { MAXDAYS=${!j}; i=$j; continue; }
|
|
if [[ -z "$FILE" ]]; then
|
|
FILE="${!i}"
|
|
continue
|
|
fi
|
|
if [[ -z "$NAME" ]]; then
|
|
NAME="${!i}"
|
|
fi
|
|
done
|
|
if [[ -z "$NAME" ]]; then
|
|
if [[ -n "$FILE" ]]; then
|
|
NAME="$( basename "${FILE}" )"
|
|
fi
|
|
fi
|
|
|
|
[[ "$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" = "show" ]] && { CMD=details; ARG1=$CMD; }
|
|
[[ "$1" = "maintain" ]] && { CMD=maintain; }
|
|
[[ "$1" = "simplelist" ]] && { CMD=simple_list; ARG1=$CMD; }
|
|
[[ "$1" = "autocomplete" ]] && { _get_completer; }
|
|
[[ "$1" = "update" ]] && { _update_client; }
|
|
[[ "$1" = "upload" ]] && { _upload_url; }
|
|
[[ "$1" = "self" ]] && { _self_url; }
|
|
[[ "$1" = "h" || "$1" = "help" ]] && CMD=help
|
|
|
|
[[ "$CMD" = help ]] && {
|
|
_help
|
|
exit $?
|
|
}
|
|
|
|
[[ "$CMD" = list ]] && {
|
|
_list
|
|
exit $?
|
|
}
|
|
|
|
[[ "$CMD" = simple_list ]] && {
|
|
_simple_list
|
|
exit $?
|
|
}
|
|
|
|
[[ "$CMD" = delete ]] && {
|
|
if [[ -z "$FILE" ]]; then
|
|
echo Missing key / file name
|
|
_simple_list
|
|
exit
|
|
fi
|
|
|
|
_delete "$FILE"
|
|
exit $?
|
|
}
|
|
[[ "$CMD" = write ]] && {
|
|
_write
|
|
exit $?
|
|
}
|
|
[[ "$CMD" = details ]] && {
|
|
_details "$FILE"
|
|
exit $?
|
|
}
|
|
[[ "$CMD" = maintain ]] && {
|
|
_maintain
|
|
exit $?
|
|
}
|
|
|