#!/usr/bin/env bash # Install wscat (or ensure npx works) inside every RPC LXC container via SSH to Proxmox hosts. # Run from project root. Containers need network and (for full install) Node.js/npm. # Usage: ./scripts/install-wscat-in-rpc-containers.sh [--check-only] # --check-only Only check if wscat/npx already available (fast). Default: install if missing (can take 30+ min for 13 containers). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" [ -f config/ip-addresses.conf ] && source config/ip-addresses.conf 2>/dev/null || true PROXMOX_SSH_USER="${PROXMOX_SSH_USER:-${PROXMOX_USER:-root}}" [[ "$PROXMOX_SSH_USER" == *"@"* ]] && PROXMOX_SSH_USER="root" R630_01="${PROXMOX_HOST_R630_01:-192.168.11.11}" R630_02="${PROXMOX_HOST_R630_02:-192.168.11.12}" ML110="${PROXMOX_HOST_ML110:-192.168.11.10}" RPC_NODES=( "2101:$R630_01" "2201:$R630_02" "2301:$ML110" "2303:$R630_02" "2304:$ML110" "2305:$ML110" "2306:$ML110" "2307:$ML110" "2308:$ML110" "2400:$ML110" "2401:$R630_02" "2402:$ML110" "2403:$ML110" ) SSH_OPTS="-o ConnectTimeout=10 -o StrictHostKeyChecking=no" CHECK_ONLY=false [[ "${1:-}" == "--check-only" ]] && CHECK_ONLY=true # Try to ensure wscat or npx is available inside the container (non-interactive, minimal install) install_inside() { local vmid="$1" host="$2" ssh $SSH_OPTS "${PROXMOX_SSH_USER}@${host}" "pct exec $vmid -- bash -s" <<'INNER' export DEBIAN_FRONTEND=noninteractive if command -v wscat >/dev/null 2>&1; then echo "ok:wscat" exit 0 fi if command -v npx >/dev/null 2>&1; then npx -y wscat --version >/dev/null 2>&1 && echo "ok:npx" || echo "fail:npx" exit 0 fi # Install Node.js if missing (Debian/Ubuntu) if ! command -v node >/dev/null 2>&1; then apt-get update -qq && apt-get install -y -qq nodejs npm 2>/dev/null || true fi if command -v npm >/dev/null 2>&1; then npm install -g wscat 2>/dev/null && echo "ok:installed" || echo "fail:install" else echo "fail:no_node" fi INNER } echo "=== Install wscat in RPC containers (check-only=$CHECK_ONLY) ===" echo "" ok=0 fail=0 for entry in "${RPC_NODES[@]}"; do IFS=: read -r vmid host <<< "$entry" result="" if "$CHECK_ONLY"; then result=$(ssh $SSH_OPTS "${PROXMOX_SSH_USER}@${host}" "pct exec $vmid -- bash -c 'command -v wscat >/dev/null && echo ok:wscat || (command -v npx >/dev/null && npx -y wscat --version 2>/dev/null && echo ok:npx || echo fail)' 2>/dev/null" || echo "fail:ssh") else result=$(install_inside "$vmid" "$host" 2>/dev/null || echo "fail:ssh") fi if echo "$result" | grep -q "^ok:"; then echo " VMID $vmid ($host): $result" ((ok++)) || true else echo " VMID $vmid ($host): $result" ((fail++)) || true fi done echo "" echo "Summary: $ok OK, $fail failed (total ${#RPC_NODES[@]} containers)" exit $fail