From 2de40c4cad93977cd9790d05a57477fa5bda7198 Mon Sep 17 00:00:00 2001 From: Kroese Date: Fri, 10 May 2024 01:32:41 +0200 Subject: [PATCH] feat: Switch between install modes --- src/install.sh | 139 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 94 insertions(+), 45 deletions(-) diff --git a/src/install.sh b/src/install.sh index 8c63540..a1629d9 100644 --- a/src/install.sh +++ b/src/install.sh @@ -59,10 +59,11 @@ startInstall() { if [ -f "$ISO" ] && [ -s "$ISO" ]; then - # Check if the ISO was already processed by our script local magic local auto="16" local manual="17" + + # Check if the ISO was already processed by our script magic=$(dd if="$ISO" seek=0 bs=1 count=1 status=none | tr -d '\000') magic="$(printf '%s' "$magic" | od -A n -t x1 -v | tr -d ' \n')" @@ -182,19 +183,18 @@ detectCustom() { base="${VERSION/\/storage\//}" [[ "$base" == "."* ]] && base="${file:1}" [[ "$base" == *"/"* ]] && base="" - [ -n "$base" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$base" -printf "%f\n" | head -n 1) + [ -n "$base" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$base" | head -n 1) fi - [ -z "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.iso -printf "%f\n" | head -n 1) - [ -z "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.img -printf "%f\n" | head -n 1) - [ -n "$file" ] && file="$STORAGE/$file" + [ -z "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.iso | head -n 1) + [ -z "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.img | head -n 1) base="/custom.iso" [ -f "$base" ] && [ -s "$base" ] && file="$base" - [ -z "$file" ] && return 0 - [ ! -f "$file" ] && return 0 - [ ! -s "$file" ] && return 0 + if [ ! -f "$file" ] || [ ! -s "$file" ]; then + return 0 + fi size="$(stat -c%s "$file")" [ -z "$size" ] || [[ "$size" == "0" ]] && return 0 @@ -507,20 +507,20 @@ extractESD() { fi local esdImageCount - esdImageCount=$(wimlib-imagex info "${iso}" | awk '/Image Count:/ {print $3}') + esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}') - wimlib-imagex apply "$iso" 1 "${dir}" --quiet 2>/dev/null || { + wimlib-imagex apply "$iso" 1 "$dir" --quiet 2>/dev/null || { retVal=$? error "Extracting $desc bootdisk failed" && return $retVal } - local bootWimFile="${dir}/sources/boot.wim" - local installWimFile="${dir}/sources/install.wim" + local bootWimFile="$dir/sources/boot.wim" + local installWimFile="$dir/sources/install.wim" local msg="Extracting $desc environment..." info "$msg" && html "$msg" - wimlib-imagex export "${iso}" 2 "${bootWimFile}" --compress=LZX --chunk-size 32K --quiet || { + wimlib-imagex export "$iso" 2 "$bootWimFile" --compress=LZX --chunk-size 32K --quiet || { retVal=$? error "Adding WinPE failed" && return ${retVal} } @@ -528,7 +528,7 @@ extractESD() { local msg="Extracting $desc setup..." info "$msg" && html "$msg" - wimlib-imagex export "${iso}" 3 "$bootWimFile" --compress=LZX --chunk-size 32K --boot --quiet || { + wimlib-imagex export "$iso" 3 "$bootWimFile" --compress=LZX --chunk-size 32K --boot --quiet || { retVal=$? error "Adding Windows Setup failed" && return ${retVal} } @@ -550,11 +550,11 @@ extractESD() { fi for (( imageIndex=4; imageIndex<=esdImageCount; imageIndex++ )); do - imageEdition=$(wimlib-imagex info "${iso}" ${imageIndex} | grep '^Description:' | sed 's/Description:[ \t]*//') + imageEdition=$(wimlib-imagex info "$iso" ${imageIndex} | grep '^Description:' | sed 's/Description:[ \t]*//') [[ "${imageEdition,,}" != "${edition,,}" ]] && continue - wimlib-imagex export "${iso}" ${imageIndex} "${installWimFile}" --compress=LZMS --chunk-size 128K --quiet || { + wimlib-imagex export "$iso" ${imageIndex} "$installWimFile" --compress=LZMS --chunk-size 128K --quiet || { retVal=$? - error "Addition of ${imageIndex} to the $desc image failed" && return $retVal + error "Addition of $imageIndex to the $desc image failed" && return $retVal } return 0 done @@ -644,12 +644,28 @@ getPlatform() { return 0 } +hasVersion() { + + local id="$1" + local tag="$2" + local xml="$3" + local edition + + [ ! -f "/run/assets/$id.xml" ] && return 1 + + edition=$(printEdition "$id" "") + [ -z "$edition" ] && return 1 + [[ "${xml,,}" != *"<${tag,,}>${edition,,}"* ]] && return 1 + + return 0 +} + selectVersion() { local tag="$1" local xml="$2" local platform="$3" - local id find name prefer + local id name prefer name=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$xml") [[ "$name" == *"Operating System"* ]] && name="" @@ -659,22 +675,13 @@ selectVersion() { [ -z "$id" ] && warn "Unknown ${tag,,}: '$name'" && return 0 prefer="$id-enterprise" - [ -f "/run/assets/$prefer.xml" ] && find=$(printEdition "$prefer" "") || find="" - if [ -n "$find" ] && [[ "${xml,,}" == *"<${tag,,}>${find,,}"* ]]; then - echo "$prefer" && return 0 - fi + hasVersion "$prefer" "$tag" "$xml" && echo "$prefer" && return 0 prefer="$id-ultimate" - [ -f "/run/assets/$prefer.xml" ] && find=$(printEdition "$prefer" "") || find="" - if [ -n "$find" ] && [[ "${xml,,}" == *"<${tag,,}>${find,,}"* ]]; then - echo "$prefer" && return 0 - fi + hasVersion "$prefer" "$tag" "$xml" && echo "$prefer" && return 0 prefer="$id" - [ -f "/run/assets/$prefer.xml" ] && find=$(printEdition "$prefer" "") || find="" - if [ -n "$find" ] && [[ "${xml,,}" == *"<${tag,,}>${find,,}"* ]]; then - echo "$prefer" && return 0 - fi + hasVersion "$prefer" "$tag" "$xml" && echo "$prefer" && return 0 prefer=$(getVersion "$name" "$platform") @@ -733,6 +740,7 @@ detectImage() { [[ "${DETECTED,,}" == "winxp"* ]] && return 0 if ! setXML "" && [[ "$MANUAL" != [Yy1]* ]]; then + MANUAL="Y" desc=$(printEdition "$DETECTED" "this version") warn "the answer file for $desc was not found ($DETECTED.xml), $FB." fi @@ -775,7 +783,8 @@ detectImage() { if setXML "" || [[ "$MANUAL" == [Yy1]* ]]; then info "${msg}!" else - warn "${msg}, $FB" + MANUAL="Y" + warn "${msg}, $FB." fi return 0 fi @@ -791,6 +800,7 @@ detectImage() { if setXML "$fallback" || [[ "$MANUAL" == [Yy1]* ]]; then [[ "$MANUAL" != [Yy1]* ]] && warn "${msg}." else + MANUAL="Y" warn "${msg}, $FB." fi @@ -831,17 +841,31 @@ prepareImage() { return 1 } +isOurs() { + + local asset="$1" + + [ ! -f "$asset" ] && return 1 + grep -q Dockur "$asset" && return 0 + grep -q NetKVM "$asset" && return 0 + + return 1 +} + updateImage() { local dir="$1" local asset="$2" - local path src loc xml index result + local file="autounattend.xml" + local desc path src loc xml index result - [[ "$MANUAL" == [Yy1]* ]] && return 0 - [ ! -s "$asset" ] || [ ! -f "$asset" ] && return 0 - - path=$(find "$dir" -maxdepth 1 -type f -iname autounattend.xml | head -n 1) - [ -n "$path" ] && cp "$asset" "$path" + if [ ! -s "$asset" ] || [ ! -f "$asset" ]; then + asset="" + if [[ "$MANUAL" != [Yy1]* ]]; then + MANUAL="Y" + warn "no answer file provided, $FB." + fi + fi src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1) @@ -858,9 +882,6 @@ updateImage() { warn "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1 fi - xml=$(basename "$asset") - info "Adding $xml for automatic installation..." - index="1" result=$(wimlib-imagex info -xml "$loc" | tr -d '\000') @@ -868,8 +889,36 @@ updateImage() { index="2" fi - if ! wimlib-imagex update "$loc" "$index" --command "add $asset /autounattend.xml" > /dev/null; then - warn "failed to add answer file ($xml) to ISO image, $FB" && return 1 + if [[ "$MANUAL" != [Yy1]* ]]; then + + xml=$(basename "$asset") + info "Adding $xml for automatic installation..." + + if ! wimlib-imagex update "$loc" "$index" --command "add $asset /$file" > /dev/null; then + MANUAL="Y" + warn "failed to add answer file ($xml) to ISO image, $FB" + fi + + fi + + if [[ "$MANUAL" == [Yy1]* ]]; then + + if ! wimlib-imagex update "$loc" "$index" --command "delete --force /$file" > /dev/null; then + warn "failed to remove answer file (autounattend.xml) from ISO image!" + fi + + fi + + local find="$file" + [[ "$MANUAL" == [Yy1]* ]] && find="$find.org" + path=$(find "$dir" -maxdepth 1 -type f -iname "$find" | head -n 1) + + if [ -f "$path" ]; then + if [[ "$MANUAL" != [Yy1]* ]]; then + mv -f "$path" "$path.org" + else + mv -f "$path" "${path/.org/}" + fi fi return 0 @@ -974,7 +1023,7 @@ buildImage() { [ -s "$log" ] && error="$(<"$log")" [[ "$error" != "$hide" ]] && echo "$error" - mv "$out" "$BOOT" + ! mv -f "$out" "$BOOT" && return 1 return 0 } @@ -1025,10 +1074,10 @@ bootWindows() { BOOT_MODE="windows_secure" echo "$BOOT_MODE" > "$STORAGE/windows.mode" if [ -f "$STORAGE/windows.rom" ] && [ ! -f "$STORAGE/$BOOT_MODE.rom" ]; then - mv "$STORAGE/windows.rom" "$STORAGE/$BOOT_MODE.rom" + mv -f "$STORAGE/windows.rom" "$STORAGE/$BOOT_MODE.rom" fi if [ -f "$STORAGE/windows.vars" ] && [ ! -f "$STORAGE/$BOOT_MODE.vars" ]; then - mv "$STORAGE/windows.vars" "$STORAGE/$BOOT_MODE.vars" + mv -f "$STORAGE/windows.vars" "$STORAGE/$BOOT_MODE.vars" fi fi fi