| 
									
										
										
										
											2024-01-14 16:39:24 +01:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | set -Eeuo pipefail | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | : "${MANUAL:=""}" | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | : "${DETECTED:=""}" | 
					
						
							| 
									
										
										
										
											2024-01-14 20:32:24 +01:00
										 |  |  | : "${VERSION:="win11x64"}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | if [[ "${VERSION}" == \"*\" || "${VERSION}" == \'*\' ]]; then | 
					
						
							|  |  |  |   VERSION="${VERSION:1:-1}" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | [[ "${VERSION,,}" == "11" ]] && VERSION="win11x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win11" ]] && VERSION="win11x64" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "10" ]] && VERSION="win10x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win10" ]] && VERSION="win10x64" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "8" ]] && VERSION="win81x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "81" ]] && VERSION="win81x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "8.1" ]] && VERSION="win81x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win81" ]] && VERSION="win81x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win8" ]] && VERSION="win81x64" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | [[ "${VERSION,,}" == "7" ]] && VERSION="win7x64" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win7" ]] && VERSION="win7x64" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | [[ "${VERSION,,}" == "22" ]] && VERSION="win2022-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "2022" ]] && VERSION="win2022-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win22" ]] && VERSION="win2022-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win2022" ]] && VERSION="win2022-eval" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "19" ]] && VERSION="win2019-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "2019" ]] && VERSION="win2019-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win19" ]] && VERSION="win2019-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win2019" ]] && VERSION="win2019-eval" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "16" ]] && VERSION="win2016-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "2016" ]] && VERSION="win2016-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win16" ]] && VERSION="win2016-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win2016" ]] && VERSION="win2016-eval" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 06:05:01 +01:00
										 |  |  | [[ "${VERSION,,}" == "ltsc10" ]] && VERSION="win10x64-enterprise-ltsc-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "10ltsc" ]] && VERSION="win10x64-enterprise-ltsc-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win10-ltsc" ]] && VERSION="win10x64-enterprise-ltsc-eval" | 
					
						
							|  |  |  | [[ "${VERSION,,}" == "win10x64-ltsc" ]] && VERSION="win10x64-enterprise-ltsc-eval" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | if [[ "${VERSION,,}" == "win10x64-enterprise-ltsc-eval" ]]; then | 
					
						
							|  |  |  |   DETECTED="win10x64-ltsc" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | if [[ "${VERSION,,}" == "win7x64" ]]; then | 
					
						
							|  |  |  |   DETECTED="win7x64" | 
					
						
							| 
									
										
										
										
											2024-01-27 05:10:45 +01:00
										 |  |  |   VERSION="https://dl.bobpony.com/windows/7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 17:57:26 +01:00
										 |  |  | if [[ "${VERSION,,}" == "core11" ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   DETECTED="win11x64" | 
					
						
							|  |  |  |   VERSION="https://archive.org/download/tiny-11-core-x-64-beta-1/tiny11%20core%20x64%20beta%201.iso" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 17:57:26 +01:00
										 |  |  | if [[ "${VERSION,,}" == "tiny11" ]]; then | 
					
						
							|  |  |  |   DETECTED="win11x64" | 
					
						
							|  |  |  |   VERSION="https://archive.org/download/tiny11-2311/tiny11%202311%20x64.iso" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ "${VERSION,,}" == "tiny10" ]]; then | 
					
						
							|  |  |  |   DETECTED="win10x64-ltsc" | 
					
						
							|  |  |  |   VERSION="https://archive.org/download/tiny-10-23-h2/tiny10%20x64%2023h2.iso" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | CUSTOM="custom.iso" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="Custom.iso" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.ISO" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="CUSTOM.ISO" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.img" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="Custom.img" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.IMG" | 
					
						
							|  |  |  | [ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="CUSTOM.IMG" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | TMP="$STORAGE/tmp" | 
					
						
							|  |  |  | DIR="$TMP/unpack" | 
					
						
							|  |  |  | FB="falling back to manual installation!" | 
					
						
							|  |  |  | ETFS="boot/etfsboot.com" | 
					
						
							|  |  |  | EFISYS="efi/microsoft/boot/efisys_noprompt.bin" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  | printVersion() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local id="$1" | 
					
						
							|  |  |  |   local desc="" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   [[ "$id" == "win7"* ]] && desc="Windows 7" | 
					
						
							|  |  |  |   [[ "$id" == "win8"* ]] && desc="Windows 8" | 
					
						
							|  |  |  |   [[ "$id" == "win10"* ]] && desc="Windows 10" | 
					
						
							|  |  |  |   [[ "$id" == "win11"* ]] && desc="Windows 11" | 
					
						
							|  |  |  |   [[ "$id" == "winvista"* ]] && desc="Windows Vista" | 
					
						
							|  |  |  |   [[ "$id" == "win2022"* ]] && desc="Windows Server 2022" | 
					
						
							|  |  |  |   [[ "$id" == "win2019"* ]] && desc="Windows Server 2019" | 
					
						
							|  |  |  |   [[ "$id" == "win2016"* ]] && desc="Windows Server 2016" | 
					
						
							|  |  |  |   [[ "$id" == "win10x64-ltsc" ]] && desc="Windows 10 LTSC" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   echo "$desc" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | replaceXML() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local dir="$1" | 
					
						
							|  |  |  |   local asset="$2" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local path="$dir/autounattend.xml" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/Autounattend.xml" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/AutoUnattend.xml" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/autounattend.XML" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/Autounattend.XML" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/AutoUnattend.XML" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/AUTOUNATTEND.xml" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   path="$dir/AUTOUNATTEND.XML" | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  |   [ -f "$path" ] && cp "$asset" "$path" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | hasDisk() { | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   [ -b "${DEVICE:-}" ] && return 0 | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ -f "$STORAGE/data.img" ] || [ -f "$STORAGE/data.qcow2" ]; then | 
					
						
							|  |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 1 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | skipInstall() { | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if hasDisk && [ -f "$STORAGE/windows.boot" ]; then | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 04:28:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 1 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | finishInstall() { | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local iso="$1" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   # Mark ISO as prepared via magic byte | 
					
						
							|  |  |  |   printf '\x16' | dd of="$iso" bs=1 seek=0 count=1 conv=notrunc status=none | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   rm -f "$STORAGE/windows.boot" | 
					
						
							|  |  |  |   cp /run/version "$STORAGE/windows.ver" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then | 
					
						
							|  |  |  |     touch "$STORAGE/windows.old" | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     rm -f "$STORAGE/windows.old" | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   rm -rf "$TMP" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | abortInstall() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local iso="$1" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if [[ "$iso" != "$STORAGE/$BASE" ]]; then | 
					
						
							|  |  |  |     mv -f "$iso" "$STORAGE/$BASE" | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   finishInstall "$STORAGE/$BASE" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | startInstall() { | 
					
						
							| 
									
										
										
										
											2024-01-16 19:58:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   local magic desc | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local msg="Windows is being started, please wait..." | 
					
						
							| 
									
										
										
										
											2024-01-22 23:31:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ -f "$STORAGE/$CUSTOM" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     EXTERNAL="Y" | 
					
						
							|  |  |  |     BASE="$CUSTOM" | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     CUSTOM="" | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     if [[ "${VERSION,,}" == "http"* ]]; then | 
					
						
							|  |  |  |       EXTERNAL="Y" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |       EXTERNAL="N" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     if [[ "$EXTERNAL" != [Yy1]* ]]; then | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BASE="$VERSION.iso" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if ! skipInstall && [ ! -f "$STORAGE/$BASE" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-27 17:20:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |         desc=$(printVersion "$VERSION") | 
					
						
							|  |  |  |         [ -z "$desc" ] && desc="Windows" | 
					
						
							|  |  |  |         msg="$desc is being downloaded, please wait..." | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |       fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BASE=$(basename "${VERSION%%\?*}") | 
					
						
							|  |  |  |       : "${BASE//+/ }"; printf -v BASE '%b' "${_//%/\\x}" | 
					
						
							|  |  |  |       BASE=$(echo "$BASE" | sed -e 's/[^A-Za-z0-9._-]/_/g') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if ! skipInstall && [ ! -f "$STORAGE/$BASE" ]; then | 
					
						
							|  |  |  |         msg="Image '$BASE' is being downloaded, please wait..." | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     [[ "${BASE,,}" == "custom."* ]] && BASE="windows.iso" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   html "$msg" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   [ -z "$MANUAL" ] && MANUAL="N" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ -f "$STORAGE/$BASE" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     # Check if the ISO was already processed by our script | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |     magic=$(dd if="$STORAGE/$BASE" seek=0 bs=1 count=1 status=none | tr -d '\000') | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     magic="$(printf '%s' "$magic" | od -A n -t x1 -v | tr -d ' \n')" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     if [[ "$magic" == "16" ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |       if hasDisk || [[ "$MANUAL" = [Yy1]* ]]; then | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  |       fi | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     fi | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     EXTERNAL="Y" | 
					
						
							|  |  |  |     CUSTOM="$BASE" | 
					
						
							| 
									
										
										
										
											2024-01-15 15:15:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  |   else | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     if skipInstall; then | 
					
						
							|  |  |  |       BASE="" | 
					
						
							|  |  |  |       return 1 | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  |     fi | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-15 15:15:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   mkdir -p "$TMP" | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ ! -f "$STORAGE/$CUSTOM" ]; then | 
					
						
							|  |  |  |     CUSTOM="" | 
					
						
							|  |  |  |     ISO="$TMP/$BASE" | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     ISO="$STORAGE/$CUSTOM" | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   rm -f "$TMP/$BASE" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | downloadImage() { | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local iso="$1" | 
					
						
							|  |  |  |   local url="$2" | 
					
						
							|  |  |  |   local progress | 
					
						
							|  |  |  |   rm -f "$iso" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [[ "$EXTERNAL" != [Yy1]* ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     cd "$TMP" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     if ! /run/mido.sh "$url"; then | 
					
						
							|  |  |  |       return 1 | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     cd /run | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     [ ! -f "$iso" ] && return 1 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     return 0 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   info "Downloading $BASE as boot image..." | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   # Check if running with interactive TTY or redirected to docker log | 
					
						
							|  |  |  |   if [ -t 1 ]; then | 
					
						
							|  |  |  |     progress="--progress=bar:noscroll" | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     progress="--progress=dot:giga" | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   { wget "$url" -O "$iso" -q --no-check-certificate --show-progress "$progress"; rc=$?; } || : | 
					
						
							| 
									
										
										
										
											2024-01-27 02:00:04 +01:00
										 |  |  |   (( rc != 0 )) && error "Failed to download $url , reason: $rc" && exit 60 | 
					
						
							| 
									
										
										
										
											2024-01-19 15:18:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   [ ! -f "$iso" ] && return 1 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | extractImage() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local iso="$1" | 
					
						
							|  |  |  |   local dir="$2" | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   local desc="downloaded ISO" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   local size size_gb space space_gb | 
					
						
							| 
									
										
										
										
											2024-01-25 00:18:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   if [[ "$EXTERNAL" != [Yy1]* ]] && [ -z "$CUSTOM" ]; then | 
					
						
							|  |  |  |     desc=$(printVersion "$VERSION") | 
					
						
							|  |  |  |     [ -z "$desc" ] && desc="downloaded ISO" | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local msg="Extracting $desc image..." | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   [ -n "$CUSTOM" ] && msg="Extracting local ISO image..." | 
					
						
							|  |  |  |   info "$msg" && html "$msg" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   size=$(stat -c%s "$iso") | 
					
						
							|  |  |  |   size_gb=$(( (size + 1073741823)/1073741824 )) | 
					
						
							|  |  |  |   space=$(df --output=avail -B 1 "$TMP" | tail -n 1) | 
					
						
							|  |  |  |   space_gb=$(( (space + 1073741823)/1073741824 )) | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if ((size<10000000)); then | 
					
						
							|  |  |  |     error "Invalid ISO file: Size is smaller than 10 MB" && exit 62 | 
					
						
							| 
									
										
										
										
											2024-01-19 15:18:56 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if (( size > space )); then | 
					
						
							|  |  |  |     error "Not enough free space in $STORAGE, have $space_gb GB available but need at least $size_gb GB." && exit 63 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   rm -rf "$dir" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if ! 7z x "$iso" -o"$dir" > /dev/null; then | 
					
						
							|  |  |  |     error "Failed to extract ISO file!" | 
					
						
							|  |  |  |     exit 66 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |   return 0 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-15 23:45:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  | getVersion() { | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local name="$1" | 
					
						
							|  |  |  |   local detected="" | 
					
						
							| 
									
										
										
										
											2024-01-19 15:18:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   [[ "${name,,}" == *"windows 7"* ]] && detected="win7x64" | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   [[ "${name,,}" == *"windows 8"* ]] && detected="win81x64" | 
					
						
							|  |  |  |   [[ "${name,,}" == *"windows 11"* ]] && detected="win11x64" | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   [[ "${name,,}" == *"windows vista"* ]] && detected="winvistax64" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   [[ "${name,,}" == *"server 2022"* ]] && detected="win2022-eval" | 
					
						
							|  |  |  |   [[ "${name,,}" == *"server 2019"* ]] && detected="win2019-eval" | 
					
						
							|  |  |  |   [[ "${name,,}" == *"server 2016"* ]] && detected="win2016-eval" | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 06:05:01 +01:00
										 |  |  |   if [[ "${name,,}" == *"windows 10"* ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-27 17:20:55 +01:00
										 |  |  |     if [[ "${name,,}" == *"ltsc"* ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-26 06:05:01 +01:00
										 |  |  |       detected="win10x64-ltsc" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       detected="win10x64" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-15 23:45:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   echo "$detected" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-15 23:45:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | detectImage() { | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   XML="" | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   if [ -n "$CUSTOM" ]; then | 
					
						
							|  |  |  |     DETECTED="" | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     if [ -z "$DETECTED" ] && [[ "$EXTERNAL" != [Yy1]* ]]; then | 
					
						
							| 
									
										
										
										
											2024-01-26 06:05:01 +01:00
										 |  |  |       DETECTED="$VERSION" | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if [ -n "$DETECTED" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |     if [ -f "/run/assets/$DETECTED.xml" ]; then | 
					
						
							|  |  |  |       [[ "$MANUAL" != [Yy1]* ]] && XML="$DETECTED.xml" | 
					
						
							|  |  |  |       return 0 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     fi | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     local dsc | 
					
						
							|  |  |  |     dsc=$(printVersion "$DETECTED") | 
					
						
							|  |  |  |     [ -z "$dsc" ] && dsc="$DETECTED" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     warn "got $desc, but no matching XML file exists, $FB." | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   info "Detecting Windows version from ISO image..." | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   local dir="$1" | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   local tag result name name2 desc | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local loc="$dir/sources/install.wim" | 
					
						
							|  |  |  |   [ ! -f "$loc" ] && loc="$dir/sources/install.esd" | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ ! -f "$loc" ]; then | 
					
						
							|  |  |  |     warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     BOOT_MODE="windows_legacy" | 
					
						
							|  |  |  |     return 1 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   tag="DISPLAYNAME" | 
					
						
							|  |  |  |   result=$(wimlib-imagex info -xml "$loc" | tr -d '\000') | 
					
						
							|  |  |  |   name=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$result") | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   DETECTED=$(getVersion "$name") | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   if [ -z "$DETECTED" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     tag="PRODUCTNAME" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |     name2=$(sed -n "/$tag/{s/.*<$tag>\(.*\)<\/$tag>.*/\1/;p}" <<< "$result") | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |     [ -z "$name" ] && name="$name2" | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |     DETECTED=$(getVersion "$name2") | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   if [ -z "$DETECTED" ]; then | 
					
						
							|  |  |  |     warn "failed to determine Windows version from string '$name', $FB" | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   desc=$(printVersion "$DETECTED") | 
					
						
							|  |  |  |   [ -z "$desc" ] && desc="$DETECTED" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   if [ -f "/run/assets/$DETECTED.xml" ]; then | 
					
						
							|  |  |  |     [[ "$MANUAL" != [Yy1]* ]] && XML="$DETECTED.xml" | 
					
						
							|  |  |  |     info "Detected: $desc" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |     warn "detected $desc, but no matching XML file exists, $FB." | 
					
						
							| 
									
										
										
										
											2024-01-15 23:45:35 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return 0 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | prepareImage() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local iso="$1" | 
					
						
							|  |  |  |   local dir="$2" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 22:11:12 +01:00
										 |  |  |   if [[ "${BOOT_MODE,,}" == "windows" ]]; then | 
					
						
							|  |  |  |     if [[ "${DETECTED,,}" != "win7x64"* ]] && [[ "${DETECTED,,}" != "winvistax64"* ]]; then | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if [ -f "$dir/$ETFS" ] && [ -f "$dir/$EFISYS" ]; then | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if [ ! -f "$dir/$ETFS" ]; then | 
					
						
							|  |  |  |         warn "failed to locate file 'etfsboot.com' in ISO image, falling back to legacy boot!" | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         warn "failed to locate file 'efisys_noprompt.bin' in ISO image, falling back to legacy boot!" | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   ETFS="boot.img" | 
					
						
							|  |  |  |   BOOT_MODE="windows_legacy" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local len offset | 
					
						
							|  |  |  |   len=$(isoinfo -d -i "$iso" | grep "Nsect " | grep -o "[^ ]*$") | 
					
						
							|  |  |  |   offset=$(isoinfo -d -i "$iso" | grep "Bootoff " | grep -o "[^ ]*$") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ! dd "if=$iso" "of=$dir/$ETFS" bs=2048 "count=$len" "skip=$offset" status=none; then | 
					
						
							|  |  |  |     error "Failed to extract boot image from ISO!" | 
					
						
							|  |  |  |     exit 67 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-15 23:45:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | updateImage() { | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   local iso="$1" | 
					
						
							|  |  |  |   local dir="$2" | 
					
						
							|  |  |  |   local asset="/run/assets/$3" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   local index result | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   [ ! -f "$asset" ] && return 0 | 
					
						
							|  |  |  |   replaceXML "$dir" "$asset" | 
					
						
							| 
									
										
										
										
											2024-01-17 03:40:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   local loc="$dir/sources/boot.wim" | 
					
						
							|  |  |  |   [ ! -f "$loc" ] && loc="$dir/sources/boot.esd" | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [ ! -f "$loc" ]; then | 
					
						
							|  |  |  |     warn "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     BOOT_MODE="windows_legacy" | 
					
						
							|  |  |  |     return 1 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   info "Adding XML file for automatic installation..." | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   index="1" | 
					
						
							|  |  |  |   result=$(wimlib-imagex info -xml "$loc" | tr -d '\000') | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   if [[ "${result^^}" == *"<IMAGE INDEX=\"2\">"* ]]; then | 
					
						
							|  |  |  |     index="2" | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   if ! wimlib-imagex update "$loc" "$index" --command "add $asset /autounattend.xml" > /dev/null; then | 
					
						
							|  |  |  |     warn "failed to add XML to ISO image, $FB" | 
					
						
							|  |  |  |     return 1 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | buildImage() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local dir="$1" | 
					
						
							|  |  |  |   local cat="BOOT.CAT" | 
					
						
							|  |  |  |   local label="${BASE%.*}" | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   local log="/run/shm/iso.log" | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   local size size_gb space space_gb desc | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   label="${label::30}" | 
					
						
							|  |  |  |   local out="$TMP/$label.tmp" | 
					
						
							|  |  |  |   rm -f "$out" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:52:58 +01:00
										 |  |  |   desc=$(printVersion "$DETECTED") | 
					
						
							|  |  |  |   [ -z "$desc" ] && desc="ISO" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   local msg="Building $desc image..." | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   info "$msg" && html "$msg" | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:54:26 +01:00
										 |  |  |   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) | 
					
						
							|  |  |  |   space_gb=$(( (space + 1073741823)/1073741824 )) | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (( size > space )); then | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     error "Not enough free space in $STORAGE, have $space_gb GB available but need at least $size_gb GB." | 
					
						
							|  |  |  |     return 1 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "$label" \
 | 
					
						
							|  |  |  |                      -udf -boot-info-table -eltorito-alt-boot -eltorito-boot "$EFISYS" -no-emul-boot -allow-limited-size -quiet "$dir" 2> "$log"; then | 
					
						
							|  |  |  |       [ -f "$log" ] && echo "$(<"$log")" | 
					
						
							|  |  |  |       return 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if !  genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 2 -J -l -D -N -joliet-long -relaxed-filenames -V "$label" \
 | 
					
						
							|  |  |  |                       -udf -allow-limited-size -quiet "$dir" 2> "$log"; then | 
					
						
							|  |  |  |       [ -f "$log" ] && echo "$(<"$log")" | 
					
						
							|  |  |  |       return 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   local error="" | 
					
						
							|  |  |  |   local hide="Warning: creating filesystem that does not conform to ISO-9660." | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   [ -f "$log" ] && error="$(<"$log")" | 
					
						
							|  |  |  |   [[ "$error" != "$hide" ]] && echo "$error" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if [ -f "$STORAGE/$BASE" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |     error "File $STORAGE/$BASE does already exist?!" | 
					
						
							|  |  |  |     return 1 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   mv "$out" "$STORAGE/$BASE" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | ###################################### | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | if ! startInstall; then | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if [ -f "$STORAGE/windows.old" ]; then | 
					
						
							|  |  |  |     BOOT_MODE="windows_legacy" | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   rm -rf "$TMP" | 
					
						
							|  |  |  |   return 0 | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-19 04:28:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | if [ ! -f "$ISO" ]; then | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   if ! downloadImage "$ISO" "$VERSION"; then | 
					
						
							|  |  |  |     error "Failed to download $VERSION" | 
					
						
							|  |  |  |     exit 61 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | if ! extractImage "$ISO" "$DIR"; then | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  |   abortInstall "$ISO" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-22 02:56:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | if ! detectImage "$DIR"; then | 
					
						
							|  |  |  |   abortInstall "$ISO" | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  |   return 0 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-19 01:25:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | if ! prepareImage "$ISO" "$DIR"; then | 
					
						
							|  |  |  |   abortInstall "$ISO" | 
					
						
							|  |  |  |   return 0 | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | if ! updateImage "$ISO" "$DIR" "$XML"; then | 
					
						
							|  |  |  |   abortInstall "$ISO" | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | rm -f "$ISO" | 
					
						
							| 
									
										
										
										
											2024-01-22 20:44:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 16:15:18 +01:00
										 |  |  | if ! buildImage "$DIR"; then | 
					
						
							|  |  |  |   error "Failed to build image!" | 
					
						
							|  |  |  |   exit 65 | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | finishInstall "$STORAGE/$BASE" | 
					
						
							| 
									
										
										
										
											2024-01-20 17:03:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 05:38:16 +01:00
										 |  |  | html "Successfully prepared image for installation..." | 
					
						
							| 
									
										
										
										
											2024-01-14 15:19:58 +01:00
										 |  |  | return 0 |