#!/usr/bin/env bash # Copyright (c) 2012 fbt # # 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 # Delay the shot by 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 file=$(sup.scrot) || { return 1; } else (( $# )) || { sup.usage return 1 } target="$1" if is_url "$target"; then 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[@]}"