#!/usr/bin/env bash # Demo rig: GUI Coldcard Mk5 sims (segregated => distinct per-PID sockets), clipped + streamed via x11vnc + # websockify for noVNC. Each signer N uses display :10N, VNC 591N, WS 691N, socket symlink /tmp/cksim-N.sock. # demo_rig.sh -> (re)start ALL 3 signers (used by /policy + every re-arm) # demo_rig.sh 2 -> (re)start ONLY signer 2 (boot-to-signing-ready / reboot demo; others keep running) set -uo pipefail export PATH="$HOME/gccshim:$PATH" CLIP="${CLIP:-192x328+96+90}" RUN=~/cksim TARGETS="${*:-1 2 3}" cd ~/coldcard-firmware/unix # --- kill ONLY the targeted signers' processes (so a single-N restart leaves the others alone) --- for n in $TARGETS; do DISP=$((100+n)); VNC=$((5910+n)); WS=$((6910+n)) oldsock=$(readlink "/tmp/cksim-$n.sock" 2>/dev/null || true) pkill -f -- "--seed $(cat "$RUN/seeds/$n.txt")" 2>/dev/null || true pkill -f "rfbport $VNC" 2>/dev/null || true pkill -f "websockify $WS" 2>/dev/null || true kill "$(cat "/tmp/.X$DISP-lock" 2>/dev/null)" 2>/dev/null || true rm -f "/tmp/.X$DISP-lock" "/tmp/cksim-$n.sock" ${oldsock:+"$oldsock"} done sleep 2 # --- (re)launch the targeted signers --- for n in $TARGETS; do DISP=$((100+n)); VNC=$((5910+n)); WS=$((6910+n)) Xvfb :$DISP -screen 0 900x720x24 >/tmp/xvfb$n.log 2>&1 & sleep 2 SEED=$(cat "$RUN/seeds/$n.txt") before=$(ls /tmp/ckcc-simulator-*.sock 2>/dev/null | sort) DISPLAY=:$DISP setsid ~/ccsim-venv/bin/python simulator.py --mk5 --segregate --seed "$SEED" >/tmp/guisim$n.log 2>&1 & sock="" for i in $(seq 1 25); do now=$(ls /tmp/ckcc-simulator-*.sock 2>/dev/null | sort) sock=$(comm -13 <(echo "$before") <(echo "$now") | grep -v '^$' | head -1) [ -n "$sock" ] && break sleep 1 done ln -sf "$sock" "/tmp/cksim-$n.sock" x11vnc -display :$DISP -clip "$CLIP" -rfbport $VNC -forever -shared -nopw -quiet -bg >/tmp/x11vnc$n.log 2>&1 setsid websockify $WS localhost:$VNC /tmp/ws$n.log 2>&1 & echo "$n $sock /tmp/cksim-$n.sock :$DISP $WS" done echo DEMO_RIG_UP