Initial check-in of Amazon S3 helper scripts.
[clinton/scripts.git] / s3-put
diff --git a/s3-put b/s3-put
new file mode 100755 (executable)
index 0000000..87af77b
--- /dev/null
+++ b/s3-put
@@ -0,0 +1,119 @@
+#! /usr/bin/env bash
+cat > /dev/null << EndOfLicence
+s3-bash
+Copyright 2007 Raphael James Cohn
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+in compliance with the License.
+You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+       
+Unless required by applicable law or agreed to in writing, software distributed under the License
+is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+or implied. See the License for the specific language governing permissions and limitations under
+the License.
+EndOfLicence
+
+# Pragmas
+set -u
+set -e
+
+function printHelpAndExit
+{
+       exitCode=$1
+       printf "%s: version %s\n" "$weAreKnownAs" "$version"
+       printf "Part of s3-bash. Latest version is at %s\n" 'http://code.google.com/p/s3-bash/'
+       printf "Usage %s: -h\n" "$weAreKnownAs"
+       printf "Usage %s: [-vS] [-H file] [-a file] -k key -s file -T file url\n" "$weAreKnownAs"
+       printf " Option\tType\tRequirement\tDescription\n"
+       printf " -h\t\tprecedent\tprint this help\n"
+       printf " -v\t\toptional\tverbose output\n"
+       printf " -k\tstring\tmandatory\tAWS Access Key Id\n"
+       printf " -s\tfile\tmandatory\tAWS Secret Access Key Id File\n"
+       printf " -T\tfile\tmandatory\tFile (or stdin with -) to PUT\n"
+       printf " -S\t\toptional\tUse https\n"
+       printf " -H\tfile\toptional\tFile to write response headers to\n"
+       printf " -a\tfile\toptional\tFile to read Amazon custom headers from (X-Amz-Date is not allowed)\n"
+       printf " -c\tMIME\toptional\tMIME Content type. Default is text/plain\n"
+       printf " \turl\tmandatory\trelative url including bucket name and leading slash, eg /bucket/path/to/object?acl. Assumed to be already encoded\n"
+       printf "\n"
+       printf "Notes\n"
+       printf "Specify proxies using a ~/.curlrc file\n"
+       printf "Specify content to PUT using stdin using option -T -\n"
+       exit $exitCode
+}
+
+function parseOptions
+{
+       verbose=""
+       url=""
+       awsAccessKeyId=""
+       awsAccessSecretKeyIdFile=""
+       protocol="http"
+       fileToUpload=""
+       dumpHeaderFile="/dev/null"
+       amazonHeaderFile="/dev/null"
+       contentType="text/plain"
+       while getopts "hvk:s:SH:T:a:c:" optionName; do          
+               case "$optionName" in
+                       h)      printHelpAndExit 0;;
+                       v)      verbose="-v";;
+                       k)      awsAccessKeyId="$OPTARG";;
+                       s)      awsAccessSecretKeyIdFile="$OPTARG"
+                               if [ ! -e "$awsAccessSecretKeyIdFile" ]; then
+                                       printErrorHelpAndExit "AWS Secret Key Id file does not exist" $userSpecifiedDataErrorExitCode
+                               fi;;
+                       S)      protocol="https";;
+                       H)      dumpHeaderFile="$OPTARG";;
+                       T)      fileToUpload="$OPTARG";;
+                       a)      amazonHeaderFile="$OPTARG";;
+                       c)      contentType="$OPTARG";;
+                       [?])    printErrorHelpAndExit "Option not recognised" $userSpecifiedDataErrorExitCode;;
+               esac
+       done
+       if [ 1 -eq $OPTIND ]; then
+               printErrorHelpAndExit "Internal Error: parseOptions or a parent method in the call stack was not called with $"@"." $internalErrorExitCode
+       fi
+       let "toShift = $OPTIND - 1"
+       shift $toShift
+       if [ $# -eq 0 ]; then
+               printErrorHelpAndExit "URL not specified" $userSpecifiedDataErrorExitCode
+       fi
+       url="$1"
+       verifyUrl
+               
+       if [ -z "$awsAccessSecretKeyIdFile" ]; then
+               printErrorHelpAndExit "AWS Secret Access Key file not specified" $userSpecifiedDataErrorExitCode
+       elif [ -z "$awsAccessKeyId" ]; then
+               printErrorHelpAndExit "AWS Access Key Id not specified" $userSpecifiedDataErrorExitCode
+       elif [ -z "$fileToUpload" ]; then
+               printErrorHelpAndExit "File to upload not specified" $userSpecifiedDataErrorExitCode
+       fi
+}
+
+function prepareToRunCurl
+{
+       readonly verb="PUT"
+       if [ ! "-" = "$fileToUpload" ]; then
+               readonly contentMD5="$(base64EncodedMD5 "$fileToUpload")"
+               readonly verbToPass="-T \"$fileToUpload\""
+       else
+               readonly contentMD5=""
+               readonly verbToPass="-T -"
+       fi
+}
+
+readonly weAreKnownAs="$(basename $0)"
+readonly ourPath="$(dirname $0)"
+
+readonly commonFunctions="$ourPath/s3-common-functions"
+if [ -e "$commonFunctions" ]; then
+       source "$commonFunctions"
+else
+       version="Unknown"
+       invalidEnvironmentExitCode=4
+       printErrorHelpAndExit "$weAreKnownAs: Could not locate file s3-common-functions" $invalidEnvironmentExitCode
+fi
+
+main "$@"