浏览代码

feat: Improved installation (#459)

Kroese 1 年之前
父节点
当前提交
4b23877eaa
共有 6 个文件被更改,包括 330 次插入178 次删除
  1. 1 1
      Dockerfile
  2. 13 8
      readme.md
  3. 128 21
      src/define.sh
  4. 174 139
      src/install.sh
  5. 4 3
      src/power.sh
  6. 10 6
      src/samba.sh

+ 1 - 1
Dockerfile

@@ -1,5 +1,5 @@
 FROM scratch
 FROM scratch
-COPY --from=qemux/qemu-docker:5.01 / /
+COPY --from=qemux/qemu-docker:5.02 / /
 
 
 ARG DEBCONF_NOWARNINGS "yes"
 ARG DEBCONF_NOWARNINGS "yes"
 ARG DEBIAN_FRONTEND "noninteractive"
 ARG DEBIAN_FRONTEND "noninteractive"

+ 13 - 8
readme.md

@@ -127,9 +127,14 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
 
 
 * ### How do I share files with the host?
 * ### How do I share files with the host?
 
 
-  Open 'File Explorer' and click on the 'Network' section, you will see a computer called `host.lan`, double-click it and it will show a folder called `Data`.
+  Open 'File Explorer' and click on the 'Network' section, you will see a computer called `host.lan`. Double-click it and it will show a folder called `Data`, which can be binded to any folder on your host via the compose file:
 
 
-  Inside this folder you can access any files that are placed in `/storage/shared` (see above) on the host. You can optionally map it to a drive letter, for easy access.
+  ```yaml
+  volumes:
+    -  /home/user/example:/shared
+  ```
+
+  The example folder `/home/user/example` will be available as ` \\host.lan\Data`. You can optionally map this path to a drive letter in Windows, for easier access.
 
 
 * ### How do I install a custom image?
 * ### How do I install a custom image?
 
 
@@ -144,7 +149,7 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
   
   
   ```yaml
   ```yaml
   volumes:
   volumes:
-    - /home/user/example.iso:/storage/custom.iso
+    - /home/user/example.iso:/custom.iso
   ```
   ```
 
 
   Replace the example path `/home/user/example.iso` with the filename of your desired ISO file. The value of `VERSION` will be ignored in this case.
   Replace the example path `/home/user/example.iso` with the filename of your desired ISO file. The value of `VERSION` will be ignored in this case.
@@ -157,7 +162,7 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
 
 
   ```yaml
   ```yaml
   volumes:
   volumes:
-    -  /home/user/example.xml:/storage/custom.xml
+    -  /home/user/example.xml:/custom.xml
   ```
   ```
 
 
   Replace the example path `/home/user/example.xml` with the filename of the modified XML file.
   Replace the example path `/home/user/example.xml` with the filename of the modified XML file.
@@ -168,7 +173,7 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
 
 
   ```yaml
   ```yaml
   volumes:
   volumes:
-    -  /home/user/example:/storage/oem
+    -  /home/user/example:/oem
   ```
   ```
 
 
   The example folder `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed during the last step.
   The example folder `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed during the last step.
@@ -292,11 +297,11 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
 
 
   ```yaml
   ```yaml
   devices:
   devices:
-    - /dev/sdb:/dev/disk1
-    - /dev/sdc:/dev/disk2
+    - /dev/sdb:/disk1
+    - /dev/sdc:/disk2
   ```
   ```
 
 
-  Use `/dev/disk1` if you want it to become your main drive, and use `/dev/disk2` and higher to add them as secondary drives.
+  Use `/disk1` if you want it to become your main drive, and use `/disk2` and higher to add them as secondary drives.
 
 
 * ### How do I pass-through a USB device?
 * ### How do I pass-through a USB device?
 
 

+ 128 - 21
src/define.sh

@@ -3,6 +3,7 @@ set -Eeuo pipefail
 
 
 : "${VERIFY:=""}"
 : "${VERIFY:=""}"
 : "${MANUAL:=""}"
 : "${MANUAL:=""}"
+: "${REMOVE:=""}"
 : "${VERSION:=""}"
 : "${VERSION:=""}"
 : "${DETECTED:=""}"
 : "${DETECTED:=""}"
 : "${PLATFORM:="x64"}"
 : "${PLATFORM:="x64"}"
@@ -11,26 +12,28 @@ MIRRORS=5
 
 
 parseVersion() {
 parseVersion() {
 
 
-  [ -z "$VERSION" ] && VERSION="win11"
+  VERSION="${VERSION/\//}"
 
 
   if [[ "${VERSION}" == \"*\" || "${VERSION}" == \'*\' ]]; then
   if [[ "${VERSION}" == \"*\" || "${VERSION}" == \'*\' ]]; then
     VERSION="${VERSION:1:-1}"
     VERSION="${VERSION:1:-1}"
   fi
   fi
 
 
+  [ -z "$VERSION" ] && VERSION="win11"
+
   case "${VERSION,,}" in
   case "${VERSION,,}" in
-    "11" | "win11" | "windows11" | "windows 11" )
+    "11" | "11p" | "win11" | "win11p" | "windows11" | "windows 11" )
       VERSION="win11${PLATFORM,,}"
       VERSION="win11${PLATFORM,,}"
       ;;
       ;;
     "11e" | "win11e" | "windows11e" | "windows 11e" )
     "11e" | "win11e" | "windows11e" | "windows 11e" )
       VERSION="win11${PLATFORM,,}-enterprise-eval"
       VERSION="win11${PLATFORM,,}-enterprise-eval"
       ;;
       ;;
-    "10" | "win10" | "windows10" | "windows 10" )
+    "10" | "10p" | "win10" | "win10p" | "windows10" | "windows 10" )
       VERSION="win10${PLATFORM,,}"
       VERSION="win10${PLATFORM,,}"
       ;;
       ;;
     "10e" | "win10e" | "windows10e" | "windows 10e" )
     "10e" | "win10e" | "windows10e" | "windows 10e" )
       VERSION="win10${PLATFORM,,}-enterprise-eval"
       VERSION="win10${PLATFORM,,}-enterprise-eval"
       ;;
       ;;
-    "8" | "81" | "8.1" | "win8" | "win81" | "windows 8" )
+    "8" | "8p" | "81" | "81p" | "8.1" | "win8" | "win8p" | "win81" | "win81p" | "windows 8" )
       VERSION="win81${PLATFORM,,}"
       VERSION="win81${PLATFORM,,}"
       ;;
       ;;
     "8e" | "81e" | "8.1e" | "win8e" | "win81e" | "windows 8e" )
     "8e" | "81e" | "8.1e" | "win8e" | "win81e" | "windows 8e" )
@@ -40,10 +43,16 @@ parseVersion() {
       VERSION="win7${PLATFORM,,}"
       VERSION="win7${PLATFORM,,}"
       DETECTED="win7${PLATFORM,,}-enterprise"
       DETECTED="win7${PLATFORM,,}-enterprise"
       ;;
       ;;
+    "7u" | "win7u" | "windows7u" | "windows 7u" )
+      VERSION="win7${PLATFORM,,}-ultimate"
+      ;;
     "vista" | "winvista" | "windowsvista" | "windows vista" )
     "vista" | "winvista" | "windowsvista" | "windows vista" )
       VERSION="winvista${PLATFORM,,}"
       VERSION="winvista${PLATFORM,,}"
       DETECTED="winvista${PLATFORM,,}-enterprise"
       DETECTED="winvista${PLATFORM,,}-enterprise"
       ;;
       ;;
+    "vistau" | "winvistau" | "windowsvistau" | "windows vistau" )
+      VERSION="winvista${PLATFORM,,}-ultimate"
+      ;;
     "xp" | "xp32" | "winxp" | "windowsxp" | "windows xp" )
     "xp" | "xp32" | "winxp" | "windowsxp" | "windows xp" )
       VERSION="winxpx86"
       VERSION="winxpx86"
       ;;
       ;;
@@ -382,31 +391,109 @@ switchEdition() {
   return 0
   return 0
 }
 }
 
 
-isESD() {
+getCatalog() {
 
 
   local id="$1"
   local id="$1"
+  local ret="$2"
+  local url=""
+  local name=""
+  local edition=""
 
 
   case "${id,,}" in
   case "${id,,}" in
-    "win11${PLATFORM,,}" ) return 0 ;;
-    "win10${PLATFORM,,}" ) return 0 ;;
+    "win11${PLATFORM,,}" )
+      edition="Professional"
+      name="Windows 11 Pro"
+      url="https://go.microsoft.com/fwlink?linkid=2156292"
+      ;;
+    "win10${PLATFORM,,}" )
+      edition="Professional"
+      name="Windows 10 Pro"
+      url="https://go.microsoft.com/fwlink/?LinkId=841361"
+      ;;
+    "win11${PLATFORM,,}-enterprise" | "win11${PLATFORM,,}-enterprise-eval")
+      edition="Enterprise"
+      name="Windows 11 Enterprise"
+      url="https://go.microsoft.com/fwlink?linkid=2156292"
+      ;;
+    "win10${PLATFORM,,}-enterprise" | "win10${PLATFORM,,}-enterprise-eval" )
+      edition="Enterprise"
+      name="Windows 10 Enterprise"
+      url="https://go.microsoft.com/fwlink/?LinkId=841361"
+      ;;
   esac
   esac
 
 
-  return 1
+  case "${ret,,}" in
+    "url" ) echo "$url" ;;
+    "name" ) echo "$name" ;;
+    "edition" ) echo "$edition" ;;
+    *) echo "";;
+  esac
+
+  return 0
 }
 }
 
 
-isMido() {
+getMido() {
 
 
   local id="$1"
   local id="$1"
+  local ret="$2"
+  local sum=""
+  local size=""
 
 
   case "${id,,}" in
   case "${id,,}" in
-    "win11${PLATFORM,,}" | "win11${PLATFORM,,}-enterprise-eval" )
-      return 0 ;;
-    "win10${PLATFORM,,}" | "win10${PLATFORM,,}-enterprise-eval" | "win10${PLATFORM,,}-enterprise-ltsc-eval" )
-      return 0 ;;
-    "win81${PLATFORM,,}" | "win81${PLATFORM,,}-enterprise-eval" )
-      return 0 ;;
-    "win2022-eval" | "win2019-eval" | "win2016-eval" | "win2012r2-eval" | "win2008r2" )
-      return 0 ;;
+    "win11${PLATFORM,,}" )
+      size=6812706816
+      sum="36de5ecb7a0daa58dce68c03b9465a543ed0f5498aa8ae60ab45fb7c8c4ae402"
+      ;;
+    "win11${PLATFORM,,}-enterprise-eval" )
+      size=6209064960
+      sum="c8dbc96b61d04c8b01faf6ce0794fdf33965c7b350eaa3eb1e6697019902945c"
+      ;;
+    "win10${PLATFORM,,}" )
+      size=6140975104
+      sum="a6f470ca6d331eb353b815c043e327a347f594f37ff525f17764738fe812852e"
+      ;;
+    "win10${PLATFORM,,}-enterprise-eval" )
+      size=5550497792
+      sum="ef7312733a9f5d7d51cfa04ac497671995674ca5e1058d5164d6028f0938d668"
+      ;;
+    "win10${PLATFORM,,}-enterprise-ltsc-eval" )
+      size=4898582528
+      sum="e4ab2e3535be5748252a8d5d57539a6e59be8d6726345ee10e7afd2cb89fefb5"
+      ;;
+    "win81${PLATFORM,,}" )
+      size=4320526336
+      sum="d8333cf427eb3318ff6ab755eb1dd9d433f0e2ae43745312c1cd23e83ca1ce51"
+      ;;
+    "win81${PLATFORM,,}-enterprise-eval" )
+      size=3961473024
+      sum="2dedd44c45646c74efc5a028f65336027e14a56f76686a4631cf94ffe37c72f2"
+      ;;
+    "win2022-eval" )
+      size=5044094976
+      sum="3e4fa6d8507b554856fc9ca6079cc402df11a8b79344871669f0251535255325"
+      ;;
+    "win2019-eval" )
+      size=5652088832
+      sum="6dae072e7f78f4ccab74a45341de0d6e2d45c39be25f1f5920a2ab4f51d7bcbb"
+     ;;
+    "win2016-eval" )
+      size=6972221440
+      sum="1ce702a578a3cb1ac3d14873980838590f06d5b7101c5daaccbac9d73f1fb50f"
+      ;;
+    "win2012r2-eval" )
+      size=4542291968
+      sum="6612b5b1f53e845aacdf96e974bb119a3d9b4dcb5b82e65804ab7e534dc7b4d5"
+      ;;
+    "win2008r2" )
+      size=3166840832
+      sum="30832ad76ccfa4ce48ccb936edefe02079d42fb1da32201bf9e3a880c8ed6312"
+      ;;
+  esac
+
+  case "${ret,,}" in
+    "sum" ) echo "$sum" ;;
+    "size" ) echo "$size" ;;
+    *) echo "";;
   esac
   esac
 
 
   return 1
   return 1
@@ -808,6 +895,28 @@ getSize() {
   return 0
   return 0
 }
 }
 
 
+isMido() {
+
+  local id="$1"
+  local sum
+
+  sum=$(getMido "$id" "sum")
+  [ -n "$sum" ] && return 0
+
+  return 1
+}
+
+isESD() {
+
+  local id="$1"
+  local url
+
+  url=$(getCatalog "$id" "url")
+  [ -n "$url" ] && return 0
+
+  return 1
+}
+
 validVersion() {
 validVersion() {
 
 
   local id="$1"
   local id="$1"
@@ -832,7 +941,7 @@ migrateFiles() {
   local version="$2"
   local version="$2"
   local file=""
   local file=""
 
 
-  [ -f "$STORAGE/$base" ] && return 0
+  [ -f "$base" ] && return 0
 
 
   [[ "${version,,}" == "tiny10" ]] && file="tiny10_${PLATFORM,,}_23h2.iso"
   [[ "${version,,}" == "tiny10" ]] && file="tiny10_${PLATFORM,,}_23h2.iso"
   [[ "${version,,}" == "tiny11" ]] && file="tiny11_2311_${PLATFORM,,}.iso"
   [[ "${version,,}" == "tiny11" ]] && file="tiny11_2311_${PLATFORM,,}.iso"
@@ -841,10 +950,8 @@ migrateFiles() {
   [[ "${version,,}" == "winvista${PLATFORM,,}" ]] && file="en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
   [[ "${version,,}" == "winvista${PLATFORM,,}" ]] && file="en_windows_vista_sp2_${PLATFORM,,}_dvd_342267.iso"
   [[ "${version,,}" == "win7${PLATFORM,,}" ]] && file="en_windows_7_enterprise_with_sp1_${PLATFORM,,}_dvd_u_677651.iso"
   [[ "${version,,}" == "win7${PLATFORM,,}" ]] && file="en_windows_7_enterprise_with_sp1_${PLATFORM,,}_dvd_u_677651.iso"
 
 
-  [ -z "$file" ] && return 0
   [ ! -f "$STORAGE/$file" ] && return 0
   [ ! -f "$STORAGE/$file" ] && return 0
-
-  ! mv "$STORAGE/$file" "$STORAGE/$base" && return 1
+  ! mv "$STORAGE/$file" "$base" && return 1
 
 
   return 0
   return 0
 }
 }

+ 174 - 139
src/install.sh

@@ -9,6 +9,8 @@ EFISYS="efi/microsoft/boot/efisys_noprompt.bin"
 
 
 hasDisk() {
 hasDisk() {
 
 
+  [ -b "/disk1" ] && return 0
+  [ -b "/dev/disk1" ] && return 0
   [ -b "${DEVICE:-}" ] && return 0
   [ -b "${DEVICE:-}" ] && return 0
 
 
   if [ -s "$STORAGE/data.img" ] || [ -s "$STORAGE/data.qcow2" ]; then
   if [ -s "$STORAGE/data.img" ] || [ -s "$STORAGE/data.qcow2" ]; then
@@ -33,69 +35,63 @@ startInstall() {
 
 
   [ -z "$MANUAL" ] && MANUAL="N"
   [ -z "$MANUAL" ] && MANUAL="N"
 
 
-  if [ -f "$STORAGE/$CUSTOM" ]; then
+  if [ -n "$CUSTOM" ]; then
 
 
-    BASE="$CUSTOM"
+    ISO="$CUSTOM"
 
 
   else
   else
 
 
-    CUSTOM=""
+    local file="${VERSION/\//}.iso"
 
 
-    if [[ "${VERSION,,}" != "http"* ]]; then
+    if [[ "${VERSION,,}" == "http"* ]]; then
 
 
-      BASE="$VERSION.iso"
+      file=$(basename "${VERSION%%\?*}")
+      : "${file//+/ }"; printf -v file '%b' "${_//%/\\x}"
+      file=$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')
 
 
-    else
+    fi
 
 
-      BASE=$(basename "${VERSION%%\?*}")
-      : "${BASE//+/ }"; printf -v BASE '%b' "${_//%/\\x}"
-      BASE=$(echo "$BASE" | sed -e 's/[^A-Za-z0-9._-]/_/g')
+    ISO="$STORAGE/$file"
 
 
-    fi
-  fi
+    ! migrateFiles "$ISO" "$VERSION" && error "Migration failed!" && exit 57
 
 
-  if [[ "${PLATFORM,,}" == "x64" ]]; then
-    ! migrateFiles "$BASE" "$VERSION" && error "Migration failed!" && exit 57
   fi
   fi
 
 
-  if skipInstall; then
-    if [ ! -f "$STORAGE/$BASE" ]; then
-      BASE="custom.iso"
-      [ ! -f "$STORAGE/$BASE" ] && BASE=""
-    fi
-    [[ "${PLATFORM,,}" == "arm64" ]] && VGA="virtio-gpu"
-    return 1
-  fi
+  skipInstall && return 1
 
 
-  if [ -f "$STORAGE/$BASE" ]; then
+  if [ -f "$ISO" ] && [ -s "$ISO" ]; then
 
 
     # Check if the ISO was already processed by our script
     # Check if the ISO was already processed by our script
     local magic=""
     local magic=""
-    magic=$(dd if="$STORAGE/$BASE" seek=0 bs=1 count=1 status=none | tr -d '\000')
+    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')"
     magic="$(printf '%s' "$magic" | od -A n -t x1 -v | tr -d ' \n')"
+    [[ "$magic" == "16" ]] && return 1
 
 
-    if [[ "$magic" == "16" ]]; then
+  fi
 
 
-      if hasDisk || [[ "$MANUAL" == [Yy1]* ]]; then
-        return 1
-      fi
+  if [ -z "$CUSTOM" ]; then
 
 
+    BOOT="$ISO"
+    ISO=$(basename "$ISO")
+    ISO="$TMP/$ISO"
+
+  else
+
+    if [ -n "$ORIGINAL" ]; then
+      rm -f "$ISO"
+      ISO="$ORIGINAL"
+      CUSTOM="$ISO"
     fi
     fi
 
 
-    CUSTOM="$BASE"
+    local size
+    size="$(stat -c%s "$ISO")"
+    BOOT="$STORAGE/windows.$size.iso"
 
 
   fi
   fi
 
 
+  rm -f "$BOOT"
   rm -rf "$TMP"
   rm -rf "$TMP"
   mkdir -p "$TMP"
   mkdir -p "$TMP"
-
-  if [ ! -f "$STORAGE/$CUSTOM" ]; then
-    CUSTOM=""
-    ISO="$TMP/$BASE"
-  else
-    ISO="$STORAGE/$CUSTOM"
-  fi
-
   return 0
   return 0
 }
 }
 
 
@@ -120,7 +116,6 @@ finishInstall() {
   rm -f "$STORAGE/windows.mode"
   rm -f "$STORAGE/windows.mode"
 
 
   cp /run/version "$STORAGE/windows.ver"
   cp /run/version "$STORAGE/windows.ver"
-  echo "$BASE" > "$STORAGE/windows.base"
 
 
   if [[ "${PLATFORM,,}" == "x64" ]]; then
   if [[ "${PLATFORM,,}" == "x64" ]]; then
     if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then
     if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then
@@ -147,42 +142,61 @@ abortInstall() {
 
 
   local iso="$1"
   local iso="$1"
 
 
-  if [[ "$iso" != "$STORAGE/$BASE" ]]; then
-    if ! mv -f "$iso" "$STORAGE/$BASE"; then
-      error "Failed to move ISO file: $iso" && return 1
+  [[ "${iso,,}" == *".esd" ]] && exit 60
+
+  if [ -n "$CUSTOM" ]; then
+    BOOT="$iso"
+    REMOVE="N"
+  else
+    if [[ "$iso" != "$BOOT" ]]; then
+      if ! mv -f "$iso" "$BOOT"; then
+        error "Failed to move ISO file: $iso" && return 1
+      fi
     fi
     fi
   fi
   fi
 
 
-  finishInstall "$STORAGE/$BASE" "Y" && return 0
-
+  finishInstall "$BOOT" "Y" && return 0
   return 1
   return 1
 }
 }
 
 
 detectCustom() {
 detectCustom() {
 
 
+  local file=""
+  local size base
+
   CUSTOM=""
   CUSTOM=""
-  local file size
+  ORIGINAL=""
 
 
   if [[ "${VERSION,,}" != "http"* ]]; then
   if [[ "${VERSION,,}" != "http"* ]]; then
-    file="${VERSION/\/storage\//}"
-    [[ "$file" == "."* ]] && file="${file:1}"
-    [[ "$file" == *"/"* ]] && file=""
-    [ -n "$file" ] && CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname "$file" -printf "%f\n" | head -n 1)
+    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)
   fi
   fi
 
 
-  [ -z "$CUSTOM" ] && CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.iso -printf "%f\n" | head -n 1)
-  [ -z "$CUSTOM" ] && CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.img -printf "%f\n" | head -n 1)
-  [ -z "$CUSTOM" ] && return 0
+  [ -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"
 
 
-  size="$(stat -c%s "$STORAGE/$CUSTOM")"
+  base="/custom.iso"
+  [ -f "$base" ] && [ -s "$base" ] && file="$base"
 
 
-  if [ -z "$size" ] || [[ "$size" == "0" ]]; then
-    CUSTOM=""
-    return 0
-  fi
+  [ -z "$file" ] && return 0
+  [ ! -f "$file" ] && return 0
+  [ ! -s "$file" ] && return 0
+
+  size="$(stat -c%s "$file")"
+  [ -z "$size" ] || [[ "$size" == "0" ]] && return 0
 
 
-  file="windows.$size.iso"
-  [ -s "$STORAGE/$file" ] && CUSTOM="$file"
+  base="$STORAGE/windows.$size.iso"
+
+  if [ -f "$base" ] && [ -s "$base" ]; then
+    CUSTOM="$base"
+    ORIGINAL="$file"
+  else
+    CUSTOM="$file"
+    rm -f "$base"
+  fi
 
 
   return 0
   return 0
 }
 }
@@ -191,13 +205,15 @@ getESD() {
 
 
   local dir="$1"
   local dir="$1"
   local version="$2"
   local version="$2"
+  local editionName
   local winCatalog size
   local winCatalog size
 
 
-  case "${version,,}" in
-    "win11${PLATFORM,,}" ) winCatalog="https://go.microsoft.com/fwlink?linkid=2156292" ;;
-    "win10${PLATFORM,,}" ) winCatalog="https://go.microsoft.com/fwlink/?LinkId=841361" ;;
-    *) error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1 ;;
-  esac
+  if ! isESD "${version,,}"; then
+    error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1
+  fi
+
+  winCatalog=$(getCatalog "$version" "url")
+  editionName=$(getCatalog "$version" "edition")
 
 
   local msg="Downloading product information from Microsoft..."
   local msg="Downloading product information from Microsoft..."
   info "$msg" && html "$msg"
   info "$msg" && html "$msg"
@@ -227,7 +243,6 @@ getESD() {
   fi
   fi
 
 
   local esdLang="en-us"
   local esdLang="en-us"
-  local editionName="Professional"
   local edQuery='//File[Architecture="'${PLATFORM}'"][Edition="'${editionName}'"]'
   local edQuery='//File[Architecture="'${PLATFORM}'"][Edition="'${editionName}'"]'
 
 
   echo -e '<Catalog>' > "$dir/$fFile"
   echo -e '<Catalog>' > "$dir/$fFile"
@@ -256,47 +271,15 @@ getESD() {
   return 0
   return 0
 }
 }
 
 
-doMido() {
-
-  local iso="$1"
-  local version="$2"
-  local desc="$3"
-  local rc
-
-  rm -f "$iso"
-  rm -f "$iso.PART"
-
-  local msg="Downloading $desc..."
-  info "$msg" && html "$msg"
-  /run/progress.sh "$iso.PART" "" "Downloading $desc ([P])..." &
-
-  cd "$TMP"
-  { /run/mido.sh "${version,,}"; rc=$?; } || :
-  cd /run
-
-  fKill "progress.sh"
-
-  if (( rc == 0 )) && [ -f "$iso" ]; then
-    if [ "$(stat -c%s "$iso")" -gt 100000000 ]; then
-      html "Download finished successfully..." && return 0
-    fi
-  fi
-
-  rm -f "$iso"
-  rm -f "$iso.PART"
-
-  return 1
-}
-
 verifyFile() {
 verifyFile() {
 
 
   local iso="$1"
   local iso="$1"
   local size="$2"
   local size="$2"
-  local total="$3" 
+  local total="$3"
   local check="$4"
   local check="$4"
 
 
-  if [ -n "$size" ] && [[ "$total" != "$size" ]]; then
-    [[ "$size" != "0" ]] && warn "The download file has an unexpected size: $total"
+  if [ -n "$size" ] && [[ "$total" != "$size" ]] && [[ "$size" != "0" ]]; then
+    warn "The downloaded file has an invalid size: $total bytes, while expected value was: $size bytes. Please report this at $SUPPORT/issues"
   fi
   fi
 
 
   local hash=""
   local hash=""
@@ -316,15 +299,52 @@ verifyFile() {
   fi
   fi
 
 
   if [[ "$hash" == "$check" ]]; then
   if [[ "$hash" == "$check" ]]; then
-    info "Succesfully verified that the checksum was correct!" && return 0
+    info "Succesfully verified ISO!" && return 0
   fi
   fi
 
 
-  error "Invalid $algo checksum: $hash , but expected value is: $check ! Please report this at $SUPPORT/issues"
+  error "The downloaded file has an invalid $algo checksum: $hash , while expected value was: $check. Please report this at $SUPPORT/issues"
 
 
   rm -f "$iso"
   rm -f "$iso"
   return 1
   return 1
 }
 }
 
 
+doMido() {
+
+  local iso="$1"
+  local version="$2"
+  local desc="$3"
+  local rc sum size total
+
+  rm -f "$iso"
+  rm -f "$iso.PART"
+
+  size=$(getMido "$version" "size")
+  sum=$(getMido "$version" "sum")
+
+  local msg="Downloading $desc..."
+  info "$msg" && html "$msg"
+  /run/progress.sh "$iso.PART" "$size" "Downloading $desc ([P])..." &
+
+  cd "$TMP"
+  { /run/mido.sh "${version,,}"; rc=$?; } || :
+  cd /run
+
+  fKill "progress.sh"
+
+  if (( rc == 0 )) && [ -f "$iso" ]; then
+    total=$(stat -c%s "$iso")
+    if [ "$total" -gt 100000000 ]; then
+      ! verifyFile "$iso" "$size" "$total" "$sum" && return 1
+      html "Download finished successfully..." && return 0
+    fi
+  fi
+
+  rm -f "$iso"
+  rm -f "$iso.PART"
+
+  return 1
+}
+
 downloadFile() {
 downloadFile() {
 
 
   local iso="$1"
   local iso="$1"
@@ -380,10 +400,11 @@ downloadImage() {
   local iso="$1"
   local iso="$1"
   local version="$2"
   local version="$2"
   local tried="n"
   local tried="n"
-  local url sum size desc
+  local url sum size base desc
 
 
   if [[ "${version,,}" == "http"* ]]; then
   if [[ "${version,,}" == "http"* ]]; then
-    desc=$(fromFile "$BASE")
+    base=$(basename "$iso")
+    desc=$(fromFile "$base")
     downloadFile "$iso" "$version" "" "" "$desc" && return 0
     downloadFile "$iso" "$version" "" "" "$desc" && return 0
     return 1
     return 1
   fi
   fi
@@ -410,9 +431,10 @@ downloadImage() {
     tried="y"
     tried="y"
 
 
     if getESD "$TMP/esd" "$version"; then
     if getESD "$TMP/esd" "$version"; then
-      ISO="$TMP/$version.esd"
+      local prev="$ISO"
+      ISO="${ISO%.*}.esd"
       downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$desc" && return 0
       downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$desc" && return 0
-      ISO="$TMP/$BASE"
+      ISO="$prev"
     fi
     fi
 
 
   fi
   fi
@@ -436,6 +458,17 @@ downloadImage() {
   return 1
   return 1
 }
 }
 
 
+removeDownload() {
+
+  local iso="$1"
+
+  [ ! -f "$iso" ] && return 0
+  [ -n "$CUSTOM" ] && return 0
+  ! rm -f "$iso" 2> /dev/null && warn "failed to remove $iso !"
+
+  return 0
+}
+
 extractESD() {
 extractESD() {
 
 
   local iso="$1"
   local iso="$1"
@@ -500,16 +533,15 @@ extractESD() {
   info "$msg" && html "$msg"
   info "$msg" && html "$msg"
 
 
   local edition imageIndex imageEdition
   local edition imageIndex imageEdition
+  edition=$(getCatalog "$version" "name")
 
 
-  case "${version,,}" in
-    "win11${PLATFORM,,}" ) edition="11 pro" ;;
-    "win10${PLATFORM,,}" ) edition="10 pro" ;;
-    *) error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1 ;;
-  esac
+  if [ -z "$edition" ]; then
+    error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1
+  fi
 
 
   for (( imageIndex=4; imageIndex<=esdImageCount; imageIndex++ )); do
   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
+    [[ "${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=$?
       retVal=$?
       error "Addition of ${imageIndex} to the $desc image failed" && return $retVal
       error "Addition of ${imageIndex} to the $desc image failed" && return $retVal
@@ -517,7 +549,7 @@ extractESD() {
     return 0
     return 0
   done
   done
 
 
-  error "Failed to find product in install.wim!" && return 1
+  error "Failed to find product '$edition' in install.wim!" && return 1
 }
 }
 
 
 extractImage() {
 extractImage() {
@@ -574,7 +606,10 @@ setXML() {
 
 
   [[ "$MANUAL" == [Yy1]* ]] && return 0
   [[ "$MANUAL" == [Yy1]* ]] && return 0
 
 
-  local file="$STORAGE/custom.xml"
+  local file="/custom.xml"
+  [ -f "$file" ] && [ -s "$file" ] && XML="$file" && return 0
+
+  file="$STORAGE/custom.xml"
   [ -f "$file" ] && [ -s "$file" ] && XML="$file" && return 0
   [ -f "$file" ] && [ -s "$file" ] && XML="$file" && return 0
 
 
   file="/run/assets/custom.xml"
   file="/run/assets/custom.xml"
@@ -649,12 +684,8 @@ detectImage() {
 
 
   XML=""
   XML=""
 
 
-  if [ -n "$CUSTOM" ]; then
-    DETECTED=""
-  else
-    if [ -z "$DETECTED" ] && [[ "${version,,}" != "http"* ]]; then
-      DETECTED="$version"
-    fi
+  if [ -z "$DETECTED" ] && [[ "${version,,}" != "http"* ]]; then
+    [ -z "$CUSTOM" ] && DETECTED="$version"
   fi
   fi
 
 
   if [ -n "$DETECTED" ]; then
   if [ -n "$DETECTED" ]; then
@@ -711,7 +742,7 @@ detectImage() {
   local fallback="/run/assets/${DETECTED%%-*}.xml"
   local fallback="/run/assets/${DETECTED%%-*}.xml"
 
 
   setXML "$fallback" && warn "${msg}." && return 0
   setXML "$fallback" && warn "${msg}." && return 0
-  
+
   warn "${msg}, $FB."
   warn "${msg}, $FB."
   return 0
   return 0
 }
 }
@@ -752,9 +783,8 @@ prepareImage() {
 
 
 updateImage() {
 updateImage() {
 
 
-  local iso="$1"
-  local dir="$2"
-  local asset="$3"
+  local dir="$1"
+  local asset="$2"
   local path src loc xml index result
   local path src loc xml index result
 
 
   [ ! -s "$asset" ] || [ ! -f "$asset" ] && return 0
   [ ! -s "$asset" ] || [ ! -f "$asset" ] && return 0
@@ -801,10 +831,8 @@ copyOEM() {
   local src
   local src
 
 
   [ ! -d "$folder" ] && folder="/OEM"
   [ ! -d "$folder" ] && folder="/OEM"
+  [ ! -d "$folder" ] && folder="$STORAGE/oem"
   [ ! -d "$folder" ] && folder="$STORAGE/OEM"
   [ ! -d "$folder" ] && folder="$STORAGE/OEM"
-  [ ! -d "$folder" ] && folder="$STORAGE/OEM"
-  [ ! -d "$folder" ] && folder="$STORAGE/shared/oem"
-  [ ! -d "$folder" ] && folder="$STORAGE/shared/OEM"
   [ ! -d "$folder" ] && return 0
   [ ! -d "$folder" ] && return 0
 
 
   local msg="Copying OEM folder to image..."
   local msg="Copying OEM folder to image..."
@@ -832,9 +860,14 @@ buildImage() {
   local failed="N"
   local failed="N"
   local cat="BOOT.CAT"
   local cat="BOOT.CAT"
   local log="/run/shm/iso.log"
   local log="/run/shm/iso.log"
-  local size size_gb space space_gb desc
-  local out="$TMP/${BASE%.*}.tmp"
+  local base size size_gb space space_gb desc
 
 
+  if [ -f "$BOOT" ]; then
+    error "File $BOOT does already exist?!" && return 1
+  fi
+
+  base=$(basename "$BOOT")
+  local out="$TMP/${base%.*}.tmp"
   rm -f "$out"
   rm -f "$out"
 
 
   desc=$(printVersion "$DETECTED" "ISO")
   desc=$(printVersion "$DETECTED" "ISO")
@@ -890,11 +923,7 @@ buildImage() {
   [ -s "$log" ] && error="$(<"$log")"
   [ -s "$log" ] && error="$(<"$log")"
   [[ "$error" != "$hide" ]] && echo "$error"
   [[ "$error" != "$hide" ]] && echo "$error"
 
 
-  if [ -f "$STORAGE/$BASE" ]; then
-    error "File $STORAGE/$BASE does already exist?!" && return 1
-  fi
-
-  mv "$out" "$STORAGE/$BASE"
+  mv "$out" "$BOOT"
   return 0
   return 0
 }
 }
 
 
@@ -902,6 +931,15 @@ bootWindows() {
 
 
   rm -rf "$TMP"
   rm -rf "$TMP"
 
 
+  if [ ! -f "$ISO" ] || [ ! -s "$ISO" ]; then
+    ISO="/custom.iso"
+    [ ! -f "$ISO" ] && ISO="${STORAGE}$ISO"
+  fi
+
+  BOOT="$ISO"
+
+  [[ "${PLATFORM,,}" == "arm64" ]] && VGA="virtio-gpu"
+
   if [ -s "$STORAGE/windows.mode" ] && [ -f "$STORAGE/windows.mode" ]; then
   if [ -s "$STORAGE/windows.mode" ] && [ -f "$STORAGE/windows.mode" ]; then
     BOOT_MODE=$(<"$STORAGE/windows.mode")
     BOOT_MODE=$(<"$STORAGE/windows.mode")
     if [ -s "$STORAGE/windows.old" ] && [ -f "$STORAGE/windows.old" ]; then
     if [ -s "$STORAGE/windows.old" ] && [ -f "$STORAGE/windows.old" ]; then
@@ -979,16 +1017,13 @@ if ! prepareImage "$ISO" "$DIR"; then
   exit 60
   exit 60
 fi
 fi
 
 
-if ! updateImage "$ISO" "$DIR" "$XML"; then
+if ! updateImage "$DIR" "$XML"; then
   abortInstall "$ISO" && return 0
   abortInstall "$ISO" && return 0
   exit 60
   exit 60
 fi
 fi
 
 
-if ! rm -f "$ISO" 2> /dev/null; then
-  size="$(stat -c%s "$ISO")"
-  BASE="windows.$size.iso"
-  ISO="$STORAGE/$BASE"
-  rm -f  "$ISO"
+if ! removeDownload "$ISO"; then
+  exit 64
 fi
 fi
 
 
 if ! copyOEM "$DIR"; then
 if ! copyOEM "$DIR"; then
@@ -999,7 +1034,7 @@ if ! buildImage "$DIR"; then
   exit 65
   exit 65
 fi
 fi
 
 
-if ! finishInstall "$STORAGE/$BASE" "N"; then
+if ! finishInstall "$BOOT" "N"; then
   exit 69
   exit 69
 fi
 fi
 
 

+ 4 - 3
src/power.sh

@@ -81,11 +81,12 @@ finish() {
     done
     done
   fi
   fi
 
 
-  if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$STORAGE/$BASE" ]; then
+  if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$BOOT" ]; then
     # Remove CD-ROM ISO after install
     # Remove CD-ROM ISO after install
     if ready; then
     if ready; then
-      if rm -f "$STORAGE/$BASE" 2>/dev/null; then
-        touch "$STORAGE/windows.boot"
+      touch "$STORAGE/windows.boot"
+      if [[ "$REMOVE" != [Nn]* ]]; then
+        rm -f "$BOOT" 2>/dev/null || true
       fi
       fi
     fi
     fi
   fi
   fi

+ 10 - 6
src/samba.sh

@@ -14,10 +14,14 @@ if [[ "$DHCP" == [Yy1]* ]]; then
   interface="$VM_NET_DEV"
   interface="$VM_NET_DEV"
 fi
 fi
 
 
-share="$STORAGE/shared"
+share="/shared"
+
+if [ ! -d "$share" ] && [ -d "$STORAGE/shared" ]; then
+  share="$STORAGE/shared"
+fi
 
 
 mkdir -p "$share"
 mkdir -p "$share"
-[ -z "$(ls -A "$share")" ] && chmod -R 777 "$share"
+[ -z "$(ls -A "$share")" ] && chmod 777 "$share"
 
 
 {      echo "[global]"
 {      echo "[global]"
         echo "    server string = Dockur"
         echo "    server string = Dockur"
@@ -53,16 +57,16 @@ mkdir -p "$share"
         echo ""
         echo ""
         echo "Using this folder you can share files with the host machine."
         echo "Using this folder you can share files with the host machine."
         echo ""
         echo ""
-        echo "To change the storage location, include the following bind mount in your compose file:"
+        echo "To change its location, include the following bind mount in your compose file:"
         echo ""
         echo ""
         echo "  volumes:"
         echo "  volumes:"
-        echo "    - \"/home/user/example:/storage/shared\""
+        echo "    - \"/home/user/example:/shared\""
         echo ""
         echo ""
         echo "Or in your run command:"
         echo "Or in your run command:"
         echo ""
         echo ""
-        echo "  -v \"/home/user/example:/storage/shared\""
+        echo "  -v \"/home/user/example:/shared\""
         echo ""
         echo ""
-        echo "Replace the example path /home/user/example with the desired storage folder."
+        echo "Replace the example path /home/user/example with the desired shared folder."
         echo ""
         echo ""
 } | unix2dos > "$share/readme.txt"
 } | unix2dos > "$share/readme.txt"