From cfae3f22edd89dcb004231bad60b5dae1c051395 Mon Sep 17 00:00:00 2001
From: "Andreas B. Mundt" <andreas.mundt@steinbeisschule-reutlingen.de>
Date: Sat, 27 Jan 2024 10:05:27 +0100
Subject: [PATCH] VM chooser menu and much faster direct kernel loading.

---
 roles/lmn_vm/files/vm-netboot | 59 ++++++++++++++++++++++++++---------
 roles/lmn_vm/tasks/main.yml   |  1 +
 2 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/roles/lmn_vm/files/vm-netboot b/roles/lmn_vm/files/vm-netboot
index 19036a9..dbb13bd 100755
--- a/roles/lmn_vm/files/vm-netboot
+++ b/roles/lmn_vm/files/vm-netboot
@@ -4,27 +4,58 @@
 #
 set -eu
 
+menu=(standard "CLI Standard Debian GNU/Linux"
+      kde-desktop "KDE Plasma Desktop Debian GNU/Linux"
+      gnome-desktop "Gnome Desktop Debian GNU/Linux")
+img=$(dialog --clear --backtitle "Virtual Machine Chooser" \
+             --title "Choose the Virtual Machine to Start" \
+             --menu "Start VM:" 12 60 6 \
+             "${menu[@]}" 2>&1 >/dev/tty)
+
+if [[ -z $img ]] ; then
+    echo "Starting VM canceled."
+    exit 1
+fi
+
 mac="$(ip link | grep -A1 "vm-macvtap" | \
-	  sed -nE "s%\s+link/ether ([[:xdigit:]:]{17}) .+%\1%p")"
+          sed -nE "s%\s+link/ether ([[:xdigit:]:]{17}) .+%\1%p")"
 
 if [[ $# -eq 0 ]] ; then
     mem=$(sed -En "s/^MemTotal:\s+([0-9]+)\s+kB/\1/p" /proc/meminfo)
     cpu=$(sed -En "0,/^cpu cores/s/^cpu cores\s+:\s+([0-9]+)/\1/p" /proc/cpuinfo)
-    arg="--memory $((mem/2048)) --vcpu $((cpu/2))"
-    echo "Set options: $arg"
+    arg=("--memory=$((mem/2048))" "--vcpu=$((cpu/2))")
+    echo Set options: "${arg[@]}"
+else
+    arg=("$@")
 fi
 
-loader='/usr/share/OVMF/OVMF_CODE_4M.fd,\
-loader.readonly=yes,loader.type=pflash,\
-nvram.template=/usr/share/OVMF/OVMF_VARS_4M.fd'
+kernel="http://livebox/d-i/n-live/$img/live/vmlinuz"
+initrd="http://livebox/d-i/n-live/$img/live/initrd.img"
+kargs=(boot=live components splash locales=de_DE.UTF-8 keyboard-layouts=de \
+                 swap=true live-config.timezone=Europe/Berlin netboot=nfs \
+                 "nfsroot=10.190.1.2:/srv/nfs/debian-live/$img/")
 
 type="ethernet,mac=${mac},target.dev=vm-macvtap,xpath1.set=./target/@managed=no"
 
-XDG_CONFIG_HOME="/tmp/${UID}/.config" \
-	       exec "virt-install \
-               --name bookworm \
-               --osinfo debiantesting \
-               --nodisks --import \
-               --pxe --boot loader=$loader \
-               --network type=$type \
-	       $* ${arg:-}"
+## FIXME: use passt, needs more settings for correct DNS/gateway
+# type=user,xpath1.create=./backend,xpath2.set=./backend/@type=passt,xpath3.create=./ip,xpath4.set=./ip/@family=ipv4,xpath5.set=./ip/@address=172.16.1.1,xpath6.set=./ip/@prefix=24,xpath7.create=./portForward,xpath8.set=./portForward/@proto=tcp,xpath9.set=./portForward/range/@start=2001,xpath10.set=./portForward/range/@end=2500,xpath11.set=./portForward/range/@to=1
+
+case "$img" in
+    standard)
+	arg+=("--autoconsole=text")
+	kargs+=("console=ttyS0")
+	;;
+    *)
+	;;
+esac
+
+http_proxy='' XDG_CONFIG_HOME="/tmp/${UID}/.config" \
+          exec virt-install \
+          --name "$img" \
+          --osinfo debiantesting \
+          --nodisks --import --noreboot --transient \
+          --install kernel="$kernel",initrd="$initrd",kernel_args="${kargs[*]}" \
+          --network "type=$type" "${arg[@]}"
+
+# --filesystem "$HOME",share
+# mount -t 9p share /mnt
diff --git a/roles/lmn_vm/tasks/main.yml b/roles/lmn_vm/tasks/main.yml
index 8681ffe..7d7e1b6 100644
--- a/roles/lmn_vm/tasks/main.yml
+++ b/roles/lmn_vm/tasks/main.yml
@@ -16,6 +16,7 @@
       - ctorrent
       - libvirt-daemon-system
       - virt-manager
+      - dialog # for vm-netboot menu
     state: latest
     autoremove: true