264 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| # Copyright (c) 2012 fbt <fbt@fleshless.org>
 | |
| #
 | |
| # About:
 | |
| # A simple upload script for ZFH (http://zerofiles.org)
 | |
| 
 | |
| _self="${0##*/}"
 | |
| 
 | |
| # Defaults for XDG
 | |
| if ! [[ "$XDG_RUNTIME_DIR" ]]; then
 | |
| 	XDG_RUNTIME_DIR="/run/user/$UID"
 | |
| fi
 | |
| 
 | |
| cfg_url_regex='^[A-Za-z]([A-Za-z0-9+.-]+)?://.+'
 | |
| cfg_tmp_dir="$XDG_RUNTIME_DIR/sup"; TEMPDIR="$cfg_tmp_dir"
 | |
| cfg_service_url='https://zfh.so'
 | |
| cfg_screenshot_ext='png'
 | |
| 
 | |
| [[ -f $HOME/.suprc ]] && { source "$HOME/.suprc"; }
 | |
| 
 | |
| _cat() {
 | |
| 	while read; do
 | |
| 		printf '%s\n' "$REPLY"
 | |
| 	done
 | |
| }
 | |
| 
 | |
| is_url() {
 | |
| 	[[ "$1" =~ $cfg_url_regex ]]
 | |
| }
 | |
| 
 | |
| sup.msg() { printf '%s\n' "[sup] $1"; }
 | |
| sup.err() { sup.msg "(error) $1" >&2; }
 | |
| 
 | |
| sup.usage() {
 | |
| 	_cat <<- EOF
 | |
| 		Usage: ${_self} [-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 private. Requires \$secret to be set in the config.
 | |
| 		        -u                   # Generate a shortlink from URL.
 | |
| 		
 | |
| 		    Config options (~/.suprc):
 | |
| 		        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_service_url
 | |
| 	EOF
 | |
| }
 | |
| 
 | |
| sup.env() {
 | |
| 	for i in "$cfg_tmp_dir"; do
 | |
| 		[[ -d "$i" ]] || { mkdir -p "$i"; }
 | |
| 	done
 | |
| }
 | |
| 
 | |
| sup.get_hash() {
 | |
| 	read file_hash _ < <( sha1sum "$1" )
 | |
| }
 | |
| 
 | |
| sup.upload() {
 | |
| 	if (( flag_scrot )); then
 | |
| 		flag_rm=1
 | |
| 		file=$(sup.scrot) || { return 1; }
 | |
| 	else
 | |
| 		(( $# )) || {
 | |
| 			sup.usage
 | |
| 			return 1
 | |
| 		}
 | |
| 
 | |
| 		target="$1"
 | |
| 
 | |
| 		if is_url "$target"; then
 | |
| 			flag_rm=1
 | |
| 			file=$(sup.mktemp "$cfg_tmp_dir")
 | |
| 
 | |
| 			curl -skL "$target" > "$file" || {
 | |
| 				sup.err "Could not download file."
 | |
| 				return 1
 | |
| 			}
 | |
| 		else
 | |
| 			file="$target"
 | |
| 
 | |
| 			[[ -f "$file" ]] || {
 | |
| 				sup.err "No such file: ${file}"
 | |
| 				return 1
 | |
| 			}
 | |
| 		fi
 | |
| 	fi
 | |
| 
 | |
| 	sup.get_hash "$file"
 | |
| 
 | |
| 	file_url=$( curl -fsL "${cfg_service_url}/api?mode=file&file=${file_hash}&direct=1&short=${flag_shortlink}" )
 | |
| 	if ! (( $? )); then
 | |
| 		printf '%s\n' "$file_url"
 | |
| 	else
 | |
| 		curl -sL \
 | |
| 			-F file="@$file" \
 | |
| 			-F upload_mode='api' \
 | |
| 			-F flag_private="$flag_private" \
 | |
| 			-F short="$flag_shortlink" \
 | |
| 			-F description="$description" \
 | |
| 			-F secret="$secret" \
 | |
| 			-F submit="" \
 | |
| 			-A 'zerofiles.org upload script' \
 | |
| 			"$cfg_service_url/upload"
 | |
| 	fi
 | |
| 
 | |
| 	if (( $? )); then
 | |
| 		sup.err 'Something has gone wrong with the upload.'
 | |
| 		return 7
 | |
| 	else
 | |
| 		if (( flag_rm )); then
 | |
| 			sup.msg "Removing file: $file"
 | |
| 			rm "$file"
 | |
| 		fi
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| sup.url() {
 | |
| 	declare url=$1
 | |
| 
 | |
| 	if ! curl -fsL "$cfg_service_url/api?mode=url_add&url=${url}&raw=1"; then
 | |
| 		sup.err 'Something went wrong!'
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| sup.mktemp() {
 | |
| 	>"$1" || {
 | |
| 		sup.err "Cannot create $1!"
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	printf '%s\n' "$1"
 | |
| }
 | |
| 
 | |
| sup.scrot() {
 | |
| 	declare tmp_file
 | |
| 
 | |
| 	[[ "$scrot_exec" ]] || { scrot_exec=$(type -P scrot); }
 | |
| 	[[ "$scrot_exec" ]] || {
 | |
| 		sup.err "Please install scrot to use this function"
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	(( "$flag_scrot_fullscreen" )) || { scrot_args+=( '-s' ); }
 | |
| 	[[ "$cfg_scrot_delay" ]] && { scrot_args+=( "-d $cfg_scrot_delay" ); }
 | |
| 
 | |
| 	tmp_file="$(sup.mktemp "${cfg_tmp_dir}" ".${cfg_screenshot_ext}")"
 | |
| 
 | |
| 	scrot "${scrot_args[@]}" "$tmp_file" || {
 | |
| 		sup.err "Failed to take a screenshot."
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	printf '%s\n' "$tmp_file"
 | |
| }
 | |
| 
 | |
| sup.mktemp() {
 | |
| 	declare tmp_file_name tmp_file_name_extra="$2" tmp_dir="$1" 
 | |
| 
 | |
| 	[[ -d "$tmp_dir" ]] || {
 | |
| 		sup.err "${tmp_dir} does not exist or is not a directory."
 | |
| 		return 1
 | |
| 	}
 | |
| 
 | |
| 	until [[ ! -e "${tmp_dir}/${tmp_file_name}" ]]; do
 | |
| 		tmp_file_name="${RANDOM}${RANDOM}${tmp_file_name_extra}"
 | |
| 	done
 | |
| 
 | |
| 	printf '%s\n' "${tmp_dir}/${tmp_file_name}"
 | |
| }
 | |
| 
 | |
| sup.get_my_ip() {
 | |
| 	my_ip=$( curl -fsL https://zfh.so/ip )
 | |
| 
 | |
| 	if ! (( $? )); then
 | |
| 		printf '%s\n' $my_ip
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| sup.set_argv() {
 | |
| 	declare arg opt c
 | |
| 	declare -g argv
 | |
| 
 | |
| 	while (( $# )); do
 | |
| 		unset -v arg opt c
 | |
| 
 | |
| 		case "$1" in
 | |
| 			(--) argv+=( "$1" ); break;;
 | |
| 
 | |
| 			(--*)
 | |
| 				IFS='=' read arg opt <<< "$1"
 | |
| 				argv+=( "$arg" )
 | |
| 
 | |
| 				[[ "$opt" ]] && {
 | |
| 					argv+=( "$opt" )
 | |
| 				}
 | |
| 			;;
 | |
| 
 | |
| 			(-*)
 | |
| 				while read -n1 c
 | |
| 				do
 | |
| 					case "$c" in
 | |
| 						-|'') :;;
 | |
| 						*) argv+=( "-$c" );;
 | |
| 					esac
 | |
| 				done <<< "$1"
 | |
| 			;;
 | |
| 
 | |
| 			(*) argv+=( "$1" );;
 | |
| 		esac
 | |
| 		shift
 | |
| 	done
 | |
| }
 | |
| 
 | |
| main() {
 | |
| 	declare args file target flag_private flag_rm flag_scrot flag_scrot_fullscreen cfg_scrot_delay
 | |
| 	declare flag_shortlink=0
 | |
| 
 | |
| 	while [[ "$1" ]]; do
 | |
| 		case "$1" in
 | |
| 			-p|--private) flag_private='true';;
 | |
| 			-R|--remove-file) flag_rm='1';;
 | |
| 			
 | |
| 			-s|--screenshot) flag_scrot='1';;
 | |
| 			-d|--description) description="$2"; shift;;
 | |
| 			-D|--screenshot-delay) cfg_scrot_delay="$2"; shift;;
 | |
| 			-F|--fullscreen)
 | |
| 				flag_scrot='1'
 | |
| 				flag_scrot_fullscreen='1'
 | |
| 			;;
 | |
| 
 | |
| 			-i|--my-ip) action='getmyip';;
 | |
| 
 | |
| 			-S|--short) flag_shortlink='1';;
 | |
| 			-u|--url) action='url';;
 | |
| 			
 | |
| 			-h|--help|--usage) sup.usage; return;;
 | |
| 
 | |
| 			--) shift; break;;
 | |
| 
 | |
| 			*) break;;
 | |
| 		esac
 | |
| 		shift
 | |
| 	done
 | |
| 
 | |
| 	sup.env
 | |
| 
 | |
| 	case "${action:-upload}" in
 | |
| 		upload) sup.upload "$1";;
 | |
| 		url) sup.url "$1";;
 | |
| 		getmyip) sup.get_my_ip;;
 | |
| 	esac
 | |
| }
 | |
| 
 | |
| sup.set_argv "$@"
 | |
| main "${argv[@]}"
 |