Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ archives:
format_overrides:
- goos: windows
formats: [ 'zip' ]

checksum:
name_template: 'checksums.txt'

Expand Down
262 changes: 262 additions & 0 deletions bin/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
#!/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
Comment thread
beeme1mr marked this conversation as resolved.
Resolved
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"

Comment thread
beeme1mr marked this conversation as resolved.
Resolved
# 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
Comment thread
beeme1mr marked this conversation as resolved.
Resolved
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