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# 27f19a742fSBrad Davis 28f19a742fSBrad DavisATLAS_API_URL='' 29*5567474cSGlen BarberATLAS_UPLOAD_URL='https://app.vagrantup.com' 30a54bd595SBrad DavisDESCRIPTION="FreeBSD Snapshot Build" 31f19a742fSBrad Davis 32f19a742fSBrad Davisusage() { 33f19a742fSBrad Davis echo "${0} usage:" 34a54bd595SBrad Davis echo "-b box-name -d 'box description' -f box-to-upload -k api-key -p provider -u user -v version" 35f19a742fSBrad Davis return 1 36f19a742fSBrad Davis} 37f19a742fSBrad Davis 38f19a742fSBrad Davismain () { 39a54bd595SBrad Davis while getopts "b:d:f:k:p:u:v:" arg; do 40f19a742fSBrad Davis case "${arg}" in 41f19a742fSBrad Davis b) 42f19a742fSBrad Davis BOX="${OPTARG}" 43f19a742fSBrad Davis ;; 44a54bd595SBrad Davis d) 45a54bd595SBrad Davis DESCRIPTION="${OPTARG}" 46a54bd595SBrad Davis ;; 47f19a742fSBrad Davis f) 48f19a742fSBrad Davis FILE="${OPTARG}" 49f19a742fSBrad Davis ;; 50f19a742fSBrad Davis k) 51f19a742fSBrad Davis KEY="${OPTARG}" 52f19a742fSBrad Davis ;; 53f19a742fSBrad Davis p) 54f19a742fSBrad Davis PROVIDER="${OPTARG}" 55f19a742fSBrad Davis ;; 56f19a742fSBrad Davis u) 57f19a742fSBrad Davis USERNAME="${OPTARG}" 58f19a742fSBrad Davis ;; 59f19a742fSBrad Davis v) 60f19a742fSBrad Davis VERSION="${OPTARG}" 61f19a742fSBrad Davis ;; 62f19a742fSBrad Davis *) 63f19a742fSBrad Davis ;; 64f19a742fSBrad Davis esac 65f19a742fSBrad Davis done 66f19a742fSBrad Davis 67f19a742fSBrad Davis if [ -z "${BOX}" -o \ 68f19a742fSBrad Davis -z "${FILE}" -o \ 69f19a742fSBrad Davis -z "${KEY}" -o \ 70f19a742fSBrad Davis -z "${PROVIDER}" -o \ 71f19a742fSBrad Davis -z "${USERNAME}" -o \ 72f19a742fSBrad Davis -z "${VERSION}" ]; 73f19a742fSBrad Davis then 74f19a742fSBrad Davis usage || exit 0 75f19a742fSBrad Davis fi 76f19a742fSBrad Davis 77f19a742fSBrad Davis # Check to see if the box exists or create it 78*5567474cSGlen Barber BOXRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}?access_token=${KEY}") 79f19a742fSBrad Davis if [ $? != 0 ]; then 80f19a742fSBrad Davis echo "Failed to connect to the API" 81f19a742fSBrad Davis exit 2; 82f19a742fSBrad Davis fi 83f19a742fSBrad Davis echo $BOXRESULT | grep "\"name\":\"${BOX}\"" > /dev/null 84f19a742fSBrad Davis if [ $? != 0 ]; then 85f19a742fSBrad Davis echo "Creating box: ${BOX}" 86*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/boxes -X POST -d "box[name]=${BOX}" -d "access_token=${KEY}" > /dev/null 87*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[is_private]=false" -d "access_token=${KEY}" > /dev/null 88*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[description]='${DESCRIPTION}'" -d "access_token=${KEY}" > /dev/null 89f19a742fSBrad Davis else 90f19a742fSBrad Davis echo "Box already exists" 91f19a742fSBrad Davis fi 92f19a742fSBrad Davis 93f19a742fSBrad Davis # Check to see if the version exists or create it 94*5567474cSGlen Barber VERSIONRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 95f19a742fSBrad Davis if [ $? != 0 ]; then 96f19a742fSBrad Davis echo "Failed to connect to the API" 97f19a742fSBrad Davis exit 2; 98f19a742fSBrad Davis fi 99*5567474cSGlen Barber echo $VERSIONRESULT | grep "version/${VERSION}" > /dev/null 100f19a742fSBrad Davis if [ $? != 0 ]; then 101f19a742fSBrad Davis echo "Creating version: ${VERSION}" 102*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/versions -X POST -d "version[version]=${VERSION}" -d "access_token=${KEY}" > /dev/null 103*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION} -X PUT -d "version[description]=${DESCRIPTION}" -d "access_token=${KEY}" > /dev/null 104*5567474cSGlen Barber VERSIONRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}") 105*5567474cSGlen Barber echo $VERSIONRESULT | grep "version/${VERSION}" > /dev/null 106f19a742fSBrad Davis if [ $? != 0 ]; then 107f19a742fSBrad Davis echo "Failed to create version" 108f19a742fSBrad Davis exit 2 109f19a742fSBrad Davis fi 110f19a742fSBrad Davis else 111f19a742fSBrad Davis echo "Version already exists" 112f19a742fSBrad Davis fi 113f19a742fSBrad Davis 114f19a742fSBrad Davis # Check to see if the provider exists or create it 115*5567474cSGlen Barber PROVIDERRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 116f19a742fSBrad Davis if [ $? != 0 ]; then 117f19a742fSBrad Davis echo "Failed to connect to the API" 118f19a742fSBrad Davis exit 2; 119f19a742fSBrad Davis fi 120*5567474cSGlen Barber echo $PROVIDERRESULT | grep "provider/${PROVIDER}" > /dev/null 121f19a742fSBrad Davis if [ $? != 0 ]; then 122f19a742fSBrad Davis echo "Creating provider: ${PROVIDER}" 123*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/providers -X POST -d "provider[name]=${PROVIDER}" -d "access_token=${KEY}" > /dev/null 124f19a742fSBrad Davis else 125f19a742fSBrad Davis echo "Provider already exists" 126f19a742fSBrad Davis fi 127f19a742fSBrad Davis 128f19a742fSBrad Davis # Request an upload token 129*5567474cSGlen Barber TOKENRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}/upload?access_token=${KEY}") 130f19a742fSBrad Davis if [ $? != 0 ]; then 131f19a742fSBrad Davis echo "Failed to get the token from the API" 132f19a742fSBrad Davis exit 2; 133f19a742fSBrad Davis fi 134*5567474cSGlen Barber echo ${TOKENRESULT} | grep -E "upload_path" > /dev/null 135f19a742fSBrad Davis if [ $? != 0 ]; then 136f19a742fSBrad Davis echo "No token found from the API" 137f19a742fSBrad Davis exit 2 138f19a742fSBrad Davis else 1394d827698SGlen Barber TOKEN=$(echo $TOKENRESULT | sed -e 's/.*token":"//' -e 's/.*upload_path":"//' -e 's/}$//g' -e 's/"//g') 140f19a742fSBrad Davis echo "Uploading to Atlas" 141*5567474cSGlen Barber UPLOADRESULT=$(/usr/local/bin/curl -s -X PUT --upload-file ${FILE} "${TOKEN}") 142f19a742fSBrad Davis 143f19a742fSBrad Davis # Validate the Upload 144f19a742fSBrad Davis echo "Validating" 145*5567474cSGlen Barber VALIDRESULT=$(/usr/local/bin/curl -s "${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/provider/${PROVIDER}?access_token=${KEY}") 1464d827698SGlen Barber HOSTED_TOKEN=$(echo $VALIDRESULT | sed -e 's/.*"hosted"://' -e 's/,.*$//') 1474d827698SGlen Barber if [ ! -z ${TOKEN} -a "${HOSTED_TOKEN}" != "true" ]; then 148f19a742fSBrad Davis echo "Upload failed, try again." 149f19a742fSBrad Davis exit 2 150f19a742fSBrad Davis fi 151f19a742fSBrad Davis 152f19a742fSBrad Davis # Release the version 153f19a742fSBrad Davis echo "Releasing ${VERSION} of ${BOX} in Atlas" 154*5567474cSGlen Barber /usr/local/bin/curl -s ${ATLAS_UPLOAD_URL}/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}/release -X PUT -d "access_token=${KEY}" > /dev/null 155f19a742fSBrad Davis fi 156f19a742fSBrad Davis} 157f19a742fSBrad Davis 158f19a742fSBrad Davismain "$@" 159