Browse Source

feat: Detect SeaBIOS status (#153)

Kroese 1 year ago
parent
commit
42a5295306
1 changed files with 34 additions and 16 deletions
  1. 34 16
      src/power.sh

+ 34 - 16
src/power.sh

@@ -22,6 +22,29 @@ _trap() {
   done
 }
 
+ready() {
+
+  [ -f "$STORAGE/windows.boot" ] && return 0
+  [ ! -f "$QEMU_PTY" ] && return 1
+
+  if [ -f "$STORAGE/windows.old" ]; then
+    local last
+    local bios="Booting from Hard Disk"
+    last=$(grep "^B.*" "$QEMU_PTY" | tail -1)
+    if [[ "${last,,}" == "${bios,,}"* ]]; then
+      return 0
+    fi
+    return 1
+  fi
+
+  local line="Windows Boot Manager"
+  if grep -Fq "$line" "$QEMU_PTY"; then
+    return 0
+  fi
+
+  return 1
+}
+
 finish() {
 
   local pid
@@ -40,6 +63,14 @@ finish() {
     done
   fi
 
+  if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$STORAGE/$BASE" ]; then
+    # Remove CD-ROM ISO after install
+    if ready; then
+      rm -f "$STORAGE/$BASE"
+      touch "$STORAGE/windows.boot"
+    fi
+  fi
+
   pid="/var/run/tpm.pid"
   [ -f "$pid" ] && pKill "$(<"$pid")"
 
@@ -116,17 +147,9 @@ _graceful_shutdown() {
     finish "$code" && return "$code"
   fi
 
-  local remove_iso=""
-
-  if [ ! -f "$STORAGE/windows.old" ]; then
-    if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$QEMU_PTY" ]; then
-      if grep -Fq "Windows Boot Manager" "$QEMU_PTY"; then
-        [ -f "$STORAGE/$BASE" ] && remove_iso="y"
-      else
-        info "Cannot send ACPI signal during Windows setup, aborting..."
-        finish "$code" && return "$code"
-      fi
-    fi
+  if ! ready; then
+    info "Cannot send ACPI signal during Windows setup, aborting..."
+    finish "$code" && return "$code"
   fi
 
   # Send ACPI shutdown signal
@@ -151,11 +174,6 @@ _graceful_shutdown() {
 
   if [ "$cnt" -ge "$QEMU_TIMEOUT" ]; then
     error "Shutdown timeout reached, aborting..."
-  else
-    if [ -n "$remove_iso" ]; then
-      rm -f "$STORAGE/$BASE"
-      touch "$STORAGE/windows.boot"
-    fi
   fi
 
   finish "$code" && return "$code"