#!/bin/sh set -e REPO="kumolabai/kumoctl" BINARY="kumoctl" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Detect OS and architecture OS=$(uname -s | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m) case $ARCH in x86_64) ARCH="amd64" ;; aarch64|arm64) ARCH="arm64" ;; *) echo "${RED}Unsupported architecture: $ARCH${NC}"; exit 1 ;; esac # Normalize OS name and set file extension case $OS in linux) EXTENSION="tar.gz" ;; darwin) EXTENSION="tar.gz" ;; mingw*|msys*|cygwin*) OS="windows" EXTENSION="zip" BINARY="kumoctl.exe" ;; *) echo "${RED}Unsupported OS: $OS${NC}"; exit 1 ;; esac # Get latest version from GitHub echo "Fetching latest version..." VERSION=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v?([^"]+)".*/\1/' | head -1) if [ -z "$VERSION" ]; then echo "${RED}Failed to fetch latest version${NC}" exit 1 fi # Remove 'v' prefix if present VERSION=$(echo "$VERSION" | sed 's/^v//') echo "Installing ${GREEN}kumoctl v${VERSION}${NC} for ${OS}/${ARCH}..." # Construct download URLs FILE="${BINARY}_${VERSION}_${OS}_${ARCH}.${EXTENSION}" URL="https://github.com/$REPO/releases/download/v${VERSION}/$FILE" CHECKSUMS_URL="https://github.com/$REPO/releases/download/v${VERSION}/checksums.txt" # Download and extract TMP_DIR=$(mktemp -d) cd "$TMP_DIR" echo "Downloading from $URL..." if ! curl -sL "$URL" -o "$FILE"; then echo "${RED}Download failed${NC}" rm -rf "$TMP_DIR" exit 1 fi # Download checksums echo "Downloading checksums..." if ! curl -sL "$CHECKSUMS_URL" -o "checksums.txt"; then echo "${YELLOW}⚠️ Could not download checksums, skipping verification${NC}" else # Verify checksum echo "Verifying checksum..." if command -v sha256sum >/dev/null 2>&1; then EXPECTED=$(grep "$FILE" checksums.txt | awk '{print $1}') ACTUAL=$(sha256sum "$FILE" | awk '{print $1}') elif command -v shasum >/dev/null 2>&1; then EXPECTED=$(grep "$FILE" checksums.txt | awk '{print $1}') ACTUAL=$(shasum -a 256 "$FILE" | awk '{print $1}') else echo "${YELLOW}⚠️ sha256sum/shasum not found, skipping verification${NC}" EXPECTED="" fi if [ -n "$EXPECTED" ] && [ "$EXPECTED" != "$ACTUAL" ]; then echo "${RED}Checksum verification failed!${NC}" echo "Expected: $EXPECTED" echo "Actual: $ACTUAL" rm -rf "$TMP_DIR" exit 1 elif [ -n "$EXPECTED" ]; then echo "${GREEN}Checksum verified${NC}" fi fi # Extract archive echo "Extracting..." if [ "$EXTENSION" = "zip" ]; then if ! unzip -q "$FILE"; then echo "${RED}Extraction failed${NC}" rm -rf "$TMP_DIR" exit 1 fi else if ! tar -xzf "$FILE"; then echo "${RED}Extraction failed${NC}" rm -rf "$TMP_DIR" exit 1 fi fi # Install binary if [ "$OS" = "windows" ]; then INSTALL_DIR="$HOME/bin" mkdir -p "$INSTALL_DIR" echo "Installing to ${INSTALL_DIR}..." mv "$BINARY" "$INSTALL_DIR/" echo "${YELLOW}Make sure $INSTALL_DIR is in your PATH${NC}" else INSTALL_DIR="/usr/local/bin" echo "Installing to ${INSTALL_DIR} (may require sudo)..." if [ -w "$INSTALL_DIR" ]; then mv "$BINARY" "$INSTALL_DIR/" else sudo mv "$BINARY" "$INSTALL_DIR/" fi fi # Cleanup cd / rm -rf "$TMP_DIR" # Verify installation if command -v kumoctl >/dev/null 2>&1; then echo "${GREEN}✅ kumoctl installed successfully!${NC}" echo "Run 'kumoctl --version' to verify" else echo "${YELLOW}⚠️ Installation complete but kumoctl not found in PATH${NC}" if [ "$OS" = "windows" ]; then echo "Add $INSTALL_DIR to your PATH and restart your shell" fi fi