#!/bin/sh # Grib Cloud CLI installer # Usage: curl -fsSL https://get.grib.cloud | sh set -e GRIB_API="${GRIB_API_URL:-https://api.grib.cloud}" INSTALL_DIR="${GRIB_INSTALL_DIR:-/usr/local/bin}" detect_os() { case "$(uname -s)" in Linux*) echo "linux" ;; Darwin*) echo "darwin" ;; MINGW*|MSYS*|CYGWIN*) echo "windows" ;; *) echo "unsupported" ;; esac } detect_arch() { case "$(uname -m)" in x86_64|amd64) echo "amd64" ;; aarch64|arm64) echo "arm64" ;; armv7*) echo "armv7" ;; *) echo "unsupported" ;; esac } main() { OS=$(detect_os) ARCH=$(detect_arch) if [ "$OS" = "unsupported" ] || [ "$ARCH" = "unsupported" ]; then echo "Error: unsupported platform $(uname -s)/$(uname -m)" exit 1 fi # Fetch release metadata for SHA256 verification. RELEASE_URL="${GRIB_API}/api/v1/releases/latest" if command -v curl >/dev/null 2>&1; then RELEASE_JSON=$(curl -fsSL "$RELEASE_URL") elif command -v wget >/dev/null 2>&1; then RELEASE_JSON=$(wget -qO- "$RELEASE_URL") else echo "Error: curl or wget required" exit 1 fi # Extract expected SHA256 for this platform (requires jq or python). if command -v jq >/dev/null 2>&1; then EXPECTED_SHA256=$(printf '%s' "$RELEASE_JSON" | jq -r ".platforms[] | select(.os==\"$OS\" and .arch==\"$ARCH\") | .sha256") elif command -v python3 >/dev/null 2>&1; then EXPECTED_SHA256=$(printf '%s' "$RELEASE_JSON" | python3 -c "import sys,json; ps=json.load(sys.stdin)['platforms']; print(next((p['sha256'] for p in ps if p['os']=='$OS' and p['arch']=='$ARCH'),''))") else EXPECTED_SHA256="" fi echo "Downloading grib for ${OS}/${ARCH}..." DOWNLOAD_URL="${GRIB_API}/api/v1/releases/download/${OS}/${ARCH}" TMP_DIR=$(mktemp -d) ARCHIVE="${TMP_DIR}/grib-archive" if command -v curl >/dev/null 2>&1; then curl -fsSL -o "$ARCHIVE" "$DOWNLOAD_URL" elif command -v wget >/dev/null 2>&1; then wget -qO "$ARCHIVE" "$DOWNLOAD_URL" else echo "Error: curl or wget required" rm -rf "$TMP_DIR" exit 1 fi # Verify SHA256 checksum if we have an expected hash. if [ -n "$EXPECTED_SHA256" ]; then if command -v sha256sum >/dev/null 2>&1; then ACTUAL_SHA256=$(sha256sum "$ARCHIVE" | awk '{print $1}') elif command -v shasum >/dev/null 2>&1; then ACTUAL_SHA256=$(shasum -a 256 "$ARCHIVE" | awk '{print $1}') else echo "Warning: cannot verify checksum (sha256sum/shasum not found)" ACTUAL_SHA256="" fi if [ -n "$ACTUAL_SHA256" ] && [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then echo "Error: checksum mismatch" echo " expected: $EXPECTED_SHA256" echo " got: $ACTUAL_SHA256" rm -rf "$TMP_DIR" exit 1 fi echo "Checksum verified." fi # Extract binary from archive. echo "Extracting..." if [ "$OS" = "windows" ]; then unzip -qo "$ARCHIVE" -d "$TMP_DIR" BINARY="${TMP_DIR}/grib.exe" else tar xzf "$ARCHIVE" -C "$TMP_DIR" BINARY="${TMP_DIR}/grib" fi if [ ! -f "$BINARY" ]; then echo "Error: binary not found in archive" rm -rf "$TMP_DIR" exit 1 fi chmod +x "$BINARY" if [ -w "$INSTALL_DIR" ]; then mv "$BINARY" "$INSTALL_DIR/grib" else echo "Installing to ${INSTALL_DIR} (requires sudo)..." sudo mv "$BINARY" "$INSTALL_DIR/grib" fi rm -rf "$TMP_DIR" echo "grib installed to ${INSTALL_DIR}/grib" echo "" echo "Run 'grib auth login' to get started." } main