#!/bin/bash set -e triton_docker_version=1.12.6 triton_compose_version=1.9.0 # Check if triton is installed and executable function checkTritonInstalled () { command -v triton >/dev/null 2>&1 || { echo >&2 "Triton 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 triton-docker-helper) # and Docker Compose (named triton-compose-helper) are installed and executable function checkDockerInstalled () { if [ ! -f /usr/local/bin/triton-docker-helper ] || [ ! -x /usr/local/bin/triton-docker-helper ] || [ "${triton_docker_version}," != "$(/usr/local/bin/triton-docker-helper -v | awk '{print $3}')" ] || [ ! -f /usr/local/bin/triton-compose-helper ] || [ ! -x /usr/local/bin/triton-compose-helper ] || [ "${triton_compose_version}," != "$(/usr/local/bin/triton-compose-helper -v | awk '{print $3}')" ] then echo 'Additional or updated components are required.' echo 'Please run `sudo triton-docker-install` to continue.' echo exit 1 fi } # Install architecture-specific Docker and Docker Compose binaries function install () { echo "Triton 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/triton-docker /usr/local/bin/triton-docker-helper mkdir -p /tmp/triton-docker curl https://get.docker.com/builds/"$(uname -a | awk '{ print $1 }')"/x86_64/docker-${triton_docker_version}.tgz | tar zxvf - -C /tmp/triton-docker mv /tmp/triton-docker/docker/docker /usr/local/bin/triton-docker-helper rm -Rf /tmp/triton-docker chmod +x /usr/local/bin/triton-docker-helper echo "The triton-docker-helper is now installed." echo # Install the specific version of Docker Compose for Triton curl -Lo /usr/local/bin/triton-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/triton-compose-helper echo "The triton-compose-helper is now installed." echo } # Emit the current Triton profile and time function currentProfile () { if [ -n "$TRITON_PROFILE" ] then local profile_source='via env var; use `eval "$(triton env )"` to change' else local profile_source='default; use `triton profile set ` to change' fi echo "Executing in '$(triton profile get | awk 'NR == 1 {print $2}')' (${profile_source})" } # Extra env vars function extraEnvVars () { # If the CNS env vars are already set, don't bother continuing if [ -n "$TRITON_CNS_SUFFIX_PUBLIC" ] && [ -n "$TRITON_CNS_SUFFIX_PRIVATE" ] then return fi # Get and the user's account information for parsing later local triton_account="$(triton account get)" # Check if CNS is enabled, require it local triton_cns_enabled="$(echo "$triton_account" | awk -F": " '/cns/{print $2}')" if [ ! "true" == "$triton_cns_enabled" ]; then echo tput rev # reverse tput bold # bold echo 'Error! Triton CNS is required and not enabled.' tput sgr0 # clear echo echo 'Please run:' echo ' triton account update triton_cns_enabled=true' echo exit 1 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="$(triton profile get | awk -F"/" '/url:/{print $3}' | awk -F'.' '{print $1}')" # Set the CNS base for public and private names export TRITON_CNS_SUFFIX_PUBLIC="${triton_account_uuid}.${triton_dc}.triton.zone" export TRITON_CNS_SUFFIX_PRIVATE="${triton_account_uuid}.${triton_dc}.cns.joyent.com" } # Run all checks function checkAll () { checkTritonInstalled && checkDockerInstalled } # Special case handling if the sub-command is `profile` if [ "profile" == "$1" ] then currentProfile exit 1 fi # Change behavior based on the calling name of this executable case "$(basename $0)" in triton-docker) checkAll && eval "$(triton env)" && extraEnvVars && exec /usr/local/bin/triton-docker-helper $@ ;; triton-compose) checkAll && eval "$(triton env)" && export COMPOSE_HTTP_TIMEOUT=750 && extraEnvVars && exec /usr/local/bin/triton-compose-helper $@ ;; triton-docker-install) install ;; esac