#!/usr/bin/env bash set -euo pipefail # Load IP configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true # Deploy static-nodes.json and permissioned-nodes.json to ALL Besu nodes # Ensures both files are identical on all nodes 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}"; } # Source files STATIC_NODES_SOURCE="$PROJECT_ROOT/smom-dbis-138/config/static-nodes.json" PERMISSIONED_NODES_SOURCE="$PROJECT_ROOT/smom-dbis-138-proxmox/config/permissioned-nodes.json" # Verify source files exist if [ ! -f "$STATIC_NODES_SOURCE" ]; then log_error "Source static-nodes.json not found: $STATIC_NODES_SOURCE" exit 1 fi if [ ! -f "$PERMISSIONED_NODES_SOURCE" ]; then log_error "Source permissioned-nodes.json not found: $PERMISSIONED_NODES_SOURCE" exit 1 fi # Verify files are identical if ! diff -q "$STATIC_NODES_SOURCE" "$PERMISSIONED_NODES_SOURCE" > /dev/null 2>&1; then log_warn "static-nodes.json and permissioned-nodes.json differ!" log_info "Syncing permissioned-nodes.json to match static-nodes.json..." cp "$STATIC_NODES_SOURCE" "$PERMISSIONED_NODES_SOURCE" log_success "Files synced" fi # All Besu nodes (VMID -> IP) declare -A ALL_NODES=( # Validators ["1000"]="${IP_VALIDATOR_0:-${IP_VALIDATOR_0:-${IP_VALIDATOR_0:-${IP_VALIDATOR_0:-192.168.11.100}}}}" ["1001"]="${IP_VALIDATOR_1:-${IP_VALIDATOR_1:-${IP_VALIDATOR_1:-${IP_VALIDATOR_1:-192.168.11.101}}}}" ["1002"]="${IP_VALIDATOR_2:-${IP_VALIDATOR_2:-${IP_VALIDATOR_2:-${IP_VALIDATOR_2:-192.168.11.102}}}}" ["1003"]="${IP_VALIDATOR_3:-${IP_VALIDATOR_3:-${IP_VALIDATOR_3:-${IP_VALIDATOR_3:-192.168.11.103}}}}" ["1004"]="${IP_VALIDATOR_4:-${IP_VALIDATOR_4:-${IP_VALIDATOR_4:-${IP_VALIDATOR_4:-192.168.11.104}}}}" # Sentries ["1500"]="${IP_BESU_RPC_0:-${IP_BESU_RPC_0:-${IP_BESU_RPC_0:-${IP_BESU_RPC_0:-192.168.11.150}}}}" ["1501"]="${IP_BESU_RPC_1:-${IP_BESU_RPC_1:-${IP_BESU_RPC_1:-${IP_BESU_RPC_1:-192.168.11.151}}}}" ["1502"]="${IP_BESU_RPC_2:-${IP_BESU_RPC_2:-${IP_BESU_RPC_2:-${IP_BESU_RPC_2:-192.168.11.152}}}}" ["1503"]="${IP_BESU_RPC_3:-${IP_BESU_RPC_3:-${IP_BESU_RPC_3:-${IP_BESU_RPC_3:-192.168.11.153}}}}" # RPC Nodes ["2101"]="${RPC_CORE_1}" ["2400"]="${RPC_THIRDWEB_PRIMARY}" ["2401"]="${RPC_THIRDWEB_1:-${RPC_THIRDWEB_1:-${RPC_THIRDWEB_1:-${RPC_THIRDWEB_1:-192.168.11.241}}}}" ["2402"]="${RPC_THIRDWEB_2:-${RPC_THIRDWEB_2:-${RPC_THIRDWEB_2:-${RPC_THIRDWEB_2:-192.168.11.242}}}}" ["2500"]="${RPC_ALLTRA_1:-192.168.11.250}" ["2501"]="${RPC_ALI_1:-${RPC_ALI_1:-${RPC_ALI_1:-${RPC_ALI_1:-192.168.11.251}}}}" ["2502"]="${RPC_ALI_2:-${RPC_ALI_2:-${RPC_ALI_2:-${RPC_ALI_2:-192.168.11.252}}}}" ["2505"]="${IP_VAULT_PHOENIX_2:-192.168.11.201}" ["2506"]="192.168.11.202" ["2507"]="192.168.11.203" ["2508"]="192.168.11.204" ) PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}" log_section "Deploying Node Lists to All Besu Nodes" log_info "Source files:" log_info " static-nodes.json: $STATIC_NODES_SOURCE" log_info " permissioned-nodes.json: $PERMISSIONED_NODES_SOURCE" log_info "" # Function to deploy to a node deploy_to_node() { local vmid=$1 local ip=$2 log_info "Deploying to VMID $vmid ($ip)..." # Check if container exists and is running local status=$(ssh root@"$PROXMOX_HOST" "pct status $vmid 2>/dev/null" | awk '{print $2}' || echo "unknown") if [ "$status" != "running" ]; then log_warn " ⚠ VMID $vmid is not running (status: $status) - skipping" return 1 fi # Create directories if they don't exist ssh root@"$PROXMOX_HOST" "pct exec $vmid -- mkdir -p /var/lib/besu /var/lib/besu/permissions" 2>/dev/null || true # Deploy static-nodes.json log_info " Copying static-nodes.json..." scp "$STATIC_NODES_SOURCE" root@"$PROXMOX_HOST":/tmp/static-nodes.json.$vmid >/dev/null 2>&1 ssh root@"$PROXMOX_HOST" "pct push $vmid /tmp/static-nodes.json.$vmid /var/lib/besu/static-nodes.json" >/dev/null 2>&1 ssh root@"$PROXMOX_HOST" "rm /tmp/static-nodes.json.$vmid" 2>/dev/null || true # Deploy permissioned-nodes.json log_info " Copying permissioned-nodes.json..." scp "$PERMISSIONED_NODES_SOURCE" root@"$PROXMOX_HOST":/tmp/permissioned-nodes.json.$vmid >/dev/null 2>&1 ssh root@"$PROXMOX_HOST" "pct push $vmid /tmp/permissioned-nodes.json.$vmid /var/lib/besu/permissions/permissioned-nodes.json" >/dev/null 2>&1 ssh root@"$PROXMOX_HOST" "rm /tmp/permissioned-nodes.json.$vmid" 2>/dev/null || true # Set permissions ssh root@"$PROXMOX_HOST" "pct exec $vmid -- chown besu:besu /var/lib/besu/static-nodes.json /var/lib/besu/permissions/permissioned-nodes.json 2>/dev/null || chown root:root /var/lib/besu/static-nodes.json /var/lib/besu/permissions/permissioned-nodes.json" 2>/dev/null || true ssh root@"$PROXMOX_HOST" "pct exec $vmid -- chmod 644 /var/lib/besu/static-nodes.json /var/lib/besu/permissions/permissioned-nodes.json" 2>/dev/null || true # Verify files local static_check=$(ssh root@"$PROXMOX_HOST" "pct exec $vmid -- test -f /var/lib/besu/static-nodes.json && echo 'ok' || echo 'missing'" 2>/dev/null || echo "error") local perm_check=$(ssh root@"$PROXMOX_HOST" "pct exec $vmid -- test -f /var/lib/besu/permissions/permissioned-nodes.json && echo 'ok' || echo 'missing'" 2>/dev/null || echo "error") if [ "$static_check" = "ok" ] && [ "$perm_check" = "ok" ]; then log_success " ✓ Files deployed successfully" return 0 else log_error " ✗ Deployment failed (static: $static_check, perm: $perm_check)" return 1 fi } # Deploy to all nodes SUCCESS_COUNT=0 FAILED_COUNT=0 for vmid in "${!ALL_NODES[@]}"; do if deploy_to_node "$vmid" "${ALL_NODES[$vmid]}"; then ((SUCCESS_COUNT++)) else ((FAILED_COUNT++)) fi echo "" done # Summary log_section "Deployment Summary" log_info "Successfully deployed: $SUCCESS_COUNT nodes" if [ $FAILED_COUNT -gt 0 ]; then log_warn "Failed/Skipped: $FAILED_COUNT nodes" fi log_info "" log_info "Next steps:" log_info "1. Verify p2p-host configuration on all nodes" log_info "2. Restart Besu services to apply changes" log_info "3. Verify peer connections after restart"