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