From aa8828186fd4531fd1e2402b435e010294366a68 Mon Sep 17 00:00:00 2001 From: Owen Date: Sun, 28 Sep 2025 11:33:28 -0700 Subject: [PATCH] Add get olm script Former-commit-id: 77a38e3dba3113faf7705e1254778e0434ab51ec --- get-olm.sh | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 get-olm.sh diff --git a/get-olm.sh b/get-olm.sh new file mode 100644 index 0000000..bd8f9d7 --- /dev/null +++ b/get-olm.sh @@ -0,0 +1,235 @@ +#!/bin/bash + +# Get Olm - Cross-platform installation script +# Usage: curl -fsSL https://raw.githubusercontent.com/fosrl/olm/refs/heads/main/get-olm.sh | bash + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# GitHub repository info +REPO="fosrl/olm" +GITHUB_API_URL="https://api.github.com/repos/${REPO}/releases/latest" + +# Function to print colored output +print_status() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to get latest version from GitHub API +get_latest_version() { + local latest_info + + if command -v curl >/dev/null 2>&1; then + latest_info=$(curl -fsSL "$GITHUB_API_URL" 2>/dev/null) + elif command -v wget >/dev/null 2>&1; then + latest_info=$(wget -qO- "$GITHUB_API_URL" 2>/dev/null) + else + print_error "Neither curl nor wget is available. Please install one of them." >&2 + exit 1 + fi + + if [ -z "$latest_info" ]; then + print_error "Failed to fetch latest version information" >&2 + exit 1 + fi + + # Extract version from JSON response (works without jq) + local version=$(echo "$latest_info" | grep '"tag_name"' | head -1 | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/') + + if [ -z "$version" ]; then + print_error "Could not parse version from GitHub API response" >&2 + exit 1 + fi + + # Remove 'v' prefix if present + version=$(echo "$version" | sed 's/^v//') + + echo "$version" +} + +# Detect OS and architecture +detect_platform() { + local os arch + + # Detect OS + case "$(uname -s)" in + Linux*) os="linux" ;; + Darwin*) os="darwin" ;; + MINGW*|MSYS*|CYGWIN*) os="windows" ;; + FreeBSD*) os="freebsd" ;; + *) + print_error "Unsupported operating system: $(uname -s)" + exit 1 + ;; + esac + + # Detect architecture + case "$(uname -m)" in + x86_64|amd64) arch="amd64" ;; + arm64|aarch64) arch="arm64" ;; + armv7l|armv6l) + if [ "$os" = "linux" ]; then + if [ "$(uname -m)" = "armv6l" ]; then + arch="arm32v6" + else + arch="arm32" + fi + else + arch="arm64" # Default for non-Linux ARM + fi + ;; + riscv64) + if [ "$os" = "linux" ]; then + arch="riscv64" + else + print_error "RISC-V architecture only supported on Linux" + exit 1 + fi + ;; + *) + print_error "Unsupported architecture: $(uname -m)" + exit 1 + ;; + esac + + echo "${os}_${arch}" +} + +# Get installation directory +get_install_dir() { + if [ "$OS" = "windows" ]; then + echo "$HOME/bin" + else + # Try to use a directory in PATH, fallback to ~/.local/bin + if echo "$PATH" | grep -q "/usr/local/bin"; then + if [ -w "/usr/local/bin" ] 2>/dev/null; then + echo "/usr/local/bin" + else + echo "$HOME/.local/bin" + fi + else + echo "$HOME/.local/bin" + fi + fi +} + +# Download and install olm +install_olm() { + local platform="$1" + local install_dir="$2" + local binary_name="olm_${platform}" + local exe_suffix="" + + # Add .exe suffix for Windows + if [[ "$platform" == *"windows"* ]]; then + binary_name="${binary_name}.exe" + exe_suffix=".exe" + fi + + local download_url="${BASE_URL}/${binary_name}" + local temp_file="/tmp/olm${exe_suffix}" + local final_path="${install_dir}/olm${exe_suffix}" + + print_status "Downloading olm from ${download_url}" + + # Download the binary + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$download_url" -o "$temp_file" + elif command -v wget >/dev/null 2>&1; then + wget -q "$download_url" -O "$temp_file" + else + print_error "Neither curl nor wget is available. Please install one of them." + exit 1 + fi + + # Create install directory if it doesn't exist + mkdir -p "$install_dir" + + # Move binary to install directory + mv "$temp_file" "$final_path" + + # Make executable (not needed on Windows, but doesn't hurt) + chmod +x "$final_path" + + print_status "olm installed to ${final_path}" + + # Check if install directory is in PATH + if ! echo "$PATH" | grep -q "$install_dir"; then + print_warning "Install directory ${install_dir} is not in your PATH." + print_warning "Add it to your PATH by adding this line to your shell profile:" + print_warning " export PATH=\"${install_dir}:\$PATH\"" + fi +} + +# Verify installation +verify_installation() { + local install_dir="$1" + local exe_suffix="" + + if [[ "$PLATFORM" == *"windows"* ]]; then + exe_suffix=".exe" + fi + + local olm_path="${install_dir}/olm${exe_suffix}" + + if [ -f "$olm_path" ] && [ -x "$olm_path" ]; then + print_status "Installation successful!" + print_status "olm version: $("$olm_path" --version 2>/dev/null || echo "unknown")" + return 0 + else + print_error "Installation failed. Binary not found or not executable." + return 1 + fi +} + +# Main installation process +main() { + print_status "Installing latest version of olm..." + + # Get latest version + print_status "Fetching latest version from GitHub..." + VERSION=$(get_latest_version) + print_status "Latest version: v${VERSION}" + + # Set base URL with the fetched version + BASE_URL="https://github.com/${REPO}/releases/download/${VERSION}" + + # Detect platform + PLATFORM=$(detect_platform) + print_status "Detected platform: ${PLATFORM}" + + # Get install directory + INSTALL_DIR=$(get_install_dir) + print_status "Install directory: ${INSTALL_DIR}" + + # Install olm + install_olm "$PLATFORM" "$INSTALL_DIR" + + # Verify installation + if verify_installation "$INSTALL_DIR"; then + print_status "olm is ready to use!" + if [[ "$PLATFORM" == *"windows"* ]]; then + print_status "Run 'olm --help' to get started" + else + print_status "Run 'olm --help' to get started" + fi + else + exit 1 + fi +} + +# Run main function +main "$@" \ No newline at end of file