#!/bin/bash # Bzzz P2P Service Cluster Deployment Script # Deploys updated Bzzz binary from walnut to other cluster nodes set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Configuration BZZZ_DIR="/home/tony/AI/projects/Bzzz" # Exclude walnut (192.168.1.27) since this IS walnut CLUSTER_NODES=("192.168.1.72" "192.168.1.113" "192.168.1.132") CLUSTER_NAMES=("ACACIA" "IRONWOOD" "ROSEWOOD") SSH_USER="tony" SSH_PASS="silverfrond[1392]" # Logging functions log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" } success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } # Check if bzzz binary exists check_binary() { log "Checking for Bzzz binary on walnut..." if [ ! -f "$BZZZ_DIR/bzzz" ]; then error "Bzzz binary not found at $BZZZ_DIR/bzzz" echo " Please build the binary first with: go build -o bzzz main.go" exit 1 fi success "Bzzz binary found and ready for deployment" } # Update walnut's own service update_walnut() { log "Updating Bzzz service on walnut (local)..." # Check if binary has been built recently if [ ! -f "$BZZZ_DIR/bzzz" ]; then error "Bzzz binary not found. Building..." cd "$BZZZ_DIR" go build -o bzzz main.go || { error "Build failed"; return 1; } fi # Stop the service sudo systemctl stop bzzz.service 2>/dev/null || true # Backup old binary sudo cp /usr/local/bin/bzzz /usr/local/bin/bzzz.backup 2>/dev/null || true # Install new binary sudo cp "$BZZZ_DIR/bzzz" /usr/local/bin/bzzz sudo chmod +x /usr/local/bin/bzzz sudo chown root:root /usr/local/bin/bzzz # Start the service sudo systemctl start bzzz.service # Check if service started successfully sleep 3 if sudo systemctl is-active bzzz.service > /dev/null 2>&1; then success "✓ WALNUT (local) - Binary updated and service restarted" else error "✗ WALNUT (local) - Service failed to start" return 1 fi } # Check cluster connectivity check_cluster_connectivity() { log "Checking cluster connectivity from walnut..." for i in "${!CLUSTER_NODES[@]}"; do node="${CLUSTER_NODES[$i]}" name="${CLUSTER_NAMES[$i]}" log "Testing connection to $name ($node)..." if sshpass -p "$SSH_PASS" ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$SSH_USER@$node" "echo 'Connection test successful'" > /dev/null 2>&1; then success "✓ $name ($node) - Connected" else warning "✗ $name ($node) - Connection failed" fi done } # Deploy bzzz binary to remote cluster nodes deploy_bzzz_binary() { log "Deploying Bzzz binary from walnut to remote cluster nodes..." # Make sure binary is executable chmod +x "$BZZZ_DIR/bzzz" for i in "${!CLUSTER_NODES[@]}"; do node="${CLUSTER_NODES[$i]}" name="${CLUSTER_NAMES[$i]}" log "Deploying to $name ($node)..." # Copy the binary if sshpass -p "$SSH_PASS" scp -o StrictHostKeyChecking=no "$BZZZ_DIR/bzzz" "$SSH_USER@$node:/tmp/bzzz-new"; then # Install the binary and restart service sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no "$SSH_USER@$node" " # Stop the service sudo systemctl stop bzzz.service 2>/dev/null || true # Backup old binary sudo cp /usr/local/bin/bzzz /usr/local/bin/bzzz.backup 2>/dev/null || true # Install new binary sudo mv /tmp/bzzz-new /usr/local/bin/bzzz sudo chmod +x /usr/local/bin/bzzz sudo chown root:root /usr/local/bin/bzzz # Start the service sudo systemctl start bzzz.service # Check if service started successfully sleep 3 if sudo systemctl is-active bzzz.service > /dev/null 2>&1; then echo 'Service started successfully' else echo 'Service failed to start' exit 1 fi " if [ $? -eq 0 ]; then success "✓ $name - Binary deployed and service restarted" else error "✗ $name - Deployment failed" fi else error "✗ $name - Failed to copy binary" fi done } # Verify cluster status after deployment verify_cluster_status() { log "Verifying cluster status after deployment..." sleep 10 # Wait for services to fully start # Check walnut (local) log "Checking WALNUT (local) status..." if sudo systemctl is-active bzzz.service > /dev/null 2>&1; then success "✓ WALNUT (local) - Service is running" else error "✗ WALNUT (local) - Service is not running" fi # Check remote nodes for i in "${!CLUSTER_NODES[@]}"; do node="${CLUSTER_NODES[$i]}" name="${CLUSTER_NAMES[$i]}" log "Checking $name ($node) status..." status=$(sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no "$SSH_USER@$node" " if sudo systemctl is-active bzzz.service > /dev/null 2>&1; then echo 'RUNNING' else echo 'FAILED' fi " 2>/dev/null || echo "CONNECTION_FAILED") case $status in "RUNNING") success "✓ $name - Service is running" ;; "FAILED") error "✗ $name - Service is not running" ;; "CONNECTION_FAILED") error "✗ $name - Cannot connect to check status" ;; esac done } # Main deployment function main() { echo -e "${GREEN}" echo "╔══════════════════════════════════════════════════════════════╗" echo "║ Bzzz Cluster Deployment ║" echo "║ ║" echo "║ Deploying updated Bzzz binary from WALNUT to cluster ║" echo "╚══════════════════════════════════════════════════════════════╝" echo -e "${NC}" log "Starting deployment from walnut to P2P mesh cluster..." # Run deployment steps check_binary update_walnut check_cluster_connectivity deploy_bzzz_binary verify_cluster_status echo -e "${GREEN}" echo "╔══════════════════════════════════════════════════════════════╗" echo "║ Deployment Completed! ║" echo "║ ║" echo "║ 🐝 Bzzz P2P mesh is now running with updated binary ║" echo "║ 📡 Check logs for P2P mesh formation and task discovery ║" echo "╚══════════════════════════════════════════════════════════════╝" echo -e "${NC}" } # Handle script arguments case "${1:-deploy}" in "deploy") main ;; "status") log "Checking cluster status..." echo -e "\n${BLUE}=== WALNUT (local) ===${NC}" sudo systemctl status bzzz.service --no-pager -l for i in "${!CLUSTER_NODES[@]}"; do node="${CLUSTER_NODES[$i]}" name="${CLUSTER_NAMES[$i]}" echo -e "\n${BLUE}=== $name ($node) ===${NC}" sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no "$SSH_USER@$node" "sudo systemctl status bzzz.service --no-pager -l" 2>/dev/null || echo "Connection failed" done ;; "logs") if [ -z "$2" ]; then echo "Usage: $0 logs " echo "Available nodes: WALNUT ${CLUSTER_NAMES[*]}" exit 1 fi if [ "$2" = "WALNUT" ]; then log "Showing logs from WALNUT (local)..." sudo journalctl -u bzzz -f exit 0 fi # Find remote node by name for i in "${!CLUSTER_NAMES[@]}"; do if [ "${CLUSTER_NAMES[$i]}" = "$2" ]; then node="${CLUSTER_NODES[$i]}" log "Showing logs from $2 ($node)..." sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no "$SSH_USER@$node" "sudo journalctl -u bzzz -f" exit 0 fi done error "Node '$2' not found. Available: WALNUT ${CLUSTER_NAMES[*]}" ;; *) echo "Usage: $0 {deploy|status|logs }" echo "" echo "Commands:" echo " deploy - Deploy updated Bzzz binary from walnut to cluster" echo " status - Show service status on all nodes" echo " logs - Show logs from specific node (WALNUT ${CLUSTER_NAMES[*]})" exit 1 ;; esac