From 9b780e5552a464fa8b9193b871d56954d86be1ba Mon Sep 17 00:00:00 2001 From: Kroese Date: Wed, 8 May 2024 23:24:28 +0200 Subject: [PATCH] feat: Detect architecture in ISO (#101) --- src/define.sh | 32 ++++++++++++++++++++++---------- src/install.sh | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/define.sh b/src/define.sh index 5bc883b..d62eae6 100644 --- a/src/define.sh +++ b/src/define.sh @@ -6,9 +6,9 @@ set -Eeuo pipefail : "${REMOVE:=""}" : "${VERSION:=""}" : "${DETECTED:=""}" -: "${PLATFORM:="ARM64"}" MIRRORS=2 +PLATFORM="ARM64" parseVersion() { @@ -62,10 +62,7 @@ printEdition() { [[ "$result" == "x" ]] && echo "$desc" && return 0 case "${id,,}" in - "win10"* ) - edition="Pro" - ;; - "win11"* ) + "win10"* | "win11"* ) edition="Pro" ;; esac @@ -81,13 +78,26 @@ fromFile() { local id="" local desc="$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 "win10"*| "win_10"* | *"windows10"* | *"windows_10"* ) - id="win10${PLATFORM,,}" + id="win10${arch}" ;; "win11"* | "win_11"* | *"windows11"* | *"windows_11"* ) - id="win11${PLATFORM,,}" + id="win11${arch}" ;; esac @@ -103,10 +113,11 @@ fromName() { local id="" local name="$1" + local arch="$2" case "${name,,}" in - *"windows 10"* ) id="win10${PLATFORM,,}" ;; - *"windows 11"* ) id="win11${PLATFORM,,}" ;; + *"windows 10"* ) id="win10${arch}" ;; + *"windows 11"* ) id="win11${arch}" ;; esac echo "$id" @@ -117,8 +128,9 @@ getVersion() { local id local name="$1" + local arch="$2" - id=$(fromName "$name") + id=$(fromName "$arch") echo "$id" return 0 diff --git a/src/install.sh b/src/install.sh index f51df1c..a21eef2 100644 --- a/src/install.sh +++ b/src/install.sh @@ -589,13 +589,14 @@ selectVersion() { local tag="$1" local xml="$2" + local platform="$3" local id find name prefer name=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$xml") [[ "$name" == *"Operating System"* ]] && name="" [ -z "$name" ] && return 0 - id=$(fromName "$name") + id=$(fromName "$name" "$platform") [ -z "$id" ] && warn "Unknown ${tag,,}: '$name'" && return 0 prefer="$id-enterprise" @@ -616,7 +617,7 @@ selectVersion() { echo "$prefer" && return 0 fi - prefer=$(getVersion "$name") + prefer=$(getVersion "$name" "$platform") echo "$prefer" return 0 @@ -626,14 +627,40 @@ detectVersion() { local xml="$1" 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 - id=$(selectVersion "PRODUCTNAME" "$xml") + id=$(selectVersion "PRODUCTNAME" "$xml" "$platform") [ -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 return 0