From 313db8ccd18ad7bf7e9f506d62b62cf1f76b1540 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 10 Jul 2026 16:02:02 -0500 Subject: [PATCH] fix: rewrite cmd_diagnose to use script upload instead of nested SSH quoting --- scripts/test-vm.sh | 83 +++++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/scripts/test-vm.sh b/scripts/test-vm.sh index 93d8e0e..d4f3d7e 100755 --- a/scripts/test-vm.sh +++ b/scripts/test-vm.sh @@ -301,42 +301,71 @@ cmd_diagnose() { log "Connecting to VM..." - # System services - echo -e "\n${BOLD}── System Services ──${NC}" - vm_ssh "systemctl list-units --type=service --state=running --no-pager | grep -E 'NetworkManager|sshd|seatd|getty|cage|systemd-logind' || true" 2>/dev/null || warn "Could not query system services" + # Build and run a diagnostic script on the server (avoids nested quoting issues) + local diag_script + diag_script="$(mktemp)" + cat > "$diag_script" << 'DIAGEOF' +#!/usr/bin/env bash +set -uo pipefail - # User services (PipeWire stack) - echo -e "\n${BOLD}── User Services (PipeWire) ──${NC}" - vm_ssh "systemctl --user list-units --type=service --state=running --no-pager 2>/dev/null | grep -E 'pipewire|wireplumber|pulse' || echo 'No user services running'" 2>/dev/null || warn "Could not query user services" +run_in_vm() { + sshpass -p kiosk ssh \ + -o StrictHostKeyChecking=no \ + -o UserKnownHostsFile=/dev/null \ + -o ConnectTimeout=5 \ + -p 2222 kiosk@localhost "$@" +} - # Audio devices via wpctl - echo -e "\n${BOLD}── PipeWire Devices (wpctl status) ──${NC}" - vm_ssh "wpctl status 2>/dev/null || echo 'wpctl not available'" 2>/dev/null || warn "Could not query wpctl" +echo "── System Services ──" +run_in_vm systemctl list-units --type=service --state=running --no-pager | \ + grep -E 'NetworkManager|sshd|seatd|getty|cage|systemd-logind' || true - # ALSA devices - echo -e "\n${BOLD}── ALSA Devices (aplay -l) ──${NC}" - vm_ssh "aplay -l 2>/dev/null || echo 'No ALSA devices'" 2>/dev/null || warn "Could not query ALSA" +echo "" +echo "── User Services (PipeWire) ──" +run_in_vm systemctl --user list-units --type=service --state=running --no-pager | \ + grep -E 'pipewire|wireplumber|pulse' || echo "No user services running" - # PulseAudio sinks - echo -e "\n${BOLD}── PulseAudio Sinks (pactl) ──${NC}" - vm_ssh "pactl list sinks short 2>/dev/null || echo 'pactl not available'" 2>/dev/null || warn "Could not query PulseAudio" +echo "" +echo "── PipeWire Devices (wpctl status) ──" +run_in_vm wpctl status 2>/dev/null || echo "wpctl not available" - # Network devices - echo -e "\n${BOLD}── Network Devices ──${NC}" - vm_ssh "nmcli device status 2>/dev/null || echo 'nmcli not available'" 2>/dev/null || warn "Could not query network" +echo "" +echo "── ALSA Devices (aplay -l) ──" +run_in_vm aplay -l 2>/dev/null || echo "No ALSA devices" - # Running processes - echo -e "\n${BOLD}── Key Processes ──${NC}" - vm_ssh "ps aux | grep -E 'rhemawave|cage|pipewire|wireplumber|NetworkManager' | grep -v grep || echo 'No matching processes'" 2>/dev/null || warn "Could not query processes" +echo "" +echo "── PulseAudio Sinks (pactl) ──" +run_in_vm pactl list sinks short 2>/dev/null || echo "pactl not available" - # Kiosk session - echo -e "\n${BOLD}── Login Sessions ──${NC}" - vm_ssh "loginctl list-sessions --no-pager 2>/dev/null || echo 'loginctl not available'" 2>/dev/null || warn "Could not query sessions" +echo "" +echo "── Network Devices ──" +run_in_vm nmcli device status 2>/dev/null || echo "nmcli not available" - # App log (last 30 lines) - echo -e "\n${BOLD}── App Log (/tmp/kiosk.log, last 30 lines) ──${NC}" - vm_ssh "tail -30 /tmp/kiosk.log 2>/dev/null || echo 'No log file yet'" 2>/dev/null || warn "Could not read app log" +echo "" +echo "── Key Processes ──" +run_in_vm ps aux | \ + grep -E 'rhemawave|cage|pipewire|wireplumber|NetworkManager' | \ + grep -v grep || echo "No matching processes" +echo "" +echo "── Login Sessions ──" +run_in_vm loginctl list-sessions --no-pager 2>/dev/null || echo "loginctl not available" + +echo "" +echo "── App Log (last 30 lines) ──" +run_in_vm tail -30 /tmp/kiosk.log 2>/dev/null || echo "No log file yet" +DIAGEOF + + if [[ "$PLATFORM" == "linux" ]]; then + bash "$diag_script" + else + # Upload and run on remote server + local remote_diag="/tmp/radiantwave-diagnose-$$.sh" + scp -q "$diag_script" "$REMOTE:$remote_diag" + ssh "$REMOTE" "nix-shell -p sshpass --run 'bash $remote_diag'; rm -f $remote_diag" + fi + + rm -f "$diag_script" hr }