#!/bin/sh set -e # PgBeam CLI installer # Usage: curl -fsSL https://pgbeam.com/install | sh # # Environment variables: # PGBEAM_INSTALL_DIR — Override install directory (default: /usr/local/bin) # PGBEAM_VERSION — Install a specific version (default: latest) REPO="sferarc/pgbeam" BINARY="pgbeam" INSTALL_DIR="${PGBEAM_INSTALL_DIR:-/usr/local/bin}" S3_BASE="https://pgbeam-releases.s3.amazonaws.com/cli" GITHUB_REPO="sferarc/pgbeam" # Colors (disabled if NO_COLOR is set or stdout is not a terminal) if [ -z "${NO_COLOR:-}" ] && [ -t 1 ]; then BOLD="\033[1m" DIM="\033[2m" GREEN="\033[32m" YELLOW="\033[33m" RED="\033[31m" RESET="\033[0m" else BOLD="" DIM="" GREEN="" YELLOW="" RED="" RESET="" fi info() { printf "${BOLD}${GREEN}info${RESET} %s\n" "$1"; } warn() { printf "${BOLD}${YELLOW}warn${RESET} %s\n" "$1"; } error() { printf "${BOLD}${RED}error${RESET} %s\n" "$1" >&2; } # Detect platform detect_platform() { OS="$(uname -s)" ARCH="$(uname -m)" case "$OS" in Linux) OS="linux" ;; Darwin) OS="darwin" ;; MINGW*|MSYS*|CYGWIN*) info "Windows detected — launching PowerShell installer..." powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://pgbeam.com/install/windows | iex" exit $? ;; *) error "Unsupported operating system: $OS" exit 1 ;; esac case "$ARCH" in x86_64|amd64) ARCH="x64" ;; aarch64|arm64) ARCH="arm64" ;; *) error "Unsupported architecture: $ARCH" exit 1 ;; esac ASSET_NAME="${BINARY}-${OS}-${ARCH}" } # Resolve version to download resolve_version() { if [ -n "${PGBEAM_VERSION:-}" ]; then VERSION="$PGBEAM_VERSION" DOWNLOAD_URL="${S3_BASE}/v${VERSION}/${ASSET_NAME}" else # Try S3 latest first, fall back to GitHub releases DOWNLOAD_URL="${S3_BASE}/latest/${ASSET_NAME}" fi } # Download with curl or wget download() { local url="$1" dest="$2" if command -v curl >/dev/null 2>&1; then curl -fsSL --retry 3 "$url" -o "$dest" elif command -v wget >/dev/null 2>&1; then wget -q -O "$dest" "$url" else error "Neither curl nor wget found. Install one and try again." exit 1 fi } # Verify the binary works verify_binary() { local bin="$1" chmod +x "$bin" # macOS: remove quarantine attribute that prevents execution if [ "$(uname -s)" = "Darwin" ]; then xattr -d com.apple.quarantine "$bin" 2>/dev/null || true fi if ! "$bin" --version >/dev/null 2>&1; then error "Binary verification failed. The downloaded file may be corrupted." rm -f "$bin" exit 1 fi } # Install the binary install_binary() { local tmp_file="$1" # Ensure the install directory exists if [ ! -d "$INSTALL_DIR" ]; then if mkdir -p "$INSTALL_DIR" 2>/dev/null; then : else warn "Creating ${INSTALL_DIR} requires elevated permissions." sudo mkdir -p "$INSTALL_DIR" fi fi if [ -w "$INSTALL_DIR" ]; then mv "$tmp_file" "${INSTALL_DIR}/${BINARY}" else warn "Installing to ${INSTALL_DIR} requires elevated permissions." sudo mv "$tmp_file" "${INSTALL_DIR}/${BINARY}" fi } # Check if pgbeam is on PATH check_path() { case ":$PATH:" in *":${INSTALL_DIR}:"*) return 0 ;; esac warn "${INSTALL_DIR} is not in your PATH." # Detect shell and suggest adding to PATH local shell_name shell_name="$(basename "${SHELL:-sh}")" local rc_file="" case "$shell_name" in bash) if [ -f "$HOME/.bashrc" ]; then rc_file="$HOME/.bashrc" elif [ -f "$HOME/.bash_profile" ]; then rc_file="$HOME/.bash_profile" fi ;; zsh) rc_file="$HOME/.zshrc" ;; fish) rc_file="$HOME/.config/fish/config.fish" ;; esac if [ -n "$rc_file" ]; then printf "\n Add to your %s:\n" "$rc_file" if [ "$shell_name" = "fish" ]; then printf " ${DIM}fish_add_path %s${RESET}\n" "$INSTALL_DIR" else printf " ${DIM}export PATH=\"%s:\$PATH\"${RESET}\n" "$INSTALL_DIR" fi fi } main() { printf "\n ${BOLD}PgBeam CLI Installer${RESET}\n\n" detect_platform resolve_version info "Platform: ${OS}-${ARCH}" # Download TMP_DIR=$(mktemp -d) TMP_FILE="${TMP_DIR}/${BINARY}" trap 'rm -rf "$TMP_DIR"' EXIT info "Downloading ${DOWNLOAD_URL}..." if ! download "$DOWNLOAD_URL" "$TMP_FILE"; then # Fall back to GitHub releases if S3 fails info "Trying GitHub releases..." RELEASE_URL="https://api.github.com/repos/${GITHUB_REPO}/releases/latest" GITHUB_DL=$(download "$RELEASE_URL" - 2>/dev/null | grep "browser_download_url.*/${ASSET_NAME}\"" | head -1 | cut -d '"' -f 4) if [ -z "$GITHUB_DL" ]; then error "Could not find a release for ${ASSET_NAME}" exit 1 fi download "$GITHUB_DL" "$TMP_FILE" fi # Verify verify_binary "$TMP_FILE" # Install install_binary "$TMP_FILE" # Verify installed version INSTALLED_VERSION=$("${INSTALL_DIR}/${BINARY}" --version 2>/dev/null || echo "unknown") info "Installed ${BINARY} ${INSTALLED_VERSION} to ${INSTALL_DIR}/${BINARY}" check_path printf "\n Run ${BOLD}pgbeam --help${RESET} to get started.\n\n" } main