Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
cloudfiles.sh is a bash script that provides command-line access to
basic functions of Mosso's Cloud Files, via curl.
basic functions of Rackspace Cloud Files (formerly Mosso's Cloud Files),
via curl.
163 changes: 119 additions & 44 deletions cloudfiles.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,60 +8,135 @@
#
# Written by Mike Barton (mike@weirdlooking.com), based on work by letterj.

auth_url="https://auth.api.rackspacecloud.com/v1.0"
me=`basename $0`

function usage {
echo "Usage: $0 [Username] [API Key] LS"
echo " $0 [Username] [API Key] LS [container]"
echo " $0 [Username] [API Key] PUT [container] [local file]"
echo " $0 [Username] [API Key] GET [/container/object]"
echo " $0 [Username] [API Key] MKDIR [/container]"
echo " $0 [Username] [API Key] RM [/container/object]"
echo " $0 [Username] [API Key] RMDIR [/container]"
echo "Usage: $0 [-e] [-u <auth url>] [<Username> <API Key>] <command> [<arguments> ...]" >&2
echo "Commands: LS [<container>]" >&2
echo " PUT <container> <local file>" >&2
echo " GET </container/object> [<local file>]" >&2
echo " MKDIR </container>" >&2
echo " RM </container/object>" >&2
echo " RMDIR </container>" >&2
echo "Options: -e use CLOUDFILES_USERNAME and CLOUDFILES_APIKEY" >&2
echo " environment variables instead of the command line" >&2
echo " (so that they won't show up in a process listing)" >&2
echo " -u specify authentication url" >&2
echo " (default: $auth_url or \$CLOUDFILES_AUTHURL)" >&2
echo " -s silent operation (apart from errors)" >&2
exit 1
}

function scurl {
curl -s -g -w '%{http_code}' -H Expect: -H "X-Auth-Token: $TOKEN" -X "$@"
curl -s -g -w '~~~%{http_code}' -H Expect: -H "X-Auth-Token: $TOKEN" -X "$@"
}

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then
usage
else
LOGIN=`curl --dump-header - -s -H "X-Auth-User: $1" \
-H "X-Auth-Key: $2" "https://auth.api.rackspacecloud.com/v1.0"`
function authenticate {
LOGIN=`curl --dump-header - -s -H "X-Auth-User: $CLOUDFILES_USERNAME" \
-H "X-Auth-Key: $CLOUDFILES_APIKEY" $auth_url`
TOKEN=`echo "$LOGIN" | grep ^X-Auth-Token | sed 's/.*: //' | tr -d "\r\n"`
URL=`echo "$LOGIN" | grep ^X-Storage-Url | sed 's/.*: //' | tr -d "\r\n"`
if [ -z $TOKEN ] || [ -z $URL ]; then
echo "Unable to auth."
exit 1
fi
case $3 in
LS)
if [ -z $4 ]; then
curl -s -o - -H "Expect:" -H "X-Auth-Token: $TOKEN" "$URL"
else
curl -s -o - -H "Expect:" -H "X-Auth-Token: $TOKEN" "$URL/$4"
fi
exit 0
;;
GET)
OBJNAME=`basename "$4"`
CODE=`scurl GET "$URL$4" -o "$OBJNAME" -i -v`
;;
PUT)
if [ ! -f $5 ]; then
usage
fi
TYPE=`file -bi "$5"`
OBJNAME=`basename "$5"`
CODE=`scurl PUT -H "Content-Type: $TYPE" -T "$5" "$URL/$4/$OBJNAME"`
;;
MKDIR) CODE=`scurl PUT -T /dev/null "$URL/$4"`;;
RM*) CODE=`scurl DELETE "$URL/$4"`;;
*) usage
esac
if [ $CODE -lt 200 ] || [ $CODE -gt 299 ]; then
echo "Invalid response code: $CODE"
exit 1
echo "$0: authentication failed" >&2
exit 4
fi
}

if [ "$CLOUDFILES_AUTHURL" ]; then
auth_url=$CLOUDFILES_AUTHURL
fi

while getopts eu: opt; do
case $opt in
e)
opt_e=1
;;
s)
opt_s=1
;;
u)
auth_url=$OPTARG
;;
*)
usage
;;
esac
done

shift $(($OPTIND - 1))

if [ ! "$opt_e" ]; then
CLOUDFILES_USERNAME=$1; shift
CLOUDFILES_APIKEY=$1; shift
fi

if [ ! "$CLOUDFILES_USERNAME" -o ! "$CLOUDFILES_APIKEY" ]; then
echo "$0: username and/or API key not specified" >&2
usage
fi

cmd=$1; shift

case $cmd in
LS)
authenticate
if [ -z "$1" ]; then
curl -s -o - -H "Expect:" -H "X-Auth-Token: $TOKEN" "$URL"
else
curl -s -o - -H "Expect:" -H "X-Auth-Token: $TOKEN" "$URL/$1"
fi
exit
;;
GET)
[ ! "$1" ] && usage
authenticate
if [ "$2" ]; then
output_file=$2
else
output_file=`basename "$1"`
fi
tmp="$output_file.$me.$$.part"
result=`scurl GET "$URL$1" -o "$tmp"`
if [ "$result" -eq "200" ]; then
mv $tmp $output_file
else
rm $tmp
fi
;;
PUT)
if [ ! "$2" ]; then
usage
elif [ ! -r "$2" ]; then
echo "$0: can't open $2 for reading" >&2
exit 1
fi
authenticate
TYPE=`file -bi "$2"`
OBJNAME=`basename "$2"`
result=`scurl PUT -H "Content-Type: $TYPE" -T "$2" "$URL/$1/$OBJNAME"`
;;
MKDIR)
[ ! "$1" ] && usage
authenticate
result=`scurl PUT -T /dev/null "$URL/$1"`
;;
RM*)
[ ! "$1" ] && usage
authenticate
target="`echo $1 | sed -e 's/^\///'`"
result=`scurl DELETE "$URL/$target"`
;;
*)
usage
esac

code=`echo $result | sed -e 's/^.*~~~//'`

if [[ ! "$code" =~ ^20[0-9] ]]; then
echo "$0: failed with status code $code" >&2
exit 1
fi

exit 0