Compare commits

...

9 Commits

Author SHA1 Message Date
Kroese 7b4404db6b fix: Improve version string trimming (#1738) 2026-05-17 12:58:03 +02:00
Kroese 2412a3ed18 fix: Local variable declaration (#1736) 2026-05-17 10:51:00 +02:00
Kroese 8c57b119cf fix: Language string replacement syntax (#1735) 2026-05-17 10:22:20 +02:00
Kroese 40867f6e85 feat: Update Windows 11 download links (#1733) 2026-05-17 06:06:54 +02:00
Kroese b5d8c2ad08 feat: Update Windows 11 download link (#1732) 2026-05-16 22:41:45 +02:00
Kroese 603465a687 fix: Update Windows Server 2025 download link (#1731) 2026-05-16 22:18:31 +02:00
Kroese d8a548c3fb fix: Escape illegal characters in base64 output (#1730) 2026-05-16 22:10:56 +02:00
Kroese 60e5925d72 feat: Enhance debug messages (#1729) 2026-05-16 19:34:35 +02:00
Kroese 398344163f fix: Invalid sed command syntax (#1728) 2026-05-16 18:53:26 +02:00
5 changed files with 37 additions and 29 deletions
+2 -2
View File
@@ -97,7 +97,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
| **Value** | **Version** | **Size** | | **Value** | **Version** | **Size** |
|---|---|---| |---|---|---|
| `11` | Windows 11 Pro | 7.2 GB | | `11` | Windows 11 Pro | 7.9 GB |
| `11l` | Windows 11 LTSC | 4.7 GB | | `11l` | Windows 11 LTSC | 4.7 GB |
| `11e` | Windows 11 Enterprise | 6.6 GB | | `11e` | Windows 11 Enterprise | 6.6 GB |
|||| ||||
@@ -111,7 +111,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
| `xp` | Windows XP Professional | 0.6 GB | | `xp` | Windows XP Professional | 0.6 GB |
| `2k` | Windows 2000 Professional | 0.4 GB | | `2k` | Windows 2000 Professional | 0.4 GB |
|||| ||||
| `2025` | Windows Server 2025 | 6.7 GB | | `2025` | Windows Server 2025 | 7.6 GB |
| `2022` | Windows Server 2022 | 6.0 GB | | `2022` | Windows Server 2022 | 6.0 GB |
| `2019` | Windows Server 2019 | 5.3 GB | | `2019` | Windows Server 2019 | 5.3 GB |
| `2016` | Windows Server 2016 | 6.5 GB | | `2016` | Windows Server 2016 | 6.5 GB |
+13 -12
View File
@@ -24,7 +24,9 @@ parseVersion() {
VERSION="${VERSION:1:-1}" VERSION="${VERSION:1:-1}"
fi fi
[ -n "$VERSION" ] && VERSION=$(expr "$VERSION" : "^\ *\(.*[^ ]\)\ *$") VERSION="${VERSION#"${VERSION%%[! ]*}"}"
VERSION="${VERSION%"${VERSION##*[! ]}"}"
[ -z "$VERSION" ] && VERSION="win11" [ -z "$VERSION" ] && VERSION="win11"
case "${VERSION,,}" in case "${VERSION,,}" in
@@ -376,9 +378,9 @@ getLanguage() {
parseLanguage() { parseLanguage() {
REGION="${REGION//_/-/}" REGION="${REGION//_/-}"
KEYBOARD="${KEYBOARD//_/-/}" KEYBOARD="${KEYBOARD//_/-}"
LANGUAGE="${LANGUAGE//_/-/}" LANGUAGE="${LANGUAGE//_/-}"
[ -z "$LANGUAGE" ] && LANGUAGE="en" [ -z "$LANGUAGE" ] && LANGUAGE="en"
@@ -722,8 +724,8 @@ getMido() {
case "${id,,}" in case "${id,,}" in
"win11x64" ) "win11x64" )
size=7736125440 size=8471603200
sum="d141f6030fed50f75e2b03e1eb2e53646c4b21e5386047cb860af5223f102a32" sum="768984706b909479417b2368438909440f2967ff05c6a9195ed2667254e465e3"
url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENT_CONSUMER_x64FRE_en-us.iso" url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENT_CONSUMER_x64FRE_en-us.iso"
;; ;;
"win11x64-enterprise-eval" ) "win11x64-enterprise-eval" )
@@ -752,9 +754,9 @@ getMido() {
url="https://download.microsoft.com/download/B/9/9/B999286E-0A47-406D-8B3D-5B5AD7373A4A/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_ENTERPRISE_EVAL_EN-US-IR3_CENA_X64FREE_EN-US_DV9.ISO" url="https://download.microsoft.com/download/B/9/9/B999286E-0A47-406D-8B3D-5B5AD7373A4A/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_ENTERPRISE_EVAL_EN-US-IR3_CENA_X64FREE_EN-US_DV9.ISO"
;; ;;
"win2025-eval" ) "win2025-eval" )
size=6014152704 size=8152356864
sum="d0ef4502e350e3c6c53c15b1b3020d38a5ded011bf04998e950720ac8579b23d" sum="7b052573ba7894c9924e3e87ba732ccd354d18cb75a883efa9b900ea125bfd51"
url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26100.1742.240906-0331.ge_release_svc_refresh_SERVER_EVAL_x64FRE_en-us.iso" url="https://software-static.download.prss.microsoft.com/dbazure/998969d5-f34g-4e03-ac9d-1f9786c66749/26100.32230.260111-0550.lt_release_svc_refresh_SERVER_EVAL_x64FRE_en-us.iso"
;; ;;
"win2022-eval" ) "win2022-eval" )
size=5044094976 size=5044094976
@@ -813,8 +815,8 @@ getLink1() {
case "${id,,}" in case "${id,,}" in
"win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" ) "win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" )
size=6723362816 size=6898546688
sum="d6f5e10db6a6654190ab575fc72c392b7663e31a0156bcc9ce719496a6dde37d" sum="2618a56931b645a6f097082431994bd85ae80862518de389e382f35ebfd455be"
url="11/en-us_windows_11_25h2_x64.iso" url="11/en-us_windows_11_25h2_x64.iso"
;; ;;
"win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" ) "win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" )
@@ -1860,7 +1862,6 @@ detectLegacy() {
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IB -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IB -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51ID -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51ID -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IL -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IL -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IS -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AA -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AA -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AD -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AD -print -quit)
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AS -print -quit) [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AS -print -quit)
+10 -10
View File
@@ -379,7 +379,7 @@ extractESD() {
local version="$3" local version="$3"
local desc="$4" local desc="$4"
local size size_gb sizes space space_gb local size size_gb sizes space space_gb
local desc total total1 total2 total3 total4 local retVal total total1 total2 total3 total4
local imageIndex links links1 links2 links3 links4 local imageIndex links links1 links2 links3 links4
local msg="Extracting $desc bootdisk" local msg="Extracting $desc bootdisk"
@@ -893,12 +893,12 @@ updateXML() {
pw=$(printf '%s' "${pass}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0) pw=$(printf '%s' "${pass}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0)
admin=$(printf '%s' "${pass}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0) admin=$(printf '%s' "${pass}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0)
sed -i "s/<Value>password<\/Value>/<Value>$admin<\/Value>/g" "$asset" sed -i "s|<Value>password<\/Value>|<Value>$admin<\/Value>|g" "$asset"
sed -i "s/<PlainText>true<\/PlainText>/<PlainText>false<\/PlainText>/g" "$asset" sed -i "s|<PlainText>true<\/PlainText>|<PlainText>false<\/PlainText>|g" "$asset"
sed -z "s/<Password>...........<Value \/>/<Password>\n <Value>$pw<\/Value>/g" -i "$asset" sed -i -z "s|<Password>...........<Value \/>|<Password>\n <Value>$pw<\/Value>|g" "$asset"
sed -z "s/<Password>...............<Value \/>/<Password>\n <Value>$pw<\/Value>/g" -i "$asset" sed -i -z "s|<Password>...............<Value \/>|<Password>\n <Value>$pw<\/Value>|g" "$asset"
sed -z "s/<AdministratorPassword>...........<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" sed -i -z "s|<AdministratorPassword>...........<Value \/>|<AdministratorPassword>\n <Value>$admin<\/Value>|g" "$asset"
sed -z "s/<AdministratorPassword>...............<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" sed -i -z "s|<AdministratorPassword>...............<Value \/>|<AdministratorPassword>\n <Value>$admin<\/Value>|g" "$asset"
if [ -n "$EDITION" ]; then if [ -n "$EDITION" ]; then
[[ "${EDITION^^}" == "CORE" ]] && EDITION="STANDARDCORE" [[ "${EDITION^^}" == "CORE" ]] && EDITION="STANDARDCORE"
@@ -1218,11 +1218,11 @@ buildImage() {
error "Failed to build image!" && return 1 error "Failed to build image!" && return 1
fi fi
local error="" local err=""
local hide="Warning: creating filesystem that does not conform to ISO-9660." local hide="Warning: creating filesystem that does not conform to ISO-9660."
[ -s "$log" ] && error="$(<"$log")" [ -s "$log" ] && err="$(<"$log")"
[[ "$error" != "$hide" ]] && echo "$error" [[ "$err" != "$hide" ]] && echo "$err"
mv -f "$out" "$BOOT" || return 1 mv -f "$out" "$BOOT" || return 1
! setOwner "$BOOT" && error "Failed to set the owner for \"$BOOT\" !" ! setOwner "$BOOT" && error "Failed to set the owner for \"$BOOT\" !"
+11 -4
View File
@@ -49,7 +49,7 @@ handle_curl_error() {
get_agent() { get_agent() {
local user_agent local browser_version
# Determine approximate latest Firefox release # Determine approximate latest Firefox release
browser_version="$((124 + ($(date +%s) - 1710892800) / 2419200))" browser_version="$((124 + ($(date +%s) - 1710892800) / 2419200))"
@@ -119,7 +119,7 @@ download_windows() {
org_id="y6jn8c31" org_id="y6jn8c31"
vls_url="https://vlscppe.microsoft.com/tags?org_id=$org_id&session_id=$session_id" vls_url="https://vlscppe.microsoft.com/tags?org_id=$org_id&session_id=$session_id"
[[ "$DEBUG" == [Yy1]* ]] && echo "Session ID: $session_id" [[ "$DEBUG" == [Yy1]* ]] && echo "Getting Session ID: $session_id"
# Permit Session ID # Permit Session ID
curl --silent --max-time 30 --output /dev/null --user-agent "$user_agent" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$vls_url" || { curl --silent --max-time 30 --output /dev/null --user-agent "$user_agent" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$vls_url" || {
@@ -134,6 +134,8 @@ download_windows() {
instance_id="560dc9f3-1aa5-4a2f-b63c-9e18f8d0e175" instance_id="560dc9f3-1aa5-4a2f-b63c-9e18f8d0e175"
ov_url="https://ov-df.microsoft.com/mdt.js?instanceId=$instance_id&PageId=si&session_id=$session_id" ov_url="https://ov-df.microsoft.com/mdt.js?instanceId=$instance_id&PageId=si&session_id=$session_id"
[[ "$DEBUG" == [Yy1]* ]] && echo -n "Getting OV data: "
ov_data=$(curl --silent --max-time 30 --user-agent "$user_agent" --header "Accept:" --max-filesize 1M --fail --proto =https --tlsv1.2 --http1.1 -- "$ov_url") || { ov_data=$(curl --silent --max-time 30 --user-agent "$user_agent" --header "Accept:" --max-filesize 1M --fail --proto =https --tlsv1.2 --http1.1 -- "$ov_url") || {
handle_curl_error "$?" "Microsoft" handle_curl_error "$?" "Microsoft"
return $? return $?
@@ -152,6 +154,8 @@ download_windows() {
return 1 return 1
fi fi
[[ "$DEBUG" == [Yy1]* ]] && echo "$ovw"
sleep 0.2 sleep 0.2
# 2) Send a reply with session ID, current epoch and previously retrieved w and rticks # 2) Send a reply with session ID, current epoch and previously retrieved w and rticks
@@ -159,6 +163,8 @@ download_windows() {
mdt=$(date +%s%3N) mdt=$(date +%s%3N)
ov_url="https://ov-df.microsoft.com/?session_id=$session_id&CustomerId=$instance_id&PageId=si&w=$ovw&mdt=$mdt&rticks=$rticks" ov_url="https://ov-df.microsoft.com/?session_id=$session_id&CustomerId=$instance_id&PageId=si&w=$ovw&mdt=$mdt&rticks=$rticks"
[[ "$DEBUG" == [Yy1]* ]] && echo "Sending OV reply: $instance_id"
curl --silent --max-time 30 --output /dev/null --user-agent "$user_agent" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$ov_url" || { curl --silent --max-time 30 --output /dev/null --user-agent "$user_agent" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$ov_url" || {
# This should only happen if there's been some change to how this API works # This should only happen if there's been some change to how this API works
handle_curl_error "$?" "Microsoft" handle_curl_error "$?" "Microsoft"
@@ -209,7 +215,7 @@ download_windows() {
{ iso_download_link=$(echo "$iso_json" | jq --argjson TYPE "$download_type" -r '.ProductDownloadOptions[] | select(.DownloadType==$TYPE).Uri') 2>/dev/null; rc=$?; } || : { iso_download_link=$(echo "$iso_json" | jq --argjson TYPE "$download_type" -r '.ProductDownloadOptions[] | select(.DownloadType==$TYPE).Uri') 2>/dev/null; rc=$?; } || :
if [ -z "$iso_download_link" ] || [[ "${iso_download_link,,}" == "null" ]] || (( rc != 0 )); then if [ -z "$iso_download_link" ] || [[ "${iso_download_link,,}" == "null" ]] || (( rc != 0 )); then
error "Microsoft servers gave us no download link to our request for an automated download!" error "Microsoft server gave us no download link to our request for an automated download!"
info "Response: $iso_json" info "Response: $iso_json"
return 1 return 1
fi fi
@@ -267,6 +273,7 @@ download_windows_eval() {
culture=$(getLanguage "$lang" "culture") culture=$(getLanguage "$lang" "culture")
local country="${culture#*-}" local country="${culture#*-}"
local iso_download_links=""
local iso_download_page_html="" local iso_download_page_html=""
local url="https://www.microsoft.com/en-us/evalcenter/download-$windows_version" local url="https://www.microsoft.com/en-us/evalcenter/download-$windows_version"
@@ -521,7 +528,7 @@ getESD() {
error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1 error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1
fi fi
local msg="Downloading catalog..." local msg="Downloading catalog from the Microsoft servers..."
info "$msg" && html "$msg" info "$msg" && html "$msg"
rm -rf "$dir" rm -rf "$dir"
+1 -1
View File
@@ -97,7 +97,7 @@ finish() {
# Workaround for zombie pid # Workaround for zombie pid
[ ! -s "$QEMU_PID" ] && break [ ! -s "$QEMU_PID" ] && break
if [ "$cnt" == "5" ]; then if [ "$cnt" -eq 5 ]; then
echo && error "QEMU did not terminate itself, forcefully killing process..." echo && error "QEMU did not terminate itself, forcefully killing process..."
{ kill -9 "$pid" || true; } 2>/dev/null { kill -9 "$pid" || true; } 2>/dev/null
fi fi