1f19a742fSBrad Davis#!/bin/sh 2f19a742fSBrad Davis#- 3f19a742fSBrad Davis# Redistribution and use in source and binary forms, with or without 4f19a742fSBrad Davis# modification, are permitted provided that the following conditions 5f19a742fSBrad Davis# are met: 6f19a742fSBrad Davis# 1. Redistributions of source code must retain the above copyright 7f19a742fSBrad Davis# notice, this list of conditions and the following disclaimer. 8f19a742fSBrad Davis# 2. Redistributions in binary form must reproduce the above copyright 9f19a742fSBrad Davis# notice, this list of conditions and the following disclaimer in the 10f19a742fSBrad Davis# documentation and/or other materials provided with the distribution. 11f19a742fSBrad Davis# 12f19a742fSBrad Davis# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 13f19a742fSBrad Davis# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14f19a742fSBrad Davis# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15f19a742fSBrad Davis# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 16f19a742fSBrad Davis# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 17f19a742fSBrad Davis# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 18f19a742fSBrad Davis# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 19f19a742fSBrad Davis# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 20f19a742fSBrad Davis# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 21f19a742fSBrad Davis# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 22f19a742fSBrad Davis# SUCH DAMAGE. 23f19a742fSBrad Davis# 24f19a742fSBrad Davis# Upload a Vagrant image to Hashicorp's Atlas service 25f19a742fSBrad Davis# 26f19a742fSBrad Davis# $FreeBSD$ 27f19a742fSBrad Davis# 28f19a742fSBrad Davis 29f19a742fSBrad DavisATLAS_API_URL='' 30f19a742fSBrad DavisATLAS_UPLOAD_URL='https://binstore.hashicorp.com' 31*a54bd595SBrad DavisDESCRIPTION="FreeBSD Snapshot Build" 32f19a742fSBrad Davis 33f19a742fSBrad Davisusage() { 34f19a742fSBrad Davis echo "${0} usage:" 35*a54bd595SBrad Davis echo "-b box-name -d 'box description' -f box-to-upload -k api-key -p provider -u user -v version" 36f19a742fSBrad Davis return 1 37f19a742fSBrad Davis} 38f19a742fSBrad Davis 39f19a742fSBrad Davismain () { 40*a54bd595SBrad Davis while getopts "b:d:f:k:p:u:v:" arg; do 41f19a742fSBrad Davis case "${arg}" in 42f19a742fSBrad Davis b) 43f19a742fSBrad Davis BOX="${OPTARG}" 44f19a742fSBrad Davis ;; 45*a54bd595SBrad Davis d) 46*a54bd595SBrad Davis DESCRIPTION="${OPTARG}" 47*a54bd595SBrad Davis ;; 48f19a742fSBrad Davis f) 49f19a742fSBrad Davis FILE="${OPTARG}" 50f19a742fSBrad Davis ;; 51f19a742fSBrad Davis k) 52f19a742fSBrad Davis KEY="${OPTARG}" 53f19a742fSBrad Davis ;; 54f19a742fSBrad Davis p) 55f19a742fSBrad Davis PROVIDER="${OPTARG}" 56f19a742fSBrad Davis ;; 57f19a742fSBrad Davis u) 58f19a742fSBrad Davis USERNAME="${OPTARG}" 59f19a742fSBrad Davis ;; 60f19a742fSBrad Davis v) 61f19a742fSBrad Davis VERSION="${OPTARG}" 62f19a742fSBrad Davis ;; 63f19a742fSBrad Davis *) 64f19a742fSBrad Davis ;; 65f19a742fSBrad Davis esac 66f19a742fSBrad Davis done 67f19a742fSBrad Davis 68f19a742fSBrad Davis if [ -z "${BOX}" -o \ 69f19a742fSBrad Davis -z "${FILE}" -o \ 70f19a742fSBrad Davis -z "${KEY}" -o \ 71f19a742fSBrad Davis -z "${PROVIDER}" -o \ 72f19a742fSBrad Davis -z "${USERNAME}" -o \ 73f19a742fSBrad Davis -z "${VERSION}" ]; 74f19a742fSBrad Davis then 75f19a742fSBrad Davis usage || exit 0 76f19a742fSBrad Davis fi 77f19a742fSBrad Davis 78f19a742fSBrad Davis # Check to see if the box exists or create it 79f19a742fSBrad Davis BOXRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}?access_token=${KEY}") 80f19a742fSBrad Davis if [ $? != 0 ]; then 81f19a742fSBrad Davis echo "Failed to connect to the API" 82f19a742fSBrad Davis exit 2; 83f19a742fSBrad Davis fi 84f19a742fSBrad Davis echo $BOXRESULT | grep "\"name\":\"${BOX}\"" > /dev/null 85f19a742fSBrad Davis if [ $? != 0 ]; then 86f19a742fSBrad Davis echo "Creating box: ${BOX}" 87f19a742fSBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/boxes -X POST -d "box[name]=${BOX}" -d "access_token=${KEY}" > /dev/null 88f19a742fSBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[is_private]=false" -d "access_token=${KEY}" > /dev/null 89*a54bd595SBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[description]='${DESCRIPTION}'" -d "access_token=${KEY}" > /dev/null 90f19a742fSBrad Davis else 91f19a742fSBrad Davis echo "Box already exists" 92f19a742fSBrad Davis fi 93f19a742fSBrad Davis 94f19a742fSBrad Davis # Check to see if the version exists or create it 95f19a742fSBrad Davis VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 96f19a742fSBrad Davis if [ $? != 0 ]; then 97f19a742fSBrad Davis echo "Failed to connect to the API" 98f19a742fSBrad Davis exit 2; 99f19a742fSBrad Davis fi 100f19a742fSBrad Davis echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null 101f19a742fSBrad Davis if [ $? != 0 ]; then 102f19a742fSBrad Davis echo "Creating version: ${VERSION}" 103f19a742fSBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/versions -X POST -d "version[version]=${VERSION}" -d "access_token=${KEY}" > /dev/null 104*a54bd595SBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION} -X PUT -d "version[description]=${DESCRIPTION}" -d "access_token=${KEY}" > /dev/null 105f19a742fSBrad Davis VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 106f19a742fSBrad Davis echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null 107f19a742fSBrad Davis if [ $? != 0 ]; then 108f19a742fSBrad Davis echo "Failed to create version" 109f19a742fSBrad Davis exit 2 110f19a742fSBrad Davis fi 111f19a742fSBrad Davis else 112f19a742fSBrad Davis echo "Version already exists" 113f19a742fSBrad Davis fi 114f19a742fSBrad Davis 115f19a742fSBrad Davis # Check to see if the provider exists or create it 116f19a742fSBrad Davis PROVIDERRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 117f19a742fSBrad Davis if [ $? != 0 ]; then 118f19a742fSBrad Davis echo "Failed to connect to the API" 119f19a742fSBrad Davis exit 2; 120f19a742fSBrad Davis fi 121f19a742fSBrad Davis echo $PROVIDERRESULT | grep "\"name\":\"${PROVIDER}\"" > /dev/null 122f19a742fSBrad Davis if [ $? != 0 ]; then 123f19a742fSBrad Davis echo "Creating provider: ${PROVIDER}" 124f19a742fSBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/providers -X POST -d "provider[name]=${PROVIDER}" -d "access_token=${KEY}" > /dev/null 125f19a742fSBrad Davis else 126f19a742fSBrad Davis echo "Provider already exists" 127f19a742fSBrad Davis fi 128f19a742fSBrad Davis 129f19a742fSBrad Davis # Request an upload token 130f19a742fSBrad Davis TOKENRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}/upload?access_token=${KEY}") 131f19a742fSBrad Davis if [ $? != 0 ]; then 132f19a742fSBrad Davis echo "Failed to get the token from the API" 133f19a742fSBrad Davis exit 2; 134f19a742fSBrad Davis fi 135f19a742fSBrad Davis echo ${TOKENRESULT} | grep "\"token\":" > /dev/null 136f19a742fSBrad Davis if [ $? != 0 ]; then 137f19a742fSBrad Davis echo "No token found from the API" 138f19a742fSBrad Davis exit 2 139f19a742fSBrad Davis else 140f19a742fSBrad Davis TOKEN=$(echo $TOKENRESULT | sed -e 's/.*token":"//' -e 's/".*//') 141f19a742fSBrad Davis echo "Uploading to Atlas" 142f19a742fSBrad Davis UPLOADRESULT=$(/usr/local/bin/curl -s -X PUT --upload-file ${FILE} ${ATLAS_UPLOAD_URL}/${TOKEN}) 143f19a742fSBrad Davis 144f19a742fSBrad Davis # Validate the Upload 145f19a742fSBrad Davis echo "Validating" 146f19a742fSBrad Davis VALIDRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 147f19a742fSBrad Davis HOSTED_TOKEN=$(echo $VALIDRESULT | sed -e 's/.*hosted_token":"//' -e 's/".*//') 148f19a742fSBrad Davis if [ ! -z ${HOSTED_TOKEN} -a ! -z ${TOKEN} -a ${HOSTED_TOKEN} != ${TOKEN} ]; then 149f19a742fSBrad Davis echo "Upload failed, try again." 150f19a742fSBrad Davis exit 2 151f19a742fSBrad Davis fi 152f19a742fSBrad Davis 153f19a742fSBrad Davis # Release the version 154f19a742fSBrad Davis echo "Releasing ${VERSION} of ${BOX} in Atlas" 155f19a742fSBrad Davis /usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/release -X PUT -d "access_token=${KEY}" > /dev/null 156f19a742fSBrad Davis fi 157f19a742fSBrad Davis} 158f19a742fSBrad Davis 159f19a742fSBrad Davismain "$@" 160