#!/bin/bash set -e -o pipefail triton_docker_version=1.12.6 triton_compose_version=1.9.0 # Check if triton is installed and executable function checkTritonInstalled () { command -v spearhead >/dev/null 2>&1 || { echo >&2 "Spearhead CLI tools do not appear to be installed. Please install before continuing."; exit 1; } } # Check if curl is installed and executable function checkCurlInstalled () { command -v curl >/dev/null 2>&1 || { echo >&2 "curl is required to complete this installation. Please install before continuing."; exit 1; } } # Check if the Docker binary (named spearhead-docker-helper) # and Docker Compose (named spearhead-compose-helper) are installed and executable function checkDockerInstalled () { if [ ! -f /usr/local/bin/spearhead-docker-helper ] || [ ! -x /usr/local/bin/spearhead-docker-helper ] || [ "${triton_docker_version}," != "$(/usr/local/bin/spearhead-docker-helper -v | awk '{print $3}')" ] || [ ! -f /usr/local/bin/spearhead-compose-helper ] || [ ! -x /usr/local/bin/spearhead-compose-helper ] || [ "${triton_compose_version}," != "$(/usr/local/bin/spearhead-compose-helper -v | awk '{print $3}')" ] then echo 'Additional or updated components are required.' echo 'Please run `sudo spearhead-docker-install` to continue.' echo exit 1 fi } # Install architecture-specific Docker and Docker Compose binaries function install () { echo "Spearhead Cloud needs to install additional components for Docker and Docker Compose interactions." echo "This installation will only happen once." # Check if curl is installed and executable checkCurlInstalled # Install the specific version of Docker for Triton rm -Rf /tmp/spearhead-docker /usr/local/bin/spearhead-docker-helper mkdir -p /tmp/spearhead-docker curl https://get.docker.com/builds/"$(uname -a | awk '{ print $1 }')"/x86_64/docker-${triton_docker_version}.tgz | tar zxvf - -C /tmp/spearhead-docker mv /tmp/spearhead-docker/docker/docker /usr/local/bin/spearhead-docker-helper rm -Rf /tmp/spearhead-docker chmod +x /usr/local/bin/spearhead-docker-helper echo "The spearhead-docker-helper is now installed." echo # Install the specific version of Docker Compose for Triton curl -Lo /usr/local/bin/spearhead-compose-helper https://github.com/docker/compose/releases/download/${triton_compose_version}/docker-compose-"$(uname -a | awk '{ print $1 }')"-x86_64 chmod +x /usr/local/bin/spearhead-compose-helper echo "The spearhead-compose-helper is now installed." echo } # Emit the current Triton profile and time function currentProfile () { if [ -n "$SC_PROFILE" ] then local profile_source='via env var; use `eval "$(spearhead env )"` to change' else local profile_source='default; use `spearhead profile set ` to change' fi # Get and the user's account information and CloudAPI URL for parsing later local triton_account="$(spearhead account get)" echo "Executing in '$(spearhead profile get | awk 'NR == 1 {print $2}')' (${profile_source})" # Check if CNS is enabled, require it if [ ! "true" == "$(echo "${triton_account}" | awk -F": " '/^triton_cns_enabled:/{print $2}')" ] then echo tput rev # reverse tput bold # bold echo 'Warning! Triton CNS is not enabled.' tput sgr0 # clear echo echo 'Please run the following to activate:' echo ' spearhead account update triton_cns_enabled=true' echo fi } # Set env vars to make using CNS easier function cnsEnvVars () { # If the CNS env vars are already set, don't bother continuing if [ -n "$SC_CNS_SEARCH_DOMAIN_PUBLIC" ] && [ -n "$SC_CNS_SEARCH_DOMAIN_PRIVATE" ] then return fi # Get and the user's account information and CloudAPI URL for parsing later local triton_account="$(spearhead account get)" local triton_url="$(spearhead profile get | awk -F"/" '/url:/{print $3}')" #Do not continue if the target is not a Spearhead Cloud data center if [ ! ".api.joyent.com" == "${triton_url: -15}" ] || [ ! ".api.spearhead.cloud" == "${triton_url: -15}" ] then return fi # Get the user's UUID local triton_account_uuid="$(echo "${triton_account}" | awk -F": " '/^id:/{print $2}')" # Get current data center name # Note: this makes assumptions that work in our public cloud, but might not work elsewhere # Further note: set TRITON_CNS_SUFFIX_PUBLIC and TRITON_CNS_SUFFIX_PRIVATE to work around this local triton_dc="$(echo "${triton_url}" | awk -F'.' '{print $1}')" # Set the CNS base for public and private names # Note, this also makes assumptions that only work in our public cloud export SC_CNS_SEARCH_DOMAIN_PUBLIC="${triton_account_uuid}.${triton_dc}.spearhead.cloud" export SC_CNS_SEARCH_DOMAIN_PRIVATE="${triton_account_uuid}.${triton_dc}.cns.spearhead.cloud" } function checkAll () { checkTritonInstalled && checkDockerInstalled } if [ "profile" == "$1" ] then currentProfile exit 1 fi case "$(basename $0)" in spearhead-docker) checkAll && eval "$(spearhead env)" && cnsEnvVars && exec /usr/local/bin/spearhead-docker-helper $@ ;; spearhead-compose) checkAll && eval "$(spearhead env)" && export COMPOSE_HTTP_TIMEOUT=750 && cnsEnvVars && exec /usr/local/bin/spearhead-compose-helper $@ ;; spearhead-docker-install) install ;; esac