Browse Source

fix: Refactor code for legacy machines (#548)

Kroese 1 year ago
parent
commit
4ed3437983
2 changed files with 96 additions and 126 deletions
  1. 80 84
      src/define.sh
  2. 16 42
      src/install.sh

+ 80 - 84
src/define.sh

@@ -1977,78 +1977,6 @@ migrateFiles() {
   return 0
 }
 
-skipVersion() {
-
-  local version="$1"
-
-  case "${version,,}" in
-    "win2003"* | "win2k"* | "winxp"* | "win9"* )
-      return 0
-      ;;
-  esac
-
-  return 1
-}
-
-detectLegacy() {
-
-  local dir="$1"
-  local find find2 desc
-
-  find=$(find "$dir" -maxdepth 1 -type d -iname win95 | head -n 1)
-
-  if [ -n "$find" ]; then
-    DETECTED="win95"
-    desc=$(printEdition "$DETECTED" "Windows 95")
-    info "Detected: $desc" && return 0
-  fi
-
-  find=$(find "$dir" -maxdepth 1 -type d -iname win98 | head -n 1)
-
-  if [ -n "$find" ]; then
-    DETECTED="win98"
-    desc=$(printEdition "$DETECTED" "Windows 98")
-    info "Detected: $desc" && return 0
-  fi
-
-  find=$(find "$dir" -maxdepth 1 -type d -iname win9x | head -n 1)
-
-  if [ -n "$find" ]; then
-    DETECTED="win9x"
-    desc=$(printEdition "$DETECTED" "Windows ME")
-    info "Detected: $desc" && return 0
-  fi
-
-  find=$(find "$dir" -maxdepth 1 -type d -iname win51 | head -n 1)
-  find2=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm | head -n 1)
-
-  if [ -n "$find" ] || [ -n "$find2" ] || [ -f "$dir/WIN51AP" ] || [ -f "$dir/WIN51IC" ]; then
-    [ -d "$dir/AMD64" ] && DETECTED="winxpx64" || DETECTED="winxpx86"
-    desc=$(printEdition "$DETECTED" "Windows XP")
-    info "Detected: $desc" && return 0
-  fi
-
-  if [ -f "$dir/CDROM_NT.5" ]; then
-    DETECTED="win2k"
-    desc=$(printEdition "$DETECTED" "Windows 2000")
-    info "Detected: $desc" && return 0
-  fi
-
-  if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then
-    DETECTED="win2003r2"
-    desc=$(printEdition "$DETECTED" "Windows Server 2003")
-    info "Detected: $desc" && return 0
-  fi
-
-  if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then
-    DETECTED="win2003r2"
-    desc=$(printEdition "$DETECTED" "Windows Server 2003")
-    info "Detected: $desc" && return 0
-  fi
-
-  return 1
-}
-
 prepareInstall() {
 
   local dir="$2"
@@ -2363,28 +2291,96 @@ prepareLegacy() {
   return 1
 }
 
-prepare9x() {
+detectLegacy() {
 
-  local dir="$2"
-  local desc="$3"
+  local dir="$1"
+  local find find2
 
-  ETFS="[BOOT]/Boot-1.44M.img"
-  [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
+  find=$(find "$dir" -maxdepth 1 -type d -iname win95 | head -n 1)
+  [ -n "$find" ] && DETECTED="win95" && return 0
+
+  find=$(find "$dir" -maxdepth 1 -type d -iname win98 | head -n 1)
+  [ -n "$find" ] && DETECTED="win98" && return 0
+
+  find=$(find "$dir" -maxdepth 1 -type d -iname win9x | head -n 1)
+  [ -n "$find" ] && DETECTED="win9x" && return 0
+
+  find=$(find "$dir" -maxdepth 1 -type f -iname cdrom_nt.5 | head -n 1)
+  [ -n "$find" ] && DETECTED="win2k" && return 0
+
+  find=$(find "$dir" -maxdepth 1 -type d -iname win51 | head -n 1)
+  find2=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm | head -n 1)
+
+  if [ -n "$find" ] || [ -n "$find2" ] || [ -f "$dir/WIN51AP" ] || [ -f "$dir/WIN51IC" ]; then
+    [ -d "$dir/AMD64" ] && DETECTED="winxpx64" && return 0
+    DETECTED="winxpx86" && return 0
+  fi
+
+  if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then
+    DETECTED="win2003r2" && return 0
+  fi
+
+  if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then
+    DETECTED="win2003r2" && return 0
+  fi
 
-  error "Failed to locate file \"$ETFS\" in $desc ISO image!"
   return 1
 }
 
-prepare2k() {
+skipVersion() {
 
-  local dir="$2"
-  local desc="$3"
+  local id="$1"
 
-  ETFS="[BOOT]/Boot-NoEmul.img"
-  [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
+  case "${id,,}" in
+    "win9"* | "winxp"* | "win2k"* | "win2003"* )
+      return 0 ;;
+  esac
 
-  error "Failed to locate file \"$ETFS\" in $desc ISO image!"
   return 1
 }
 
+setMachine() {
+
+  local id="$1"
+  local iso="$2"
+  local dir="$3"
+  local desc="$4"
+
+  case "${id,,}" in
+    "win9"* | "win2k"* )
+      MACHINE="pc-i440fx-2.4" ;;
+    "winxp"* | "win2003"* | "winvistax86"* | "win7x86"* )
+      MACHINE="pc-q35-2.10" ;;
+  esac
+
+  case "${id,,}" in
+    "win9"* | "win2k"* | "winxp"* | "win2003"* )
+      HV="N"
+      BOOT_MODE="windows_legacy" ;;
+    "winvista"* | "win7"* | "win2008"* )
+      BOOT_MODE="windows_legacy" ;;
+  esac
+
+  case "${id,,}" in
+    "win9"* )
+      DISK_TYPE="auto"
+      ETFS="[BOOT]/Boot-1.44M.img" ;;
+    "win2k"* )
+      DISK_TYPE="auto"
+      ETFS="[BOOT]/Boot-NoEmul.img" ;;
+    "winxp"* )
+      DISK_TYPE="blk"
+      if ! prepareXP "$iso" "$dir" "$desc"; then
+        error "Failed to prepare $desc ISO!" && return 1
+      fi ;;
+    "win2003"* )
+      DISK_TYPE="blk"
+      if ! prepare2k3 "$iso" "$dir" "$desc"; then
+        error "Failed to prepare $desc ISO!" && return 1
+      fi ;;
+  esac
+
+  return 0
+}
+
 return 0

+ 16 - 42
src/install.sh

@@ -515,7 +515,12 @@ detectImage() {
   fi
 
   info "Detecting version from ISO image..."
-  detectLegacy "$dir" && return 0
+
+  if detectLegacy "$dir"; then
+    desc=$(printEdition "$DETECTED" "$DETECTED")
+    info "Detected: $desc"
+    return 0
+  fi
 
   local src wim info
   src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
@@ -579,39 +584,8 @@ prepareImage() {
 
   desc=$(printVersion "$DETECTED" "$DETECTED")
 
-  case "${DETECTED,,}" in
-    "win9"* | "win2k"* )
-      MACHINE="pc-i440fx-2.4" ;;
-    "winvistax86"* | "win7x86"* | "winxp"* | "win2003"* )
-      MACHINE="pc-q35-2.10" ;;
-  esac
-
-  case "${DETECTED,,}" in
-    "win9"* | "win2k"* | "winxp"* | "win2003"* )
-      HV="N"
-      BOOT_MODE="windows_legacy" ;;
-    "winvista"* | "win7"* | "win2008"* )
-      BOOT_MODE="windows_legacy" ;;
-  esac
-
-  case "${DETECTED,,}" in
-    "win9"* )
-      DISK_TYPE="auto"
-      prepare9x "$iso" "$dir" "$desc" && return 0
-      error "Failed to prepare $desc ISO!" && return 1 ;;
-    "win2k"* )
-      DISK_TYPE="auto"
-      prepare2k "$iso" "$dir" "$desc" && return 0
-      error "Failed to prepare $desc ISO!" && return 1 ;;
-    "winxp"* )
-      DISK_TYPE="blk"
-      prepareXP "$iso" "$dir" "$desc" && return 0
-      error "Failed to prepare $desc ISO!" && return 1 ;;
-    "win2003"* )
-      DISK_TYPE="blk"
-      prepare2k3 "$iso" "$dir" "$desc" && return 0
-      error "Failed to prepare $desc ISO!" && return 1 ;;
-  esac
+  ! setMachine "$DETECTED" "$iso" "$dir" "$desc" && return 1
+  skipVersion "$DETECTED" && return 0
 
   if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
 
@@ -620,13 +594,13 @@ prepareImage() {
     missing=$(basename "$dir/$EFISYS")
     [ ! -f "$dir/$ETFS" ] && missing=$(basename "$dir/$ETFS")
 
-    error "Failed to locate file \"${missing,,}\" in $desc ISO image!"
+    error "Failed to locate file \"${missing,,}\" in ISO image!"
     return 1
   fi
 
   prepareLegacy "$iso" "$dir" "$desc" && return 0
 
-  error "Failed to extract boot image from $desc ISO image!"
+  error "Failed to extract boot image from ISO image!"
   return 1
 }
 
@@ -927,10 +901,6 @@ buildImage() {
     error "File $BOOT does already exist?!" && return 1
   fi
 
-  if [ ! -f "$dir/$ETFS" ]; then
-    error "Failed to locate file \"$ETFS\" in ISO image!" && return 1
-  fi
-
   base=$(basename "$BOOT")
   local out="$TMP/${base%.*}.tmp"
   rm -f "$out"
@@ -940,6 +910,12 @@ buildImage() {
   local msg="Building $desc image..."
   info "$msg" && html "$msg"
 
+  [ -z "$LABEL" ] && LABEL="Windows"
+
+  if [ ! -f "$dir/$ETFS" ]; then
+    error "Failed to locate file \"$ETFS\" in ISO image!" && return 1
+  fi
+
   size=$(du -h -b --max-depth=0 "$dir" | cut -f1)
   size_gb=$(( (size + 1073741823)/1073741824 ))
   space=$(df --output=avail -B 1 "$TMP" | tail -n 1)
@@ -949,8 +925,6 @@ buildImage() {
     error "Not enough free space in $STORAGE, have $space_gb GB available but need at least $size_gb GB." && return 1
   fi
 
-  [ -z "$LABEL" ] && LABEL="Windows"
-
   if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
 
     ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \