dctlenv/libexec/dctlenv-install

106 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -uo pipefail
[ "$#" -gt 1 ] && log_error "Need 1 version instead of $#" 'usage: dctlenv install [<version>]'
version_requested="${1:-""}"
[ -n "$version_requested" ] || log_error 'Version is not specified' 'usage: dctlenv install [<version>]'
version_requested=$(echo $version_requested | sed 's/^v//')
if [[ $version_requested == "latest" ]]; then
version="$(dctlenv-list-remote | tail -n 1)"
else
version="$(dctlenv-list-remote | grep "$version_requested" | head -n 1)"
fi
[ -n "$version" ] || log_error "No version $version_requested found in remote"
dst_path="$DCTLENV_ROOT/versions/$version"
if [ -f "$dst_path/driftctl" ]; then
echo "driftctl v$version is already installed"
exit 0
fi
DCTLENV_ARCH="${DCTLENV_ARCH:-amd64}"
case "$(uname -s)" in
Darwin*)
os="darwin_$DCTLENV_ARCH"
;;
MINGW64*)
os="windows_$DCTLENV_ARCH"
;;
MSYS_NT*)
os="windows_$DCTLENV_ARCH"
;;
CYGWIN_NT*)
os="windows_$DCTLENV_ARCH"
;;
*)
os="linux_$DCTLENV_ARCH"
;;
esac
case "${DCTLENV_CURL:-0}" in
0)
curl="-#"
;;
1)
curl="-s"
;;
*)
log_error 'You can only set DCTLENV_CURL to 0 or 1'
;;
esac
driftctl_url="https://github.com/snyk/driftctl/releases/download"
echo "Installing driftctl v$version"
echo "Downloading release tarball from $driftctl_url/v$version/driftctl_$os"
$(curlw "$curl" -f -L -o "$dst_path/driftctl_$os" --create-dirs "$driftctl_url/v$version/driftctl_$os") || log_error 'Tarball download failed'
echo "Downloading SHA256 hashes file from $driftctl_url/v$version/driftctl_SHA256SUMS"
$(curlw -s -f -L -o "$dst_path/driftctl_SHA256SUMS" "$driftctl_url/v$version/driftctl_SHA256SUMS") || log_debug 'SHA256 hashes download failed'
if [[ -f "$dst_path/driftctl_SHA256SUMS" ]]; then
sha256sum_bin="$(command -v sha256sum 2>/dev/null)"
if [[ -n "$sha256sum_bin" ]]; then
(cd "$dst_path"; grep "driftctl_$os" "driftctl_SHA256SUMS" | "$sha256sum_bin" -c) &>/dev/null \
&& echo "SHA256 hash matched!" \
|| log_error 'SHA256 hash does not match!'
else
echo 'No sha256sum tool available. Skipping SHA256 hash validation'
fi
if [ "${DCTLENV_PGP:-0}" -eq 0 ]; then
$(rm "$dst_path/driftctl_SHA256SUMS")
fi
else
echo 'No SHA256 hashes file available. Skipping SHA256 hash validation'
fi
if [ "${DCTLENV_PGP:-0}" -gt 0 ]; then
echo "Downloading SHA256 hashes signature file from $driftctl_url/v$version/driftctl_SHA256SUMS.gpg"
$(curlw -s -f -L -o "$dst_path/driftctl_SHA256SUMS.gpg" "$driftctl_url/v$version/driftctl_SHA256SUMS.gpg") || log_debug 'SHA256 hashes signature download failed'
if [[ -f "$dst_path/driftctl_SHA256SUMS.gpg" ]]; then
gpg_bin="$(command -v gpg 2>/dev/null)"
if [[ -n "$gpg_bin" ]]; then
("$gpg_bin" --verify "$dst_path/driftctl_SHA256SUMS.gpg" "$dst_path/driftctl_SHA256SUMS") &>/dev/null \
&& echo "PGP signature matched!" \
|| log_error 'PGP signature rejected!'
else
echo 'No gpg tool available. Skipping signature validation'
fi
$(rm "$dst_path/driftctl_SHA256SUMS.gpg")
else
echo 'No SHA256 hashes signature file available. Skipping signature validation'
fi
$(rm "$dst_path/driftctl_SHA256SUMS")
fi
$(mv "$dst_path/driftctl_$os" "$dst_path/driftctl")
$(chmod +x "$dst_path/driftctl") || log_error "Fail to make the binary executable"
echo "Installation of driftctl v${version} successful. To make this your default version, run 'dctlenv use ${version}'"