Files
proxmox/scripts/besu/collect-all-node-enodes.sh.bak

154 lines
4.0 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
# Collect All Node Enodes from Running Nodes
# Queries each RPC node via admin_nodeInfo to get their enode
# Ensures unique enodes with matching IP addresses
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_section() { echo -e "\n${CYAN}=== $1 ===${NC}"; }
# Expected RPC nodes (VMID -> IP)
declare -A RPC_NODES=(
["2400"]="192.168.11.240"
["2401"]="192.168.11.241"
["2402"]="192.168.11.242"
["2500"]="192.168.11.250"
["2501"]="192.168.11.251"
["2502"]="192.168.11.252"
["2505"]="192.168.11.201"
["2506"]="192.168.11.202"
["2507"]="192.168.11.203"
["2508"]="192.168.11.204"
["2101"]="192.168.11.211"
)
# Validator nodes
declare -A VALIDATOR_NODES=(
["1000"]="192.168.11.100"
["1001"]="192.168.11.101"
["1002"]="192.168.11.102"
["1003"]="192.168.11.103"
["1004"]="192.168.11.104"
)
# Sentry nodes
declare -A SENTRY_NODES=(
["1500"]="192.168.11.150"
["1501"]="192.168.11.151"
["1502"]="192.168.11.152"
["1503"]="192.168.11.153"
)
RPC_PORT=8545
log_section "Collecting Enodes from All Nodes"
declare -A COLLECTED_ENODES=()
declare -A FAILED_NODES=()
# Function to get enode from a node
get_enode() {
local vmid=$1
local ip=$2
local rpc_url="http://${ip}:${RPC_PORT}"
log_info "Querying VMID $vmid ($ip)..."
# Try to get enode via admin_nodeInfo
local enode=$(cast rpc admin_nodeInfo "$rpc_url" 2>/dev/null | jq -r '.enode' 2>/dev/null || echo "")
if [ -z "$enode" ] || [ "$enode" = "null" ]; then
log_warn " ⚠ Failed to get enode (node may not be running or admin API not available)"
FAILED_NODES[$vmid]="$ip"
return 1
fi
# Verify IP matches
local enode_ip=$(echo "$enode" | sed -n 's/.*@\([0-9.]*\):.*/\1/p')
if [ "$enode_ip" != "$ip" ]; then
log_warn " ⚠ IP mismatch: enode has $enode_ip but expected $ip"
log_info " Enode: $enode"
else
log_success " ✓ Enode: $enode"
fi
COLLECTED_ENODES[$vmid]="$enode"
return 0
}
# Collect from all validator nodes
log_section "Collecting from Validator Nodes"
for vmid in "${!VALIDATOR_NODES[@]}"; do
get_enode "$vmid" "${VALIDATOR_NODES[$vmid]}" || true
done
# Collect from all sentry nodes
log_section "Collecting from Sentry Nodes"
for vmid in "${!SENTRY_NODES[@]}"; do
get_enode "$vmid" "${SENTRY_NODES[$vmid]}" || true
done
# Collect from all RPC nodes
log_section "Collecting from RPC Nodes"
for vmid in "${!RPC_NODES[@]}"; do
get_enode "$vmid" "${RPC_NODES[$vmid]}" || true
done
# Summary
log_section "Collection Summary"
log_info "Successfully collected: ${#COLLECTED_ENODES[@]} enodes"
log_info "Failed: ${#FAILED_NODES[@]} nodes"
if [ ${#FAILED_NODES[@]} -gt 0 ]; then
log_warn "Failed nodes:"
for vmid in "${!FAILED_NODES[@]}"; do
log_warn " VMID $vmid (${FAILED_NODES[$vmid]})"
done
fi
# Generate JSON output
log_section "Generating Updated static-nodes.json"
OUTPUT_FILE="$PROJECT_ROOT/smom-dbis-138/config/static-nodes.json.new"
echo "[" > "$OUTPUT_FILE"
FIRST=true
for vmid in "${!COLLECTED_ENODES[@]}"; do
if [ "$FIRST" = true ]; then
FIRST=false
else
echo "," >> "$OUTPUT_FILE"
fi
echo -n " \"${COLLECTED_ENODES[$vmid]}\"" >> "$OUTPUT_FILE"
done
echo "" >> "$OUTPUT_FILE"
echo "]" >> "$OUTPUT_FILE"
log_success "Generated: $OUTPUT_FILE"
log_info ""
log_info "Next steps:"
log_info "1. Review the generated file: $OUTPUT_FILE"
log_info "2. Compare with existing static-nodes.json"
log_info "3. Update static-nodes.json and permissioned-nodes.json"
log_info "4. Deploy to all nodes"