#!/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 Missing Enodes from Running Nodes # Queries all running nodes to collect their enodes and update node lists # 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_NODES = VMID_CURRENT_NODES from scripts/lib/vmid-ip-maps.sh declare -gA EXPECTED_NODES=() for k in "${!VMID_CURRENT_NODES[@]}"; do EXPECTED_NODES["$k"]="${VMID_CURRENT_NODES[$k]}"; done PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}" 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 log_info "Querying VMID $vmid ($ip)..." # Check if node is running local status=$(ssh -o ConnectTimeout=2 root@"$PROXMOX_HOST" "pct status $vmid 2>/dev/null" | awk '{print $2}' || echo "unknown") if [ "$status" != "running" ]; then log_warn " ⚠ Not running (status: $status) - skipping" FAILED_NODES[$vmid]="$ip (not running)" return 1 fi # Try to get enode via admin_nodeInfo local rpc_url="http://${ip}:${RPC_PORT}" 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 (admin API may not be available)" FAILED_NODES[$vmid]="$ip (RPC failed)" 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" else log_success " ✓ Enode collected: $enode" fi COLLECTED_ENODES["$ip"]="$enode" return 0 } # Collect from all expected nodes for vmid in "${!EXPECTED_NODES[@]}"; do get_enode "$vmid" "${EXPECTED_NODES[$vmid]}" || true done # Summary log_section "Collection Summary" log_info "Successfully collected: ${#COLLECTED_ENODES[@]} enodes" log_info "Failed/Not running: ${#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 updated static-nodes.json log_section "Generating Updated static-nodes.json" OUTPUT_FILE="$PROJECT_ROOT/smom-dbis-138/config/static-nodes.json.new" # Sort IPs for consistent output declare -a SORTED_IPS for ip in "${!COLLECTED_ENODES[@]}"; do SORTED_IPS+=("$ip") done IFS=$'\n' SORTED_IPS=($(sort <<<"${SORTED_IPS[*]}")) unset IFS echo "[" > "$OUTPUT_FILE" FIRST=true for ip in "${SORTED_IPS[@]}"; do if [ "$FIRST" = true ]; then FIRST=false else echo "," >> "$OUTPUT_FILE" fi echo -n " \"${COLLECTED_ENODES[$ip]}\"" >> "$OUTPUT_FILE" done echo "" >> "$OUTPUT_FILE" echo "]" >> "$OUTPUT_FILE" log_success "Generated: $OUTPUT_FILE" log_info "Contains ${#COLLECTED_ENODES[@]} enodes" log_info "" log_info "Review the file and update static-nodes.json and permissioned-nodes.json"