Compare commits

...

58 Commits

Author SHA1 Message Date
Jack L. Frost 19f6c5249a remove debug stuff
Signed-off-by: fbt <fbt@fleshless.org>
2022-12-28 04:19:58 +00:00
Jack L. Frost 823a2847c8 encode all the stuff
Signed-off-by: fbt <fbt@fleshless.org>
2022-12-28 04:16:26 +00:00
Jack L. Frost 6e2c506e72 alignment
Signed-off-by: fbt <fbt@fleshless.org>
2022-04-18 10:25:48 +00:00
Jack L. Frost 3f094a2b47 xclip selector selector :>
Signed-off-by: fbt <fbt@fleshless.org>
2021-10-06 13:49:35 +03:00
Jack L. Frost cd5f695936 clipboard option
Signed-off-by: fbt <fbt@fleshless.org>
2021-10-06 13:40:45 +03:00
Jack L. Frost 8aea6446bb forgot this one
Signed-off-by: fbt <fbt@fleshless.org>
2021-10-06 13:22:17 +03:00
Jack L. Frost fb38496fe9 just return 1
Signed-off-by: fbt <fbt@fleshless.org>
2021-04-19 16:14:19 +03:00
Jack L. Frost df4e1d0370 Smarter args
Signed-off-by: fbt <fbt@fleshless.org>
2020-10-03 19:44:19 +03:00
Jack L. Frost b63ae67204 it's actually just format
Signed-off-by: fbt <fbt@fleshless.org>
2020-08-21 15:42:52 +03:00
Jack L. Frost f103e564dc readme
Signed-off-by: fbt <fbt@fleshless.org>
2020-05-24 04:36:13 +03:00
Jack L. Frost 176b80fcf6 Actually, to hell with this sugar stuff
Signed-off-by: fbt <fbt@fleshless.org>
2020-05-24 04:21:39 +03:00
Jack L. Frost 3ac25bbeb2 simpler sugar
Signed-off-by: fbt <fbt@fleshless.org>
2020-05-24 03:57:17 +03:00
Jack L. Frost 522dc0e1f6 group curl settings and make em configurable at the same time
Signed-off-by: fbt <fbt@fleshless.org>
2020-05-24 03:43:39 +03:00
Jack L. Frost 6e9046367f wut
Signed-off-by: fbt <fbt@fleshless.org>
2019-12-04 14:14:13 +03:00
Jack L. Frost 67ddff1306 indentation
Signed-off-by: fbt <fbt@fleshless.org>
2019-12-04 14:13:03 +03:00
Jack L. Frost c89d90f67c Just use this in a wrapper; this was a bad idea
Signed-off-by: fbt <fbt@fleshless.org>
2019-12-04 14:12:01 +03:00
Jack L. Frost 2beb1c0638 these have no reason not to be flags
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-26 01:53:22 +03:00
Jack L. Frost 8804a855b3 and some other stuff
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-26 01:49:12 +03:00
Jack L. Frost 7858829ec4 support setting the secret in env vars
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-26 01:46:00 +03:00
Jack L. Frost bfbd899554 Forgot to change this
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-25 04:39:24 +03:00
Jack L. Frost 4e1d3a7bcd A better way
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 14:00:32 +03:00
Jack L. Frost 03e0fda896 A better way
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 13:59:08 +03:00
Jack L. Frost 146f06e7c5 alternate config file
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 13:50:24 +03:00
Jack L. Frost d2529e32bd Let the script get its own damn token
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 13:18:22 +03:00
Jack L. Frost bb704f4856 fix the doc
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 08:46:22 +03:00
Jack L. Frost fadba21791 void
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-24 08:41:53 +03:00
Jack L. Frost 3cfdcb1209 How long has that been there, wtf
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 22:45:55 +03:00
Jack L. Frost ad256e83e3 Use jq
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 09:58:19 +03:00
Jack L. Frost 3a48f36d43 Use jq
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 09:57:58 +03:00
Jack L. Frost 01478630e8 no more api/2
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 09:37:09 +03:00
Jack L. Frost a31d8b8963 album control also moved
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 08:19:12 +03:00
Jack L. Frost 0dafaaf15b The upload endpoint moved
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 07:18:51 +03:00
Jack L. Frost 466050972d shrink moved too
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-23 06:52:41 +03:00
Jack L. Frost 99735444f3 notification control
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-22 14:43:04 +03:00
Jack L. Frost d73f41e2de ip moved
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-22 12:52:07 +03:00
Jack L. Frost 52f5ea9028 support tags
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-20 07:38:10 +03:00
Jack L. Frost 83bbe70c80 Fix: ufw does nothing without a positional argument even if it's not required
Signed-off-by: fbt <fbt@fleshless.org>
2019-11-18 04:07:42 +03:00
Jack L. Frost 47fe62a7c8 duh
Signed-off-by: fbt <fbt@fleshless.org>
2019-06-03 02:21:56 +03:00
Jack L. Frost 639a97f43e I SAID NO MORE
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:31:06 +03:00
Jack L. Frost 784ad95215 There is no scan anymore
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:30:35 +03:00
Jack L. Frost 58e1b63fb7 Support multiple workdirs
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:28:03 +03:00
Jack L. Frost 65fdd688bf That was poorly researched
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-13 22:57:40 +03:00
Jack L. Frost 488fdc0a5a oops-driven development
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-10 00:18:29 +03:00
Jack L. Frost 14af6b720f oops
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:55:03 +03:00
Jack L. Frost c22e34afb2 aaaand fork for every file
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:50:33 +03:00
Jack L. Frost d7f1104f82 use inotifywait; clipboard
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:31:25 +03:00
Jack L. Frost e2c6143c8c use maim instead of scrot
Signed-off-by: fbt <fbt@fleshless.org>
2016-12-04 16:58:19 +03:00
Jack L. Frost b5331d8c93 code shuffle; quiet flag
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-12 20:45:19 +03:00
Jack L. Frost 59fb4b81eb -l: request a login token
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-08 00:39:48 +03:00
Jack L. Frost 97701825bd deps
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 16:55:09 +03:00
Jack L. Frost c6e43448ca clear the delimiter for read
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 09:01:49 +03:00
Jack L. Frost 9b3516951c code cleanup
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:43:05 +03:00
Jack L. Frost 91a5d9bec2 Line breaks
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:33:20 +03:00
Jack L. Frost 40c1767aae I'm tired of updating the help in README
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:32:52 +03:00
Jack L. Frost 7c9d85e8c0 Some options overhaul and 8fw json support
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:28:33 +03:00
Jack L. Frost e610dce293 * Fix README
* Create the album ourselves.

Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 07:35:25 +03:00
Jack L. Frost 634b11c3b4 forgot about --
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 07:19:40 +03:00
Jack L. Frost f05682e9a7 new README
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 07:18:59 +03:00
4 changed files with 352 additions and 193 deletions

View File

@ -1,38 +1,27 @@
LICENSE
=======
All scripts here are released uder the ISC permissive free software license (http://en.wikipedia.org/wiki/ISC_license).
It basically says that you can do whatever you like with the code as long as you credit the author and provide the license with it.
Also see LICENSE in the repo.
ufw-tools
=========
ufw-tools are two simple-ish scripts for uploading files to 8fw.me.
Support
=======
I do not promise any support for any of the provided scripts. That said, I'll do what I can for you if I'm not too busy and/or drunk.
General information
===================
The paths are all configurable of course.
The help information that the scripts give is dynamic and is provided here only for reference.
Scripts
=======
ufw
---
A very simple tool to upload files to the zfh.so file hosting
Usage: ufw [-RsF] [-D num] [file/url]"
Flags:
-R # Remove the file after uploading.
-s # Make a screenshot and upload it instead of a file.
-F # Make a fullscreen shot instead of prompting for a window/area. Implies -s.
-D <num> # Delay the shot by <num> seconds.
-p # Make the file private. Requires $secret to be set in the config.
-m # Maximum filesize (takes K, M and G suffixes).
ufw can upload files to 8fw.me, shorten urls and show you your ip.
Call ufw -h for help.
Config options (~/.config/ufw):
secret # Your personal token. Get it at https://zfh.so/settings_form
cfg_screenshot_ext # Screenshot file type, used by scrot.
# Others are self-explanatory:
cfg_url_regex
cfg_tmp_dir
cfg_script_url
Dependencies: curl, jq
The config goes into `$XDG_CONFIG_DIR/ufw`.
ufwd
----
ufwd periodically checks a directory of your choosing (defaults to $XDG_RUNTIME DIR/ufwd) and invokes ufw to upload the files and remove them.
Call ufwd -h for help.

11
config/ufw Normal file
View File

@ -0,0 +1,11 @@
# Put your actual secret here, this is just a random string
secret='rooxoosh7Aese7phiPh3Choh3uthiTha'
# Override the default common curl behaviour:
#curl() { command curl -sL "$@"; }
#cfg_tmp_dir="$XDG_RUNTIME_DIR/ufw"
#cfg_service_url='https://8fw.me'
#cfg_max_filesize='200M' # Local limit, doesn't affect the server one :)
#flag_shortlink=0 # Display short links
#flag_directlink=1 # Display direct file links

411
ufw
View File

@ -15,39 +15,50 @@ is_url() {
[[ "$1" =~ $cfg_url_regex ]]
}
msg() { printf '%s\n' "[ufw] $1"; }
err() { msg "(error) $1" >&2; }
msg() {
if ! (( flag_quiet )); then
printf '%s\n' "$1"
fi
}
err() { printf '(error) %s\n' "$*" >&2; }
curl() { command curl -sL "$@"; }
usage() {
_cat <<- EOF
Usage: ufw [-RsF] [-D num] [file/url]"
Usage: ufw [-RsF] [-D num] [file/url]
Flags:
-R # Remove the file after uploading.
-s # Make a screenshot and upload it instead of a file.
-F # Make a fullscreen shot instead of prompting for a window/area. Implies -s.
-d # Supply a dexcription.
-D <num> # Delay the shot by <num> seconds.
-p # Make the file public.
-u # Generate a shortlink from URL.
-m # Maximum filesize (takes K, M and G suffixes).
-a # Add the file to an album.
-A # API response format.
-R|--remove-file # Remove the file after uploading.
-d|--description # Supply a description.
-p|--public # Make the file public.
-n|--no-notify # Don't send immediate notifications for this upload.
--notify # Force a notification for this upload.
-u|--shorten <URL> # Generate a shortlink from URL.
-S|--short-url # Get a shortlink when uploading a file.
-P|--page-url # Get a link to the file page instead of a direct one.
-m|--max-filesize <num>[suf] # Maximum filesize (takes K, M and G suffixes).
-a|--album-id # Add the file to an album.
-A|--album-name # Add the file to an album by name. The album will be created, if necessary.
-t|--tags "<tag1[, tag2,..]>" # Add tags to the file.
-q|--quiet # Be quiet.
-v|--void # Don't add the file to my files.
-c|--clipboard # Throw the result into the clipboard
Config options (~/.config/ufw):
secret # Your personal token. Get it at https://zfh.so/settings_form
cfg_screenshot_ext # Screenshot file type, used by scrot.
cfg_max_filesize # Maximum filesize in megabytes.
cfg_max_filesize # Maximum filesize (takes K, M and G suffixes).
# Others are self-explanatory:
cfg_url_regex
cfg_tmp_dir
cfg_service_url
EOF
}
ensure_env() {
for i in "$cfg_tmp_dir"; do
[[ -d "$i" ]] || { mkdir -p "$i"; }
done
Environment variables:
UFW_CFG_FILE # Config file to read, defaults to \$XDG_CONFIG_DIR/ufw
UFW_SECRET # Your API secret
UFW_TMP_DIR
UFW_URL
EOF
}
get_file_hash() {
@ -70,97 +81,142 @@ get_max_filesize() {
fi
}
upload() {
if (( flag_scrot )); then
flag_rm=1
file=$(take_screenshot) || { return 1; }
get_album_id() {
declare api_response api_status api_status_message
api_response=$( curl --get \
--data-urlencode "name=$1" \
--data-urlencode "secret=$secret" \
"$cfg_service_url/albumctl.json?m=new" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
album_id=$( jq -r '.data.album.id' <<< "$api_response" )
misc_curl_args+=( -F album_id="$album_id" )
else
(( $# )) || {
usage
printf 'Error [album]: %s %s\n' "$api_status" "$api_status_message"
return 1
fi
}
upload() {
declare api_response api_status api_status_message
(( $# )) || {
usage
return 1
}
target="$1"
if is_url "$target"; then
flag_rm=1
file=$(_mktemp "$cfg_tmp_dir")
get_max_filesize || { return 1; }
curl --max-filesize "$max_filesize_bytes" "$target" > "$file"
curl_result=$?
if (( curl_result )); then
case "$curl_result" in
63) err "File exceeds cfg_max_filesize";;
*) err "Could not download file.";;
esac
return 1
fi
else
file="$target"
[[ -f "$file" ]] || {
err "No such file: ${file}"
return 1
}
target="$1"
if is_url "$target"; then
flag_rm=1
file=$(_mktemp "$cfg_tmp_dir")
get_max_filesize || { return 1; }
curl --max-filesize "$max_filesize_bytes" -skL "$target" > "$file"
curl_result=$?
if (( curl_result )); then
case "$curl_result" in
63) err "File exceeds cfg_max_filesize";;
*) err "Could not download file.";;
esac
return 1
fi
else
file="$target"
[[ -f "$file" ]] || {
err "No such file: ${file}"
return 1
}
fi
fi
get_file_hash "$file"
curl -sL \
if [[ "$album_name" ]]; then
get_album_id "$album_name"
fi
api_response=$( curl \
-F file="@$file" \
-F api_format="$cfg_api_format" \
-F format='json' \
-F flag_private="$flag_private" \
-F short="$flag_shortlink" \
-F secret="$secret" \
-F tags="$tags" \
-F notify="$flag_notify" \
-F void="${flag_void:-0}" \
-F submit="" \
"${misc_curl_args[@]}" \
-A 'zerofiles.org upload script' \
"$cfg_service_url/$cfg_api_path/upload"
"$cfg_service_url/maw.json" )
if (( $? )); then
err 'Something has gone wrong with the upload.'
return 7
if (( flag_shortlink )); then
if (( flag_directlink )); then
file_url_request='short_url'
else
file_url_request='page_short_url'
fi
else
file_url_request='url'
fi
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
file_link=$( jq -r ".data.${file_url_request}" <<< "$api_response" )
(( flag_shortlink )) || {
(( flag_directlink )) || file_link="${file_link#*.}"
}
(( flag_clipboard )) && xclip "${xclip_args[@]}" <<< "$file_link"
printf '%s\n' "$file_link"
if (( flag_rm )); then
msg "Removing file: $file"
rm "$file"
fi
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
return 1
fi
}
get_shortlink() {
declare url=$1
declare url=$1 api_response api_status api_status_message
if ! curl -fsL "$cfg_service_url/api?mode=url_add&url=${url}&raw=1"; then
err 'Something went wrong!'
api_response=$( curl --data-urlencode "url=$url" \
--data-urlencode "secret=$secret" \
"$cfg_service_url/shrink.json" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
read -r short_url real_url < <(
jq -r '.data.short_url' <<< "$api_response"
)
(( flag_clipboard )) && xclip "${xclip_args[@]}" <<< "$short_url"
printf '%s\n' "$short_url"
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
take_screenshot() {
declare tmp_file
get_api_status() {
read -d '' -r api_status api_status_message < <(
jq -r '.status.code, .status.message'
)
[[ "$scrot_exec" ]] || { scrot_exec=$(type -P scrot); }
[[ "$scrot_exec" ]] || {
err "Please install scrot to use this function"
if (( api_status >= 400 )); then
return 1
}
(( "$flag_scrot_fullscreen" )) || { scrot_args+=( '-s' ); }
[[ "$cfg_scrot_delay" ]] && { scrot_args+=( "-d $cfg_scrot_delay" ); }
tmp_file="$(_mktemp "${cfg_tmp_dir}" ".${cfg_screenshot_ext}")"
scrot "${scrot_args[@]}" "$tmp_file" || {
err "Failed to take a screenshot."
return 1
}
printf '%s\n' "$tmp_file"
fi
}
_mktemp() {
@ -179,10 +235,61 @@ _mktemp() {
}
get_my_ip() {
my_ip=$( curl -fsL https://zfh.so/ip )
declare api_response api_status api_status_message my_ip
if ! (( $? )); then
printf '%s\n' $my_ip
api_response=$( curl "$cfg_service_url/ip.json" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
my_ip=$( jq -r '.data.ip' <<< "$api_response" )
(( flag_clipboard )) && xclip "${xclip_args[@]}" <<< "$my_ip"
printf '%s\n' "$my_ip"
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
login() {
declare api_response
api_response=$( curl "$cfg_service_url/token_request.json?login=$login" )
if get_api_status <<< "$api_response"; then
printf 'Check your email.\n'
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
get_token() {
[[ $secret ]] && return 0
[[ -f $cfg_file ]] && return 1
declare api_response login password
printf "First-time setup...\n"
read -p 'Username: ' login
read -sp 'Password: ' password
printf '\n'
login_response=$(curl -c "$cfg_file.cookiejar" -d "login=$login" -d "password=$password" -sl "$cfg_service_url/login.json")
get_api_status <<< "$login_response" || {
jq -r '.status.message' <<< "$login_response"
return 1
}
api_response=$(curl -b "$cfg_file.cookiejar" -sl "$cfg_service_url/api_token.json")
rm -f "$cfg_file.cookiejar"
if get_api_status <<< "$api_response"; then
secret=$(jq -r '.data.token' <<< "$api_response")
printf 'export secret="%s"' "$secret" >> "$cfg_file"
chmod 600 "$cfg_file"
printf 'Done\n'
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
return 1
fi
}
@ -194,7 +301,7 @@ set_argv() {
unset -v arg opt c
case "$1" in
(--) argv+=( "$1" ); break;;
(--) argv+=( "$1" ); shift; break;;
(--*)
IFS='=' read arg opt <<< "$1"
@ -219,11 +326,15 @@ set_argv() {
esac
shift
done
if (( $# )); then
argv+=( "$@" )
fi
}
main() {
declare args file target flag_private flag_rm flag_scrot flag_scrot_fullscreen cfg_scrot_delay
declare flag_shortlink=0
declare args file target flag_private flag_rm flag_notify
declare flag_shortlink
# Defaults for XDG
if ! [[ "$XDG_RUNTIME_DIR" ]]; then
@ -235,74 +346,116 @@ main() {
fi
cfg_url_regex='^[A-Za-z]([A-Za-z0-9+.-]+)?://.+'
cfg_tmp_dir="$XDG_RUNTIME_DIR/ufw"; TEMPDIR="$cfg_tmp_dir"
cfg_service_url='https://8fw.me'
cfg_screenshot_ext='png'
cfg_max_filesize='200M'
cfg_api_format='plain'
cfg_api_path='/api/2'
cfg_file=${UFW_CFG_FILE:-"$XDG_CONFIG_DIR/ufw"}
if [[ -f "$HOME/.suprc" ]]; then
printf 'Found legacy configfile, moving...\n' >&2
mv "$HOME/.suprc" "$XDG_CONFIG_DIR/ufw"
fi
[[ $UFW_SECRET ]] && secret=$UFW_SECRET
[[ $UFW_TMP_DIR ]] && cfg_tmp_dir=$UFW_TMP_DIR
[[ $UFW_URL ]] && cfg_service_url=$UFW_URL
if [[ -f "$XDG_CONFIG_DIR/ufw" ]]; then
if ! source "$XDG_CONFIG_DIR/ufw"; then
printf 'Failed to source configuration file: %s\n' "$XDG_CONFIG_DIR/ufw"
return $?
[[ $1 ]] || { usage; return 1; }
if [[ -f "$cfg_file" ]]; then
if ! source "$cfg_file"; then
printf 'Failed to source configuration file: %s\n' "$cfg_file"
return 1
fi
fi
# Defaults
: ${cfg_file:="$XDG_CONFIG_DIR/ufw"}
: ${cfg_tmp_dir:="$XDG_RUNTIME_DIR/ufw"}
: ${cfg_service_url:='https://8fw.me'}
: ${cfg_max_filesize:='200M'}
: ${flag_shortlink:=0}
: ${flag_directlink:=1}
: ${flag_clipboard:=0}
: ${xclip_selector:='clipboard'}
while [[ "$1" ]]; do
case "$1" in
-p|--private) flag_private='false';;
-R|--remove-file) flag_rm='1';;
-s|--screenshot) flag_scrot='1';;
-D|--screenshot-delay) cfg_scrot_delay="$2"; shift;;
-F|--fullscreen)
flag_scrot='1'
flag_scrot_fullscreen='1'
;;
(-h|--help|--usage) usage; return;;
(-m|--max-filesize) cfg_max_filesize=$2; shift;;
(-A|--album-name) album_name=$2; shift;;
(-t|--tags) tags=$2; shift;;
-A|--api-format) cfg_api_format=$2; shift;;
(--tmp-dir) cfg_tmp_dir=$2; shift;;
(--url) cfg_service_url=$2; shift;;
(--max-filesize) cfg_max_filesize=$2; shift;;
-i|--my-ip) action='getmyip';;
(-i|--my-ip) action='getmyip';;
(-u|--shorten) action='url';;
-S|--short) flag_shortlink='1';;
-u|--url) action='url';;
(-p|--public) flag_private='false';;
(-R|--remove-file) flag_rm='1';;
(-S|--short-url) flag_shortlink=1;;
(-P|--page-url) flag_directlink=0;;
(-q|--quiet) flag_quiet=1;;
(-v|--void) flag_void=1;;
-a|--album-id)
# Clipboard
(-c|--clipboard) flag_clipboard=1;;
(-C|--xclip-selector) xclip_selector=$2; shift;;
(--notify) flag_notify=1;;
(--no-notify|-n) flag_notify=0;;
(-a|--album-id)
misc_curl_args+=( -F "album_id=$2" )
shift
;;
-A|--album-name)
misc_curl_args+=( -F "album_name=$2" )
shift
;;
-d|--description)
(-d|--description)
misc_curl_args+=( -F "description=$2" )
shift
;;
-h|--help|--usage) usage; return;;
--) shift; break;;
*) break;;
-*)
err "Unknown flag: $1"
usage
return 1
;;
*) args+=( "$1" );;
esac
shift
done
ensure_env
xclip_args+=( -selection "$xclip_selector" )
# Catch the args after --
if (( $# )); then
args+=( "$@" )
shift
fi
TEMPDIR="$cfg_tmp_dir"
for i in "$cfg_tmp_dir"; do
[[ -d "$i" ]] || { mkdir -p "$i"; }
done
case "${action:-upload}" in
upload) upload "$1";;
url) get_shortlink "$1";;
upload)
get_token || return $?
(( ${#args[@]} )) || return 1
for t in "${args[@]}"; do
upload "$t"
done
;;
url)
get_token || return $?
for t in "${args[@]}"; do
get_shortlink "$t"
done
;;
getmyip) get_my_ip;;
login) login;;
esac
}

82
ufwd
View File

@ -6,37 +6,57 @@ if ! [[ "$XDG_RUNTIME_DIR" ]]; then
XDG_RUNTIME_DIR="/run/user/$UID"
fi
# Defaults
cfg_workdir="$XDG_RUNTIME_DIR/ufwd"
cfg_scan_delay='30'
msg() { printf '%s\n' "$*"; }
err() { echo "$*" >&2; }
usage() { echo "No help available."; }
usage() {
printf 'Usage: ufwd [-hn] [-d workdir] -D [check delay]\n'
printf ' -h # Show this message.\n'
printf ' -n # Enable notifications with notify-send. Must be installed.\n'
printf ' -d [path] # Set the dir that is to be watched.\n'
printf ' -s # Push the file url into the clipboard.\n'
}
upload() {
declare file=$1; shift
upload_output=$( ufw -R "$@" "$file" )
upload_return=$?
if (( flag_enable_notifications )); then
if (( $upload_return )); then
notify-send 'ufwd' "File upload failed: $upload_output"
else
notify-send 'ufwd' "File uploaded: $upload_output"
fi
fi
if (( flag_enable_clipboard )); then
read -r fl <<< "$upload_output"
xclip <<< "$fl"
fi
printf '%s\n' "$upload_output"
}
main() {
while (( $# )); do
case "$1" in
(--help|-h) usage; return 0;;
(--workdir|-d) cfg_workdir="$2"; shift;;
(--scan-delay|-D) cfg_scan_delay="$2"; shift;;
(--notify|-n) flag_enable_notifications=1;;
(--clipboard|-c) flag_enable_clipboard=1;;
(--workdir|-d) cfg_workdir+=( "$2" ); shift;;
(--) shift; break;;
(-*)
err "Unknown key: $1"
usage
return 1
;;
(-*) err "Unknown key: $1"; usage; return 1;;
(*) break;;
esac
shift
done
[[ $cfg_workdir ]] || cfg_workdir="$XDG_RUNTIME_DIR/ufwd"
if (( flag_enable_notifications )); then
if type -P notify-send &>/dev/null; then
msg "Found notify-send."
@ -46,30 +66,16 @@ main() {
fi
fi
mkdir -p "$cfg_workdir" || {
return 1
}
cd "$cfg_workdir" || {
return 1
}
while sleep "$cfg_scan_delay"; do
for i in *; do
upload_output=$( ufw "$@" -R "$i" )
upload_return=$?
if (( flag_enable_notifications )); then
if (( $upload_return )); then
notify-send 'ufwd' "File upload failed: $upload_output"
else
notify-send 'ufwd' "File uploaded: $upload_output"
fi
fi
printf '%s\n' "$upload_output"
done
for p in "${cfg_workdir[@]}"; do
[[ -d "$p" ]] || return 1
done
printf 'Working in:\n'
printf ' - %s\n' "${cfg_workdir[@]}"
while read -r d e f; do
upload "$d$f" "$@" &
done < <( inotifywait -m -e close_write "${cfg_workdir[@]}" )
}
main "$@"