mirror of https://github.com/k3d-io/k3d
parent
68c38a104f
commit
845339e9da
@ -0,0 +1,187 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
APP_NAME="k3d" |
||||
REPO_URL="https://github.com/iwilltry42/k3d-go" |
||||
|
||||
: ${USE_SUDO:="true"} |
||||
: ${K3D_INSTALL_DIR:="/usr/local/bin"} |
||||
|
||||
# initArch discovers the architecture for this system. |
||||
initArch() { |
||||
ARCH=$(uname -m) |
||||
case $ARCH in |
||||
armv5*) ARCH="armv5";; |
||||
armv6*) ARCH="armv6";; |
||||
armv7*) ARCH="arm";; |
||||
aarch64) ARCH="arm64";; |
||||
x86) ARCH="386";; |
||||
x86_64) ARCH="amd64";; |
||||
i686) ARCH="386";; |
||||
i386) ARCH="386";; |
||||
esac |
||||
} |
||||
|
||||
# initOS discovers the operating system for this system. |
||||
initOS() { |
||||
OS=$(echo `uname`|tr '[:upper:]' '[:lower:]') |
||||
|
||||
case "$OS" in |
||||
# Minimalist GNU for Windows |
||||
mingw*) OS='windows';; |
||||
esac |
||||
} |
||||
|
||||
# runs the given command as root (detects if we are root already) |
||||
runAsRoot() { |
||||
local CMD="$*" |
||||
|
||||
if [ $EUID -ne 0 -a $USE_SUDO = "true" ]; then |
||||
CMD="sudo $CMD" |
||||
fi |
||||
|
||||
$CMD |
||||
} |
||||
|
||||
# verifySupported checks that the os/arch combination is supported for |
||||
# binary builds. |
||||
verifySupported() { |
||||
local supported="darwin-386\ndarwin-amd64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nwindows-386\nwindows-amd64" |
||||
if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then |
||||
echo "No prebuilt binary for ${OS}-${ARCH}." |
||||
echo "To build from source, go to $REPO_URL" |
||||
exit 1 |
||||
fi |
||||
|
||||
if ! type "curl" > /dev/null && ! type "wget" > /dev/null; then |
||||
echo "Either curl or wget is required" |
||||
exit 1 |
||||
fi |
||||
} |
||||
|
||||
# checkK3dInstalledVersion checks which version of k3d is installed and |
||||
# if it needs to be changed. |
||||
checkK3dInstalledVersion() { |
||||
if [[ -f "${K3D_INSTALL_DIR}/${APP_NAME}" ]]; then |
||||
local version=$(k3d --version | cut -d " " -f3) |
||||
if [[ "$version" == "$TAG" ]]; then |
||||
echo "k3d ${version} is already ${DESIRED_VERSION:-latest}" |
||||
return 0 |
||||
else |
||||
echo "k3d ${TAG} is available. Changing from version ${version}." |
||||
return 1 |
||||
fi |
||||
else |
||||
return 1 |
||||
fi |
||||
} |
||||
|
||||
# checkLatestVersion grabs the latest version string from the releases |
||||
checkLatestVersion() { |
||||
local latest_release_url="$REPO_URL/releases/latest" |
||||
if type "curl" > /dev/null; then |
||||
TAG=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url | grep -oE "[^/]+$" ) |
||||
elif type "wget" > /dev/null; then |
||||
TAG=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^ Location: /{DEST=$2} END{ print DEST}' | grep -oE "[^/]+$") |
||||
fi |
||||
} |
||||
|
||||
# downloadFile downloads the latest binary package and also the checksum |
||||
# for that binary. |
||||
downloadFile() { |
||||
K3D_DIST="k3d-$OS-$ARCH" |
||||
DOWNLOAD_URL="$REPO_URL/releases/download/$TAG/$K3D_DIST" |
||||
K3D_TMP_ROOT="$(mktemp -dt k3d-binary-XXXXXX)" |
||||
K3D_TMP_FILE="$K3D_TMP_ROOT/$K3D_DIST" |
||||
if type "curl" > /dev/null; then |
||||
curl -SsL "$DOWNLOAD_URL" -o "$K3D_TMP_FILE" |
||||
elif type "wget" > /dev/null; then |
||||
wget -q -O "$K3D_TMP_FILE" "$DOWNLOAD_URL" |
||||
fi |
||||
} |
||||
|
||||
# installFile verifies the SHA256 for the file, then unpacks and |
||||
# installs it. |
||||
installFile() { |
||||
echo "Preparing to install $APP_NAME into ${K3D_INSTALL_DIR}" |
||||
runAsRoot chmod +x "$K3D_TMP_FILE" |
||||
runAsRoot cp "$K3D_TMP_FILE" "$K3D_INSTALL_DIR/$APP_NAME" |
||||
echo "$APP_NAME installed into $K3D_INSTALL_DIR/$APP_NAME" |
||||
} |
||||
|
||||
# fail_trap is executed if an error occurs. |
||||
fail_trap() { |
||||
result=$? |
||||
if [ "$result" != "0" ]; then |
||||
if [[ -n "$INPUT_ARGUMENTS" ]]; then |
||||
echo "Failed to install $APP_NAME with the arguments provided: $INPUT_ARGUMENTS" |
||||
help |
||||
else |
||||
echo "Failed to install $APP_NAME" |
||||
fi |
||||
echo -e "\tFor support, go to $REPO_URL." |
||||
fi |
||||
cleanup |
||||
exit $result |
||||
} |
||||
|
||||
# testVersion tests the installed client to make sure it is working. |
||||
testVersion() { |
||||
set +e |
||||
K3D="$(which $APP_NAME)" |
||||
if [ "$?" = "1" ]; then |
||||
echo "$APP_NAME not found. Is $K3D_INSTALL_DIR on your "'$PATH?' |
||||
exit 1 |
||||
fi |
||||
set -e |
||||
echo "Run '$APP_NAME --help' to see what you can do with it." |
||||
} |
||||
|
||||
# help provides possible cli installation arguments |
||||
help () { |
||||
echo "Accepted cli arguments are:" |
||||
echo -e "\t[--help|-h ] ->> prints this help" |
||||
echo -e "\t[--no-sudo] ->> install without sudo" |
||||
} |
||||
|
||||
# cleanup temporary files |
||||
cleanup() { |
||||
if [[ -d "${K3D_TMP_ROOT:-}" ]]; then |
||||
rm -rf "$K3D_TMP_ROOT" |
||||
fi |
||||
} |
||||
|
||||
# Execution |
||||
|
||||
#Stop execution on any error |
||||
trap "fail_trap" EXIT |
||||
set -e |
||||
|
||||
# Parsing input arguments (if any) |
||||
export INPUT_ARGUMENTS="${@}" |
||||
set -u |
||||
while [[ $# -gt 0 ]]; do |
||||
case $1 in |
||||
'--no-sudo') |
||||
USE_SUDO="false" |
||||
;; |
||||
'--help'|-h) |
||||
help |
||||
exit 0 |
||||
;; |
||||
*) exit 1 |
||||
;; |
||||
esac |
||||
shift |
||||
done |
||||
set +u |
||||
|
||||
initArch |
||||
initOS |
||||
verifySupported |
||||
checkLatestVersion |
||||
if ! checkK3dInstalledVersion; then |
||||
downloadFile |
||||
installFile |
||||
fi |
||||
testVersion |
||||
cleanup |
Loading…
Reference in new issue