#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" source "${PROJECT_ROOT}/scripts/lib/vmid-ip-maps.sh" 2>/dev/null || true # 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 # 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}"; } # RPC_NODES, VALIDATOR_NODES, SENTRY_NODES from scripts/lib/vmid-ip-maps.sh 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"