292 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			6.0 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://8fw.me'
 | 
						|
cfg_screenshot_ext='png'
 | 
						|
cfg_max_filesize='200M'
 | 
						|
 | 
						|
[[ -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.
 | 
						|
		        -m                   # Maximum filesize (takes K, M and G suffixes).
 | 
						|
		
 | 
						|
		    Config options (~/.suprc):
 | 
						|
		        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.
 | 
						|
		        # 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.get_max_filesize() {
 | 
						|
	if [[ $cfg_max_filesize =~ ^[0-9]+[BKMG]?$ ]]; then
 | 
						|
		max_filesize_base="${cfg_max_filesize//[BKMG]/}"
 | 
						|
 | 
						|
		case "$cfg_max_filesize" in
 | 
						|
			*K) max_filesize_bytes=$(( max_filesize_base * 1024 ));;
 | 
						|
			*M) max_filesize_bytes=$(( max_filesize_base * 1024 * 1024 ));;
 | 
						|
			*G) max_filesize_bytes=$(( max_filesize_base * 1024 * 1024 * 1024 ));;
 | 
						|
			*) max_filesize_bytes=$max_filesize_base;;
 | 
						|
		esac
 | 
						|
	else
 | 
						|
		sup.err "Wrong cfg_max_filesize: $cfg_max_filesize"
 | 
						|
		return 1
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
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")
 | 
						|
 | 
						|
			sup.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) sup.err "File exceeds cfg_max_filesize";;
 | 
						|
					*) sup.err "Could not download file.";;
 | 
						|
				esac
 | 
						|
 | 
						|
				return 1
 | 
						|
			fi
 | 
						|
		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[@]}"
 |