#!/bin/sh #---------------------------------------------------- # Author: Florian "Bluewind" Pritz # Contributor: Moritz Wilhelmy # # Licensed under WTFPL v2 # (see COPYING for full license text) # #---------------------------------------------------- # Dependencies: curl # Optional: xclip #---------------------------------------------------- VERSION="@VERSION@" DELETE= EXTENSION="" GET= TAR= COMPRESS=0 TAREXT=".tar" TAROPTS="" PASTEBIN="http://paste.xinu.at" WARNSIZE=10485760 USERAGENT="fb-client/$VERSION" CLIPBOARD="" EXITCODE=0 # the calling conventions for stat(1) are highly system dependent STAT='stat -c %s' # GNU stat(1) is the default since most people have it CLIPBOARD_CMD=xclip # also default to X11 case "`uname -s`" in *BSD) STAT='stat -f %z';; Minix) STAT='stat -size';; Darwin)STAT='stat -f %z'; CLIPBOARD_CMD=pbcopy;; esac do_upload() { local EXTRA="" file="$1" basefilename="`basename -- "$file"`" basedirname="`dirname -- "$file"`" if [ ! -e "$file" ]; then echo "Error: File \"$file\" doesn't exist" >&2 EXITCODE=1 return 1 fi if [ -d "$file" ]; then cd "$basedirname" tar $TAROPTS -cf "$TMPDIR/$basefilename$TAREXT" -- "$basefilename" COMPRESS=0 file="$TMPDIR/$basefilename$TAREXT" fi if [ "$COMPRESS" = "1" ]; then gzip -c -- "$file" > "$TMPDIR/$basefilename.gz" file="$TMPDIR/$basefilename.gz" elif [ "$COMPRESS" = "2" ]; then xz -c -- "$file" > "$TMPDIR/$basefilename.xz" file="$TMPDIR/$basefilename.xz" fi if [ "$EXTENSION" ]; then EXTRA="-F extension=$EXTENSION" fi TMPFILE=`mktemp "$TMPDIR/data.XXXXXX"` if [ "`$STAT -- "$file"`" -gt "$WARNSIZE" ]; then WARNSIZE=`curl -s "$PASTEBIN/file/get_max_size"` if [ "`$STAT -- "$file"`" -gt "$WARNSIZE" ]; then echo "Warning: Your upload is too big and would be rejected. Maximum size is: $WARNSIZE bytes. Skipping..." >&2 EXITCODE=1 return 1 fi fi CURLOPTS="-# -n -L -A $USERAGENT $EXTRA" if [ "`$STAT -- "$file"`" -eq "0" ] || echo "$file" | grep -F -q ","; then basefilename=`echo "$basefilename" | tr -d ,` if ! curl $CURLOPTS -F "file=@-;filename=$basefilename" "$PASTEBIN/file/do_upload" < "$file" > $TMPFILE; then EXITCODE=1 return 1 fi else if ! curl $CURLOPTS -F "file=@$file" "$PASTEBIN/file/do_upload" > $TMPFILE; then EXITCODE=1 return 1 fi fi sed '$d' $TMPFILE >&2 URL=`tail -1 $TMPFILE` echo $URL CLIPBOARD="$CLIPBOARD $URL" } read_stdin() { if tty -s; then echo "^C to exit, ^D to send" fi cat > "$1" } id_from_arg() { if echo "$1" | grep -qE "^https?://"; then echo "$1" | sed -r 's/https?:\/\/[^\/]+\/([^\/]+).*/\1/' else echo "$1" fi } help() { cat <] Upload/nopaste file(s)/stdin to paste.xinu.at and copy URL(s) to clipboard. ~/.netrc: machine paste.xinu.at password PASSWORD Switches: -d delete the IDs -g download the IDs and output on stdout (use with care!) -h this help -v show the client version Options: These have no effect if used in conjunction with a switch -e extension for default highlighting (e.g. "diff") -t upload a tar file containing all files (and directories) -c compress the file being uploaded with gz or xz if used 2 times ! } while getopts "e:gdhtcv" OPTION; do case $OPTION in e) EXTENSION="$OPTARG";; g) GET=1;; c) COMPRESS=`expr $COMPRESS + 1` if [ "$COMPRESS" = "1" ]; then TAROPTS="-z" TAREXT=".tar.gz" elif [ "$COMPRESS" = "2" ]; then TAROPTS="-J" TAREXT=".tar.xz" fi ;; t) TAR=1;; d) DELETE=1;; v) echo "$VERSION"; exit 0;; h|\?) help; exit 0;; esac done shift `expr $OPTIND - 1` TMPDIR="`mktemp -dt "fb.XXXXXX"`" trap "rm -rf '${TMPDIR}'" EXIT TERM if [ $# -eq 0 ]; then read_stdin "$TMPDIR/stdin" do_upload "$TMPDIR/stdin" else if [ "$TAR" ]; then tar $TAROPTS -cf "$TMPDIR/upload$TAREXT" -- "$@" COMPRESS=0 do_upload "$TMPDIR/upload$TAREXT" break else for i in "$@"; do if [ "$DELETE" ]; then i=$(id_from_arg "$i") if ! curl -n -L -A $USERAGENT "$PASTEBIN/file/delete/$i"; then EXITCODE=1 fi elif [ "$GET" ]; then i=$(id_from_arg "$i") if ! curl -s -o - -A $USERAGENT "$PASTEBIN/$i"; then EXITCODE=1 fi elif echo "$i" | grep -qE "^(f|ht)tp(s)?://.+"; then cd $TMPDIR if ! curl -# -A $USERAGENT -O "$i"; then EXITCODE=1 continue fi for f in *; do do_upload "$f" && rm -f -- "$f" done else do_upload "$i" fi done fi fi if [ "$CLIPBOARD" != "" ]; then type $CLIPBOARD_CMD >/dev/null 2>&1 && echo -n $CLIPBOARD | nohup $CLIPBOARD_CMD >/dev/null 2>&1 fi exit $EXITCODE #vim: set noet: