#!/usr/bin/env bash # # Upload a file to S3 # (c) 2015 Chi Vinh Le # # 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. set -euo pipefail readonly PROJECT_PATH=$(dirname $0) readonly SCRIPT_NAME="$(basename $0)" readonly METHOD="PUT" # Includes source ${PROJECT_PATH}/s3-common.sh ## # Print help and exit # Arguments: # $1 int exit code # Output: # string help ## printUsageAndExitWith() { printf "Usage:\n" printf " ${SCRIPT_NAME} [--debug] [-vip] [-k key] [-r region] [-s file] [-c content_type] -T file_to_upload resource_path\n" printf " ${SCRIPT_NAME} -h\n" printf "Example:\n" printf " ${SCRIPT_NAME} -k key -s secret -r eu-central-1 -T file.ext -c text/plain /bucket/file.ext\n" printf "Options:\n" printf " -c,--content-type\tMIME content type\n" printf " --debug\tEnable debugging mode\n" printf " -h,--help\tPrint this help\n" printf " -i,--insecure\tUse http instead of https\n" printf " -k,--key\tAWS Access Key ID. Default to environment variable AWS_ACCESS_KEY_ID\n" printf " -p,--public\tGrant public read on uploaded file\n" printf " -r,--region\tAWS S3 Region. Default to environment variable AWS_DEFAULT_REGION\n" printf " -s,--secret\tFile containing AWS Secret Access Key. If not set, secret will be environment variable AWS_SECRET_ACCESS_KEY\n" printf " -T,--upload-file\tPath to file to upload\n" printf " -v,--verbose\tVerbose output\n" printf " --version\tShow version\n" exit $1 } ## # Parse command line and set global variables # Arguments: # $@ command line # Sets the following Globals: # AWS_ACCESS_KEY_ID string # AWS_SECRET_ACCESS_KEY string # AWS_REGION string # RESOURCE_PATH string # FILE_TO_UPLOAD string # CONTENT_TYPE string # PUBLISH bool # VERBOSE bool # INSECURE bool # DEBUG bool # PUBLISH bool ## parseCommandLine() { # Init globals AWS_REGION=${AWS_DEFAULT_REGION:-""} AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-""} AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-""} FILE_TO_UPLOAD= CONTENT_TYPE= PUBLISH=false VERBOSE=false INSECURE=false DEBUG=false # Parse options local remaining= local secretKeyFile= while [[ $# > 0 ]]; do local key="$1" case ${key} in --version) showVersionAndExit;; --debug) DEBUG=true;; -h|--help) printUsageAndExitWith 0;; -v|--verbose) VERBOSE=true;; -i|--insecure) INSECURE=true;; -p|--publish) PUBLISH=true;; -c|--content-type) assertArgument $@; CONTENT_TYPE=$2; shift;; -T|--upload-file) assertArgument $@; FILE_TO_UPLOAD=$2; shift;; -r|--region) assertArgument $@; AWS_REGION=$2; shift;; -k|--key) assertArgument $@; AWS_ACCESS_KEY_ID=$2; shift;; -s|--secret) assertArgument $@; secretKeyFile=$2; shift;; -*) err "Unknown option $1" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE};; *) remaining="${remaining} \"${key}\"";; esac shift done # Set the non-parameters back into the positional parameters ($1 $2 ..) eval set -- ${remaining} # Read secret file if set if ! [[ -z "${secretKeyFile}" ]]; then AWS_SECRET_ACCESS_KEY=$(processAWSSecretFile "${secretKeyFile}") fi # Parse arguments if [[ $# != 1 ]]; then err "You need to specify the resource path to upload to e.g. /bucket/file.ext" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE} fi assertResourcePath $1 RESOURCE_PATH="$1" if [[ -z "${FILE_TO_UPLOAD}" ]]; then err "You need to specify the file to upload using -T" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE} fi assertFileExists "${FILE_TO_UPLOAD}" if [[ -z "${AWS_REGION}" ]]; then err "AWS Region not specified" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE} fi if [[ -z "${AWS_ACCESS_KEY_ID}" ]]; then err "AWS Access Key ID not specified" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE} fi if [[ -z "${AWS_SECRET_ACCESS_KEY}" ]]; then err "AWS Secret Access Key not specified" printUsageAndExitWith ${INVALID_USAGE_EXIT_CODE} fi # Freeze globals readonly AWS_REGION readonly AWS_ACCESS_KEY_ID readonly AWS_SECRET_ACCESS_KEY readonly RESOURCE_PATH readonly CONTENT_TYPE readonly PUBLISH readonly DEBUG readonly VERBOSE readonly INSECURE } ## # Main routine ## main() { checkEnvironment parseCommandLine $@ performRequest } main $@