xref: /freebsd/release/scripts/atlas-upload.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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