mirror of
https://github.com/dockur/windows.git
synced 2026-01-22 02:43:06 +00:00
Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8b4cb9c14 | ||
|
|
5425783f5c | ||
|
|
221f4feac3 | ||
|
|
a14426478c | ||
|
|
e56f059bd2 | ||
|
|
4a5e455389 | ||
|
|
0f918c8cb0 | ||
|
|
9c08dc7b1e | ||
|
|
bfc9b357e5 | ||
|
|
ea3003dec5 | ||
|
|
06518d8eb3 | ||
|
|
9b4cd5a745 | ||
|
|
d9211a77df | ||
|
|
d25e18c0c5 | ||
|
|
ef850e9837 | ||
|
|
0903fad26b | ||
|
|
d08b7aeb27 | ||
|
|
2239792fa9 | ||
|
|
05330ff64c | ||
|
|
1c15df95ac | ||
|
|
1ebb4c8d58 | ||
|
|
e3dc889601 | ||
|
|
22511b16ae | ||
|
|
d0ac685a81 | ||
|
|
36e69fba72 | ||
|
|
2983b2b677 | ||
|
|
22235bf48e | ||
|
|
da308b7e89 | ||
|
|
53b0c9ad02 | ||
|
|
0b7e8f01be | ||
|
|
5248397845 | ||
|
|
032d7a31a4 | ||
|
|
21f533ece8 | ||
|
|
945e27f72c | ||
|
|
50f6467dea |
12
.github/workflows/build.yml
vendored
12
.github/workflows/build.yml
vendored
@@ -2,16 +2,6 @@ name: Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
paths-ignore:
|
|
||||||
- '**/*.md'
|
|
||||||
- '**/*.yml'
|
|
||||||
- '.gitignore'
|
|
||||||
- '.dockerignore'
|
|
||||||
- '.github/**'
|
|
||||||
- '.github/workflows/**'
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: build
|
group: build
|
||||||
@@ -32,7 +22,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
-
|
-
|
||||||
|
|||||||
4
.github/workflows/check.yml
vendored
4
.github/workflows/check.yml
vendored
@@ -7,7 +7,7 @@ jobs:
|
|||||||
name: shellcheck
|
name: shellcheck
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Run ShellCheck
|
- name: Run ShellCheck
|
||||||
uses: ludeeus/action-shellcheck@master
|
uses: ludeeus/action-shellcheck@master
|
||||||
env:
|
env:
|
||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
path: "assets"
|
path: "assets"
|
||||||
file-endings: ".xml"
|
file-endings: ".xml"
|
||||||
- name: Lint Dockerfile
|
- name: Lint Dockerfile
|
||||||
uses: hadolint/hadolint-action@v3.1.0
|
uses: hadolint/hadolint-action@v3.3.0
|
||||||
with:
|
with:
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ignore: DL3006,DL3008
|
ignore: DL3006,DL3008
|
||||||
|
|||||||
2
.github/workflows/hub.yml
vendored
2
.github/workflows/hub.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
dockerHubDescription:
|
dockerHubDescription:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
-
|
-
|
||||||
name: Docker Hub Description
|
name: Docker Hub Description
|
||||||
uses: peter-evans/dockerhub-description@v4
|
uses: peter-evans/dockerhub-description@v4
|
||||||
|
|||||||
13
Dockerfile
13
Dockerfile
@@ -1,8 +1,11 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG VERSION_ARG="latest"
|
ARG VERSION_ARG="latest"
|
||||||
FROM scratch AS build-amd64
|
FROM scratch AS build-amd64
|
||||||
|
|
||||||
COPY --from=qemux/qemu:7.12 / /
|
COPY --from=qemux/qemu:7.16 / /
|
||||||
|
|
||||||
|
ARG TARGETARCH
|
||||||
ARG DEBCONF_NOWARNINGS="yes"
|
ARG DEBCONF_NOWARNINGS="yes"
|
||||||
ARG DEBIAN_FRONTEND="noninteractive"
|
ARG DEBIAN_FRONTEND="noninteractive"
|
||||||
ARG DEBCONF_NONINTERACTIVE_SEEN="true"
|
ARG DEBCONF_NONINTERACTIVE_SEEN="true"
|
||||||
@@ -10,21 +13,21 @@ ARG DEBCONF_NONINTERACTIVE_SEEN="true"
|
|||||||
RUN set -eu && \
|
RUN set -eu && \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
apt-get --no-install-recommends -y install \
|
apt-get --no-install-recommends -y install \
|
||||||
wsdd \
|
|
||||||
samba \
|
samba \
|
||||||
wimtools \
|
wimtools \
|
||||||
dos2unix \
|
dos2unix \
|
||||||
cabextract \
|
cabextract \
|
||||||
libxml2-utils \
|
libxml2-utils \
|
||||||
libarchive-tools \
|
libarchive-tools && \
|
||||||
netcat-openbsd && \
|
wget "https://github.com/gershnik/wsdd-native/releases/download/v1.21/wsddn_1.21_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q && \
|
||||||
|
dpkg -i /tmp/wsddn.deb && \
|
||||||
apt-get clean && \
|
apt-get clean && \
|
||||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
COPY --chmod=755 ./src /run/
|
COPY --chmod=755 ./src /run/
|
||||||
COPY --chmod=755 ./assets /run/assets
|
COPY --chmod=755 ./assets /run/assets
|
||||||
|
|
||||||
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.45-0/virtio-win-1.9.45.tar.xz /var/drivers.txz
|
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.47-0/virtio-win-1.9.47.tar.xz /var/drivers.txz
|
||||||
|
|
||||||
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
|
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
|
||||||
FROM build-${TARGETARCH}
|
FROM build-${TARGETARCH}
|
||||||
|
|||||||
@@ -358,7 +358,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -361,7 +361,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -361,7 +361,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -361,7 +361,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -361,7 +361,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -257,7 +257,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
@@ -260,7 +260,7 @@
|
|||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
<Order>5</Order>
|
<Order>5</Order>
|
||||||
<CommandLine>cmd /C wmic useraccount where name="Docker" set PasswordExpires=false</CommandLine>
|
<CommandLine>powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1</CommandLine>
|
||||||
<Description>Password Never Expires</Description>
|
<Description>Password Never Expires</Description>
|
||||||
</SynchronousCommand>
|
</SynchronousCommand>
|
||||||
<SynchronousCommand wcm:action="add">
|
<SynchronousCommand wcm:action="add">
|
||||||
|
|||||||
11
readme.md
11
readme.md
@@ -95,7 +95,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `11` | Windows 11 Pro | 5.4 GB |
|
| `11` | Windows 11 Pro | 5.4 GB |
|
||||||
| `11l` | Windows 11 LTSC | 4.7 GB |
|
| `11l` | Windows 11 LTSC | 4.7 GB |
|
||||||
| `11e` | Windows 11 Enterprise | 4.0 GB |
|
| `11e` | Windows 11 Enterprise | 5.3 GB |
|
||||||
||||
|
||||
|
||||||
| `10` | Windows 10 Pro | 5.7 GB |
|
| `10` | Windows 10 Pro | 5.7 GB |
|
||||||
| `10l` | Windows 10 LTSC | 4.6 GB |
|
| `10l` | Windows 10 LTSC | 4.6 GB |
|
||||||
@@ -107,8 +107,8 @@ 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 | 5.6 GB |
|
| `2025` | Windows Server 2025 | 6.7 GB |
|
||||||
| `2022` | Windows Server 2022 | 4.7 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 |
|
||||||
| `2012` | Windows Server 2012 | 4.3 GB |
|
| `2012` | Windows Server 2012 | 4.3 GB |
|
||||||
@@ -139,7 +139,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
|||||||
```
|
```
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> This can also be used to resize the existing disk to a larger capacity without any data loss.
|
> This can also be used to resize the existing disk to a larger capacity without any data loss. However you will need to [manually extend the disk partition](https://learn.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume?tabs=disk-management) since the added disk space will appear as unallocated.
|
||||||
|
|
||||||
### How do I share files with the host?
|
### How do I share files with the host?
|
||||||
|
|
||||||
@@ -393,9 +393,6 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
|||||||
|
|
||||||
Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project will be considered legal.
|
Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project will be considered legal.
|
||||||
|
|
||||||
## Stars 🌟
|
|
||||||
[](https://starchart.cc/dockur/windows)
|
|
||||||
|
|
||||||
## Disclaimer ⚖️
|
## Disclaimer ⚖️
|
||||||
|
|
||||||
*The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation.*
|
*The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation.*
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ parseVersion() {
|
|||||||
VERSION="${VERSION:1:-1}"
|
VERSION="${VERSION:1:-1}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
VERSION=$(expr "$VERSION" : "^\ *\(.*[^ ]\)\ *$")
|
||||||
[ -z "$VERSION" ] && VERSION="win11"
|
[ -z "$VERSION" ] && VERSION="win11"
|
||||||
|
|
||||||
case "${VERSION,,}" in
|
case "${VERSION,,}" in
|
||||||
@@ -33,11 +34,11 @@ parseVersion() {
|
|||||||
"11e" | "win11e" | "windows11e" | "windows 11e" )
|
"11e" | "win11e" | "windows11e" | "windows 11e" )
|
||||||
VERSION="win11x64-enterprise-eval"
|
VERSION="win11x64-enterprise-eval"
|
||||||
;;
|
;;
|
||||||
"11i" | "11iot" | "iot11" | "win11i" | "win11-iot" | "win11x64-iot" | "win11x64-enterprise-iot-eval" )
|
"11i" | "11iot" | "iot11" | "win11i" | "win11-iot" | "win11x64-iot" )
|
||||||
VERSION="win11x64-enterprise-iot-eval"
|
VERSION="win11x64-enterprise-iot-eval"
|
||||||
[ -z "$DETECTED" ] && DETECTED="win11x64-iot"
|
[ -z "$DETECTED" ] && DETECTED="win11x64-iot"
|
||||||
;;
|
;;
|
||||||
"11l" | "11ltsc" | "ltsc11" | "win11l" | "win11-ltsc" | "win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" )
|
"11l" | "11ltsc" | "ltsc11" | "win11l" | "win11-ltsc" | "win11x64-ltsc" )
|
||||||
VERSION="win11x64-enterprise-ltsc-eval"
|
VERSION="win11x64-enterprise-ltsc-eval"
|
||||||
[ -z "$DETECTED" ] && DETECTED="win11x64-ltsc"
|
[ -z "$DETECTED" ] && DETECTED="win11x64-ltsc"
|
||||||
;;
|
;;
|
||||||
@@ -47,11 +48,11 @@ parseVersion() {
|
|||||||
"10e" | "win10e" | "windows10e" | "windows 10e" )
|
"10e" | "win10e" | "windows10e" | "windows 10e" )
|
||||||
VERSION="win10x64-enterprise-eval"
|
VERSION="win10x64-enterprise-eval"
|
||||||
;;
|
;;
|
||||||
"10i" | "10iot" | "iot10" | "win10i" | "win10-iot" | "win10x64-iot" | "win10x64-enterprise-iot-eval" )
|
"10i" | "10iot" | "iot10" | "win10i" | "win10-iot" | "win10x64-iot" )
|
||||||
VERSION="win10x64-enterprise-iot-eval"
|
VERSION="win10x64-enterprise-iot-eval"
|
||||||
[ -z "$DETECTED" ] && DETECTED="win10x64-iot"
|
[ -z "$DETECTED" ] && DETECTED="win10x64-iot"
|
||||||
;;
|
;;
|
||||||
"10l" | "10ltsc" | "ltsc10" | "win10l" | "win10-ltsc" | "win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" )
|
"10l" | "10ltsc" | "ltsc10" | "win10l" | "win10-ltsc" | "win10x64-ltsc" )
|
||||||
VERSION="win10x64-enterprise-ltsc-eval"
|
VERSION="win10x64-enterprise-ltsc-eval"
|
||||||
[ -z "$DETECTED" ] && DETECTED="win10x64-ltsc"
|
[ -z "$DETECTED" ] && DETECTED="win10x64-ltsc"
|
||||||
;;
|
;;
|
||||||
@@ -134,6 +135,10 @@ parseVersion() {
|
|||||||
"2003" | "2003r2" | "win2003" | "win2003r2" | "windows2003" | "windows 2003" )
|
"2003" | "2003r2" | "win2003" | "win2003r2" | "windows2003" | "windows 2003" )
|
||||||
VERSION="win2003r2"
|
VERSION="win2003r2"
|
||||||
;;
|
;;
|
||||||
|
"nano11" | "nano 11" )
|
||||||
|
VERSION="nano11"
|
||||||
|
[ -z "$DETECTED" ] && DETECTED="win11x64"
|
||||||
|
;;
|
||||||
"core11" | "core 11" )
|
"core11" | "core 11" )
|
||||||
VERSION="core11"
|
VERSION="core11"
|
||||||
[ -z "$DETECTED" ] && DETECTED="win11x64"
|
[ -z "$DETECTED" ] && DETECTED="win11x64"
|
||||||
@@ -431,6 +436,7 @@ printVersion() {
|
|||||||
"tiny11"* ) desc="Tiny 11" ;;
|
"tiny11"* ) desc="Tiny 11" ;;
|
||||||
"tiny10"* ) desc="Tiny 10" ;;
|
"tiny10"* ) desc="Tiny 10" ;;
|
||||||
"core11"* ) desc="Core 11" ;;
|
"core11"* ) desc="Core 11" ;;
|
||||||
|
"nano11"* ) desc="Nano 11" ;;
|
||||||
"win7"* ) desc="Windows 7" ;;
|
"win7"* ) desc="Windows 7" ;;
|
||||||
"win8"* ) desc="Windows 8" ;;
|
"win8"* ) desc="Windows 8" ;;
|
||||||
"win10"* ) desc="Windows 10" ;;
|
"win10"* ) desc="Windows 10" ;;
|
||||||
@@ -569,6 +575,9 @@ fromFile() {
|
|||||||
*"winvista"* | *"win_vista"* | *"windowsvista"* | *"windows_vista"* )
|
*"winvista"* | *"win_vista"* | *"windowsvista"* | *"windows_vista"* )
|
||||||
id="winvista${arch}"
|
id="winvista${arch}"
|
||||||
;;
|
;;
|
||||||
|
"nano11"* | "nano_11"* )
|
||||||
|
id="nano11"
|
||||||
|
;;
|
||||||
"tiny11core"* | "tiny11_core"* | "tiny_11_core"* )
|
"tiny11core"* | "tiny11_core"* | "tiny_11_core"* )
|
||||||
id="core11"
|
id="core11"
|
||||||
;;
|
;;
|
||||||
@@ -693,26 +702,9 @@ switchEdition() {
|
|||||||
|
|
||||||
local id="$1"
|
local id="$1"
|
||||||
|
|
||||||
case "${id,,}" in
|
if [[ "${id,,}" == *"-eval" ]]; then
|
||||||
"win11${PLATFORM,,}-enterprise-eval" )
|
[ -z "$DETECTED" ] && DETECTED="${id::-5}"
|
||||||
DETECTED="win11${PLATFORM,,}-enterprise"
|
fi
|
||||||
;;
|
|
||||||
"win10${PLATFORM,,}-enterprise-eval" )
|
|
||||||
DETECTED="win10${PLATFORM,,}-enterprise"
|
|
||||||
;;
|
|
||||||
"win81${PLATFORM,,}-enterprise-eval" )
|
|
||||||
DETECTED="win81${PLATFORM,,}-enterprise"
|
|
||||||
;;
|
|
||||||
"win7${PLATFORM,,}" | "win7${PLATFORM,,}-enterprise-eval" )
|
|
||||||
DETECTED="win7${PLATFORM,,}-enterprise"
|
|
||||||
;;
|
|
||||||
"win2025-eval" ) DETECTED="win2025" ;;
|
|
||||||
"win2022-eval" ) DETECTED="win2022" ;;
|
|
||||||
"win2019-eval" ) DETECTED="win2019" ;;
|
|
||||||
"win2016-eval" ) DETECTED="win2016" ;;
|
|
||||||
"win2012r2-eval" ) DETECTED="win2012r2" ;;
|
|
||||||
"win2008r2-eval" ) DETECTED="win2008r2" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -726,7 +718,7 @@ getMido() {
|
|||||||
local sum=""
|
local sum=""
|
||||||
local size=""
|
local size=""
|
||||||
|
|
||||||
[[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
|
[[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win11x64" )
|
"win11x64" )
|
||||||
@@ -734,8 +726,8 @@ getMido() {
|
|||||||
sum="b56b911bf18a2ceaeb3904d87e7c770bdf92d3099599d61ac2497b91bf190b11"
|
sum="b56b911bf18a2ceaeb3904d87e7c770bdf92d3099599d61ac2497b91bf190b11"
|
||||||
;;
|
;;
|
||||||
"win11x64-enterprise-eval" )
|
"win11x64-enterprise-eval" )
|
||||||
size=4295096320
|
size=5387960320
|
||||||
sum="dad633276073f14f3e0373ef7e787569e216d54942ce522b39451c8f2d38ad43"
|
sum="755a90d43e826a74b9e1932a34788b898e028272439b777e5593dee8d53622ae"
|
||||||
url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26100.1.240331-1435.ge_release_CLIENTENTERPRISEEVAL_OEMRET_A64FRE_en-us.iso"
|
url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26100.1.240331-1435.ge_release_CLIENTENTERPRISEEVAL_OEMRET_A64FRE_en-us.iso"
|
||||||
;;
|
;;
|
||||||
"win11x64-enterprise-iot-eval" | "win11x64-enterprise-ltsc-eval" )
|
"win11x64-enterprise-iot-eval" | "win11x64-enterprise-ltsc-eval" )
|
||||||
@@ -820,7 +812,7 @@ getLink1() {
|
|||||||
local size=""
|
local size=""
|
||||||
local host="https://dl.bobpony.com/windows"
|
local host="https://dl.bobpony.com/windows"
|
||||||
|
|
||||||
[[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
|
[[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" )
|
"win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" )
|
||||||
@@ -828,12 +820,12 @@ getLink1() {
|
|||||||
sum="aa1ad990f930d907b7a34ea897abbb0dfbe47552ca8acc146f92e40381839e05"
|
sum="aa1ad990f930d907b7a34ea897abbb0dfbe47552ca8acc146f92e40381839e05"
|
||||||
url="11/en-us_windows_11_24h2_x64.iso"
|
url="11/en-us_windows_11_24h2_x64.iso"
|
||||||
;;
|
;;
|
||||||
"win11x64-iot" | "win11x64-enterprise-iot-eval" )
|
"win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" )
|
||||||
size=5144817664
|
size=5144817664
|
||||||
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
||||||
url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
||||||
;;
|
;;
|
||||||
"win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" )
|
"win11x64-ltsc" | "win11x64-enterprise-ltsc" | "win11x64-enterprise-ltsc-eval" )
|
||||||
size=5144817664
|
size=5144817664
|
||||||
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
||||||
url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
||||||
@@ -843,12 +835,12 @@ getLink1() {
|
|||||||
sum="557871965263d0fd0a1ea50b5d0d0d7cb04a279148ca905c1c675c9bc0d5486c"
|
sum="557871965263d0fd0a1ea50b5d0d0d7cb04a279148ca905c1c675c9bc0d5486c"
|
||||||
url="10/en-us_windows_10_22h2_x64.iso"
|
url="10/en-us_windows_10_22h2_x64.iso"
|
||||||
;;
|
;;
|
||||||
"win10x64-iot" | "win10x64-enterprise-iot-eval" )
|
"win10x64-iot" | "win10x64-enterprise-iot" | "win10x64-enterprise-iot-eval" )
|
||||||
size=4851668992
|
size=4851668992
|
||||||
sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160"
|
sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160"
|
||||||
url="10/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso"
|
url="10/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso"
|
||||||
;;
|
;;
|
||||||
"win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" )
|
"win10x64-ltsc" | "win10x64-enterprise-ltsc" | "win10x64-enterprise-ltsc-eval" )
|
||||||
size=4899461120
|
size=4899461120
|
||||||
sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d"
|
sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d"
|
||||||
url="10/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso"
|
url="10/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso"
|
||||||
@@ -864,14 +856,14 @@ getLink1() {
|
|||||||
url="8.x/8.1/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso"
|
url="8.x/8.1/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso"
|
||||||
;;
|
;;
|
||||||
"win2025" | "win2025-eval" )
|
"win2025" | "win2025-eval" )
|
||||||
size=5307176960
|
size=6786627584
|
||||||
sum="2293897341febdcea599f5412300b470b5288c6fd2b89666a7b27d283e8d3cf3"
|
sum="bf3ef0849c7cb5e818e1035b7466d206af5aa227ace1a3f4b0de2bf00d2e2144"
|
||||||
url="server/2025/en-us_windows_server_2025_preview_x64_dvd_ce9eb1a5.iso"
|
url="server/2025/en-us_windows_server_2025_updated_april_2025_x64_dvd_ea86301d.iso"
|
||||||
;;
|
;;
|
||||||
"win2022" | "win2022-eval" )
|
"win2022" | "win2022-eval" )
|
||||||
size=5365624832
|
size=6005706752
|
||||||
sum="c3c57bb2cf723973a7dcfb1a21e97dfa035753a7f111e348ad918bb64b3114db"
|
sum="cea2cb2c09de9910c236e64eae3a801c55e9c77ec25e8d81585e3a4581d24bfb"
|
||||||
url="server/2022/en-us_windows_server_2022_updated_jan_2024_x64_dvd_2b7a0c9f.iso"
|
url="server/2022/en-us_windows_server_2022_updated_april_2025_x64_dvd_3f755ec1.iso"
|
||||||
;;
|
;;
|
||||||
"win2019" | "win2019-eval" )
|
"win2019" | "win2019-eval" )
|
||||||
size=5575774208
|
size=5575774208
|
||||||
@@ -964,7 +956,7 @@ getLink2() {
|
|||||||
local size=""
|
local size=""
|
||||||
local host="https://files.dog/MSDN"
|
local host="https://files.dog/MSDN"
|
||||||
|
|
||||||
[[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
|
[[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win81x64" )
|
"win81x64" )
|
||||||
@@ -1063,7 +1055,7 @@ getLink3() {
|
|||||||
local size=""
|
local size=""
|
||||||
local host="https://nixsys.com/drivers"
|
local host="https://nixsys.com/drivers"
|
||||||
|
|
||||||
[[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
|
[[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win7x64" | "win7x64-ultimate" )
|
"win7x64" | "win7x64-ultimate" )
|
||||||
@@ -1106,9 +1098,14 @@ getLink4() {
|
|||||||
local size=""
|
local size=""
|
||||||
local host="https://archive.org/download"
|
local host="https://archive.org/download"
|
||||||
|
|
||||||
[[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
|
[[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
|
"nano11" )
|
||||||
|
size=2463565824
|
||||||
|
sum="a1e0614372768cbe2d24de74b78a4a97bc1017ea5080dfed1d2125e4a527eb1a"
|
||||||
|
url="nano11_25h2/nano11%2025h2.iso"
|
||||||
|
;;
|
||||||
"core11" )
|
"core11" )
|
||||||
size=2159738880
|
size=2159738880
|
||||||
sum="78f0f44444ff95b97125b43e560a72e0d6ce0a665cf9f5573bf268191e5510c1"
|
sum="78f0f44444ff95b97125b43e560a72e0d6ce0a665cf9f5573bf268191e5510c1"
|
||||||
@@ -1134,12 +1131,12 @@ getLink4() {
|
|||||||
sum="c8dbc96b61d04c8b01faf6ce0794fdf33965c7b350eaa3eb1e6697019902945c"
|
sum="c8dbc96b61d04c8b01faf6ce0794fdf33965c7b350eaa3eb1e6697019902945c"
|
||||||
url="Windows11Enterprise23H2x64/22631.2428.231001-0608.23H2_NI_RELEASE_SVC_REFRESH_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso"
|
url="Windows11Enterprise23H2x64/22631.2428.231001-0608.23H2_NI_RELEASE_SVC_REFRESH_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso"
|
||||||
;;
|
;;
|
||||||
"win11x64-iot" | "win11x64-enterprise-iot-eval" )
|
"win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" )
|
||||||
size=5144817664
|
size=5144817664
|
||||||
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
||||||
url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
||||||
;;
|
;;
|
||||||
"win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" )
|
"win11x64-ltsc" | "win11x64-enterprise-ltsc" | "win11x64-enterprise-ltsc-eval" )
|
||||||
size=5144817664
|
size=5144817664
|
||||||
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
|
||||||
url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
||||||
@@ -1149,12 +1146,12 @@ getLink4() {
|
|||||||
sum="7847abd6f39abd02dc8089c4177d354f9eb66fa0ee2fe8ae20e596e675d1ab67"
|
sum="7847abd6f39abd02dc8089c4177d354f9eb66fa0ee2fe8ae20e596e675d1ab67"
|
||||||
url="Windows-10-22H2-July-2024-64-bit-DVD-English/en-us_windows_10_business_editions_version_22h2_updated_july_2024_x64_dvd_c004521a.iso"
|
url="Windows-10-22H2-July-2024-64-bit-DVD-English/en-us_windows_10_business_editions_version_22h2_updated_july_2024_x64_dvd_c004521a.iso"
|
||||||
;;
|
;;
|
||||||
"win10x64-iot" | "win10x64-enterprise-iot-eval" )
|
"win10x64-iot" | "win10x64-enterprise-iot" | "win10x64-enterprise-iot-eval" )
|
||||||
size=4851668992
|
size=4851668992
|
||||||
sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160"
|
sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160"
|
||||||
url="en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f_202411/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso"
|
url="en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f_202411/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso"
|
||||||
;;
|
;;
|
||||||
"win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" )
|
"win10x64-ltsc" | "win10x64-enterprise-ltsc" | "win10x64-enterprise-ltsc-eval" )
|
||||||
size=4899461120
|
size=4899461120
|
||||||
sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d"
|
sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d"
|
||||||
url="en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_202302/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso"
|
url="en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_202302/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso"
|
||||||
@@ -1313,6 +1310,8 @@ isMido() {
|
|||||||
local lang="$2"
|
local lang="$2"
|
||||||
local sum
|
local sum
|
||||||
|
|
||||||
|
[[ "${MIDO:-}" == [Nn]* ]] && return 1
|
||||||
|
|
||||||
sum=$(getMido "$id" "en" "sum")
|
sum=$(getMido "$id" "en" "sum")
|
||||||
[ -n "$sum" ] && return 0
|
[ -n "$sum" ] && return 0
|
||||||
|
|
||||||
@@ -1324,6 +1323,8 @@ isESD() {
|
|||||||
local id="$1"
|
local id="$1"
|
||||||
local lang="$2"
|
local lang="$2"
|
||||||
|
|
||||||
|
[[ "${ESD:-}" == [Nn]* ]] && return 1
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win11${PLATFORM,,}" | "win10${PLATFORM,,}" )
|
"win11${PLATFORM,,}" | "win10${PLATFORM,,}" )
|
||||||
return 0
|
return 0
|
||||||
@@ -1405,7 +1406,7 @@ prepareInstall() {
|
|||||||
error "Failed to locate directory \"$target\" in $desc ISO image!" && return 1
|
error "Failed to locate directory \"$target\" in $desc ISO image!" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${driver,,}" == "xp" ]] || [[ "${driver,,}" == "2k3" ]]; then
|
if [[ "${driver,,}" == "xp" || "${driver,,}" == "2k3" ]]; then
|
||||||
|
|
||||||
local msg="Adding drivers to image..."
|
local msg="Adding drivers to image..."
|
||||||
info "$msg" && html "$msg"
|
info "$msg" && html "$msg"
|
||||||
@@ -1884,6 +1885,10 @@ skipVersion() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCompatible() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
setMachine() {
|
setMachine() {
|
||||||
|
|
||||||
local id="$1"
|
local id="$1"
|
||||||
|
|||||||
140
src/install.sh
140
src/install.sh
@@ -1,12 +1,52 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
TMP="$STORAGE/tmp"
|
|
||||||
DIR="$TMP/unpack"
|
|
||||||
FB="falling back to manual installation!"
|
|
||||||
ETFS="boot/etfsboot.com"
|
ETFS="boot/etfsboot.com"
|
||||||
|
FB="falling back to manual installation!"
|
||||||
EFISYS="efi/microsoft/boot/efisys_noprompt.bin"
|
EFISYS="efi/microsoft/boot/efisys_noprompt.bin"
|
||||||
|
|
||||||
|
backup () {
|
||||||
|
|
||||||
|
local count=1
|
||||||
|
local iso="$1"
|
||||||
|
local name="unknown"
|
||||||
|
local root="$STORAGE/backups"
|
||||||
|
local previous="$STORAGE/windows.base"
|
||||||
|
|
||||||
|
if [ -f "$previous" ]; then
|
||||||
|
|
||||||
|
previous=$(<"$previous")
|
||||||
|
previous="${previous//[![:print:]]/}"
|
||||||
|
|
||||||
|
[ -n "$previous" ] && name="${previous%.*}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$root"
|
||||||
|
local folder="$name"
|
||||||
|
local dir="$root/$folder"
|
||||||
|
|
||||||
|
while [ -d "$dir" ]
|
||||||
|
do
|
||||||
|
count=$((count+1))
|
||||||
|
folder="${name}.${count}"
|
||||||
|
dir="$root/$folder"
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf "$dir"
|
||||||
|
mkdir -p "$dir"
|
||||||
|
|
||||||
|
[ -f "$iso" ] && mv -f "$iso" "$dir/"
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f -iname 'data.*' -not -iname '*.iso' -exec mv -n {} "$dir/" \;
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f -iname 'windows.*' -not -iname '*.iso' -exec mv -n {} "$dir/" \;
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f \( -iname '*.rom' -or -iname '*.vars' \) -exec mv -n {} "$dir/" \;
|
||||||
|
|
||||||
|
[ -z "$(ls -A "$dir")" ] && rm -rf "$dir"
|
||||||
|
[ -z "$(ls -A "$root")" ] && rm -rf "$root"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
skipInstall() {
|
skipInstall() {
|
||||||
|
|
||||||
local iso="$1"
|
local iso="$1"
|
||||||
@@ -16,28 +56,44 @@ skipInstall() {
|
|||||||
local previous="$STORAGE/windows.base"
|
local previous="$STORAGE/windows.base"
|
||||||
|
|
||||||
if [ -f "$previous" ]; then
|
if [ -f "$previous" ]; then
|
||||||
|
|
||||||
previous=$(<"$previous")
|
previous=$(<"$previous")
|
||||||
previous="${previous//[![:print:]]/}"
|
previous="${previous//[![:print:]]/}"
|
||||||
|
|
||||||
if [ -n "$previous" ]; then
|
if [ -n "$previous" ]; then
|
||||||
if [[ "${STORAGE,,}/${previous,,}" != "${iso,,}" ]]; then
|
if [[ "${STORAGE,,}/${previous,,}" != "${iso,,}" ]]; then
|
||||||
if [ -f "$boot" ] && hasDisk; then
|
|
||||||
if [[ "${iso,,}" == "${STORAGE,,}/windows."* ]]; then
|
if ! hasDisk; then
|
||||||
method="your custom .iso file"
|
|
||||||
else
|
rm -f "$STORAGE/$previous"
|
||||||
if [[ "${previous,,}" != "windows."* ]]; then
|
return 1
|
||||||
method="the VERSION variable"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [ -n "$method" ]; then
|
|
||||||
info "Detected that $method was changed, but ignoring this because Windows is already installed."
|
|
||||||
info "Please start with an empty /storage folder, if you want to install a different version of Windows."
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
fi
|
||||||
rm -f "$STORAGE/$previous"
|
|
||||||
|
if [[ "${iso,,}" == "${STORAGE,,}/windows."* ]]; then
|
||||||
|
method="your custom .iso file was changed"
|
||||||
|
else
|
||||||
|
if [[ "${previous,,}" != "windows."* ]]; then
|
||||||
|
method="the VERSION variable was changed"
|
||||||
|
else
|
||||||
|
method="your custom .iso file was removed"
|
||||||
|
|
||||||
|
if [ -f "$boot" ]; then
|
||||||
|
info "Detected that $method, will be ignored."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
info "Detected that $method, a backup of your previous installation will be saved..."
|
||||||
|
! backup "$STORAGE/$previous" && error "Backup failed!"
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -f "$boot" ] && hasDisk && return 0
|
[ -f "$boot" ] && hasDisk && return 0
|
||||||
@@ -51,8 +107,10 @@ skipInstall() {
|
|||||||
byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17"
|
byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17"
|
||||||
|
|
||||||
if [[ "$magic" != "$byte" ]]; then
|
if [[ "$magic" != "$byte" ]]; then
|
||||||
|
|
||||||
info "The ISO will be processed again because the configuration was changed..."
|
info "The ISO will be processed again because the configuration was changed..."
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
@@ -88,9 +146,15 @@ startInstall() {
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
TMP="$STORAGE/tmp"
|
||||||
|
rm -rf "$TMP"
|
||||||
|
|
||||||
skipInstall "$BOOT" && return 1
|
skipInstall "$BOOT" && return 1
|
||||||
|
|
||||||
rm -rf "$TMP"
|
if hasDisk; then
|
||||||
|
! backup "" && error "Backup failed!"
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p "$TMP"
|
mkdir -p "$TMP"
|
||||||
|
|
||||||
if [ -z "$CUSTOM" ]; then
|
if [ -z "$CUSTOM" ]; then
|
||||||
@@ -105,6 +169,11 @@ startInstall() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f "$BOOT"
|
rm -f "$BOOT"
|
||||||
|
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f -iname 'data.*' -not -iname '*.iso' -delete
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f -iname 'windows.*' -not -iname '*.iso' -delete
|
||||||
|
find "$STORAGE" -maxdepth 1 -type f \( -iname '*.rom' -or -iname '*.vars' \) -delete
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,16 +195,6 @@ finishInstall() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f "$STORAGE/windows.old"
|
|
||||||
rm -f "$STORAGE/windows.vga"
|
|
||||||
rm -f "$STORAGE/windows.net"
|
|
||||||
rm -f "$STORAGE/windows.usb"
|
|
||||||
rm -f "$STORAGE/windows.args"
|
|
||||||
rm -f "$STORAGE/windows.base"
|
|
||||||
rm -f "$STORAGE/windows.boot"
|
|
||||||
rm -f "$STORAGE/windows.mode"
|
|
||||||
rm -f "$STORAGE/windows.type"
|
|
||||||
|
|
||||||
cp -f /run/version "$STORAGE/windows.ver"
|
cp -f /run/version "$STORAGE/windows.ver"
|
||||||
|
|
||||||
if [[ "$iso" == "$STORAGE/"* ]]; then
|
if [[ "$iso" == "$STORAGE/"* ]]; then
|
||||||
@@ -153,7 +212,7 @@ finishInstall() {
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Enable secure boot + TPM on manual installs as Win11 requires
|
# Enable secure boot + TPM on manual installs as Win11 requires
|
||||||
if [[ "$MANUAL" == [Yy1]* ]] || [[ "$aborted" == [Yy1]* ]]; then
|
if [[ "$MANUAL" == [Yy1]* || "$aborted" == [Yy1]* ]]; then
|
||||||
if [[ "${DETECTED,,}" == "win11"* ]]; then
|
if [[ "${DETECTED,,}" == "win11"* ]]; then
|
||||||
BOOT_MODE="windows_secure"
|
BOOT_MODE="windows_secure"
|
||||||
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
|
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
|
||||||
@@ -303,6 +362,10 @@ extractESD() {
|
|||||||
local esdImageCount
|
local esdImageCount
|
||||||
esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}')
|
esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}')
|
||||||
|
|
||||||
|
if [ -z "$esdImageCount" ]; then
|
||||||
|
error "Cannot read the image count in ESD file!" && return 1
|
||||||
|
fi
|
||||||
|
|
||||||
wimlib-imagex apply "$iso" 1 "$dir" --quiet 2>/dev/null || {
|
wimlib-imagex apply "$iso" 1 "$dir" --quiet 2>/dev/null || {
|
||||||
retVal=$?
|
retVal=$?
|
||||||
error "Extracting $desc bootdisk failed" && return $retVal
|
error "Extracting $desc bootdisk failed" && return $retVal
|
||||||
@@ -608,14 +671,13 @@ detectImage() {
|
|||||||
warn "failed to locate 'sources' folder in ISO image, $FB" && return 1
|
warn "failed to locate 'sources' folder in ISO image, $FB" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
wim=$(find "$src" -maxdepth 1 -type f -iname install.wim -print -quit)
|
wim=$(find "$src" -maxdepth 1 -type f \( -iname install.wim -or -iname install.esd \) -print -quit)
|
||||||
[ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname install.esd -print -quit)
|
|
||||||
|
|
||||||
if [ ! -f "$wim" ]; then
|
if [ ! -f "$wim" ]; then
|
||||||
warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" && return 1
|
warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info=$(wimlib-imagex info -xml "$wim" | tr -d '\000')
|
info=$(wimlib-imagex info -xml "$wim" | iconv -f UTF-16LE -t UTF-8)
|
||||||
checkPlatform "$info" || exit 67
|
checkPlatform "$info" || exit 67
|
||||||
|
|
||||||
DETECTED=$(detectVersion "$info")
|
DETECTED=$(detectVersion "$info")
|
||||||
@@ -634,7 +696,7 @@ detectImage() {
|
|||||||
desc=$(printEdition "$DETECTED" "$DETECTED")
|
desc=$(printEdition "$DETECTED" "$DETECTED")
|
||||||
detectLanguage "$info"
|
detectLanguage "$info"
|
||||||
|
|
||||||
if [[ "${LANGUAGE,,}" != "en" ]] && [[ "${LANGUAGE,,}" != "en-"* ]]; then
|
if [[ "${LANGUAGE,,}" != "en" && "${LANGUAGE,,}" != "en-"* ]]; then
|
||||||
language=$(getLanguage "$LANGUAGE" "desc")
|
language=$(getLanguage "$LANGUAGE" "desc")
|
||||||
desc+=" ($language)"
|
desc+=" ($language)"
|
||||||
fi
|
fi
|
||||||
@@ -642,7 +704,7 @@ detectImage() {
|
|||||||
info "Detected: $desc"
|
info "Detected: $desc"
|
||||||
setXML "" && return 0
|
setXML "" && return 0
|
||||||
|
|
||||||
if [[ "$DETECTED" == "win81x86"* ]] || [[ "$DETECTED" == "win10x86"* ]]; then
|
if [[ "$DETECTED" == "win81x86"* || "$DETECTED" == "win10x86"* ]]; then
|
||||||
error "The 32-bit version of $desc is not supported!" && return 1
|
error "The 32-bit version of $desc is not supported!" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -728,6 +790,7 @@ updateXML() {
|
|||||||
user=$(echo "$USERNAME" | sed 's/[^[:alnum:]@!._-]//g')
|
user=$(echo "$USERNAME" | sed 's/[^[:alnum:]@!._-]//g')
|
||||||
|
|
||||||
if [ -n "$user" ]; then
|
if [ -n "$user" ]; then
|
||||||
|
sed -i "s/-name \"Docker\"/-name \"$user\"/g" "$asset"
|
||||||
sed -i "s/<Name>Docker<\/Name>/<Name>$user<\/Name>/g" "$asset"
|
sed -i "s/<Name>Docker<\/Name>/<Name>$user<\/Name>/g" "$asset"
|
||||||
sed -i "s/where name=\"Docker\"/where name=\"$user\"/g" "$asset"
|
sed -i "s/where name=\"Docker\"/where name=\"$user\"/g" "$asset"
|
||||||
sed -i "s/<FullName>Docker<\/FullName>/<FullName>$user<\/FullName>/g" "$asset"
|
sed -i "s/<FullName>Docker<\/FullName>/<FullName>$user<\/FullName>/g" "$asset"
|
||||||
@@ -909,15 +972,14 @@ updateImage() {
|
|||||||
error "failed to locate 'sources' folder in ISO image, $FB" && return 1
|
error "failed to locate 'sources' folder in ISO image, $FB" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
wim=$(find "$src" -maxdepth 1 -type f -iname boot.wim -print -quit)
|
wim=$(find "$src" -maxdepth 1 -type f \( -iname boot.wim -or -iname boot.esd \) -print -quit)
|
||||||
[ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname boot.esd -print -quit)
|
|
||||||
|
|
||||||
if [ ! -f "$wim" ]; then
|
if [ ! -f "$wim" ]; then
|
||||||
error "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1
|
error "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
index="1"
|
index="1"
|
||||||
result=$(wimlib-imagex info -xml "$wim" | tr -d '\000')
|
result=$(wimlib-imagex info -xml "$wim" | iconv -f UTF-16LE -t UTF-8)
|
||||||
|
|
||||||
if [[ "${result^^}" == *"<IMAGE INDEX=\"2\">"* ]]; then
|
if [[ "${result^^}" == *"<IMAGE INDEX=\"2\">"* ]]; then
|
||||||
index="2"
|
index="2"
|
||||||
@@ -1072,8 +1134,6 @@ buildImage() {
|
|||||||
|
|
||||||
bootWindows() {
|
bootWindows() {
|
||||||
|
|
||||||
rm -rf "$TMP"
|
|
||||||
|
|
||||||
if [ -f "$STORAGE/windows.args" ]; then
|
if [ -f "$STORAGE/windows.args" ]; then
|
||||||
ARGS=$(<"$STORAGE/windows.args")
|
ARGS=$(<"$STORAGE/windows.args")
|
||||||
ARGS="${ARGS//[![:print:]]/}"
|
ARGS="${ARGS//[![:print:]]/}"
|
||||||
@@ -1141,6 +1201,8 @@ if [ ! -s "$ISO" ] || [ ! -f "$ISO" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
DIR="$TMP/unpack"
|
||||||
|
|
||||||
if ! extractImage "$ISO" "$DIR" "$VERSION"; then
|
if ! extractImage "$ISO" "$DIR" "$VERSION"; then
|
||||||
rm -f "$ISO" 2> /dev/null || true
|
rm -f "$ISO" 2> /dev/null || true
|
||||||
exit 62
|
exit 62
|
||||||
|
|||||||
224
src/mido.sh
224
src/mido.sh
@@ -254,7 +254,7 @@ download_windows_eval() {
|
|||||||
|
|
||||||
iso_download_links=$(echo "$iso_download_page_html" | grep -io "$filter") || {
|
iso_download_links=$(echo "$iso_download_page_html" | grep -io "$filter") || {
|
||||||
# This should only happen if there's been some change to the download endpoint web address
|
# This should only happen if there's been some change to the download endpoint web address
|
||||||
if [[ "${lang,,}" == "en" ]] || [[ "${lang,,}" == "en-"* ]]; then
|
if [[ "${lang,,}" == "en" || "${lang,,}" == "en-"* ]]; then
|
||||||
error "Windows server download page gave us no download link!"
|
error "Windows server download page gave us no download link!"
|
||||||
else
|
else
|
||||||
language=$(getLanguage "$lang" "desc")
|
language=$(getLanguage "$lang" "desc")
|
||||||
@@ -264,28 +264,40 @@ download_windows_eval() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case "$enterprise_type" in
|
case "$enterprise_type" in
|
||||||
|
"iot" | "ltsc" )
|
||||||
|
case "${PLATFORM,,}" in
|
||||||
|
"x64" )
|
||||||
|
if [[ "$windows_version" != "windows-10"* ]]; then
|
||||||
|
iso_download_link=$(echo "$iso_download_links" | head -n 1)
|
||||||
|
else
|
||||||
|
iso_download_link=$(echo "$iso_download_links" | head -n 4 | tail -n 1)
|
||||||
|
fi ;;
|
||||||
|
"arm64" )
|
||||||
|
iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) ;;
|
||||||
|
* )
|
||||||
|
error "Invalid platform specified, value \"$PLATFORM\" is not recognized!" && return 1 ;;
|
||||||
|
esac ;;
|
||||||
"enterprise" )
|
"enterprise" )
|
||||||
iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1)
|
case "${PLATFORM,,}" in
|
||||||
;;
|
"x64" )
|
||||||
"iot" )
|
if [[ "$windows_version" != "windows-10"* ]]; then
|
||||||
if [[ "${PLATFORM,,}" == "x64" ]]; then
|
iso_download_link=$(echo "$iso_download_links" | head -n 1)
|
||||||
iso_download_link=$(echo "$iso_download_links" | head -n 1)
|
else
|
||||||
fi
|
iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1)
|
||||||
if [[ "${PLATFORM,,}" == "arm64" ]]; then
|
fi ;;
|
||||||
iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1)
|
"arm64" )
|
||||||
fi
|
iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) ;;
|
||||||
;;
|
* )
|
||||||
"ltsc" )
|
error "Invalid platform specified, value \"$PLATFORM\" is not recognized!" && return 1 ;;
|
||||||
iso_download_link=$(echo "$iso_download_links" | head -n 4 | tail -n 1)
|
esac ;;
|
||||||
;;
|
|
||||||
"server" )
|
"server" )
|
||||||
iso_download_link=$(echo "$iso_download_links" | head -n 1)
|
iso_download_link=$(echo "$iso_download_links" | head -n 1) ;;
|
||||||
;;
|
|
||||||
* )
|
* )
|
||||||
error "Invalid type specified, value \"$enterprise_type\" is not recognized!" && return 1 ;;
|
error "Invalid type specified, value \"$enterprise_type\" is not recognized!" && return 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
[[ "$DEBUG" == [Yy1]* ]] && echo "Found download link: $iso_download_link"
|
[[ "$DEBUG" == [Yy1]* ]] && echo "Found download link: $iso_download_link"
|
||||||
|
[ -z "$iso_download_link" ] && error "Could not parse download link from page!" && return 1
|
||||||
|
|
||||||
# Follow redirect so proceeding log message is useful
|
# Follow redirect so proceeding log message is useful
|
||||||
# This is a request we make that Fido doesn't
|
# This is a request we make that Fido doesn't
|
||||||
@@ -315,7 +327,7 @@ getWindows() {
|
|||||||
|
|
||||||
case "${version,,}" in
|
case "${version,,}" in
|
||||||
"win2008r2" | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
|
"win2008r2" | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
|
||||||
if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then
|
if [[ "${lang,,}" != "en" && "${lang,,}" != "en-"* ]]; then
|
||||||
error "No download in the $language language available for $edition!"
|
error "No download in the $language language available for $edition!"
|
||||||
MIDO_URL="" && return 1
|
MIDO_URL="" && return 1
|
||||||
fi ;;
|
fi ;;
|
||||||
@@ -323,8 +335,7 @@ getWindows() {
|
|||||||
|
|
||||||
case "${version,,}" in
|
case "${version,,}" in
|
||||||
"win11${PLATFORM,,}" ) ;;
|
"win11${PLATFORM,,}" ) ;;
|
||||||
"win11${PLATFORM,,}-enterprise-iot"* ) ;;
|
"win11${PLATFORM,,}-enterprise"* ) ;;
|
||||||
"win11${PLATFORM,,}-enterprise-ltsc"* ) ;;
|
|
||||||
* )
|
* )
|
||||||
if [[ "${PLATFORM,,}" != "x64" ]]; then
|
if [[ "${PLATFORM,,}" != "x64" ]]; then
|
||||||
error "No download for the ${PLATFORM^^} platform available for $edition!"
|
error "No download for the ${PLATFORM^^} platform available for $edition!"
|
||||||
@@ -353,6 +364,36 @@ getWindows() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getBuild() {
|
||||||
|
|
||||||
|
local id="$1"
|
||||||
|
local ret="$2"
|
||||||
|
local url=""
|
||||||
|
local name=""
|
||||||
|
local build="$3"
|
||||||
|
local edition=""
|
||||||
|
local file="catalog.xml"
|
||||||
|
|
||||||
|
case "${id,,}" in
|
||||||
|
"win11${PLATFORM,,}" )
|
||||||
|
name="Windows 11 Pro"
|
||||||
|
url="https://worproject.com/dldserv/esd/getcatalog.php?build=${build}&arch=${PLATFORM^^}&edition=Professional" ;;
|
||||||
|
"win11${PLATFORM,,}-enterprise" | "win11${PLATFORM,,}-enterprise-eval")
|
||||||
|
name="Windows 11 Enterprise"
|
||||||
|
url="https://worproject.com/dldserv/esd/getcatalog.php?build=${build}&arch=${PLATFORM^^}&edition=Enterprise" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ret,,}" in
|
||||||
|
"url" ) echo "$url" ;;
|
||||||
|
"file" ) echo "$file" ;;
|
||||||
|
"name" ) echo "$name" ;;
|
||||||
|
"edition" ) echo "$edition" ;;
|
||||||
|
*) echo "";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
getCatalog() {
|
getCatalog() {
|
||||||
|
|
||||||
local id="$1"
|
local id="$1"
|
||||||
@@ -360,6 +401,12 @@ getCatalog() {
|
|||||||
local url=""
|
local url=""
|
||||||
local name=""
|
local name=""
|
||||||
local edition=""
|
local edition=""
|
||||||
|
local file="catalog.cab"
|
||||||
|
|
||||||
|
if [[ "${id,,}" == "win11"* ]] && ! isCompatible; then
|
||||||
|
# ARMv8.0 cannot run Windows 11 builds 24H2 and up.
|
||||||
|
getBuild "$1" "$2" "22631.2861" && return 0
|
||||||
|
fi
|
||||||
|
|
||||||
case "${id,,}" in
|
case "${id,,}" in
|
||||||
"win11${PLATFORM,,}" )
|
"win11${PLATFORM,,}" )
|
||||||
@@ -382,8 +429,9 @@ getCatalog() {
|
|||||||
|
|
||||||
case "${ret,,}" in
|
case "${ret,,}" in
|
||||||
"url" ) echo "$url" ;;
|
"url" ) echo "$url" ;;
|
||||||
|
"file" ) echo "$file" ;;
|
||||||
"name" ) echo "$name" ;;
|
"name" ) echo "$name" ;;
|
||||||
"edition" ) echo "$edition" ;;
|
"edition" ) echo '[Edition="'"${edition}"'"]' ;;
|
||||||
*) echo "";;
|
*) echo "";;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -396,77 +444,112 @@ getESD() {
|
|||||||
local version="$2"
|
local version="$2"
|
||||||
local lang="$3"
|
local lang="$3"
|
||||||
local desc="$4"
|
local desc="$4"
|
||||||
|
local file
|
||||||
|
local result
|
||||||
local culture
|
local culture
|
||||||
local language
|
local language
|
||||||
local editionName
|
local edition
|
||||||
local winCatalog size
|
local catalog
|
||||||
|
|
||||||
|
file=$(getCatalog "$version" "file")
|
||||||
|
catalog=$(getCatalog "$version" "url")
|
||||||
culture=$(getLanguage "$lang" "culture")
|
culture=$(getLanguage "$lang" "culture")
|
||||||
winCatalog=$(getCatalog "$version" "url")
|
edition=$(getCatalog "$version" "edition")
|
||||||
editionName=$(getCatalog "$version" "edition")
|
|
||||||
|
|
||||||
if [ -z "$winCatalog" ] || [ -z "$editionName" ]; then
|
if [ -z "$file" ] || [ -z "$catalog" ]; then
|
||||||
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 product information from Microsoft server..."
|
local msg="Downloading catalog..."
|
||||||
info "$msg" && html "$msg"
|
info "$msg" && html "$msg"
|
||||||
|
|
||||||
rm -rf "$dir"
|
rm -rf "$dir"
|
||||||
mkdir -p "$dir"
|
mkdir -p "$dir"
|
||||||
|
|
||||||
local wFile="catalog.cab"
|
|
||||||
local xFile="products.xml"
|
local xFile="products.xml"
|
||||||
local eFile="esd_edition.xml"
|
local eFile="esd_edition.xml"
|
||||||
local fFile="products_filter.xml"
|
local fFile="products_filter.xml"
|
||||||
|
|
||||||
{ wget "$winCatalog" -O "$dir/$wFile" -q --timeout=30 --no-http-keep-alive; rc=$?; } || :
|
{ wget "$catalog" -O "$dir/$file" -q --timeout=30 --no-http-keep-alive; rc=$?; } || :
|
||||||
|
|
||||||
msg="Failed to download $winCatalog"
|
msg="Failed to download $catalog"
|
||||||
(( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1
|
(( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1
|
||||||
(( rc == 4 )) && error "$msg , network failure!" && return 1
|
(( rc == 4 )) && error "$msg , network failure!" && return 1
|
||||||
(( rc == 8 )) && error "$msg , server issued an error response!" && return 1
|
(( rc == 8 )) && error "$msg , server issued an error response!" && return 1
|
||||||
(( rc != 0 )) && error "$msg , reason: $rc" && return 1
|
(( rc != 0 )) && error "$msg , reason: $rc" && return 1
|
||||||
|
|
||||||
cd "$dir"
|
if [[ "$file" == *".xml" ]]; then
|
||||||
|
|
||||||
|
mv -f "$dir/$file" "$dir/$xFile"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cd "$dir"
|
||||||
|
|
||||||
|
if ! cabextract "$file" > /dev/null; then
|
||||||
|
cd /run
|
||||||
|
error "Failed to extract $file!" && return 1
|
||||||
|
fi
|
||||||
|
|
||||||
if ! cabextract "$wFile" > /dev/null; then
|
|
||||||
cd /run
|
cd /run
|
||||||
error "Failed to extract $wFile!" && return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd /run
|
fi
|
||||||
|
|
||||||
if [ ! -s "$dir/$xFile" ]; then
|
if [ ! -s "$dir/$xFile" ]; then
|
||||||
error "Failed to find $xFile in $wFile!" && return 1
|
error "Failed to find $xFile in $file!" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local edQuery='//File[Architecture="'${PLATFORM}'"][Edition="'${editionName}'"]'
|
local edQuery='//File[Architecture="'${PLATFORM,,}'"]'"${edition}"''
|
||||||
|
result=$(xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$result" ]; then
|
||||||
|
|
||||||
|
edQuery='//File[Architecture="'${PLATFORM^^}'"]'"${edition}"''
|
||||||
|
|
||||||
|
result=$(xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$result" ]; then
|
||||||
|
desc=$(printEdition "$version" "$desc")
|
||||||
|
language=$(getLanguage "$lang" "desc")
|
||||||
|
error "No download link available for $desc!" && return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
echo -e '<Catalog>' > "$dir/$fFile"
|
echo -e '<Catalog>' > "$dir/$fFile"
|
||||||
xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" >> "$dir/$fFile" 2>/dev/null
|
echo "$result" >> "$dir/$fFile"
|
||||||
echo -e '</Catalog>'>> "$dir/$fFile"
|
echo -e '</Catalog>'>> "$dir/$fFile"
|
||||||
|
|
||||||
xmllint --nonet --xpath "//File[LanguageCode=\"${culture,,}\"]" "$dir/$fFile" >"$dir/$eFile"
|
result=$(xmllint --nonet --xpath "//File[LanguageCode=\"${culture,,}\"]" "$dir/$fFile" 2>/dev/null)
|
||||||
|
|
||||||
size=$(stat -c%s "$dir/$eFile")
|
if [ -z "$result" ]; then
|
||||||
if ((size<20)); then
|
|
||||||
desc=$(printEdition "$version" "$desc")
|
desc=$(printEdition "$version" "$desc")
|
||||||
language=$(getLanguage "$lang" "desc")
|
language=$(getLanguage "$lang" "desc")
|
||||||
error "No download in the $language language available for $desc!" && return 1
|
error "No download in the $language language available for $desc!" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "$result" > "$dir/$eFile"
|
||||||
|
|
||||||
local tag="FilePath"
|
local tag="FilePath"
|
||||||
ESD=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g")
|
ESD=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null)
|
||||||
|
|
||||||
if [ -z "$ESD" ]; then
|
if [ -z "$ESD" ]; then
|
||||||
error "Failed to find ESD URL in $eFile!" && return 1
|
error "Failed to find ESD URL in $eFile!" && return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tag="Sha1"
|
tag="Sha1"
|
||||||
ESD_SUM=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g")
|
ESD_SUM=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$ESD_SUM" ]; then
|
||||||
|
error "Failed to find ESD checksum in $eFile!" && return 1
|
||||||
|
fi
|
||||||
|
|
||||||
tag="Size"
|
tag="Size"
|
||||||
ESD_SIZE=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g")
|
ESD_SIZE=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$ESD_SIZE" ]; then
|
||||||
|
error "Failed to find ESD filesize in $eFile!" && return 1
|
||||||
|
fi
|
||||||
|
|
||||||
rm -rf "$dir"
|
rm -rf "$dir"
|
||||||
return 0
|
return 0
|
||||||
@@ -491,8 +574,8 @@ verifyFile() {
|
|||||||
local total="$3"
|
local total="$3"
|
||||||
local check="$4"
|
local check="$4"
|
||||||
|
|
||||||
if [ -n "$size" ] && [[ "$total" != "$size" ]] && [[ "$size" != "0" ]]; then
|
if [ -n "$size" ] && [[ "$total" != "$size" && "$size" != "0" ]]; then
|
||||||
if [[ "$VERIFY" == [Yy1]* ]] || [[ "$DEBUG" == [Yy1]* ]]; then
|
if [[ "$VERIFY" == [Yy1]* || "$DEBUG" == [Yy1]* ]]; then
|
||||||
warn "The downloaded file has a different size ( $total bytes) than expected ( $size bytes). Please report this at $SUPPORT/issues"
|
warn "The downloaded file has a different size ( $total bytes) than expected ( $size bytes). Please report this at $SUPPORT/issues"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -514,7 +597,7 @@ verifyFile() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$hash" == "$check" ]]; then
|
if [[ "$hash" == "$check" ]]; then
|
||||||
info "Succesfully verified ISO!" && return 0
|
info "Successfully verified ISO!" && return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
error "The downloaded file has an unknown $algo checksum: $hash , as the expected value was: $check. Please report this at $SUPPORT/issues"
|
error "The downloaded file has an unknown $algo checksum: $hash , as the expected value was: $check. Please report this at $SUPPORT/issues"
|
||||||
@@ -532,7 +615,6 @@ downloadFile() {
|
|||||||
local msg="Downloading $desc"
|
local msg="Downloading $desc"
|
||||||
local rc total total_gb progress domain dots agent space folder
|
local rc total total_gb progress domain dots agent space folder
|
||||||
|
|
||||||
rm -f "$iso"
|
|
||||||
agent=$(get_agent)
|
agent=$(get_agent)
|
||||||
|
|
||||||
if [ -n "$size" ] && [[ "$size" != "0" ]]; then
|
if [ -n "$size" ] && [[ "$size" != "0" ]]; then
|
||||||
@@ -561,8 +643,9 @@ downloadFile() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
info "$msg..."
|
info "$msg..."
|
||||||
|
[[ "$DEBUG" == [Yy1]* ]] && echo "Downloading: $url"
|
||||||
|
|
||||||
{ wget "$url" -O "$iso" -q --timeout=30 --no-http-keep-alive --user-agent "$agent" --show-progress "$progress"; rc=$?; } || :
|
{ wget "$url" -O "$iso" --continue -q --timeout=30 --no-http-keep-alive --user-agent "$agent" --show-progress "$progress"; rc=$?; } || :
|
||||||
|
|
||||||
fKill "progress.sh"
|
fKill "progress.sh"
|
||||||
|
|
||||||
@@ -586,23 +669,40 @@ downloadFile() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delay() {
|
||||||
|
|
||||||
|
local i
|
||||||
|
local delay="$1"
|
||||||
|
local msg="Will retry in X seconds..."
|
||||||
|
|
||||||
|
info "${msg/X/$delay}"
|
||||||
|
|
||||||
|
for i in $(seq "$delay" -1 1); do
|
||||||
|
html "${msg/X/$i}"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
downloadImage() {
|
downloadImage() {
|
||||||
|
|
||||||
local iso="$1"
|
local iso="$1"
|
||||||
local version="$2"
|
local version="$2"
|
||||||
local lang="$3"
|
local lang="$3"
|
||||||
local delay=5
|
|
||||||
local tried="n"
|
local tried="n"
|
||||||
local success="n"
|
local success="n"
|
||||||
|
local seconds="5"
|
||||||
local url sum size base desc language
|
local url sum size base desc language
|
||||||
local msg="Will retry after $delay seconds..."
|
|
||||||
|
|
||||||
if [[ "${version,,}" == "http"* ]]; then
|
if [[ "${version,,}" == "http"* ]]; then
|
||||||
|
|
||||||
base=$(basename "$iso")
|
base=$(basename "$iso")
|
||||||
desc=$(fromFile "$base")
|
desc=$(fromFile "$base")
|
||||||
|
|
||||||
|
rm -f "$iso"
|
||||||
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
|
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
|
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
|
||||||
rm -f "$iso"
|
rm -f "$iso"
|
||||||
|
|
||||||
@@ -615,7 +715,7 @@ downloadImage() {
|
|||||||
|
|
||||||
desc=$(printVersion "$version" "")
|
desc=$(printVersion "$version" "")
|
||||||
|
|
||||||
if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then
|
if [[ "${lang,,}" != "en" && "${lang,,}" != "en-"* ]]; then
|
||||||
language=$(getLanguage "$lang" "desc")
|
language=$(getLanguage "$lang" "desc")
|
||||||
if ! validVersion "$version" "$lang"; then
|
if ! validVersion "$version" "$lang"; then
|
||||||
desc=$(printEdition "$version" "$desc")
|
desc=$(printEdition "$version" "$desc")
|
||||||
@@ -632,15 +732,17 @@ downloadImage() {
|
|||||||
if getWindows "$version" "$lang" "$desc"; then
|
if getWindows "$version" "$lang" "$desc"; then
|
||||||
success="y"
|
success="y"
|
||||||
else
|
else
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
getWindows "$version" "$lang" "$desc" && success="y"
|
getWindows "$version" "$lang" "$desc" && success="y"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$success" == "y" ]]; then
|
if [[ "$success" == "y" ]]; then
|
||||||
size=$(getMido "$version" "$lang" "size" )
|
size=$(getMido "$version" "$lang" "size" )
|
||||||
sum=$(getMido "$version" "$lang" "sum")
|
sum=$(getMido "$version" "$lang" "sum")
|
||||||
|
|
||||||
|
rm -f "$iso"
|
||||||
downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0
|
downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0
|
downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0
|
||||||
rm -f "$iso"
|
rm -f "$iso"
|
||||||
fi
|
fi
|
||||||
@@ -651,7 +753,7 @@ downloadImage() {
|
|||||||
if isESD "$version" "$lang"; then
|
if isESD "$version" "$lang"; then
|
||||||
|
|
||||||
if [[ "$tried" != "n" ]]; then
|
if [[ "$tried" != "n" ]]; then
|
||||||
info "Failed to download $desc, will try a diferent method now..."
|
info "Failed to download $desc, will try a different method now..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tried="y"
|
tried="y"
|
||||||
@@ -660,14 +762,16 @@ downloadImage() {
|
|||||||
if getESD "$TMP/esd" "$version" "$lang" "$desc"; then
|
if getESD "$TMP/esd" "$version" "$lang" "$desc"; then
|
||||||
success="y"
|
success="y"
|
||||||
else
|
else
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
getESD "$TMP/esd" "$version" "$lang" "$desc" && success="y"
|
getESD "$TMP/esd" "$version" "$lang" "$desc" && success="y"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$success" == "y" ]]; then
|
if [[ "$success" == "y" ]]; then
|
||||||
ISO="${ISO%.*}.esd"
|
ISO="${ISO%.*}.esd"
|
||||||
|
|
||||||
|
rm -f "$ISO"
|
||||||
downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0
|
downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0
|
downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0
|
||||||
rm -f "$ISO"
|
rm -f "$ISO"
|
||||||
ISO="$iso"
|
ISO="$iso"
|
||||||
@@ -680,14 +784,18 @@ downloadImage() {
|
|||||||
url=$(getLink "$i" "$version" "$lang")
|
url=$(getLink "$i" "$version" "$lang")
|
||||||
|
|
||||||
if [ -n "$url" ]; then
|
if [ -n "$url" ]; then
|
||||||
|
|
||||||
if [[ "$tried" != "n" ]]; then
|
if [[ "$tried" != "n" ]]; then
|
||||||
info "Failed to download $desc, will try another mirror now..."
|
info "Failed to download $desc, will try another mirror now..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tried="y"
|
tried="y"
|
||||||
size=$(getSize "$i" "$version" "$lang")
|
size=$(getSize "$i" "$version" "$lang")
|
||||||
sum=$(getHash "$i" "$version" "$lang")
|
sum=$(getHash "$i" "$version" "$lang")
|
||||||
|
|
||||||
|
rm -f "$iso"
|
||||||
downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0
|
downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0
|
||||||
info "$msg" && html "$msg" && sleep "$delay"
|
delay "$seconds"
|
||||||
downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0
|
downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0
|
||||||
rm -f "$iso"
|
rm -f "$iso"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ boot() {
|
|||||||
grep -Fq "BOOTMGR is missing" "$QEMU_PTY" && fail="y"
|
grep -Fq "BOOTMGR is missing" "$QEMU_PTY" && fail="y"
|
||||||
fi
|
fi
|
||||||
if [ -z "$fail" ]; then
|
if [ -z "$fail" ]; then
|
||||||
info "Windows started succesfully, visit http://127.0.0.1:8006/ to view the screen..."
|
info "Windows started successfully, visit http://127.0.0.1:8006/ to view the screen..."
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
11
src/samba.sh
11
src/samba.sh
@@ -111,10 +111,10 @@ for dir in "${dirs[@]}"; do
|
|||||||
addShare "$dir" "$dir_name" "Shared $dir_name" || error "Failed to create shared folder for $dir!"
|
addShare "$dir" "$dir_name" "Shared $dir_name" || error "Failed to create shared folder for $dir!"
|
||||||
done
|
done
|
||||||
|
|
||||||
# Fix Samba permissions
|
# Try to fix Samba permissions
|
||||||
[ -d /run/samba/msg.lock ] && chmod -R 0755 /run/samba/msg.lock
|
[ -d /run/samba/msg.lock ] && chmod -R 0755 /run/samba/msg.lock 2>/dev/null || :
|
||||||
[ -d /var/log/samba/cores ] && chmod -R 0700 /var/log/samba/cores
|
[ -d /var/log/samba/cores ] && chmod -R 0700 /var/log/samba/cores 2>/dev/null || :
|
||||||
[ -d /var/cache/samba/msg.lock ] && chmod -R 0755 /var/cache/samba/msg.lock
|
[ -d /var/cache/samba/msg.lock ] && chmod -R 0755 /var/cache/samba/msg.lock 2>/dev/null || :
|
||||||
|
|
||||||
if ! smbd; then
|
if ! smbd; then
|
||||||
error "Samba daemon failed to start!"
|
error "Samba daemon failed to start!"
|
||||||
@@ -129,8 +129,7 @@ if [[ "${BOOT_MODE:-}" == "windows_legacy" ]]; then
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Enable Web Service Discovery on Vista and up
|
# Enable Web Service Discovery on Vista and up
|
||||||
wsdd -i "$interface" -p -n "$hostname" &
|
wsddn -i "$interface" -H "$hostname" --pid-file=/var/run/wsdd.pid >/dev/null &
|
||||||
echo "$!" > /var/run/wsdd.pid
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user