#!/bin/bash #
I'm served from GitHub Pages and my source code lives here: get.submariner.io @ github.com
You can find some useful links here:
set -e -o pipefail get_operating_system() { case $(uname -s) in Darwin*) echo "darwin" ;; Linux*) echo "linux" ;; CYGWIN*) echo "windows" ;; MINGW*) echo "windows" ;; *) error "This installer only works on Linux, macos and Windows. Found $(uname -s)" return 1;; esac } get_architecture() { case $(uname -m) in x86_64) echo "amd64" ;; amd64) echo "amd64" ;; arm64) echo "arm64" ;; aarch64) echo "arm64" ;; i?86) echo "386" ;; *) error "This installer only supports x86_64, i386, amd64, arm64, and aarch64 architectures. Found $(uname -m)" return 1;; esac } command_exists() { command -v "$@" > /dev/null 2>&1 } download_command() { if command_exists curl; then echo "curl -fsSL" elif command_exists wget; then echo "wget -qO-" else error "curl and wget are missing" return 1 fi } get=$(download_command) sanitized_version() { case $1 in rc|latest|devel|release*|feature*|v*) echo $1;; *) echo "v$1" ;; esac } get_subctl_release_url() { local draft_filter="cat" local url case ${VERSION} in rc) url=https://api.github.com/repos/submariner-io/releases/releases draft_filter="grep \-rc.*xz" ;; latest) url=https://api.github.com/repos/submariner-io/releases/releases/latest ;; feature-multi-active-gw|release-0.?|release-0.1[012]) echo "https://github.com/submariner-io/submariner-operator/releases/download/subctl-${VERSION}/subctl-${VERSION}-${os}-${architecture}.tar.xz" return ;; devel|release*|feature*) echo "https://github.com/submariner-io/subctl/releases/download/subctl-${VERSION}/subctl-${VERSION}-${os}-${architecture}.tar.xz" return ;; v0.[1234567].*) echo "https://github.com/submariner-io/submariner-operator/releases/download/${VERSION}/subctl-${VERSION}-${os}-${architecture}.tar.xz" return ;; *) echo "https://github.com/submariner-io/releases/releases/download/${VERSION}/subctl-${VERSION}-${os}-${architecture}.tar.xz" return ;; esac ${get} "${url}" | grep "browser_download_url.*-${os}-${architecture}" | ${draft_filter} | head -n 1 | cut -d\" -f 4 } finish_cleanup() { [ -z "${tmpdir}" ] || rm -rf "$tmpdir" } get_subctl() { tmpdir=$(mktemp -d) cd "${tmpdir}" # Retry downloading several times, as the underlying $get command might not support the retries we need. for i in {1..5}; do echo "Download attempt #${i}..." download_and_install && return 0 [ "$i" == 5 ] && exit 1 sleep "${backoff}" backoff=$((backoff * 2)) done } download_and_install() { case ${url} in *tar.gz) ${get} "${url}" | tar xfz - || return 1 # shellcheck disable=SC2086 install_subctl subctl*/subctl* ;; *tar.xz) ${get} "${url}" | tar xfJ - || return 1 # shellcheck disable=SC2086 install_subctl subctl*/subctl* ;; *) # non tar.xz releases (older) filename=$(basename "${url}") ${get} "${url}" > "${filename}" install_subctl "${filename}" ;; esac } install_subctl() { local bin=$1 local bin_file local destdir=${DESTDIR:-~/.local/bin} local dest=${destdir}/subctl mkdir -p "$destdir" # Delete the target if it exists, to ensure we get a new inode # This allows a running subctl to be replace (e.g. if subctl is really a download script) rm -f "${dest}" cp "${bin}" "${dest}" chmod +x "${dest}" bin_file=$(basename "${bin}") echo "${bin_file} has been installed as ${dest}" printf "This provides " ${dest} version if [ "$(command -v subctl)" != "${dest}" ]; then echo "" echo "please update your path (and consider adding it to ~/.profile): export PATH=\$PATH:${destdir} " fi } VERSION=$(sanitized_version "${VERSION:-latest}") os=$(get_operating_system) architecture=$(get_architecture) url=$(get_subctl_release_url) backoff=1 echo "Installing subctl version $VERSION" echo " OS detected: ${os}" echo " Architecture detected: ${architecture}" echo " Download URL: ${url}" echo "" echo "Downloading..." trap finish_cleanup EXIT get_subctl #