diff --git a/src/answer.sh b/src/answer.sh index 273fc199..068cb3e9 100644 --- a/src/answer.sh +++ b/src/answer.sh @@ -1557,49 +1557,4 @@ legacyInstall() { return 0 } -legacyPrepare() { - - local iso="$1" - local dir="$2" - local desc="$3" - - local tmp="$TMP/boot-images" - local image="$tmp/eltorito_img1_bios.img" - - ETFS="boot.img" - [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0 - - rm -f "$dir/$ETFS" || return 1 - rm -rf "$tmp" || return 1 - - LC_ALL=C xorriso \ - -no_rc \ - -osirrox on \ - -indev "$iso" \ - -extract_boot_images "$tmp" >/dev/null 2>&1 || { - local rc=$? - rm -rf "$tmp" || true - - (( rc > 128 )) && exit "$rc" - - error "Failed to extract boot image from $desc ISO!" - return 1 - } - - if [ ! -s "$image" ]; then - rm -rf "$tmp" || true - error "Failed to locate BIOS boot image in $desc ISO!" - return 1 - fi - - if ! mv -f "$image" "$dir/$ETFS"; then - rm -rf "$tmp" || true - error "Failed to save boot image from $desc ISO!" - return 1 - fi - - rm -rf "$tmp" || return 1 - return 0 -} - return 0 diff --git a/src/define.sh b/src/define.sh index 44b401ed..7425edd0 100644 --- a/src/define.sh +++ b/src/define.sh @@ -11,6 +11,7 @@ set -Eeuo pipefail : "${EDITION:=""}" : "${MANUAL:=""}" : "${REMOVE:=""}" +: "${REBUILD:="N"}" : "${VERSION:=""}" : "${COMMAND:=""}" : "${DETECTED:=""}" diff --git a/src/image.sh b/src/image.sh index e7f1b495..ba6527e0 100644 --- a/src/image.sh +++ b/src/image.sh @@ -951,3 +951,65 @@ EOF return 0 } + +extractBootImage() { + + local iso="$1" + local dir="$2" + local desc="$3" + + local tmp="$TMP/boot-images" + local image="$tmp/eltorito_img1_bios.img" + local max_size=$((32 * 1024 * 1024)) + + ETFS="boot.img" + [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0 + + rm -f "$dir/$ETFS" || return 1 + rm -rf "$tmp" || return 1 + + LC_ALL=C xorriso \ + -no_rc \ + -osirrox on \ + -indev "$iso" \ + -extract_boot_images "$tmp" >/dev/null 2>&1 || { + local rc=$? + rm -rf "$tmp" || true + + (( rc > 128 )) && exit "$rc" + + error "Failed to extract boot image from $desc ISO!" + return 1 + } + + if [ ! -s "$image" ]; then + rm -rf "$tmp" || true + error "Failed to locate BIOS boot image in $desc ISO!" + return 1 + fi + + local size + + if ! size=$(stat -c%s "$image"); then + rm -rf "$tmp" || true + error "Failed to determine BIOS boot image size in $desc ISO!" + return 1 + fi + + if (( size > max_size )); then + rm -rf "$tmp" || true + error "The BIOS boot image in $desc ISO exceeds 32 MB!" + return 1 + fi + + if ! mv -f "$image" "$dir/$ETFS"; then + rm -rf "$tmp" || true + error "Failed to save boot image from $desc ISO!" + return 1 + fi + + rm -rf "$tmp" || return 1 + return 0 +} + +return 0 diff --git a/src/install.sh b/src/install.sh index 11290344..a08df391 100644 --- a/src/install.sh +++ b/src/install.sh @@ -769,26 +769,29 @@ prepareImage() { desc=$(printVariant "$DETECTED" "$DETECTED") + # Adjust QEMU machine configuration for legacy versions setMachine "$DETECTED" "$iso" "$dir" "$desc" || return 1 + + disabled "$REBUILD" && return 0 skipVersion "$DETECTED" && return 0 - if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then + if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then - [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && - [ -f "$dir/$EFISYS" ] && [ -s "$dir/$EFISYS" ] && return 0 + extractBootImage "$iso" "$dir" "$desc" && return 0 - missing=$(basename "$dir/$EFISYS") - if [ ! -f "$dir/$ETFS" ] || [ ! -s "$dir/$ETFS" ]; then - missing=$(basename "$dir/$ETFS") - fi - - error "Failed to locate file \"${missing,,}\" in ISO image!" + error "Failed to extract boot image from ISO image \"${iso}\"!" return 1 fi - legacyPrepare "$iso" "$dir" "$desc" && return 0 + [ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && + [ -f "$dir/$EFISYS" ] && [ -s "$dir/$EFISYS" ] && return 0 - error "Failed to extract boot image from ISO image!" + missing=$(basename "$dir/$EFISYS") + if [ ! -f "$dir/$ETFS" ] || [ ! -s "$dir/$ETFS" ]; then + missing=$(basename "$dir/$ETFS") + fi + + error "Failed to locate file \"${missing,,}\" in ISO image!" return 1 } @@ -962,6 +965,11 @@ updateImage() { local dat="${xml//.xml/.dat}" local desc path src wim name info + if disabled "$REBUILD"; then + info "Skipping modifications to the installation image..." + return 1 + fi + skipVersion "${DETECTED,,}" && return 0 if [ ! -s "$asset" ] || [ ! -f "$asset" ]; then