cli/bin/install.sh

262 lines
6.7 KiB
Bash
Executable File

#!/bin/sh
set -e
# Adapted/Copied from https://github.com/daveshanley/vacuum/blob/main/bin/install.sh
if [ -d "$HOME/.local/bin" ] || mkdir -p "$HOME/.local/bin" 2>/dev/null; then
DEFAULT_INSTALL_DIR="$HOME/.local/bin"
elif [ -w "/usr/local/bin" ]; then
DEFAULT_INSTALL_DIR="/usr/local/bin"
else
fmt_error "unable to write to $HOME/.local/bin or /usr/local/bin"
fmt_error "Please run this script with sudo or set INSTALL_DIR to a directory you can write to."
exit 1
fi
INSTALL_DIR=${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}
BINARY_NAME=${BINARY_NAME:-"openfeature"}
REPO_NAME="open-feature/cli"
ISSUE_URL="https://github.com/open-feature/cli/issues/new"
# get_latest_release "open-feature/cli"
get_latest_release() {
curl --retry 5 --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
grep '"tag_name":' | # Get tag line
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
}
get_asset_name() {
echo "openfeature_$1_$2.tar.gz"
}
get_download_url() {
local asset_name=$(get_asset_name $2 $3)
echo "https://github.com/open-feature/cli/releases/download/v$1/${asset_name}"
}
get_checksum_url() {
echo "https://github.com/open-feature/cli/releases/download/v$1/checksums.txt"
}
command_exists() {
command -v "$@" >/dev/null 2>&1
}
fmt_error() {
echo ${RED}"Error: $@"${RESET} >&2
}
fmt_warning() {
echo ${YELLOW}"Warning: $@"${RESET} >&2
}
fmt_underline() {
echo "$(printf '\033[4m')$@$(printf '\033[24m')"
}
fmt_code() {
echo "\`$(printf '\033[38;5;247m')$@${RESET}\`"
}
setup_color() {
# Only use colors if connected to a terminal
if [ -t 1 ]; then
RED=$(printf '\033[31m')
GREEN=$(printf '\033[32m')
YELLOW=$(printf '\033[33m')
BLUE=$(printf '\033[34m')
MAGENTA=$(printf '\033[35m')
BOLD=$(printf '\033[1m')
RESET=$(printf '\033[m')
else
RED=""
GREEN=""
YELLOW=""
BLUE=""
MAGENTA=""
BOLD=""
RESET=""
fi
}
get_os() {
case "$(uname -s)" in
*linux* ) echo "Linux" ;;
*Linux* ) echo "Linux" ;;
*darwin* ) echo "Darwin" ;;
*Darwin* ) echo "Darwin" ;;
esac
}
get_machine() {
case "$(uname -m)" in
"x86_64"|"amd64"|"x64")
echo "x86_64" ;;
"i386"|"i86pc"|"x86"|"i686")
echo "i386" ;;
"arm64"|"armv6l"|"aarch64")
echo "arm64"
esac
}
get_tmp_dir() {
echo $(mktemp -d)
}
do_checksum() {
checksum_url=$(get_checksum_url $version)
get_checksum_url $version
expected_checksum=$(curl -sL $checksum_url | grep $asset_name | awk '{print $1}')
if command_exists sha256sum; then
checksum=$(sha256sum $asset_name | awk '{print $1}')
elif command_exists shasum; then
checksum=$(shasum -a 256 $asset_name | awk '{print $1}')
else
fmt_warning "Could not find a checksum program. Install shasum or sha256sum to validate checksum."
return 0
fi
if [ "$checksum" != "$expected_checksum" ]; then
fmt_error "Checksums do not match"
exit 1
fi
}
do_install_binary() {
asset_name=$(get_asset_name $os $machine)
download_url=$(get_download_url $version $os $machine)
command_exists curl || {
fmt_error "curl is not installed"
exit 1
}
command_exists tar || {
fmt_error "tar is not installed"
exit 1
}
local tmp_dir=$(get_tmp_dir)
# Download tar.gz to tmp directory
echo "Downloading $download_url"
(cd $tmp_dir && curl -sL -O "$download_url")
(cd $tmp_dir && do_checksum)
# Extract download
(cd $tmp_dir && tar -xzf "$asset_name")
# Install binary
if [ -w "$INSTALL_DIR" ]; then
mv "$tmp_dir/$BINARY_NAME" "$INSTALL_DIR"
else
fmt_error "Unable to write to $INSTALL_DIR. Please run this script with sudo or set INSTALL_DIR to a directory you can write to."
exit 1
fi
# Make the binary executable
if [ -w "$INSTALL_DIR/$BINARY_NAME" ]; then
chmod +x "$INSTALL_DIR/$BINARY_NAME"
else
sudo chmod +x "$INSTALL_DIR/$BINARY_NAME" 2>/dev/null || {
fmt_error "Could not make $INSTALL_DIR/$BINARY_NAME executable"
exit 1
}
fi
# Check if the binary is executable
if [ ! -x "$INSTALL_DIR/$BINARY_NAME" ]; then
fmt_error "The binary is not executable. Please check your permissions."
exit 1
fi
echo "Installed the OpenFeature cli to $INSTALL_DIR"
# Add to PATH information if not already in PATH
if ! echo "$PATH" | tr ":" "\n" | grep -q "^$INSTALL_DIR$"; then
shell_profile=""
case $SHELL in
*/bash*)
if [ -f "$HOME/.bashrc" ]; then
shell_profile="$HOME/.bashrc"
elif [ -f "$HOME/.bash_profile" ]; then
shell_profile="$HOME/.bash_profile"
fi
;;
*/zsh*)
shell_profile="$HOME/.zshrc"
;;
esac
if [ -n "$shell_profile" ]; then
echo ""
echo "${YELLOW}$INSTALL_DIR is not in your PATH.${RESET}"
echo "To add it to your PATH, run:"
echo " echo 'export PATH=\"\$PATH:$INSTALL_DIR\"' >> $shell_profile"
echo "Then, restart your terminal or run:"
echo " source $shell_profile"
fi
fi
# Cleanup
rm -rf "$tmp_dir"
}
install_termux() {
echo "Installing the OpenFeature cli, this may take a few minutes..."
pkg upgrade && pkg install golang git -y && git clone https://github.com/open-feature/cli.git && cd cli/ && go build -o $PREFIX/bin/openfeature
}
main() {
setup_color
latest_tag=$(get_latest_release $REPO_NAME)
latest_version=$(echo $latest_tag | sed 's/v//')
version=${VERSION:-$latest_version}
os=$(get_os)
if test -z "$os"; then
fmt_error "$(uname -s) os type is not supported"
echo "Please create an issue so we can add support. $ISSUE_URL"
exit 1
fi
machine=$(get_machine)
if test -z "$machine"; then
fmt_error "$(uname -m) machine type is not supported"
echo "Please create an issue so we can add support. $ISSUE_URL"
exit 1
fi
if [ ${TERMUX_VERSION} ] ; then
install_termux
else
echo "Installing OpenFeature CLI to $INSTALL_DIR..."
echo "To use a different install location, press Ctrl+C and run again with:"
echo " INSTALL_DIR=/your/custom/path ./bin/install.sh"
echo ""
sleep 2 # Give user a chance to cancel if needed
do_install_binary
fi
printf "$MAGENTA"
cat <<'EOF'
___ _____ _
/ _ \ _ __ ___ _ __ | ___|__ __ _| |_ _ _ _ __ ___
| | | | '_ \ / _ \ '_ \| |_ / _ \/ _` | __| | | | '__/ _ \
| |_| | |_) | __/ | | | _| __/ (_| | |_| |_| | | | __/
\___/| .__/ \___|_| |_|_| \___|\__,_|\__|\__,_|_| \___|
|_|
CLI
Run `openfeature help` for commands
EOF
printf "$RESET"
}
main