#!/usr/bin/env bash # Confirm Besu version >= 24.1.0 on all nodes (required for EIP-7702 / Cancun) # Usage: PROXMOX_HOST=${PROXMOX_HOST_ML110:-192.168.11.10} ./scripts/check-besu-version-all-nodes.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # Optional: load IP config for PROXMOX_HOST_ML110 etc. if [ -f "$PROJECT_ROOT/config/ip-addresses.conf" ]; then # shellcheck source=../config/ip-addresses.conf source "$PROJECT_ROOT/config/ip-addresses.conf" fi PROXMOX_HOST="${PROXMOX_HOST:-${PROXMOX_HOST_ML110:-192.168.11.10}}" MIN_VERSION="24.1.0" # All known Besu node VMIDs (validators, sentries, RPC). Override with BESU_VMIDS="2101 2400 2401 2402" for quick check. if [ -n "${BESU_VMIDS:-}" ]; then read -ra BESU_VMIDS <<< "$BESU_VMIDS" else BESU_VMIDS=(1000 1001 1002 1003 1004 1500 1501 1502 1503 2101 2201 2301 2303 2304 2305 2306 2307 2308 2400 2401 2402 2403) fi RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_ok() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_fail() { echo -e "${RED}[FAIL]${NC} $1"; } # Compare semantic versions: return 0 if $1 >= $2, else 1 version_gte() { local a="${1:-0}" local b="${2:-0}" [ "$a" = "$b" ] && return 0 local win win=$(echo -e "${a}\n${b}" | sort -V | tail -n1) [ "$win" = "$a" ] && return 0 return 1 } # Get Besu version from node: try RPC web3_clientVersion first, then CLI get_besu_version() { local vmid=$1 local host=$2 local version="" local raw # 1) RPC (actual running client) raw=$(ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=accept-new root@"$host" \ "pct exec $vmid -- curl -s -m 3 -X POST -H 'Content-Type: application/json' \ --data '{\"jsonrpc\":\"2.0\",\"method\":\"web3_clientVersion\",\"params\":[],\"id\":1}' \ http://127.0.0.1:8545 2>/dev/null" || true) if [ -n "$raw" ]; then if echo "$raw" | grep -q '"result"'; then version=$(echo "$raw" | sed -n 's/.*"result":"[^/]*\/v\([^\/"]*\).*/\1/p') [ -z "$version" ] && version=$(echo "$raw" | sed -n 's/.*"result":"\([^"]*\)".*/\1/p') fi fi # 2) CLI fallback if [ -z "$version" ]; then raw=$(ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=accept-new root@"$host" \ "pct exec $vmid -- /opt/besu/bin/besu --version 2>/dev/null || pct exec $vmid -- besu --version 2>/dev/null" || true) if [ -n "$raw" ]; then version=$(echo "$raw" | sed -n 's/.*[Bb]esu\/\?v\?\([0-9][0-9.]*\).*/\1/p') fi fi echo "$version" } # Check if container exists and is running on host is_running() { local vmid=$1 local host=$2 ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=accept-new root@"$host" \ "pct status $vmid 2>/dev/null" | grep -q running } echo "" log_info "Besu version check (>= ${MIN_VERSION}) on Proxmox host: $PROXMOX_HOST" log_info "EIP-7702 / Cancun requires Besu >= 24.1.0" echo "" PASS=0 FAIL=0 SKIP=0 declare -a FAILED_VMIDS declare -a FAILED_VERSIONS for vmid in "${BESU_VMIDS[@]}"; do if ! is_running "$vmid" "$PROXMOX_HOST"; then printf " VMID %-5s %-12s %s\n" "$vmid" "—" "(container not running)" ((SKIP++)) || true continue fi version=$(get_besu_version "$vmid" "$PROXMOX_HOST") if [ -z "$version" ]; then printf " VMID %-5s %-12s " "$vmid" "—" log_fail "no Besu version (RPC/CLI failed)" FAILED_VMIDS+=("$vmid") FAILED_VERSIONS+=("?") ((FAIL++)) || true continue fi if version_gte "$version" "$MIN_VERSION"; then printf " VMID %-5s %-12s " "$vmid" "$version" log_ok ">= $MIN_VERSION" ((PASS++)) || true else printf " VMID %-5s %-12s " "$vmid" "$version" log_fail "< $MIN_VERSION (upgrade required)" FAILED_VMIDS+=("$vmid") FAILED_VERSIONS+=("$version") ((FAIL++)) || true fi done echo "" echo "────────────────────────────────────────────────────────────" printf " Passed: %s Failed: %s Skipped (not running): %s\n" "$PASS" "$FAIL" "$SKIP" echo "────────────────────────────────────────────────────────────" if [ ${#FAILED_VMIDS[@]} -gt 0 ]; then echo "" log_warn "Nodes below minimum version ($MIN_VERSION):" for i in "${!FAILED_VMIDS[@]}"; do echo " VMID ${FAILED_VMIDS[$i]} version ${FAILED_VERSIONS[$i]}" done echo "" log_info "Upgrade: install Besu 24.1.0+ (e.g. from https://github.com/hyperledger/besu/releases) and restart besu service." exit 1 fi if [ "$PASS" -gt 0 ]; then log_ok "All checked nodes run Besu >= $MIN_VERSION (EIP-7702 / Cancun OK)." exit 0 fi log_warn "No Besu nodes could be checked (all skipped or failed)." exit 0