Files
proxmox/scripts/install-wscat-in-rpc-containers.sh
defiQUG dbd517b279 Sync workspace: config, docs, scripts, CI, operator rules, and submodule pointers.
- Update dbis_core, cross-chain-pmm-lps, explorer-monorepo, metamask-integration, pr-workspace/chains
- Omit embedded publish git dirs and empty placeholders from index

Made-with: Cursor
2026-04-12 06:12:20 -07:00

129 lines
3.5 KiB
Bash

#!/usr/bin/env bash
# Install wscat (or ensure npx works) inside RPC LXC containers 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
# ./scripts/install-wscat-in-rpc-containers.sh --apply
# ./scripts/install-wscat-in-rpc-containers.sh --vmid 2301 --apply
# Default is read-only check mode; use --apply to install if missing.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$PROJECT_ROOT"
source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh"
PROXMOX_SSH_USER="${PROXMOX_SSH_USER:-${PROXMOX_USER:-root}}"
[[ "$PROXMOX_SSH_USER" == *"@"* ]] && PROXMOX_SSH_USER="root"
RPC_VMIDS=(2101 2201 2301 2303 2304 2305 2306 2307 2308 2400 2401 2402 2403)
RPC_NODES=()
for vmid in "${RPC_VMIDS[@]}"; do
RPC_NODES+=("${vmid}:$(get_host_for_vmid "$vmid")")
done
SSH_OPTS="-o ConnectTimeout=10 -o StrictHostKeyChecking=no"
CHECK_ONLY=true
TARGET_VMIDS=()
usage() {
cat <<'EOF'
Usage: ./scripts/install-wscat-in-rpc-containers.sh [--apply] [--check-only] [--vmid <N>]
Options:
--check-only Read-only check for wscat/npx availability (default)
--apply Install wscat if missing
--vmid <N> Limit to one VMID; repeatable
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--check-only)
CHECK_ONLY=true
shift
;;
--apply)
CHECK_ONLY=false
shift
;;
--vmid)
[[ $# -ge 2 ]] || { usage >&2; exit 2; }
TARGET_VMIDS+=("$2")
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 2
;;
esac
done
selected_vmid() {
local vmid="$1"
[[ ${#TARGET_VMIDS[@]} -eq 0 ]] && return 0
local wanted
for wanted in "${TARGET_VMIDS[@]}"; do
[[ "$vmid" == "$wanted" ]] && return 0
done
return 1
}
# 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"
selected_vmid "$vmid" || continue
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