- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control. - Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities. - Created .gitmodules to include OpenZeppelin contracts as a submodule. - Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment. - Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks. - Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring. - Created scripts for resource import and usage validation across non-US regions. - Added tests for CCIP error handling and integration to ensure robust functionality. - Included various new files and directories for the orchestration portal and deployment scripts.
148 lines
5.4 KiB
Bash
Executable File
148 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Empty Besu data directories and restart with new genesis.json
|
|
# Run from Nginx proxy to connect to all Besu nodes
|
|
|
|
set -e
|
|
|
|
NGINX_IP="${NGINX_PROXY_IP:-20.160.58.99}"
|
|
GENESIS_FILE="${GENESIS_FILE:-/tmp/genesis.json}"
|
|
|
|
# Define node IPs (update these with actual IPs from Azure)
|
|
# Format: "region_name:ip_address"
|
|
NODES=(
|
|
"cus:10.0.1.4" # Central US - Update with actual IP
|
|
"eus:10.0.2.4" # East US - Update with actual IP
|
|
"eus2:10.0.3.4" # East US 2 - Update with actual IP
|
|
"wus:10.0.4.4" # West US - Update with actual IP
|
|
"wus2:10.0.5.4" # West US 2 - Update with actual IP
|
|
)
|
|
|
|
# Besu data directory path
|
|
BESU_DATA_DIR="/opt/besu/data"
|
|
COMPOSE_DIR="/opt/docker-compose"
|
|
COMPOSE_FILE="docker-compose.yml"
|
|
|
|
# Function to empty data directory on a node
|
|
empty_and_restart_node() {
|
|
local node_name=$1
|
|
local node_ip=$2
|
|
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "📋 Processing $node_name ($node_ip)"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
|
|
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 besuadmin@"$node_ip" <<EOF
|
|
set -e
|
|
|
|
echo " ✅ Connected to $node_name"
|
|
|
|
# Stop Besu container
|
|
echo " 🔄 Stopping Besu container..."
|
|
if [ -f "$COMPOSE_DIR/$COMPOSE_FILE" ]; then
|
|
cd "$COMPOSE_DIR"
|
|
sudo docker-compose -f "$COMPOSE_FILE" down besu 2>/dev/null || true
|
|
sleep 2
|
|
else
|
|
echo " ⚠️ Docker compose file not found at $COMPOSE_DIR/$COMPOSE_FILE"
|
|
fi
|
|
|
|
# Empty data directory
|
|
echo " 🗑️ Emptying data directory..."
|
|
if [ -d "$BESU_DATA_DIR" ]; then
|
|
sudo rm -rf "$BESU_DATA_DIR"/* "$BESU_DATA_DIR"/.[^.]* 2>/dev/null || true
|
|
sudo mkdir -p "$BESU_DATA_DIR" 2>/dev/null || true
|
|
sudo chown -R besuadmin:besuadmin "$BESU_DATA_DIR" 2>/dev/null || true
|
|
echo " ✅ Data directory emptied: $BESU_DATA_DIR"
|
|
else
|
|
echo " ⚠️ Data directory not found: $BESU_DATA_DIR"
|
|
sudo mkdir -p "$BESU_DATA_DIR"
|
|
sudo chown -R besuadmin:besuadmin "$BESU_DATA_DIR"
|
|
fi
|
|
|
|
# Copy new genesis.json
|
|
echo " 📤 Copying new genesis.json..."
|
|
if [ -f "$GENESIS_FILE" ]; then
|
|
sudo cp "$GENESIS_FILE" /opt/besu/config/genesis.json
|
|
sudo chown besuadmin:besuadmin /opt/besu/config/genesis.json
|
|
echo " ✅ Genesis.json updated"
|
|
else
|
|
echo " ⚠️ Genesis file not found at $GENESIS_FILE"
|
|
echo " Creating symlink..."
|
|
sudo ln -sf "$GENESIS_FILE" /opt/besu/config/genesis.json 2>/dev/null || true
|
|
fi
|
|
|
|
# Restart Besu container
|
|
echo " 🔄 Restarting Besu container..."
|
|
if [ -f "$COMPOSE_DIR/$COMPOSE_FILE" ]; then
|
|
cd "$COMPOSE_DIR"
|
|
sudo docker-compose -f "$COMPOSE_FILE" up -d besu
|
|
echo " ✅ Besu container restarted"
|
|
else
|
|
echo " ⚠️ Cannot restart - compose file not found"
|
|
fi
|
|
|
|
echo " ✅ $node_name processing complete"
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ $node_name: Success"
|
|
else
|
|
echo "❌ $node_name: Failed"
|
|
return 1
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Empty Besu Data Directories and Restart with New Genesis"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo "Nginx Proxy: $NGINX_IP"
|
|
echo "Genesis File: $GENESIS_FILE"
|
|
echo "Nodes to process: ${#NODES[@]}"
|
|
echo ""
|
|
|
|
# First, copy genesis.json to Nginx proxy if not already there
|
|
if [ ! -f "$GENESIS_FILE" ]; then
|
|
echo "⚠️ Genesis file not found at $GENESIS_FILE"
|
|
echo " Please copy genesis.json to $GENESIS_FILE first"
|
|
exit 1
|
|
fi
|
|
|
|
# Process each node
|
|
FAILED_NODES=()
|
|
for node_entry in "${NODES[@]}"; do
|
|
IFS=':' read -r node_name node_ip <<< "$node_entry"
|
|
|
|
if empty_and_restart_node "$node_name" "$node_ip"; then
|
|
echo "✅ $node_name completed successfully"
|
|
else
|
|
echo "❌ $node_name failed"
|
|
FAILED_NODES+=("$node_name")
|
|
fi
|
|
echo ""
|
|
done
|
|
|
|
# Summary
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Summary"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
if [ ${#FAILED_NODES[@]} -eq 0 ]; then
|
|
echo "✅ All nodes processed successfully!"
|
|
else
|
|
echo "⚠️ Some nodes failed:"
|
|
for node in "${FAILED_NODES[@]}"; do
|
|
echo " • $node"
|
|
done
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|
|
|