21 Commits

Author SHA1 Message Date
fbt
47fe62a7c8 duh
Signed-off-by: fbt <fbt@fleshless.org>
2019-06-03 02:21:56 +03:00
fbt
639a97f43e I SAID NO MORE
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:31:06 +03:00
fbt
784ad95215 There is no scan anymore
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:30:35 +03:00
fbt
58e1b63fb7 Support multiple workdirs
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-20 15:28:03 +03:00
fbt
65fdd688bf That was poorly researched
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-13 22:57:40 +03:00
fbt
488fdc0a5a oops-driven development
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-10 00:18:29 +03:00
fbt
14af6b720f oops
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:55:03 +03:00
fbt
c22e34afb2 aaaand fork for every file
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:50:33 +03:00
fbt
d7f1104f82 use inotifywait; clipboard
Signed-off-by: fbt <fbt@fleshless.org>
2019-05-09 23:31:25 +03:00
fbt
e2c6143c8c use maim instead of scrot
Signed-off-by: fbt <fbt@fleshless.org>
2016-12-04 16:58:19 +03:00
fbt
b5331d8c93 code shuffle; quiet flag
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-12 20:45:19 +03:00
fbt
59fb4b81eb -l: request a login token
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-08 00:39:48 +03:00
fbt
97701825bd deps
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 16:55:09 +03:00
fbt
c6e43448ca clear the delimiter for read
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 09:01:49 +03:00
fbt
9b3516951c code cleanup
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:43:05 +03:00
fbt
91a5d9bec2 Line breaks
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:33:20 +03:00
fbt
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
fbt
7c9d85e8c0 Some options overhaul and 8fw json support
Signed-off-by: fbt <fbt@fleshless.org>
2016-03-06 08:28:33 +03:00
fbt
e610dce293 * Fix README
* Create the album ourselves.

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

View File

@@ -1,38 +1,25 @@
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, jshon
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.

229
ufw
View File

@@ -15,41 +15,43 @@ 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; }
usage() {
_cat <<- EOF
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.
-s|--screenshot # Make a screenshot and upload it instead of a file.
-F|--fullscreen # Make a fullscreen shot instead of prompting for a window/area. Implies -s.
-d|--description # Supply a description.
-D|--screenshot-delay <num> # Delay the shot by <num> seconds.
-p|--public # Make the file public.
-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.
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_screenshot_ext # Screenshot file type, used by maim.
cfg_max_filesize # Maximum filesize (takes K, M and G suffixes).
# Others are self-explanatory:
cfg_url_regex
cfg_tmp_dir
cfg_service_url
cfg_api_path
EOF
}
ensure_env() {
for i in "$cfg_tmp_dir"; do
[[ -d "$i" ]] || { mkdir -p "$i"; }
done
}
get_file_hash() {
read file_hash _ < <( sha1sum "$1" )
}
@@ -70,8 +72,26 @@ get_max_filesize() {
fi
}
get_album_id() {
declare api_response api_status api_status_message
api_response=$( curl -fsL "$cfg_service_url/$cfg_api_path/album?a=new&name=$1&format=json&secret=$secret" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
album_id=$( jshon -e data -e album -e id -u <<< "$api_response" )
misc_curl_args+=( -F album_id="$album_id" )
else
printf 'Error [album]: %s %s\n' "$api_status" "$api_status_message"
return 1
fi
}
upload() {
if (( flag_scrot )); then
declare api_response api_status api_status_message
if (( flag_scn )); then
flag_rm=1
file=$(take_screenshot) || { return 1; }
else
@@ -111,51 +131,84 @@ upload() {
get_file_hash "$file"
curl -sL \
if [[ "$album_name" ]]; then
get_album_id "$album_name"
fi
api_response=$( curl -sL \
-F file="@$file" \
-F api_format="$cfg_api_format" \
-F api_format='json' \
-F flag_private="$flag_private" \
-F short="$flag_shortlink" \
-F secret="$secret" \
-F submit="" \
"${misc_curl_args[@]}" \
-A 'zerofiles.org upload script' \
"$cfg_service_url/$cfg_api_path/upload"
"$cfg_service_url/$cfg_api_path/upload" )
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_direct'
else
file_url_request='short_url'
fi
else
if (( flag_directlink )); then
file_url_request='direct_url'
else
file_url_request='page_url'
fi
fi
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
file_link=$( jshon -e data -e file -e "$file_url_request" -u <<< "$api_response" )
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 -sL "$cfg_service_url/$cfg_api_path/url?a=add&url=${url}&format=json&secret=$secret" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
read -r short_url real_url < <(
jshon -e data -e URL -e shorturl -u <<< "$api_response"
)
printf '%s\n' "$short_url"
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
take_screenshot() {
declare tmp_file
[[ "$scrot_exec" ]] || { scrot_exec=$(type -P scrot); }
[[ "$scrot_exec" ]] || {
err "Please install scrot to use this function"
[[ "$scn_exec" ]] || { scn_exec=$(type -P maim); }
[[ "$scn_exec" ]] || {
err "Please install maim to use this function"
return 1
}
(( "$flag_scrot_fullscreen" )) || { scrot_args+=( '-s' ); }
[[ "$cfg_scrot_delay" ]] && { scrot_args+=( "-d $cfg_scrot_delay" ); }
(( "$flag_scn_fullscreen" )) || { scn_args+=( '-s' ); }
[[ "$cfg_scn_delay" ]] && { scn_args+=( "-d $cfg_scn_delay" ); }
tmp_file="$(_mktemp "${cfg_tmp_dir}" ".${cfg_screenshot_ext}")"
scrot "${scrot_args[@]}" "$tmp_file" || {
maim "${scn_args[@]}" "$tmp_file" || {
err "Failed to take a screenshot."
return 1
}
@@ -163,6 +216,16 @@ take_screenshot() {
printf '%s\n' "$tmp_file"
}
get_api_status() {
read -d '' -r api_status api_status_message < <(
jshon -e status -e code -u -p -e message -u
)
if ! (( api_status == 200 )); then
return 1
fi
}
_mktemp() {
declare tmp_file_name tmp_file_name_extra="$2" tmp_dir="$1"
@@ -179,10 +242,29 @@ _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 -sl "$cfg_service_url/$cfg_api_path/ip?format=json" )
get_api_status <<< "$api_response"
if (( api_status == 200 )); then
my_ip=$( jshon -e data -e ip -u <<< "$api_response" )
printf '%s\n' "$my_ip"
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
login() {
declare api_response
api_response=$( curl -sl "$cfg_service_url/$cfg_api_path/get_login_token?login=$login&format=json" )
if get_api_status <<< "$api_response"; then
printf 'Check your email.\n'
else
printf 'Error: %s %s\n' "$api_status" "$api_status_message"
fi
}
@@ -222,7 +304,7 @@ set_argv() {
}
main() {
declare args file target flag_private flag_rm flag_scrot flag_scrot_fullscreen cfg_scrot_delay
declare args file target flag_private flag_rm flag_scn flag_scn_fullscreen cfg_scn_delay
declare flag_shortlink=0
# Defaults for XDG
@@ -239,9 +321,11 @@ main() {
cfg_service_url='https://8fw.me'
cfg_screenshot_ext='png'
cfg_max_filesize='200M'
cfg_api_format='plain'
cfg_api_path='/api/2'
flag_shortlink=0
flag_directlink=1
if [[ -f "$HOME/.suprc" ]]; then
printf 'Found legacy configfile, moving...\n' >&2
mv "$HOME/.suprc" "$XDG_CONFIG_DIR/ufw"
@@ -256,53 +340,68 @@ main() {
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'
;;
-A|--api-format) cfg_api_format=$2; shift;;
-h|--help|--usage) usage; return;;
-D|--screenshot-delay) cfg_scn_delay="$2"; shift;;
-m|--max-filesize) cfg_max_filesize=$2; shift;;
-A|--album-name) album_name=$2; shift;;
-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|--screenshot) flag_scn='1';;
-S|--short-url) flag_shortlink=1;;
-P|--page-url) flag_directlink=0;;
-q|--quiet) flag_quiet=1;;
-F|--fullscreen)
flag_scn='1'
flag_scn_fullscreen='1'
;;
-a|--album-id)
misc_curl_args+=( -F "album_id=$2" )
shift
;;
-A|--album-name)
misc_curl_args+=( -F "album_name=$2" )
shift
;;
-d|--description)
misc_curl_args+=( -F "description=$2" )
shift
;;
-h|--help|--usage) usage; return;;
--) shift; break;;
-*)
err "Unknown flag: $1"
usage
return 1
;;
*) break;;
esac
shift
done
ensure_env
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)
for t in "$@"; do
upload "$t"
done
;;
url)
for t in "$@"; do
get_shortlink "$1"
done
;;
getmyip) get_my_ip;;
login) login;;
esac
}

81
ufwd
View File

@@ -6,37 +6,56 @@ 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'
}
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 +65,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 "$@"