#!/bin/bash
# boot-test-proxmox.sh <qcow2_artefato> <uefi|bios> [vmid] [node_ip]
#
# Boota o disco numa VM Proxmox para validar ANTES de subir ~140 GiB para a WCI.
#
# Dois modos, de proposito -- para separar as variaveis:
#   uefi : disco ainda GPT. Prova se o Windows boota em KVM com o viostor
#          injetado pelo virt-v2v. Isola a questao "virtio funciona?".
#   bios : depois do fix-boot (GPT->MBR). SeaBIOS e o MESMO firmware da WCI.
#          Isola a questao "a conversao do boot record funcionou?".
#
# O artefato NAO e bootado direto: o Windows escreve no disco ao subir, o que
# alteraria o arquivo que vamos enviar. Bootamos um OVERLAY que tem o artefato
# como backing file; o original fica intocado.
#
# Disco vai em VIRTIO-BLK porque foi viostor.sys (virtio-blk) que o virt-v2v
# instalou -- vioscsi NAO foi. Anexar em virtio-scsi daria 7B.
# Sem rede, para o clone nao conversar com nada enquanto sobe.
set -o pipefail
ART="${1:?uso: $0 <qcow2> <uefi|bios> [vmid] [node]}"
MODO="${2:?informe uefi ou bios}"
VMID="${3:-5013}"
NODE="${4:-192.168.100.14}"

case "$MODO" in
  uefi) BIOSARG="--bios ovmf"; EFI=1 ;;
  bios) BIOSARG="--bios seabios"; EFI=0 ;;
  *) echo "modo invalido: $MODO"; exit 1 ;;
esac

no() { ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o BatchMode=yes root@"$NODE" "$@"; }

echo "=== $(date -u) boot-test modo=$MODO vmid=$VMID node=$NODE ==="
[ -s "$ART" ] || { echo "ABORT: artefato inexistente/vazio"; exit 1; }
ART_NO=$(echo "$ART" | sed 's#^/NFS01#/mnt/pve/NFS01#')
no "test -s '$ART_NO'" || { echo "ABORT: o no nao enxerga $ART_NO"; exit 1; }

echo "--- limpando teste anterior ---"
no "qm stop $VMID 2>/dev/null; sleep 3; qm destroy $VMID --purge 2>/dev/null; rm -rf /mnt/pve/NFS01/images/$VMID" >/dev/null 2>&1 || true
sleep 2

echo "--- overlay (artefato permanece intocado como backing) ---"
no "mkdir -p /mnt/pve/NFS01/images/$VMID && \
    qemu-img create -f qcow2 -F qcow2 -b '$ART_NO' \
      /mnt/pve/NFS01/images/$VMID/vm-$VMID-disk-0.qcow2" >/dev/null \
  || { echo "ABORT: falha no overlay"; exit 2; }

echo "--- criando VM ($MODO, disco em virtio-blk) ---"
no "qm create $VMID --name DEVTHOMSON-BOOTTEST-$MODO --memory 8192 --cores 4 \
      --sockets 1 --ostype win11 $BIOSARG --machine pc --vga std \
      --virtio0 NFS01:$VMID/vm-$VMID-disk-0.qcow2 \
      --boot order=virtio0 --onboot 0" \
  || { echo "ABORT: qm create falhou"; exit 3; }

if [ "$EFI" = "1" ]; then
  echo "--- UEFI precisa de efidisk ---"
  no "qm set $VMID --efidisk0 NFS01:0,efitype=4m,pre-enrolled-keys=0" \
    || { echo "ABORT: efidisk falhou"; exit 3; }
fi

echo "--- ligando ---"
no "qm start $VMID" || { echo "ABORT: qm start falhou"; exit 4; }

for T in 45 45 60; do
  sleep $T
  echo "--- t+$(date -u +%H:%M:%S) ---"
  no "qm status $VMID --verbose 2>/dev/null | grep -E '^(status|cpu|diskread|diskwrite|netout|mem):'" || true
done

echo "--- screendump ---"
no "echo 'screendump /tmp/scr-$VMID.ppm' | qm monitor $VMID" >/dev/null 2>&1 || true
sleep 3
no "ls -la /tmp/scr-$VMID.ppm" || echo "sem screendump"
echo
echo "traga a tela com:"
echo "  ssh -i ~/.ssh/id_rsa root@$NODE 'cat /tmp/scr-$VMID.ppm' > /tmp/scr-$VMID.ppm"
