#!/usr/bin/env bash # Précharge le clipboard de la VM Ubuntu avec le INSERT SQL du workflow linux_db. # Contourne la lenteur du char-by-char NoMachine (bug paste:true). # # Source de vérité : scripts/payload_insert_morel.sql (extrait depuis workflows.db # backup du 2026-05-16_102755, avant transformation du step ord 8 en Ctrl+V). # # Wayland ne permet pas de "verrouiller" la sélection clipboard : wl-copy meurt # dès qu'un autre client (terminal, navigateur, DBeaver) prend le clipboard. # Solution : un GARDIEN qui re-pousse le payload toutes les 0.5s en boucle. # Le PID du gardien est sauvegardé dans /tmp/clipboard_guard.pid sur la VM # pour permettre un kill propre sans pkill -f (qui se tuerait lui-même). # # À lancer AVANT chaque run du workflow linux_db. # Le step ord 8 du workflow est désormais un Ctrl+V (et non plus le type_text). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PAYLOAD_FILE="$SCRIPT_DIR/payload_insert_morel.sql" VM_HOST="dom@192.168.122.132" SSH_PASS="loli" VM_PAYLOAD="/tmp/clipboard_payload.sql" VM_PIDFILE="/tmp/clipboard_guard.pid" # 1. Vérifier le payload local if [ ! -s "$PAYLOAD_FILE" ]; then echo "ERREUR: payload introuvable ou vide : $PAYLOAD_FILE" >&2 exit 1 fi BYTES=$(wc -c < "$PAYLOAD_FILE") echo "[1/3] Payload local : ${BYTES} bytes ($PAYLOAD_FILE)" # 2. Pousser dans la VM via SSH (cat redirect) SSHPASS="$SSH_PASS" sshpass -e ssh -o StrictHostKeyChecking=no "$VM_HOST" \ "cat > $VM_PAYLOAD" < "$PAYLOAD_FILE" REMOTE_BYTES=$(SSHPASS="$SSH_PASS" sshpass -e ssh -o StrictHostKeyChecking=no "$VM_HOST" \ "wc -c < $VM_PAYLOAD") echo "[2/3] Fichier déployé : ${REMOTE_BYTES} bytes sur VM ($VM_PAYLOAD)" if [ "$REMOTE_BYTES" != "$BYTES" ]; then echo "ERREUR: taille fichier VM (${REMOTE_BYTES}) != local (${BYTES})" >&2 exit 1 fi # 3. Lancer le gardien clipboard : boucle qui re-pousse le payload toutes les 0.5s. # Kill de l'ancien via /tmp/clipboard_guard.pid (PID file, PAS pkill -f # qui se tuerait lui-même car le pattern apparaît dans notre cmdline SSH). SSHPASS="$SSH_PASS" sshpass -e ssh -o StrictHostKeyChecking=no "$VM_HOST" \ "export WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/user/1000 # Kill ancien gardien si PID file existe et pointe vers un processus vivant if [ -f $VM_PIDFILE ]; then OLD_PID=\$(cat $VM_PIDFILE) if [ -n \"\$OLD_PID\" ] && kill -0 \"\$OLD_PID\" 2>/dev/null; then kill \"\$OLD_PID\" 2>/dev/null sleep 0.3 fi fi # Lancer la boucle gardien : écrit sur LES DEUX clipboards. # - wl-copy : clipboard Wayland (apps natives Wayland) # - xsel : clipboard X11/XWayland (DBeaver/Java/GTK qui passe par XWayland) # Sans le double-write, DBeaver lit un clipboard X11 vide même si Wayland plein. # XAUTHORITY = cookie temporaire de mutter/XWayland (régénéré à chaque session) XAUTH=\$(ls /run/user/1000/.mutter-Xwaylandauth.* 2>/dev/null | head -1) if [ -z \"\$XAUTH\" ]; then echo 'WARN: mutter-Xwaylandauth introuvable, X11 paste ne marchera pas' >&2 XAUTH=/home/dom/.Xauthority fi nohup setsid bash -c \"export DISPLAY=:0 XAUTHORITY=\$XAUTH; while true; do wl-copy < $VM_PAYLOAD; xsel --clipboard --input < $VM_PAYLOAD 2>/dev/null; sleep 0.5; done\" >/dev/null 2>&1 $VM_PIDFILE sleep 0.7 # Vérifier que le gardien tourne et que le clipboard est rempli if ! kill -0 \"\$GUARD_PID\" 2>/dev/null; then echo 'ERREUR: gardien mort juste après lancement' >&2 exit 1 fi CHECK=\$(wl-paste | wc -c) echo \"[3/3] gardien actif PID=\$GUARD_PID, clipboard=\$CHECK bytes\" # Tolérance ±1 byte (wl-paste ajoute parfois un newline final) DELTA=\$(( \$CHECK - $BYTES )) if [ \$DELTA -lt -1 ] || [ \$DELTA -gt 1 ]; then echo \"ERREUR: clipboard (\$CHECK) != payload ($BYTES) delta=\$DELTA\" >&2 exit 1 fi" echo "" echo "OK clipboard VM verrouillé en boucle. Tu peux lancer le replay linux_db." echo "(le step ord 8 fera Ctrl+V, l'INSERT sera collé instantanément dans DBeaver)" echo "" echo "APRÈS LA DÉMO, tuer le gardien :" echo " SSHPASS=$SSH_PASS sshpass -e ssh ${VM_HOST} \"kill \\\$(cat $VM_PIDFILE)\""