Ctrl K
ComunidadGuías…

install.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/bin/sh

# Honeywire Automated Installer & Provisioner
set -e

# Pass all arguments into the function
do_install() {
    # 1. Parse Arguments passed via 'bash -s --'
    LINK_URL=""
    API_KEY=""
    TARGET_VERSION=""

    while [ $# -gt 0 ]; do
        case "$1" in
            --version)
                TARGET_VERSION="$2"
                shift 2
                ;;
            --link)
                LINK_URL="$2"
                shift 2
                ;;
            --api-key)
                API_KEY="$2"
                shift 2
                ;;
            *)
                # Ignore unknown arguments silently or log them,
                # but don't break the install.
                shift 1
                ;;
        esac
    done

    # Define colors
    RESET='\033[0m'
    BOLD='\033[1m'
    DIM='\033[2m'
    CYAN='\033[36m'
    GREEN='\033[32m'
    YELLOW='\033[33m'
    RED='\033[31m'
    MAGENTA='\033[35m'

    echo -e "${CYAN}${BOLD}==> Starting Honeywire Installation...${RESET}"

    # 2. Check for existing installation (Upgrade flow)
    if command -v honeywire >/dev/null 2>&1; then
        EXISTING_PATH=$(command -v honeywire)
        echo -e "${YELLOW}${BOLD}==> Warning:${RESET}${YELLOW} Honeywire is already installed at ${EXISTING_PATH}${RESET}"
        echo -e "${DIM}Upgrading version in 3 seconds... (Press CTRL + C to cancel)${RESET}"
        sleep 3
    fi

    # 3. Check for required tools
    if ! command -v curl >/dev/null 2>&1; then
        echo -e "${RED}${BOLD}Error:${RESET}${RED} 'curl' is required. Aborting.${RESET}"
        exit 1
    fi

    if ! command -v sha256sum >/dev/null 2>&1; then
        echo -e "${RED}${BOLD}Error:${RESET}${RED} 'sha256sum' is required. Aborting.${RESET}"
        exit 1
    fi

    # 4. Detect Architecture
    ARCH=$(uname -m)
    case "$ARCH" in
        x86_64)  BIN_ARCH="amd64" ;;
        aarch64) BIN_ARCH="arm64" ;;
        arm64)   BIN_ARCH="arm64" ;;
        *)
            echo -e "${RED}${BOLD}Error:${RESET}${RED} Unsupported architecture ($ARCH)${RESET}"
            exit 1
            ;;
    esac

    # 5. Resolve Target Release Version
    LATEST_TAG=""
    if [ -n "$TARGET_VERSION" ]; then
        case "$TARGET_VERSION" in
            v*) LATEST_TAG="wizard/$TARGET_VERSION" ;;
            *)  LATEST_TAG="wizard/v$TARGET_VERSION" ;;
        esac
        echo -e "${CYAN}==> Target version specified: ${BOLD}$LATEST_TAG${RESET}"
    elif [ -n "$LINK_URL" ]; then
        echo -e "${CYAN}==> Detecting Hub version compatibility from ${DIM}$LINK_URL${RESET}${CYAN}...${RESET}"
        HUB_VER=$(curl -s --connect-timeout 3 "$LINK_URL/api/v2/version" 2>/dev/null | grep -o '"version":"[^"]*' | cut -d'"' -f4 || true)
        if [ -n "$HUB_VER" ]; then
            HUB_MAJOR=$(echo "$HUB_VER" | sed -E 's/^v?([0-9]+).*/\1/')
            echo -e "${CYAN}==> Hub major version identified: ${BOLD}v$HUB_MAJOR${RESET}"
            LATEST_TAG=$(curl -s https://api.github.com/repos/AndReicscs/HoneyWire/releases | grep -o "\"tag_name\": \"wizard/v$HUB_MAJOR\.[^\"]*" | head -n 1 | cut -d'"' -f4 || true)
        fi
    fi

    # Fallback to latest available wizard release
    if [ -z "$LATEST_TAG" ]; then
        echo -e "${CYAN}==> Fetching latest release info from GitHub...${RESET}"
        LATEST_TAG=$(curl -s https://api.github.com/repos/AndReicscs/HoneyWire/releases | grep -o '"tag_name": "wizard/[^"]*' | head -n 1 | cut -d'"' -f4 || true)
    fi

    if [ -z "$LATEST_TAG" ]; then
        echo -e "${RED}${BOLD}Error:${RESET}${RED} Could not determine the Wizard release version from GitHub. Aborting.${RESET}"
        exit 1
    fi

    # 6. Variables
    BASE_URL="https://github.com/AndReicscs/HoneyWire/releases/download/$LATEST_TAG"
    BINARY_NAME="honeywire-linux-$BIN_ARCH"
    INSTALL_PATH="/usr/local/bin/honeywire"

    # 7. Secure Temp Dir
    TMP_DIR=$(mktemp -d)
    trap 'rm -rf "$TMP_DIR"' EXIT
    cd "$TMP_DIR"

    # 8. Download
    echo -e "${CYAN}==> Downloading ${BOLD}$LATEST_TAG${RESET}${CYAN}...${RESET}"
    curl -fsSL "$BASE_URL/$BINARY_NAME" -o "$BINARY_NAME"

    echo -e "${CYAN}==> Downloading checksums...${RESET}"
    curl -fsSL "$BASE_URL/checksums.txt" -o checksums.txt

    # 9. Strict Checksum Verification
    echo -e "${CYAN}==> Verifying cryptographic signature...${RESET}"
    EXPECTED_HASH=$(grep " $BINARY_NAME\$" checksums.txt | awk '{print $1}')

    if [ -z "$EXPECTED_HASH" ]; then
        echo -e "${RED}${BOLD}Error:${RESET}${RED} Binary not found in checksums.txt! Aborting.${RESET}"
        exit 1
    fi

    if ! echo "$EXPECTED_HASH  $BINARY_NAME" | sha256sum -c - >/dev/null 2>&1; then
        echo -e "${RED}${BOLD}Error:${RESET}${RED} Checksum verification failed!${RESET}"
        exit 1
    fi
    echo -e "${GREEN}✓ Checksum valid.${RESET}"

    # 10. Install
    echo -e "${CYAN}==> Installing to ${DIM}$INSTALL_PATH${RESET}${CYAN} (requires sudo)...${RESET}"
    SUDO=""
    if [ "$(id -u)" -ne 0 ]; then
        SUDO="sudo"
    fi

    $SUDO mv "$BINARY_NAME" "$INSTALL_PATH"
    $SUDO chmod +x "$INSTALL_PATH"

    # 11. Auto-Provisioning (The Magic Step)
    if [ -n "$LINK_URL" ]; then
        echo -e "\n${CYAN}${BOLD}==> Provisioning Node...${RESET}"
        # /dev/tty to force the binary to read from the user's keyboard
        if [ -n "$API_KEY" ]; then
            $SUDO $INSTALL_PATH --link "$LINK_URL" --api-key "$API_KEY" < /dev/tty
        else
            $SUDO $INSTALL_PATH --link "$LINK_URL" < /dev/tty
        fi
        echo -e "\n${GREEN}${BOLD}==> Node Successfully Deployed!${RESET}"
    else
        echo -e "\n${GREEN}${BOLD}==> Installation Complete!${RESET}"
        echo -e "You can now run the tool by typing: ${MAGENTA}${BOLD}honeywire${RESET}\n"
    fi
}

# Execute the function and pass all arguments to it
do_install "$@"