#!/usr/bin/bash # Copyright (c) 2012 fbt # License: ISC # # About: # A simple upload script for UFW (http://zerofiles.org) _cat() { while read; do printf '%s\n' "$REPLY" done } is_url() { [[ "$1" =~ $cfg_url_regex ]] } msg() { printf '%s\n' "[ufw] $1"; } err() { msg "(error) $1" >&2; } usage() { _cat <<- EOF Usage: ufw [-RsF] [-D num] [file/url]" Flags: -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 # Delay the shot by seconds. -p|--public # Make the file public. -u|--short # Generate a shortlink from URL. -m|--max-filesize # 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 crated, if necessary. -M|--api-format # API response format. 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 (takes K, M and G suffixes). cfg_api_format # Set the api response format. Supports json or plain (default). # 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" ) } 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 err "Wrong cfg_max_filesize: $cfg_max_filesize" return 1 fi } upload() { if (( flag_scrot )); then flag_rm=1 file=$(take_screenshot) || { return 1; } else (( $# )) || { 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" -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" if [[ "$album_name" ]]; then if album_id=$( curl -fsL "$cfg_service_url/$cfg_api_path/album?a=new&name=$album_name&format=plain&secret=$secret" ); then misc_curl_args+=( -F album_id="$album_id" ) else return 1 fi fi curl -sL \ -F file="@$file" \ -F api_format="$cfg_api_format" \ -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" if (( $? )); then err 'Something has gone wrong with the upload.' return 7 else if (( flag_rm )); then msg "Removing file: $file" rm "$file" fi fi } get_shortlink() { declare url=$1 if ! curl -fsL "$cfg_service_url/api?mode=url_add&url=${url}&raw=1"; then err 'Something went wrong!' fi } take_screenshot() { declare tmp_file [[ "$scrot_exec" ]] || { scrot_exec=$(type -P scrot); } [[ "$scrot_exec" ]] || { 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="$(_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" } _mktemp() { declare tmp_file_name tmp_file_name_extra="$2" tmp_dir="$1" [[ -d "$tmp_dir" ]] || { 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}" } get_my_ip() { my_ip=$( curl -fsL https://zfh.so/ip ) if ! (( $? )); then printf '%s\n' $my_ip fi } 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 # Defaults for XDG if ! [[ "$XDG_RUNTIME_DIR" ]]; then XDG_RUNTIME_DIR="/run/user/$UID" fi if ! [[ "$XDG_CONFIG_DIR" ]]; then XDG_CONFIG_DIR="$HOME/.config" 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' if [[ -f "$HOME/.suprc" ]]; then printf 'Found legacy configfile, moving...\n' >&2 mv "$HOME/.suprc" "$XDG_CONFIG_DIR/ufw" fi 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 $? fi fi while [[ "$1" ]]; do case "$1" in -p|--public) 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' ;; -m|--max-filesize) cfg_max_filesize=$2; shift;; -M|--api-format) cfg_api_format=$2; shift;; -i|--my-ip) action='getmyip';; -S|--short) flag_shortlink='1';; -u|--url) action='url';; -a|--album-id) misc_curl_args+=( -F "album_id=$2" ) shift ;; -A|--album-name) album_name=$2; shift;; -d|--description) misc_curl_args+=( -F "description=$2" ) shift ;; -h|--help|--usage) usage; return;; --) shift; break;; *) break;; esac shift done ensure_env case "${action:-upload}" in upload) upload "$1";; url) get_shortlink "$1";; getmyip) get_my_ip;; esac } set_argv "$@" main "${argv[@]}"