From 220dbda602bd7f2e391eeab762b5e758d8171418 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Wed, 8 Oct 2025 21:16:51 -0400 Subject: [PATCH] Add omarchy-vm --- .gitignore | 1 + bin/omarchy-vm | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100755 bin/omarchy-vm diff --git a/.gitignore b/.gitignore index 912937a..9d8a8bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ release/** +vm-saves/** diff --git a/bin/omarchy-vm b/bin/omarchy-vm new file mode 100755 index 0000000..f5cf601 --- /dev/null +++ b/bin/omarchy-vm @@ -0,0 +1,111 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +VM_DIR="$(dirname "$SCRIPT_DIR")/vm-saves" +TMP_DISK="/tmp/omarchy-iso-boot.qcow2" +TMP_OVMF="/tmp/OVMF_VARS.4m.fd" + +mkdir -p "$VM_DIR" + +save_vm() { + local name="$1" + + if [[ -z "$name" ]]; then + name=$(gum input --placeholder "Enter VM snapshot name") + [[ -z "$name" ]] && exit 1 + fi + + if [[ ! -f "$TMP_DISK" || ! -f "$TMP_OVMF" ]]; then + echo "Error: No active VM found in /tmp" + echo "Boot a VM first with: omarchy-iso-boot [iso]" + exit 1 + fi + + local vm_path="$VM_DIR/$name" + + if [[ -d "$vm_path" ]]; then + if ! gum confirm "VM '$name' exists. Overwrite?"; then + exit 0 + fi + fi + + mkdir -p "$vm_path" + + echo "Saving VM snapshot '$name'..." + cp "$TMP_DISK" "$vm_path/omarchy-iso-boot.qcow2" + cp "$TMP_OVMF" "$vm_path/OVMF_VARS.4m.fd" + + gum style --foreground 212 "✓ Saved to $vm_path" +} + +list_vms() { + if [[ ! -d "$VM_DIR" ]] || [[ -z "$(ls -A "$VM_DIR")" ]]; then + echo "No VM snapshots found" + return 1 + fi + + echo "Available VM snapshots:" + for vm in "$VM_DIR"/*; do + [[ -d "$vm" ]] && echo " • $(basename "$vm")" + done +} + +boot_vm() { + local name="$1" + + if [[ -z "$(ls -A "$VM_DIR" 2>/dev/null)" ]]; then + echo "No VM snapshots available" + exit 1 + fi + + if [[ -z "$name" ]]; then + name=$(ls -1 "$VM_DIR" | gum choose --header "Select VM to boot:") + [[ -z "$name" ]] && exit 0 + fi + + local vm_path="$VM_DIR/$name" + + if [[ ! -d "$vm_path" ]]; then + echo "Error: VM '$name' not found" + list_vms + exit 1 + fi + + if [[ -f "$TMP_DISK" ]] && ! gum confirm "Override existing /tmp VM?"; then + exit 0 + fi + + echo "Copying VM '$name' to /tmp..." + cp "$vm_path/omarchy-iso-boot.qcow2" "$TMP_DISK" + cp "$vm_path/OVMF_VARS.4m.fd" "$TMP_OVMF" + + gum style --foreground 212 "✓ VM ready. Booting..." + + exec omarchy-iso-boot /dev/null reuse +} + +case "${1:-}" in + save) + save_vm "$2" + ;; + boot) + boot_vm "$2" + ;; + list) + list_vms + ;; + *) + gum style --border rounded --padding "0 1" --border-foreground 212 \ + "$(gum style --bold 'omarchy-vm') - VM snapshot manager" \ + "" \ + "$(gum style --foreground 245 'Commands:')" \ + " save [name] Save current VM from /tmp" \ + " boot [name] Boot saved VM (interactive if no name)" \ + " list List available VMs" \ + "" \ + "$(gum style --foreground 245 'Current VMs:')" + list_vms 2>/dev/null || echo " None" + ;; +esac