Browse Source

feat: Detect architecture in ISO (#463)

Kroese 1 year ago
parent
commit
f99032312c
2 changed files with 134 additions and 74 deletions
  1. 102 69
      src/define.sh
  2. 32 5
      src/install.sh

+ 102 - 69
src/define.sh

@@ -6,9 +6,9 @@ set -Eeuo pipefail
 : "${REMOVE:=""}"
 : "${REMOVE:=""}"
 : "${VERSION:=""}"
 : "${VERSION:=""}"
 : "${DETECTED:=""}"
 : "${DETECTED:=""}"
-: "${PLATFORM:="x64"}"
 
 
 MIRRORS=5
 MIRRORS=5
+PLATFORM="x64"
 
 
 parseVersion() {
 parseVersion() {
 
 
@@ -50,14 +50,14 @@ parseVersion() {
       VERSION="winvista${PLATFORM,,}"
       VERSION="winvista${PLATFORM,,}"
       DETECTED="winvista${PLATFORM,,}-enterprise"
       DETECTED="winvista${PLATFORM,,}-enterprise"
       ;;
       ;;
-    "vistau" | "winvistau" | "windowsvistau" | "windows vistau" )
+    "vistu" | "winvistu" | "windowsvistu" | "windows vistu" )
       VERSION="winvista${PLATFORM,,}-ultimate"
       VERSION="winvista${PLATFORM,,}-ultimate"
       ;;
       ;;
-    "xp" | "xp32" | "winxp" | "windowsxp" | "windows xp" )
+    "xp" | "xp32" | "xpx86" | "winxp" | "winxp86" | "windowsxp" | "windows xp" )
       VERSION="winxpx86"
       VERSION="winxpx86"
       ;;
       ;;
-    "xp64" | "winxp64" | "windowsxp64" | "windows xp 64" )
-      VERSION="winxpx64"
+    "xp64" | "xpx64" | "winxp64" | "winxpx64" | "windowsxp64" | "windowsxpx64" )
+      VERSION="winxp${PLATFORM,,}"
       ;;
       ;;
     "22" | "2022" | "win22" | "win2022" | "windows2022" | "windows 2022" )
     "22" | "2022" | "win22" | "win2022" | "windows2022" | "windows 2022" )
       VERSION="win2022-eval"
       VERSION="win2022-eval"
@@ -146,75 +146,39 @@ printEdition() {
   [[ "$result" == "x" ]] && echo "$desc" && return 0
   [[ "$result" == "x" ]] && echo "$desc" && return 0
 
 
   case "${id,,}" in
   case "${id,,}" in
-    "win7${PLATFORM,,}-home"* )
-      edition="Home"
-      ;;
-    "win7${PLATFORM,,}-starter"* )
-      edition="Starter"
-      ;;
-    "win7${PLATFORM,,}-ultimate"* )
-      edition="Ultimate"
-      ;;
-    "win7${PLATFORM,,}-enterprise"* )
-      edition="Enterprise"
-      ;;
-    "win7"* )
-      edition="Professional"
-      ;;
-    "win8${PLATFORM,,}-enterprise"* )
-      edition="Enterprise"
-      ;;
-    "win8"* )
-      edition="Pro"
-      ;;
-    "win10${PLATFORM,,}-iot"* )
+    *"-iot" )
       edition="IoT"
       edition="IoT"
       ;;
       ;;
-    "win10${PLATFORM,,}-ltsc"* )
+    *"-ltsc" )
       edition="LTSC"
       edition="LTSC"
       ;;
       ;;
-    "win10${PLATFORM,,}-home"* )
+    *"-home" )
       edition="Home"
       edition="Home"
       ;;
       ;;
-    "win10${PLATFORM,,}-education"* )
-      edition="Education"
-      ;;
-    "win10${PLATFORM,,}-enterprise"* )
-      edition="Enterprise"
-      ;;
-    "win10"* )
-      edition="Pro"
+    *"-starter" )
+      edition="Starter"
       ;;
       ;;
-    "win11${PLATFORM,,}-iot"* )
-      edition="IoT"
+    *"-ultimate" )
+      edition="Ultimate"
       ;;
       ;;
-    "win11${PLATFORM,,}-home"* )
-      edition="Home"
+    *"-enterprise" )
+      edition="Enterprise"
       ;;
       ;;
-    "win11${PLATFORM,,}-education"* )
+    *"-education" )
       edition="Education"
       edition="Education"
       ;;
       ;;
-    "win11${PLATFORM,,}-enterprise"* )
-      edition="Enterprise"
+    *"-enterprise-eval" )
+      edition="Enterprise (Evaluation)"
       ;;
       ;;
-    "win11"* )
+    "win7"* )
+      edition="Professional"
+      ;;
+    "win8"* | "win10"* | "win11"* )
       edition="Pro"
       edition="Pro"
       ;;
       ;;
     "winxp"* )
     "winxp"* )
       edition="Professional"
       edition="Professional"
       ;;
       ;;
-    "winvista${PLATFORM,,}-home"* )
-      edition="Home"
-      ;;
-    "winvista${PLATFORM,,}-starter"* )
-      edition="Starter"
-      ;;
-    "winvista${PLATFORM,,}-ultimate"* )
-      edition="Ultimate"
-      ;;
-    "winvista${PLATFORM,,}-enterprise"* )
-      edition="Enterprise"
-      ;;
     "winvista"* )
     "winvista"* )
       edition="Business"
       edition="Business"
       ;;
       ;;
@@ -223,7 +187,6 @@ printEdition() {
       ;;
       ;;
   esac
   esac
 
 
-  [[ "${id,,}" == *"-eval" ]] && edition="$edition (Evaluation)"
   [ -n "$edition" ] && result="$result $edition"
   [ -n "$edition" ] && result="$result $edition"
 
 
   echo "$result"
   echo "$result"
@@ -235,25 +198,38 @@ fromFile() {
   local id=""
   local id=""
   local desc="$1"
   local desc="$1"
   local file="${1,,}"
   local file="${1,,}"
+  local arch="${PLATFORM,,}"
+
+  case "${file/ /_}" in
+    *"_x64_"* | *"_x64."*)
+      arch="x64"
+      ;;
+    *"_x86_"* | *"_x86."*)
+      arch="x86"
+      ;;
+    *"_arm64_"* | *"_arm64."*)
+      arch="arm64"
+      ;;
+  esac
 
 
   case "${file/ /_}" in
   case "${file/ /_}" in
     "win7"* | "win_7"* | *"windows7"* | *"windows_7"* )
     "win7"* | "win_7"* | *"windows7"* | *"windows_7"* )
-      id="win7${PLATFORM,,}"
+      id="win7${arch}"
       ;;
       ;;
     "win8"* | "win_8"* | *"windows8"* | *"windows_8"* )
     "win8"* | "win_8"* | *"windows8"* | *"windows_8"* )
-      id="win81${PLATFORM,,}"
+      id="win81${arch}"
       ;;
       ;;
     "win10"*| "win_10"* | *"windows10"* | *"windows_10"* )
     "win10"*| "win_10"* | *"windows10"* | *"windows_10"* )
-      id="win10${PLATFORM,,}"
+      id="win10${arch}"
       ;;
       ;;
     "win11"* | "win_11"* | *"windows11"* | *"windows_11"* )
     "win11"* | "win_11"* | *"windows11"* | *"windows_11"* )
-      id="win11${PLATFORM,,}"
+      id="win11${arch}"
       ;;
       ;;
     *"winxp"* | *"win_xp"* | *"windowsxp"* | *"windows_xp"* )
     *"winxp"* | *"win_xp"* | *"windowsxp"* | *"windows_xp"* )
       id="winxpx86"
       id="winxpx86"
       ;;
       ;;
     *"winvista"* | *"win_vista"* | *"windowsvista"* | *"windows_vista"* )
     *"winvista"* | *"win_vista"* | *"windowsvista"* | *"windows_vista"* )
-      id="winvista${PLATFORM,,}"
+      id="winvista${arch}"
       ;;
       ;;
     "tiny11core"* | "tiny11_core"* | "tiny_11_core"* )
     "tiny11core"* | "tiny11_core"* | "tiny_11_core"* )
       id="core11"
       id="core11"
@@ -296,6 +272,7 @@ fromName() {
 
 
   local id=""
   local id=""
   local name="$1"
   local name="$1"
+  local arch="$2"
 
 
   case "${name,,}" in
   case "${name,,}" in
     *"server 2025"* ) id="win2025" ;;
     *"server 2025"* ) id="win2025" ;;
@@ -304,11 +281,11 @@ fromName() {
     *"server 2016"* ) id="win2016" ;;
     *"server 2016"* ) id="win2016" ;;
     *"server 2012"* ) id="win2012r2" ;;
     *"server 2012"* ) id="win2012r2" ;;
     *"server 2008"* ) id="win2008r2" ;;
     *"server 2008"* ) id="win2008r2" ;;
-    *"windows 7"* ) id="win7${PLATFORM,,}" ;;
-    *"windows 8"* ) id="win81${PLATFORM,,}" ;;
-    *"windows 10"* ) id="win10${PLATFORM,,}" ;;
-    *"windows 11"* ) id="win11${PLATFORM,,}" ;;
-    *"windows vista"* ) id="winvista${PLATFORM,,}" ;;
+    *"windows 7"* ) id="win7${arch}" ;;
+    *"windows 8"* ) id="win81${arch}" ;;
+    *"windows 10"* ) id="win10${arch}" ;;
+    *"windows 11"* ) id="win11${arch}" ;;
+    *"windows vista"* ) id="winvista${arch}" ;;
   esac
   esac
 
 
   echo "$id"
   echo "$id"
@@ -319,8 +296,9 @@ getVersion() {
 
 
   local id
   local id
   local name="$1"
   local name="$1"
+  local arch="$2"
 
 
-  id=$(fromName "$name")
+  id=$(fromName "$name" "$arch")
 
 
   case "${id,,}" in
   case "${id,,}" in
     "win7"* | "winvista"* )
     "win7"* | "winvista"* )
@@ -571,11 +549,26 @@ getLink1() {
       sum="0b738b55a5ea388ad016535a5c8234daf2e5715a0638488ddd8a228a836055a1"
       sum="0b738b55a5ea388ad016535a5c8234daf2e5715a0638488ddd8a228a836055a1"
       url="$host/7/en_windows_7_with_sp1_${PLATFORM,,}.iso"
       url="$host/7/en_windows_7_with_sp1_${PLATFORM,,}.iso"
       ;;
       ;;
+    "win7x86" | "win7x86-enterprise" )
+      size=2434502656
+      sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+      url="$host/7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+      ;;
+    "win7x86-ultimate" )
+      size=2564411392
+      sum="99f3369c90160816be07093dbb0ac053e0a84e52d6ed1395c92ae208ccdf67e5"
+      url="$host/7/en_windows_7_with_sp1_x86.iso"
+      ;;
     "winvista${PLATFORM,,}-ultimate" )
     "winvista${PLATFORM,,}-ultimate" )
       size=3861460992
       size=3861460992
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       url="$host/vista/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       url="$host/vista/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       ;;
       ;;
+    "winvistax86-ultimate" )
+      size=3243413504
+      sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
+      url="$host/vista/en_windows_vista_with_sp2_x86_dvd_342266.iso"
+      ;;
     "winxpx86" )
     "winxpx86" )
       size=617756672
       size=617756672
       sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
       sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
@@ -637,6 +630,16 @@ getLink2() {
       sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
       sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
       url="$host/Windows%207/en_windows_7_ultimate_with_sp1_${PLATFORM,,}_dvd_u_677332.iso"
       url="$host/Windows%207/en_windows_7_ultimate_with_sp1_${PLATFORM,,}_dvd_u_677332.iso"
       ;;
       ;;
+    "win7x86" | "win7x86enterprise" )
+      size=2434502656
+      sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+      url="$host/Windows%207/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+      ;;
+    "win7x86-ultimate" )
+      size=2564476928
+      sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940"
+      url="$host/Windows%207/en_windows_7_ultimate_with_sp1_x86_dvd_u_677460.iso"
+      ;;
     "winvista${PLATFORM,,}" | "winvista${PLATFORM,,}-enterprise" )
     "winvista${PLATFORM,,}" | "winvista${PLATFORM,,}-enterprise" )
       size=3205953536
       size=3205953536
       sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
       sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
@@ -647,6 +650,16 @@ getLink2() {
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       url="$host/Windows%20Vista/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       url="$host/Windows%20Vista/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       ;;
       ;;
+    "winvistax86" | "winvistax86-enterprise" )
+      size=2420981760
+      sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5"
+      url="$host/Windows%20Vista/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso"
+      ;;
+    "winvistax86-ultimate" )
+      size=3243413504
+      sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
+      url="$host/Windows%20Vista/en_windows_vista_with_sp2_x86_dvd_342266.iso"
+      ;;
     "winxpx86" )
     "winxpx86" )
       size=617756672
       size=617756672
       sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
       sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
@@ -791,6 +804,16 @@ getLink4() {
       sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
       sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
       url="$host/en_windows_7_ultimate_with_sp1_${PLATFORM,,}_dvd_u_677332.iso"
       url="$host/en_windows_7_ultimate_with_sp1_${PLATFORM,,}_dvd_u_677332.iso"
       ;;
       ;;
+    "win7x86" | "win7x86enterprise" )
+      size=2434502656
+      sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+      url="$host/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+      ;;
+    "win7x86-ultimate" )
+      size=2564476928
+      sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940"
+      url="$host/en_windows_7_ultimate_with_sp1_x86_dvd_u_677460.iso"
+      ;;
     "winvista${PLATFORM,,}" | "winvista${PLATFORM,,}-enterprise" )
     "winvista${PLATFORM,,}" | "winvista${PLATFORM,,}-enterprise" )
       size=3205953536
       size=3205953536
       sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
       sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
@@ -801,6 +824,16 @@ getLink4() {
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
       url="$host/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       url="$host/en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
       ;;
       ;;
+    "winvistax86" | "winvistax86-enterprise" )
+      size=2420981760
+      sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5"
+      url="$host/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso"
+      ;;
+    "winvistax86-ultimate" )
+      size=3243413504
+      sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
+      url="$host/en_windows_vista_with_sp2_x86_dvd_342266.iso"
+      ;;
   esac
   esac
 
 
   case "${ret,,}" in
   case "${ret,,}" in

+ 32 - 5
src/install.sh

@@ -626,13 +626,14 @@ selectVersion() {
 
 
   local tag="$1"
   local tag="$1"
   local xml="$2"
   local xml="$2"
+  local platform="$3"
   local id find name prefer
   local id find name prefer
 
 
   name=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$xml")
   name=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$xml")
   [[ "$name" == *"Operating System"* ]] && name=""
   [[ "$name" == *"Operating System"* ]] && name=""
   [ -z "$name" ] && return 0
   [ -z "$name" ] && return 0
 
 
-  id=$(fromName "$name")
+  id=$(fromName "$name" "$platform")
   [ -z "$id" ] && warn "Unknown ${tag,,}: '$name'" && return 0
   [ -z "$id" ] && warn "Unknown ${tag,,}: '$name'" && return 0
 
 
   prefer="$id-enterprise"
   prefer="$id-enterprise"
@@ -653,7 +654,7 @@ selectVersion() {
     echo "$prefer" && return 0
     echo "$prefer" && return 0
   fi
   fi
 
 
-  prefer=$(getVersion "$name")
+  prefer=$(getVersion "$name" "$platform")
 
 
   echo "$prefer"
   echo "$prefer"
   return 0
   return 0
@@ -663,14 +664,40 @@ detectVersion() {
 
 
   local xml="$1"
   local xml="$1"
   local id=""
   local id=""
+  local arch=""
+  local tag="ARCH"
+  local platform="x64"
 
 
-  id=$(selectVersion "DISPLAYNAME" "$xml")
+  arch=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$xml")
+
+  case "${arch,,}" in
+    "0" )
+      platform="x86"
+      if [[ "${PLATFORM,,}" != "x64" ]]; then
+        error "You cannot boot $platform images on a $PLATFORM cpu!" && exit 67
+      fi
+      ;;
+    "9" )
+      platform="x64"
+      if [[ "${PLATFORM,,}" != "x64" ]]; then
+        error "You cannot boot $platform images on a $PLATFORM cpu!" && exit 67
+      fi
+      ;;
+    "12" )
+      platform="arm64"
+      if [[ "${PLATFORM,,}" != "arm64" ]]; then
+        error "You cannot boot ${platform^^} images on a $PLATFORM cpu!" && exit 67
+      fi
+      ;;
+  esac
+  
+  id=$(selectVersion "DISPLAYNAME" "$xml" "$platform")
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
 
 
-  id=$(selectVersion "PRODUCTNAME" "$xml")
+  id=$(selectVersion "PRODUCTNAME" "$xml" "$platform")
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
 
 
-  id=$(selectVersion "NAME" "$xml")
+  id=$(selectVersion "NAME" "$xml" "$platform")
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
   [ -n "$id" ] && [[ "${id,,}" != *"unknown"* ]] && echo "$id" && return 0
 
 
   return 0
   return 0