From 4ed34379836efa1a1db391639a2bf6f4b955607c Mon Sep 17 00:00:00 2001 From: Kroese Date: Tue, 28 May 2024 16:39:57 +0200 Subject: [PATCH] fix: Refactor code for legacy machines (#548) --- src/define.sh | 164 ++++++++++++++++++++++++------------------------- src/install.sh | 58 +++++------------ 2 files changed, 96 insertions(+), 126 deletions(-) diff --git a/src/define.sh b/src/define.sh index 677187b..c9e776a 100644 --- a/src/define.sh +++ b/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 diff --git a/src/install.sh b/src/install.sh index e4af65f..e4abb25 100644 --- a/src/install.sh +++ b/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}" \