mirror of
https://github.com/dockur/windows.git
synced 2026-06-09 22:17:22 +01:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c768ba894d | |||
| 0c9472b62c | |||
| 8d2f27bd67 | |||
| bcae867d68 | |||
| 77c164a3fa | |||
| f088a60e2c | |||
| 6dc5ce7919 | |||
| ba478700de | |||
| 6e45deea2f | |||
| 0bc2380452 | |||
| e1732e66ec | |||
| 8f70ffa902 | |||
| 7b4404db6b | |||
| 2412a3ed18 | |||
| 8c57b119cf | |||
| 40867f6e85 | |||
| b5d8c2ad08 | |||
| 603465a687 | |||
| d8a548c3fb | |||
| 60e5925d72 | |||
| 398344163f | |||
| f2809a8929 | |||
| 7fd7ab3050 | |||
| fddbebadae | |||
| 34f312ddff | |||
| daea34a10f | |||
| c5417e8fca | |||
| 603ee5f93b | |||
| 4926ad0ea9 | |||
| a81c45de30 | |||
| 85bacbec63 | |||
| 8f1335d7f8 | |||
| 8d50472167 | |||
| 173f35d21b | |||
| e21418b228 | |||
| 1246667afa | |||
| 247e4e0b38 | |||
| c534901402 | |||
| 49e962e56a | |||
| 3e37a04d96 | |||
| 0ea63962af | |||
| 4d01a81586 | |||
| d8e51d8965 | |||
| 8d4788f7c0 | |||
| 8ec135d826 | |||
| 0400f5f45d | |||
| 588969ae5f | |||
| c7aac1edcf | |||
| ea03c67a04 | |||
| bdb0488151 | |||
| ad6f87046a | |||
| e7a3894210 | |||
| 8443559a76 | |||
| 6dbac13cd1 | |||
| fd907bb78a | |||
| 1a6a2dbad0 | |||
| 11a19f6a9d | |||
| 544501107a | |||
| 122d1ff98e | |||
| c1c44c4da7 | |||
| f661df3abc | |||
| a0bcd719be | |||
| 9236127a86 | |||
| fa606aec53 | |||
| 8790b4ec7c | |||
| e3cf3ccf3d | |||
| b244fa544f | |||
| 4cb7e1074f | |||
| ac106067bd | |||
| 0e95680704 | |||
| 5476760551 | |||
| 0caa4d76b8 | |||
| 4e0a29605b | |||
| c3ba25bfb7 | |||
| 10449a3d29 |
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "11e"
|
||||
},
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "11l"
|
||||
},
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "10"
|
||||
},
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "10e"
|
||||
},
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "10l"
|
||||
},
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "8e"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "7u"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "vu"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "xp"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2k"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2025"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2022"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2019"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2016"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2012"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2008"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "2003"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "tiny11"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "core11"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "nano11"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
"service": "windows",
|
||||
"containerEnv": {
|
||||
"VERSION": "tiny10"
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
},
|
||||
"forwardPorts": [8006],
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"hostRequirements": {
|
||||
"storage": "64gb"
|
||||
},
|
||||
"dockerComposeFile": "../codespaces.yml"
|
||||
"dockerComposeFile": "../codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
services:
|
||||
windows:
|
||||
image: dockurr/windows
|
||||
container_name: windows
|
||||
image: ghcr.io/dockur/windows
|
||||
environment:
|
||||
ALLOCATE: "Y"
|
||||
RAM_SIZE: "half"
|
||||
DISK_SIZE: "max"
|
||||
CPU_CORES: "max"
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
"portsAttributes": {
|
||||
"8006": {
|
||||
"label": "Web",
|
||||
"onAutoForward": "openBrowser"
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
},
|
||||
"otherPortsAttributes": {
|
||||
"onAutoForward": "silent"
|
||||
"onAutoForward": "ignore"
|
||||
},
|
||||
"dockerComposeFile": "codespaces.yml"
|
||||
"dockerComposeFile": "codespaces.yml",
|
||||
"initializeCommand": "docker system prune --all --force"
|
||||
}
|
||||
|
||||
@@ -22,13 +22,13 @@ jobs:
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
-
|
||||
name: Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v6
|
||||
with:
|
||||
context: git
|
||||
images: |
|
||||
@@ -43,23 +43,23 @@ jobs:
|
||||
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v4
|
||||
-
|
||||
name: Login into Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v4
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v4
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: Build Docker image
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@v7
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
-
|
||||
name: Run ShellCheck
|
||||
uses: ludeeus/action-shellcheck@master
|
||||
@@ -30,6 +30,6 @@ jobs:
|
||||
file-endings: ".xml"
|
||||
-
|
||||
name: Validate JSON and YML files
|
||||
uses: GrantBirki/json-yaml-validate@v4
|
||||
uses: GrantBirki/json-yaml-validate@v5.0.0
|
||||
with:
|
||||
yaml_exclude_regex: ".*\\kubernetes\\.yml$"
|
||||
|
||||
+12
-10
@@ -12,13 +12,15 @@ jobs:
|
||||
dockerHubDescription:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
-
|
||||
name: Docker Hub Description
|
||||
uses: peter-evans/dockerhub-description@v5
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
repository: ${{ secrets.DOCKERHUB_REPO }}
|
||||
short-description: ${{ github.event.repository.description }}
|
||||
readme-filepath: ./readme.md
|
||||
-
|
||||
name: Checkout repo
|
||||
uses: actions/checkout@v6
|
||||
-
|
||||
name: Docker Hub Description
|
||||
uses: peter-evans/dockerhub-description@v5
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
repository: ${{ secrets.DOCKERHUB_REPO }}
|
||||
short-description: ${{ github.event.repository.description }}
|
||||
readme-filepath: ./readme.md
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
name: Links
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: links
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
links:
|
||||
name: Links
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
packages: read
|
||||
contents: read
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
-
|
||||
name: Validate Links
|
||||
run: |
|
||||
errors=0
|
||||
count=0
|
||||
host=""
|
||||
declare -A seen
|
||||
wget https://github.com/lwthiker/curl-impersonate/releases/download/v0.6.1/curl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz
|
||||
tar -xzf curl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz
|
||||
sudo cp curl-impersonate-ff /usr/local/bin/
|
||||
check() {
|
||||
local url="$1" http
|
||||
http=$(curl-impersonate-ff -sSL -o /dev/null -w "%{http_code}" --max-time 10 -I -- "$url" 2>&1) || http="000"
|
||||
[[ "$http" == 2* ]] && return 0
|
||||
http=$(curl-impersonate-ff -sSL -o /dev/null -w "%{http_code}" --max-time 10 -r "0-0" -- "$url" 2>&1) || http="000"
|
||||
[[ "$http" == 2* ]]
|
||||
}
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ ^[[:space:]]*local[[:space:]]+host=\"(https://[^\"]+)\" ]]; then
|
||||
host="${BASH_REMATCH[1]%/}"
|
||||
continue
|
||||
fi
|
||||
[[ "$line" =~ ^[[:space:]]*url=\"(.+)\" ]] || continue
|
||||
val="${BASH_REMATCH[1]#/}"
|
||||
if [[ "$val" == https://* ]]; then
|
||||
url="$val"
|
||||
elif [[ -n "$host" ]]; then
|
||||
url="$host/$val"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
[[ -v seen[$url] ]] && continue
|
||||
seen[$url]=1
|
||||
count=$((count + 1))
|
||||
if check "$url"; then
|
||||
echo " OK: $url"
|
||||
else
|
||||
echo "FAIL: $url"
|
||||
errors=$((errors + 1))
|
||||
fi
|
||||
done < "src/define.sh"
|
||||
echo ""
|
||||
printf '%d/%d links valid\n' "$(( count - errors ))" "$count"
|
||||
(( errors == 0 ))
|
||||
@@ -0,0 +1,72 @@
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
name: "Review"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
review:
|
||||
name: review
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
-
|
||||
name: Spelling
|
||||
uses: reviewdog/action-misspell@v1
|
||||
with:
|
||||
locale: "US"
|
||||
level: warning
|
||||
fail_level: error
|
||||
pattern: |
|
||||
*.md
|
||||
*.sh
|
||||
reporter: github-pr-review
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: Hadolint
|
||||
uses: reviewdog/action-hadolint@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
hadolint_ignore: DL3006 DL3008
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: YamlLint
|
||||
uses: reviewdog/action-yamllint@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: ActionLint
|
||||
uses: reviewdog/action-actionlint@v1
|
||||
with:
|
||||
level: warning
|
||||
reporter: github-pr-review
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: Shellformat
|
||||
uses: reviewdog/action-shfmt@v1
|
||||
if: false
|
||||
with:
|
||||
level: warning
|
||||
fail_on_error: "true"
|
||||
shfmt_flags: "-i 2 -ci -bn"
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
name: Shellcheck
|
||||
uses: reviewdog/action-shellcheck@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
shellcheck_flags: -x -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
+7
-4
@@ -3,9 +3,12 @@
|
||||
ARG VERSION_ARG="latest"
|
||||
FROM scratch AS build-amd64
|
||||
|
||||
COPY --from=qemux/qemu:7.25 / /
|
||||
COPY --from=qemux/qemu:7.32 / /
|
||||
|
||||
ARG TARGETARCH
|
||||
ARG VERSION_WSDD="1.24"
|
||||
ARG VERSION_VIRTIO="1.9.57"
|
||||
|
||||
ARG DEBCONF_NOWARNINGS="yes"
|
||||
ARG DEBIAN_FRONTEND="noninteractive"
|
||||
ARG DEBCONF_NONINTERACTIVE_SEEN="true"
|
||||
@@ -19,7 +22,7 @@ RUN set -eu && \
|
||||
cabextract \
|
||||
libxml2-utils \
|
||||
libarchive-tools && \
|
||||
wget "https://github.com/gershnik/wsdd-native/releases/download/v1.21/wsddn_1.21_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q && \
|
||||
wget "https://github.com/gershnik/wsdd-native/releases/download/v${VERSION_WSDD}/wsddn_${VERSION_WSDD}_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q --timeout=10 && \
|
||||
dpkg -i /tmp/wsddn.deb && \
|
||||
apt-get clean && \
|
||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
@@ -27,13 +30,13 @@ RUN set -eu && \
|
||||
COPY --chmod=755 ./src /run/
|
||||
COPY --chmod=755 ./assets /run/assets
|
||||
|
||||
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.48-0/virtio-win-1.9.48.tar.xz /var/drivers.txz
|
||||
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v${VERSION_VIRTIO}-0/virtio-win-${VERSION_VIRTIO}.tar.xz /var/drivers.txz
|
||||
|
||||
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
|
||||
FROM build-${TARGETARCH}
|
||||
|
||||
ARG VERSION_ARG="0.00"
|
||||
RUN echo "$VERSION_ARG" > /run/version
|
||||
RUN echo "$VERSION_ARG" > /etc/version
|
||||
|
||||
VOLUME /storage
|
||||
EXPOSE 3389 8006
|
||||
|
||||
@@ -246,6 +246,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>26</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -249,6 +249,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>26</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -255,6 +255,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>26</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -252,6 +252,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>26</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -249,6 +249,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>26</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -269,6 +269,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>27</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -272,6 +272,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>27</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -272,6 +272,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>27</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -272,6 +272,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>27</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -272,6 +272,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>27</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -154,6 +154,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -157,6 +157,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -155,6 +155,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -158,6 +158,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -155,6 +155,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -158,6 +158,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -159,6 +159,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -164,6 +164,11 @@
|
||||
<Path>dism.exe /online /Disable-Feature /FeatureName:Microsoft-Hyper-V /NoRestart</Path>
|
||||
<Description>Disable Hyper-V role</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>3</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -162,6 +162,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -159,6 +159,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -162,6 +162,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -164,6 +164,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>4</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -167,6 +167,11 @@
|
||||
<Path>pnputil -i -a C:\Windows\Drivers\viogpudo\viogpudo.inf</Path>
|
||||
<Description>Install VirtIO display driver</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>4</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -148,6 +148,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -152,6 +152,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -152,6 +152,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -152,6 +152,15 @@
|
||||
</FirewallGroup>
|
||||
</FirewallGroups>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -146,6 +146,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -149,6 +149,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -156,6 +156,11 @@
|
||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f</Path>
|
||||
<Description>Set Network Location to Home</Description>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -90,6 +90,15 @@
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<fDenyTSConnections>false</fDenyTSConnections>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -90,6 +90,15 @@
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<fDenyTSConnections>false</fDenyTSConnections>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -90,6 +90,15 @@
|
||||
<component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<fDenyTSConnections>false</fDenyTSConnections>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>C:\Windows\Drivers\Balloon\blnsvr.exe -i</Path>
|
||||
<Description>Install VirtIO Balloon service</Description>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
@@ -66,6 +66,7 @@ spec:
|
||||
claimName: windows-pvc
|
||||
- hostPath:
|
||||
path: /dev/kvm
|
||||
type: CharDevice
|
||||
name: dev-kvm
|
||||
- hostPath:
|
||||
path: /dev/net/tun
|
||||
|
||||
@@ -22,7 +22,7 @@ Windows inside a Docker container.
|
||||
|
||||
## Video 📺
|
||||
|
||||
[](https://www.youtube.com/watch?v=xhGYobuG508)
|
||||
[](https://www.youtube.com/watch?v=xhGYobuG508)
|
||||
|
||||
## Usage 🐳
|
||||
|
||||
@@ -53,7 +53,7 @@ services:
|
||||
##### Via Docker CLI:
|
||||
|
||||
```bash
|
||||
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 dockurr/windows
|
||||
docker run -it --rm --name windows -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 docker.io/dockurr/windows
|
||||
```
|
||||
|
||||
##### Via Kubernetes:
|
||||
@@ -97,7 +97,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
||||
|
||||
| **Value** | **Version** | **Size** |
|
||||
|---|---|---|
|
||||
| `11` | Windows 11 Pro | 7.2 GB |
|
||||
| `11` | Windows 11 Pro | 7.9 GB |
|
||||
| `11l` | Windows 11 LTSC | 4.7 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 |
|
||||
| `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 |
|
||||
| `2019` | Windows Server 2019 | 5.3 GB |
|
||||
| `2016` | Windows Server 2016 | 6.5 GB |
|
||||
@@ -143,7 +143,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> 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.
|
||||
> 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) afterwards, since the added disk space will appear as unallocated.
|
||||
|
||||
### How do I share files with the host?
|
||||
|
||||
@@ -343,7 +343,8 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
||||
- /dev/bus/usb
|
||||
```
|
||||
|
||||
If the device is a USB disk drive, please wait until after the installation is fully completed before connecting it. Otherwise the installation may fail, as the order of the disks can get rearranged.
|
||||
> [!WARNING]
|
||||
> Adding a USB mass storage device before Windows Setup has finished may cause it to fail. Or worse: the drive can get formatted as the system disk, and all your data will be lost! So always keep them disconnected when launching the container for the first time.
|
||||
|
||||
### How do I verify if my system supports KVM?
|
||||
|
||||
|
||||
+59
-84
@@ -24,7 +24,9 @@ parseVersion() {
|
||||
VERSION="${VERSION:1:-1}"
|
||||
fi
|
||||
|
||||
VERSION=$(expr "$VERSION" : "^\ *\(.*[^ ]\)\ *$")
|
||||
VERSION="${VERSION#"${VERSION%%[! ]*}"}"
|
||||
VERSION="${VERSION%"${VERSION##*[! ]}"}"
|
||||
|
||||
[ -z "$VERSION" ] && VERSION="win11"
|
||||
|
||||
case "${VERSION,,}" in
|
||||
@@ -138,7 +140,7 @@ parseVersion() {
|
||||
"nano11" | "nano 11" )
|
||||
VERSION="nano11"
|
||||
[ -z "$DETECTED" ] && DETECTED="win11x64"
|
||||
;;
|
||||
;;
|
||||
"core11" | "core 11" )
|
||||
VERSION="core11"
|
||||
[ -z "$DETECTED" ] && DETECTED="win11x64"
|
||||
@@ -169,32 +171,26 @@ getLanguage() {
|
||||
"ar" | "ar-"* )
|
||||
short="ar"
|
||||
lang="Arabic"
|
||||
desc="$lang"
|
||||
culture="ar-SA" ;;
|
||||
"bg" | "bg-"* )
|
||||
short="bg"
|
||||
lang="Bulgarian"
|
||||
desc="$lang"
|
||||
culture="bg-BG" ;;
|
||||
"cs" | "cs-"* | "cz" | "cz-"* )
|
||||
short="cs"
|
||||
lang="Czech"
|
||||
desc="$lang"
|
||||
culture="cs-CZ" ;;
|
||||
"da" | "da-"* | "dk" | "dk-"* )
|
||||
short="da"
|
||||
lang="Danish"
|
||||
desc="$lang"
|
||||
culture="da-DK" ;;
|
||||
"de" | "de-"* )
|
||||
short="de"
|
||||
lang="German"
|
||||
desc="$lang"
|
||||
culture="de-DE" ;;
|
||||
"el" | "el-"* | "gr" | "gr-"* )
|
||||
short="el"
|
||||
lang="Greek"
|
||||
desc="$lang"
|
||||
culture="el-GR" ;;
|
||||
"gb" | "en-gb" )
|
||||
short="en-gb"
|
||||
@@ -204,7 +200,6 @@ getLanguage() {
|
||||
"en" | "en-"* )
|
||||
short="en"
|
||||
lang="English"
|
||||
desc="English"
|
||||
culture="en-US" ;;
|
||||
"mx" | "es-mx" )
|
||||
short="mx"
|
||||
@@ -214,17 +209,14 @@ getLanguage() {
|
||||
"es" | "es-"* )
|
||||
short="es"
|
||||
lang="Spanish"
|
||||
desc="$lang"
|
||||
culture="es-ES" ;;
|
||||
"et" | "et-"* )
|
||||
short="et"
|
||||
lang="Estonian"
|
||||
desc="$lang"
|
||||
culture="et-EE" ;;
|
||||
"fi" | "fi-"* )
|
||||
short="fi"
|
||||
lang="Finnish"
|
||||
desc="$lang"
|
||||
culture="fi-FI" ;;
|
||||
"ca" | "fr-ca" )
|
||||
short="ca"
|
||||
@@ -234,62 +226,50 @@ getLanguage() {
|
||||
"fr" | "fr-"* )
|
||||
short="fr"
|
||||
lang="French"
|
||||
desc="$lang"
|
||||
culture="fr-FR" ;;
|
||||
"he" | "he-"* | "il" | "il-"* )
|
||||
short="he"
|
||||
lang="Hebrew"
|
||||
desc="$lang"
|
||||
culture="he-IL" ;;
|
||||
"hr" | "hr-"* | "cr" | "cr-"* )
|
||||
short="hr"
|
||||
lang="Croatian"
|
||||
desc="$lang"
|
||||
culture="hr-HR" ;;
|
||||
"hu" | "hu-"* )
|
||||
short="hu"
|
||||
lang="Hungarian"
|
||||
desc="$lang"
|
||||
culture="hu-HU" ;;
|
||||
"it" | "it-"* )
|
||||
short="it"
|
||||
lang="Italian"
|
||||
desc="$lang"
|
||||
culture="it-IT" ;;
|
||||
"ja" | "ja-"* | "jp" | "jp-"* )
|
||||
short="ja"
|
||||
lang="Japanese"
|
||||
desc="$lang"
|
||||
culture="ja-JP" ;;
|
||||
"ko" | "ko-"* | "kr" | "kr-"* )
|
||||
short="ko"
|
||||
lang="Korean"
|
||||
desc="$lang"
|
||||
culture="ko-KR" ;;
|
||||
"lt" | "lt-"* )
|
||||
short="lt"
|
||||
lang="Lithuanian"
|
||||
desc="$lang"
|
||||
culture="lt-LT" ;;
|
||||
"lv" | "lv-"* )
|
||||
short="lv"
|
||||
lang="Latvian"
|
||||
desc="$lang"
|
||||
culture="lv-LV" ;;
|
||||
"nb" | "nb-"* |"nn" | "nn-"* | "no" | "no-"* )
|
||||
"nb" | "nb-"* | "nn" | "nn-"* | "no" | "no-"* )
|
||||
short="no"
|
||||
lang="Norwegian"
|
||||
desc="$lang"
|
||||
culture="nb-NO" ;;
|
||||
"nl" | "nl-"* )
|
||||
short="nl"
|
||||
lang="Dutch"
|
||||
desc="$lang"
|
||||
culture="nl-NL" ;;
|
||||
"pl" | "pl-"* )
|
||||
short="pl"
|
||||
lang="Polish"
|
||||
desc="$lang"
|
||||
culture="pl-PL" ;;
|
||||
"br" | "pt-br" )
|
||||
short="pt"
|
||||
@@ -299,27 +279,22 @@ getLanguage() {
|
||||
"pt" | "pt-"* )
|
||||
short="pp"
|
||||
lang="Portuguese"
|
||||
desc="$lang"
|
||||
culture="pt-BR" ;;
|
||||
"ro" | "ro-"* )
|
||||
short="ro"
|
||||
lang="Romanian"
|
||||
desc="$lang"
|
||||
culture="ro-RO" ;;
|
||||
"ru" | "ru-"* )
|
||||
short="ru"
|
||||
lang="Russian"
|
||||
desc="$lang"
|
||||
culture="ru-RU" ;;
|
||||
"sk" | "sk-"* )
|
||||
short="sk"
|
||||
lang="Slovak"
|
||||
desc="$lang"
|
||||
culture="sk-SK" ;;
|
||||
"sl" | "sl-"* | "si" | "si-"* )
|
||||
short="sl"
|
||||
lang="Slovenian"
|
||||
desc="$lang"
|
||||
culture="sl-SI" ;;
|
||||
"sr" | "sr-"* )
|
||||
short="sr"
|
||||
@@ -329,22 +304,18 @@ getLanguage() {
|
||||
"sv" | "sv-"* | "se" | "se-"* )
|
||||
short="sv"
|
||||
lang="Swedish"
|
||||
desc="$lang"
|
||||
culture="sv-SE" ;;
|
||||
"th" | "th-"* )
|
||||
short="th"
|
||||
lang="Thai"
|
||||
desc="$lang"
|
||||
culture="th-TH" ;;
|
||||
"tr" | "tr-"* )
|
||||
short="tr"
|
||||
lang="Turkish"
|
||||
desc="$lang"
|
||||
culture="tr-TR" ;;
|
||||
"ua" | "ua-"* | "uk" | "uk-"* )
|
||||
short="uk"
|
||||
lang="Ukrainian"
|
||||
desc="$lang"
|
||||
culture="uk-UA" ;;
|
||||
"hk" | "zh-hk" | "cn-hk" )
|
||||
short="hk"
|
||||
@@ -363,6 +334,8 @@ getLanguage() {
|
||||
culture="zh-CN" ;;
|
||||
esac
|
||||
|
||||
[ -z "$desc" ] && desc="$lang"
|
||||
|
||||
case "${ret,,}" in
|
||||
"desc" ) echo "$desc" ;;
|
||||
"name" ) echo "$lang" ;;
|
||||
@@ -376,9 +349,9 @@ getLanguage() {
|
||||
|
||||
parseLanguage() {
|
||||
|
||||
REGION="${REGION//_/-/}"
|
||||
KEYBOARD="${KEYBOARD//_/-/}"
|
||||
LANGUAGE="${LANGUAGE//_/-/}"
|
||||
REGION="${REGION//_/-}"
|
||||
KEYBOARD="${KEYBOARD//_/-}"
|
||||
LANGUAGE="${LANGUAGE//_/-}"
|
||||
|
||||
[ -z "$LANGUAGE" ] && LANGUAGE="en"
|
||||
|
||||
@@ -722,8 +695,8 @@ getMido() {
|
||||
|
||||
case "${id,,}" in
|
||||
"win11x64" )
|
||||
size=7736125440
|
||||
sum="d141f6030fed50f75e2b03e1eb2e53646c4b21e5386047cb860af5223f102a32"
|
||||
size=8471603200
|
||||
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"
|
||||
;;
|
||||
"win11x64-enterprise-eval" )
|
||||
@@ -734,11 +707,7 @@ getMido() {
|
||||
"win11x64-enterprise-iot-eval" | "win11x64-enterprise-ltsc-eval" )
|
||||
size=5060020224
|
||||
sum="2cee70bd183df42b92a2e0da08cc2bb7a2a9ce3a3841955a012c0f77aeb3cb29"
|
||||
url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26100.1.240331-1435.ge_release_CLIENT_IOT_LTSC_EVAL_x64FRE_en-us.iso"
|
||||
;;
|
||||
"win10x64" )
|
||||
size=6140975104
|
||||
sum="a6f470ca6d331eb353b815c043e327a347f594f37ff525f17764738fe812852e"
|
||||
url="https://software-static.download.prss.microsoft.com/dbazure/998969d5-f34g-4e03-ac9d-1f9786c66749/26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_IOT_LTSC_EVAL_x64FRE_en-us.iso"
|
||||
;;
|
||||
"win10x64-enterprise-eval" )
|
||||
size=5550497792
|
||||
@@ -756,9 +725,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"
|
||||
;;
|
||||
"win2025-eval" )
|
||||
size=6014152704
|
||||
sum="d0ef4502e350e3c6c53c15b1b3020d38a5ded011bf04998e950720ac8579b23d"
|
||||
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"
|
||||
size=8152356864
|
||||
sum="7b052573ba7894c9924e3e87ba732ccd354d18cb75a883efa9b900ea125bfd51"
|
||||
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" )
|
||||
size=5044094976
|
||||
@@ -817,9 +786,9 @@ getLink1() {
|
||||
|
||||
case "${id,,}" in
|
||||
"win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" )
|
||||
size=5332989952
|
||||
sum="aa1ad990f930d907b7a34ea897abbb0dfbe47552ca8acc146f92e40381839e05"
|
||||
url="11/en-us_windows_11_24h2_x64.iso"
|
||||
size=6898546688
|
||||
sum="2618a56931b645a6f097082431994bd85ae80862518de389e382f35ebfd455be"
|
||||
url="11/en-us_windows_11_25h2_x64.iso"
|
||||
;;
|
||||
"win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" )
|
||||
size=5144817664
|
||||
@@ -832,8 +801,8 @@ getLink1() {
|
||||
url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
|
||||
;;
|
||||
"win10x64" | "win10x64-enterprise" | "win10x64-enterprise-eval" )
|
||||
size=5535252480
|
||||
sum="557871965263d0fd0a1ea50b5d0d0d7cb04a279148ca905c1c675c9bc0d5486c"
|
||||
size=5767888896
|
||||
sum="9dce12d73168debc697919a6bc4d8c6624b2175bbed01a2ca97edb7d93627319"
|
||||
url="10/en-us_windows_10_22h2_x64.iso"
|
||||
;;
|
||||
"win10x64-iot" | "win10x64-enterprise-iot" | "win10x64-enterprise-iot-eval" )
|
||||
@@ -857,14 +826,14 @@ getLink1() {
|
||||
url="8.x/8.1/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso"
|
||||
;;
|
||||
"win2025" | "win2025-eval" )
|
||||
size=6786627584
|
||||
sum="bf3ef0849c7cb5e818e1035b7466d206af5aa227ace1a3f4b0de2bf00d2e2144"
|
||||
url="server/2025/en-us_windows_server_2025_updated_april_2025_x64_dvd_ea86301d.iso"
|
||||
size=7571058688
|
||||
sum="d273d0a85565ffbc06a3d46313f619103e2830a3373306ddbb9a08b8824f509d"
|
||||
url="server/2025/en-us_windows_server_2025_updated_oct_2025_x64_dvd_6c0c5aa8.iso"
|
||||
;;
|
||||
"win2022" | "win2022-eval" )
|
||||
size=6005706752
|
||||
sum="cea2cb2c09de9910c236e64eae3a801c55e9c77ec25e8d81585e3a4581d24bfb"
|
||||
url="server/2022/en-us_windows_server_2022_updated_april_2025_x64_dvd_3f755ec1.iso"
|
||||
size=6023239680
|
||||
sum="5d6d91efa972cbdd6701d78db1dcf6a34c7024ca931c1718e7cb3d0c6dd54e88"
|
||||
url="server/2022/en-us_windows_server_2022_updated_oct_2025_x64_dvd_26e9af36.iso"
|
||||
;;
|
||||
"win2019" | "win2019-eval" )
|
||||
size=5575774208
|
||||
@@ -1078,6 +1047,7 @@ getLink3() {
|
||||
size=387424256
|
||||
sum="08b11c3897eb38d1e6566a17cec5cdf2b3c620444e160e3db200a7e223aabbd8"
|
||||
url="Windows_2000_SP4.iso"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${ret,,}" in
|
||||
@@ -1108,14 +1078,14 @@ getLink4() {
|
||||
url="nano11_25h2/nano11%2025h2.iso"
|
||||
;;
|
||||
"core11" )
|
||||
size=2159738880
|
||||
sum="78f0f44444ff95b97125b43e560a72e0d6ce0a665cf9f5573bf268191e5510c1"
|
||||
url="tiny-11-core-x-64-beta-1/tiny11%20core%20x64%20beta%201.iso"
|
||||
size=3176654848
|
||||
sum="29c055fcfb7b089abd9e007e7abe4bb82c70a03aac9d65e56a38b87ab32d04d2"
|
||||
url="tiny11_25H2/tiny11core_25H2_Oct25.iso"
|
||||
;;
|
||||
"tiny11" )
|
||||
size=3788177408
|
||||
sum="a028800a91addc35d8ae22dce7459b67330f7d69d2f11c70f53c0fdffa5b4280"
|
||||
url="tiny11-2311/tiny11%202311%20x64.iso"
|
||||
size=5514559488
|
||||
sum="92484f2b7f707e42383294402a9eabbadeaa5ede80ac633390ae7f3537e36275"
|
||||
url="tiny11_25H2/tiny11_25H2_Oct25.iso"
|
||||
;;
|
||||
"tiny10" )
|
||||
size=3839819776
|
||||
@@ -1123,9 +1093,9 @@ getLink4() {
|
||||
url="tiny-10-23-h2/tiny10%20x64%2023h2.iso"
|
||||
;;
|
||||
"win11x64" )
|
||||
size=5819484160
|
||||
sum="b56b911bf18a2ceaeb3904d87e7c770bdf92d3099599d61ac2497b91bf190b11"
|
||||
url="windows-11-24h2-x64/Windows%2011%2024H2%20x64.iso"
|
||||
size=7736125440
|
||||
sum="d141f6030fed50f75e2b03e1eb2e53646c4b21e5386047cb860af5223f102a32"
|
||||
url="W11x64_26200.6584/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENT_CONSUMER_x64FRE_en-us.iso"
|
||||
;;
|
||||
"win11x64-enterprise" | "win11x64-enterprise-eval" )
|
||||
size=6209064960
|
||||
@@ -1167,10 +1137,15 @@ getLink4() {
|
||||
sum="c3c604c03677504e8905090a8ce5bb1dde76b6fd58e10f32e3a25bef21b2abe1"
|
||||
url="en_windows_8.1_enterprise_with_update_x64_dvd/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso"
|
||||
;;
|
||||
"win2025" | "win2025-eval" )
|
||||
size=6014152704
|
||||
sum="d0ef4502e350e3c6c53c15b1b3020d38a5ded011bf04998e950720ac8579b23d"
|
||||
url="26100.1742.240906-0331.ge-release-svc-refresh-server-eval-x-64-fre-en-us/26100.1742.240906-0331.ge_release_svc_refresh_SERVER_EVAL_x64FRE_en-us.iso"
|
||||
;;
|
||||
"win2022" | "win2022-eval" )
|
||||
size=5365624832
|
||||
sum="c3c57bb2cf723973a7dcfb1a21e97dfa035753a7f111e348ad918bb64b3114db"
|
||||
url="win-server-2022/2227-January_2024/en-us_windows_server_2022_updated_jan_2024_x64_dvd_2b7a0c9f.iso"
|
||||
size=5550684160
|
||||
sum="5a077ee2a95976ef9f3623eb4040e25cdf7f8f01dee3b8165a32a7626f39f025"
|
||||
url="en-us_windows_server_2022_x64_dvd_620d7eac_202405/en-us_windows_server_2022_x64_dvd_620d7eac.iso"
|
||||
;;
|
||||
"win2019" | "win2019-eval" )
|
||||
size=5575774208
|
||||
@@ -1215,7 +1190,7 @@ getLink4() {
|
||||
"winvistax64" | "winvistax64-ultimate" )
|
||||
size=3861460992
|
||||
sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
|
||||
url="en_windows_vista_sp2_x64_dvd_342267_202010/en_windows_vista_sp2_x64_dvd_342267.iso"
|
||||
url="ms_windows_vista_sp2/en_windows_vista_sp2_x64_dvd_342267.iso"
|
||||
;;
|
||||
"winvistax64-enterprise" )
|
||||
size=3205953536
|
||||
@@ -1251,6 +1226,7 @@ getLink4() {
|
||||
size=386859008
|
||||
sum="e3816f6e80b66ff686ead03eeafffe9daf020a5e4717b8bd4736b7c51733ba22"
|
||||
url="MicrosoftWindows2000BuildCollection/5.00.2195.6717_x86fre_client-professional_retail_en-us-ZRMPFPP_EN.iso"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${ret,,}" in
|
||||
@@ -1572,8 +1548,8 @@ prepareInstall() {
|
||||
[ -z "$WIDTH" ] && WIDTH="1280"
|
||||
[ -z "$HEIGHT" ] && HEIGHT="720"
|
||||
|
||||
XHEX=$(printf '%x\n' "$WIDTH")
|
||||
YHEX=$(printf '%x\n' "$HEIGHT")
|
||||
XHEX=$(printf '%08x\n' "$WIDTH")
|
||||
YHEX=$(printf '%08x\n' "$HEIGHT")
|
||||
|
||||
local username=""
|
||||
local password=""
|
||||
@@ -1605,7 +1581,7 @@ prepareInstall() {
|
||||
echo " OemPnPDriversPath=\"Drivers\viostor;Drivers\NetKVM;Drivers\sata\""
|
||||
echo " NoWaitAfterTextMode=1"
|
||||
echo " NoWaitAfterGUIMode=1"
|
||||
echo " FileSystem-ConvertNTFS"
|
||||
echo " FileSystem=ConvertNTFS"
|
||||
echo " ExtendOemPartition=0"
|
||||
echo " Hibernation=\"No\""
|
||||
echo ""
|
||||
@@ -1692,13 +1668,13 @@ prepareInstall() {
|
||||
echo ""
|
||||
echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000]"
|
||||
echo "\"DefaultSettings.BitsPerPel\"=dword:00000020"
|
||||
echo "\"DefaultSettings.XResolution\"=dword:00000$XHEX"
|
||||
echo "\"DefaultSettings.YResolution\"=dword:00000$YHEX"
|
||||
echo "\"DefaultSettings.XResolution\"=dword:$XHEX"
|
||||
echo "\"DefaultSettings.YResolution\"=dword:$YHEX"
|
||||
echo ""
|
||||
echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Control\VIDEO\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000]"
|
||||
echo "\"DefaultSettings.BitsPerPel\"=dword:00000020"
|
||||
echo "\"DefaultSettings.XResolution\"=dword:00000$XHEX"
|
||||
echo "\"DefaultSettings.YResolution\"=dword:00000$YHEX"
|
||||
echo "\"DefaultSettings.XResolution\"=dword:$XHEX"
|
||||
echo "\"DefaultSettings.YResolution\"=dword:$YHEX"
|
||||
echo ""
|
||||
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]"
|
||||
echo "\"ScreenSaver\"=\"reg add \\\"HKCU\\\\Control Panel\\\\Desktop\\\" /f /v \\\"SCRNSAVE.EXE\\\" /t REG_SZ /d \\\"off\\\"\""
|
||||
@@ -1766,7 +1742,7 @@ prepareInstall() {
|
||||
echo ""
|
||||
echo "Call Domain.MoveHere(LocalAdminADsPath, \"$username\")"
|
||||
echo ""
|
||||
echo "Set oLink = WshShell.CreateShortcut(WshShell.ExpandEnvironmentStrings(\"%userprofile%\\Desktop\\Shared.lnk\"))"
|
||||
echo "Set oLink = WshShell.CreateShortcut(WshShell.SpecialFolders(\"Desktop\") & \"\\Shared.lnk\")"
|
||||
echo "With oLink"
|
||||
echo " .TargetPath = \"\\\\host.lan\\Data\""
|
||||
echo " .Save"
|
||||
@@ -1857,7 +1833,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 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 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 WIN51AD -print -quit)
|
||||
[ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AS -print -quit)
|
||||
@@ -1915,16 +1890,16 @@ setMachine() {
|
||||
USB="no"
|
||||
VGA="cirrus"
|
||||
DISK_TYPE="auto"
|
||||
ADAPTER="rtl8139"
|
||||
MACHINE="pc-i440fx-2.4"
|
||||
BOOT_MODE="windows_legacy" ;;
|
||||
BOOT_MODE="windows_legacy"
|
||||
[ -z "${ADAPTER:-}" ] && ADAPTER="pcnet" ;;
|
||||
"win2k"* )
|
||||
VGA="cirrus"
|
||||
MACHINE="pc"
|
||||
USB="pci-ohci"
|
||||
DISK_TYPE="auto"
|
||||
ADAPTER="rtl8139"
|
||||
BOOT_MODE="windows_legacy" ;;
|
||||
BOOT_MODE="windows_legacy"
|
||||
[ -z "${ADAPTER:-}" ] && ADAPTER="rtl8139" ;;
|
||||
"winxp"* | "win2003"* )
|
||||
DISK_TYPE="blk"
|
||||
BOOT_MODE="windows_legacy" ;;
|
||||
|
||||
+27
-10
@@ -23,24 +23,41 @@ cd /run
|
||||
. proc.sh # Initialize processor
|
||||
. power.sh # Configure shutdown
|
||||
. memory.sh # Check available memory
|
||||
. balloon.sh # Initialize ballooning
|
||||
. config.sh # Configure arguments
|
||||
. finish.sh # Finish initialization
|
||||
|
||||
trap - ERR
|
||||
|
||||
version=$(qemu-system-x86_64 --version | head -n 1 | cut -d '(' -f 1 | awk '{ print $NF }')
|
||||
cmd=(qemu-system-x86_64)
|
||||
version=$("${cmd[@]}" --version | awk 'NR==1 { print $4 }')
|
||||
info "Booting ${APP}${BOOT_DESC} using QEMU v$version..."
|
||||
|
||||
{ qemu-system-x86_64 ${ARGS:+ $ARGS} >"$QEMU_OUT" 2>"$QEMU_LOG"; rc=$?; } || :
|
||||
(( rc != 0 )) && error "$(<"$QEMU_LOG")" && exit 15
|
||||
pipe="$QEMU_DIR/qemu.pipe"
|
||||
rm -f "$pipe" && mkfifo "$pipe"
|
||||
|
||||
terminal
|
||||
tee "$QEMU_PTY" <"$pipe" |
|
||||
sed -u \
|
||||
-e 's/\x1B\[[=0-9;]*[a-z]//gi' \
|
||||
-e 's/\x1B\x63//g' \
|
||||
-e 's/\x1B\[[=?]7l//g' \
|
||||
-e '/^$/d' \
|
||||
-e 's/\x44\x53\x73//g' \
|
||||
-e 's/failed to load Boot/skipped Boot/g' \
|
||||
-e 's/0): Not Found/0)/g' &
|
||||
|
||||
if [[ "$SHUTDOWN" != [Yy1]* ]]; then
|
||||
exec "${cmd[@]}" ${ARGS:+ $ARGS} >"$pipe"
|
||||
fi
|
||||
|
||||
"${cmd[@]}" ${ARGS:+ $ARGS} >"$pipe" &
|
||||
|
||||
pid=$!
|
||||
( sleep 30; boot ) &
|
||||
tail -fn +0 "$QEMU_LOG" --pid=$$ 2>/dev/null &
|
||||
cat "$QEMU_TERM" 2> /dev/null | tee "$QEMU_PTY" | \
|
||||
sed -u -e 's/\x1B\[[=0-9;]*[a-z]//gi' \
|
||||
-e 's/failed to load Boot/skipped Boot/g' \
|
||||
-e 's/0): Not Found/0)/g' & wait $! || :
|
||||
|
||||
rc=0
|
||||
wait "$pid" || rc=$?
|
||||
[ -f "$QEMU_END" ] && exit "$rc"
|
||||
|
||||
sleep 1 & wait $!
|
||||
[ ! -f "$QEMU_END" ] && finish 0
|
||||
finish "$rc"
|
||||
|
||||
+158
-60
@@ -22,19 +22,25 @@ backup () {
|
||||
|
||||
fi
|
||||
|
||||
mkdir -p "$root"
|
||||
if ! makeDir "$root"; then
|
||||
error "Failed to create directory \"$root\" !"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local folder="$name"
|
||||
local dir="$root/$folder"
|
||||
|
||||
while [ -d "$dir" ]
|
||||
do
|
||||
count=$((count+1))
|
||||
(( count++ ))
|
||||
folder="${name}.${count}"
|
||||
dir="$root/$folder"
|
||||
done
|
||||
|
||||
rm -rf "$dir"
|
||||
mkdir -p "$dir"
|
||||
if ! makeDir "$dir"; then
|
||||
error "Failed to create directory \"$dir\" !"
|
||||
return 1
|
||||
fi
|
||||
|
||||
[ -f "$iso" ] && mv -f "$iso" "$dir/"
|
||||
find "$STORAGE" -maxdepth 1 -type f -iname 'data.*' -not -iname '*.iso' -exec mv -n {} "$dir/" \;
|
||||
@@ -102,7 +108,7 @@ skipInstall() {
|
||||
[ ! -s "$iso" ] && return 1
|
||||
|
||||
# Check if the ISO was already processed by our script
|
||||
magic=$(dd if="$iso" seek=0 bs=1 count=1 status=none | tr -d '\000')
|
||||
magic=$(dd if="$iso" bs=1 count=1 status=none | tr -d '\000')
|
||||
magic="$(printf '%s' "$magic" | od -A n -t x1 -v | tr -d ' \n')"
|
||||
byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17"
|
||||
|
||||
@@ -127,7 +133,6 @@ startInstall() {
|
||||
if [[ "${VERSION,,}" == "http"* ]]; then
|
||||
|
||||
file=$(basename "${VERSION%%\?*}")
|
||||
file="${file//+/ }"
|
||||
printf -v file '%b' "${file//%/\\x}"
|
||||
file="${file//[!A-Za-z0-9._-]/_}"
|
||||
|
||||
@@ -156,7 +161,9 @@ startInstall() {
|
||||
! backup "" && error "Backup failed!"
|
||||
fi
|
||||
|
||||
mkdir -p "$TMP"
|
||||
if ! makeDir "$TMP"; then
|
||||
error "Failed to create directory \"$TMP\" !" && exit 50
|
||||
fi
|
||||
|
||||
if [ -z "$CUSTOM" ]; then
|
||||
|
||||
@@ -178,6 +185,20 @@ startInstall() {
|
||||
return 0
|
||||
}
|
||||
|
||||
writeFile() {
|
||||
|
||||
local txt="$1"
|
||||
local path="$2"
|
||||
|
||||
echo "$txt" >"$path"
|
||||
|
||||
if ! setOwner "$path"; then
|
||||
error "Failed to set the owner for \"$path\" !"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
finishInstall() {
|
||||
|
||||
local iso="$1"
|
||||
@@ -188,6 +209,10 @@ finishInstall() {
|
||||
error "Failed to find ISO file: $iso" && return 1
|
||||
fi
|
||||
|
||||
if [[ "$iso" == "$STORAGE/"* ]]; then
|
||||
! setOwner "$iso" && error "Failed to set the owner for \"$iso\" !"
|
||||
fi
|
||||
|
||||
if [[ "$aborted" != [Yy1]* ]]; then
|
||||
# Mark ISO as prepared via magic byte
|
||||
byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17"
|
||||
@@ -196,56 +221,68 @@ finishInstall() {
|
||||
fi
|
||||
fi
|
||||
|
||||
cp -f /run/version "$STORAGE/windows.ver"
|
||||
local file="$STORAGE/windows.ver"
|
||||
cp -f /etc/version "$file"
|
||||
! setOwner "$file" && error "Failed to set the owner for \"$file\" !"
|
||||
|
||||
if [[ "$iso" == "$STORAGE/"* ]]; then
|
||||
if [[ "$aborted" != [Yy1]* ]] || [ -z "$CUSTOM" ]; then
|
||||
base=$(basename "$iso")
|
||||
echo "$base" > "$STORAGE/windows.base"
|
||||
file="$STORAGE/windows.base"
|
||||
writeFile "$base" "$file"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "${PLATFORM,,}" == "x64" ]]; then
|
||||
if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then
|
||||
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
|
||||
file="$STORAGE/windows.mode"
|
||||
writeFile "$BOOT_MODE" "$file"
|
||||
if [[ "${MACHINE,,}" != "q35" ]]; then
|
||||
echo "$MACHINE" > "$STORAGE/windows.old"
|
||||
file="$STORAGE/windows.old"
|
||||
writeFile "$MACHINE" "$file"
|
||||
fi
|
||||
else
|
||||
# Enable secure boot + TPM on manual installs as Win11 requires
|
||||
if [[ "$MANUAL" == [Yy1]* || "$aborted" == [Yy1]* ]]; then
|
||||
if [[ "${DETECTED,,}" == "win11"* ]]; then
|
||||
BOOT_MODE="windows_secure"
|
||||
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
|
||||
file="$STORAGE/windows.mode"
|
||||
writeFile "$BOOT_MODE" "$file"
|
||||
fi
|
||||
fi
|
||||
# Enable secure boot on multi-socket systems to workaround freeze
|
||||
if [ -n "$SOCKETS" ] && [[ "$SOCKETS" != "1" ]]; then
|
||||
BOOT_MODE="windows_secure"
|
||||
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
|
||||
file="$STORAGE/windows.mode"
|
||||
writeFile "$BOOT_MODE" "$file"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${ARGS:-}" ]; then
|
||||
ARGUMENTS="$ARGS ${ARGUMENTS:-}"
|
||||
echo "$ARGS" > "$STORAGE/windows.args"
|
||||
file="$STORAGE/windows.args"
|
||||
writeFile "$ARGS" "$file"
|
||||
fi
|
||||
|
||||
if [ -n "${VGA:-}" ] && [[ "${VGA:-}" != "virtio"* ]]; then
|
||||
echo "$VGA" > "$STORAGE/windows.vga"
|
||||
file="$STORAGE/windows.vga"
|
||||
writeFile "$VGA" "$file"
|
||||
fi
|
||||
|
||||
if [ -n "${USB:-}" ] && [[ "${USB:-}" != "qemu-xhci"* ]]; then
|
||||
echo "$USB" > "$STORAGE/windows.usb"
|
||||
file="$STORAGE/windows.usb"
|
||||
writeFile "$USB" "$file"
|
||||
fi
|
||||
|
||||
if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then
|
||||
echo "$DISK_TYPE" > "$STORAGE/windows.type"
|
||||
file="$STORAGE/windows.type"
|
||||
writeFile "$DISK_TYPE" "$file"
|
||||
fi
|
||||
|
||||
if [ -n "${ADAPTER:-}" ] && [[ "${ADAPTER:-}" != "virtio-net-pci" ]]; then
|
||||
echo "$ADAPTER" > "$STORAGE/windows.net"
|
||||
file="$STORAGE/windows.net"
|
||||
writeFile "$ADAPTER" "$file"
|
||||
fi
|
||||
|
||||
rm -rf "$TMP"
|
||||
@@ -339,19 +376,24 @@ extractESD() {
|
||||
local dir="$2"
|
||||
local version="$3"
|
||||
local desc="$4"
|
||||
local size size_gb space space_gb desc
|
||||
local size size_gb sizes space space_gb
|
||||
local retVal total total1 total2 total3 total4
|
||||
local imageIndex links links1 links2 links3 links4
|
||||
|
||||
local msg="Extracting $desc bootdisk..."
|
||||
info "$msg" && html "$msg"
|
||||
local msg="Extracting $desc bootdisk"
|
||||
info "$msg..." && html "$msg..."
|
||||
|
||||
if [ "$(stat -c%s "$iso")" -lt 100000000 ]; then
|
||||
error "Invalid ESD file: Size is smaller than 100 MB" && return 1
|
||||
fi
|
||||
|
||||
rm -rf "$dir"
|
||||
mkdir -p "$dir"
|
||||
|
||||
size=16106127360
|
||||
if ! makeDir "$dir"; then
|
||||
error "Failed to create directory \"$dir\" !" && return 1
|
||||
fi
|
||||
|
||||
size=9606127360
|
||||
size_gb=$(formatBytes "$size")
|
||||
space=$(df --output=avail -B 1 "$dir" | tail -n 1)
|
||||
space_gb=$(formatBytes "$space")
|
||||
@@ -367,40 +409,70 @@ extractESD() {
|
||||
error "Cannot read the image count in ESD file!" && return 1
|
||||
fi
|
||||
|
||||
wimlib-imagex apply "$iso" 1 "$dir" --quiet 2>/dev/null || {
|
||||
sizes=$(wimlib-imagex info "$iso" | grep "Total Bytes:")
|
||||
links=$(wimlib-imagex info "$iso" | grep "Hard Link Bytes:")
|
||||
|
||||
total1=$(awk "NR==1{ print; }" <<< "$sizes" | cut -d':' -f2 | sed 's/^ *//')
|
||||
links1=$(awk "NR==1{ print; }" <<< "$links" | cut -d':' -f2 | sed 's/^ *//')
|
||||
total=$(( total1 - links1 ))
|
||||
|
||||
total3=$(awk "NR==3{ print; }" <<< "$sizes" | cut -d':' -f2 | sed 's/^ *//')
|
||||
links3=$(awk "NR==3{ print; }" <<< "$links" | cut -d':' -f2 | sed 's/^ *//')
|
||||
total3=$(( total3 - links3 ))
|
||||
total3=$(( total3 + 60000000 ))
|
||||
|
||||
/run/progress.sh "$dir" "$total" "$msg ([P])..." &
|
||||
|
||||
imageIndex="1"
|
||||
wimlib-imagex apply "$iso" "$imageIndex" "$dir" --quiet 2>/dev/null || {
|
||||
retVal=$?
|
||||
error "Extracting $desc bootdisk failed" && return $retVal
|
||||
fKill "progress.sh"
|
||||
error "Extracting $desc bootdisk failed ($retVal)" && return 1
|
||||
}
|
||||
|
||||
fKill "progress.sh"
|
||||
|
||||
local bootWimFile="$dir/sources/boot.wim"
|
||||
local installWimFile="$dir/sources/install.wim"
|
||||
|
||||
local msg="Extracting $desc environment..."
|
||||
info "$msg" && html "$msg"
|
||||
local msg="Extracting $desc environment"
|
||||
info "$msg..." && html "$msg..."
|
||||
|
||||
wimlib-imagex export "$iso" 2 "$bootWimFile" --compress=none --quiet || {
|
||||
imageIndex="2"
|
||||
/run/progress.sh "$bootWimFile" "$total3" "$msg ([P])..." &
|
||||
|
||||
wimlib-imagex export "$iso" "$imageIndex" "$bootWimFile" --compress=none --quiet || {
|
||||
retVal=$?
|
||||
error "Adding WinPE failed" && return ${retVal}
|
||||
fKill "progress.sh"
|
||||
error "Adding WinPE failed ($retVal)" && return 1
|
||||
}
|
||||
|
||||
local msg="Extracting $desc setup..."
|
||||
info "$msg" && html "$msg"
|
||||
fKill "progress.sh"
|
||||
|
||||
wimlib-imagex export "$iso" 3 "$bootWimFile" --compress=none --boot --quiet || {
|
||||
retVal=$?
|
||||
error "Adding Windows Setup failed" && return ${retVal}
|
||||
local msg="Extracting $desc setup"
|
||||
info "$msg..."
|
||||
|
||||
imageIndex="3"
|
||||
/run/progress.sh "$bootWimFile" "$total3" "$msg ([P])..." &
|
||||
|
||||
wimlib-imagex export "$iso" "$imageIndex" "$bootWimFile" --compress=none --boot --quiet || {
|
||||
retVal=$?
|
||||
fKill "progress.sh"
|
||||
error "Adding Windows Setup failed ($retVal)" && return 1
|
||||
}
|
||||
|
||||
fKill "progress.sh"
|
||||
|
||||
if [[ "${PLATFORM,,}" == "x64" ]]; then
|
||||
LABEL="CCCOMA_X64FRE_EN-US_DV9"
|
||||
else
|
||||
LABEL="CPBA_A64FRE_EN-US_DV9"
|
||||
fi
|
||||
|
||||
local msg="Extracting $desc image..."
|
||||
info "$msg" && html "$msg"
|
||||
local msg="Extracting $desc image"
|
||||
info "$msg..." && html "$msg..."
|
||||
|
||||
local edition imageIndex imageEdition
|
||||
local edition imageEdition
|
||||
edition=$(getCatalog "$version" "name")
|
||||
|
||||
if [ -z "$edition" ]; then
|
||||
@@ -408,15 +480,27 @@ extractESD() {
|
||||
fi
|
||||
|
||||
for (( imageIndex=4; imageIndex<=esdImageCount; imageIndex++ )); do
|
||||
imageEdition=$(wimlib-imagex info "$iso" ${imageIndex} | grep '^Description:' | sed 's/Description:[ \t]*//')
|
||||
|
||||
imageEdition=$(wimlib-imagex info "$iso" "$imageIndex" | grep '^Description:' | sed 's/Description:[ \t]*//')
|
||||
[[ "${imageEdition,,}" != "${edition,,}" ]] && continue
|
||||
wimlib-imagex export "$iso" ${imageIndex} "$installWimFile" --compress=LZMS --chunk-size 128K --quiet || {
|
||||
|
||||
total4=$(du -sb "$iso" | cut -f1)
|
||||
total4=$(( total4 + 3000000 ))
|
||||
|
||||
/run/progress.sh "$installWimFile" "$total4" "$msg ([P])..." &
|
||||
|
||||
wimlib-imagex export "$iso" "$imageIndex" "$installWimFile" --compress=LZMS --chunk-size 128K --quiet || {
|
||||
retVal=$?
|
||||
error "Addition of $imageIndex to the $desc image failed" && return $retVal
|
||||
fKill "progress.sh"
|
||||
error "Addition of $imageIndex to the $desc image failed ($retVal)" && return 1
|
||||
}
|
||||
|
||||
fKill "progress.sh"
|
||||
return 0
|
||||
|
||||
done
|
||||
|
||||
fKill "progress.sh"
|
||||
error "Failed to find product '$edition' in install.wim!" && return 1
|
||||
}
|
||||
|
||||
@@ -440,18 +524,21 @@ extractImage() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
local msg="Extracting $desc image..."
|
||||
info "$msg" && html "$msg"
|
||||
local msg="Extracting $desc image"
|
||||
info "$msg..." && html "$msg..."
|
||||
|
||||
rm -rf "$dir"
|
||||
mkdir -p "$dir"
|
||||
|
||||
if ! makeDir "$dir"; then
|
||||
error "Failed to create directory \"$dir\" !" && return 1
|
||||
fi
|
||||
|
||||
size=$(stat -c%s "$iso")
|
||||
size_gb=$(formatBytes "$size")
|
||||
space=$(df --output=avail -B 1 "$dir" | tail -n 1)
|
||||
space_gb=$(formatBytes "$space")
|
||||
|
||||
if ((size<100000000)); then
|
||||
if (( size < 100000000 )); then
|
||||
error "Invalid ISO file: Size is smaller than 100 MB" && return 1
|
||||
fi
|
||||
|
||||
@@ -460,11 +547,15 @@ extractImage() {
|
||||
fi
|
||||
|
||||
rm -rf "$dir"
|
||||
/run/progress.sh "$dir" "$size" "$msg ([P])..." &
|
||||
|
||||
if ! 7z x "$iso" -o"$dir" > /dev/null; then
|
||||
fKill "progress.sh"
|
||||
error "Failed to extract ISO file: $iso" && return 1
|
||||
fi
|
||||
|
||||
fKill "progress.sh"
|
||||
|
||||
if [[ "${UNPACK:-}" != [Yy1]* ]]; then
|
||||
|
||||
LABEL=$(isoinfo -d -i "$iso" | sed -n 's/Volume id: //p')
|
||||
@@ -501,7 +592,7 @@ getPlatform() {
|
||||
case "${arch,,}" in
|
||||
"0" ) platform="x86" ;;
|
||||
"9" ) platform="x64" ;;
|
||||
"12" )platform="arm64" ;;
|
||||
"12" ) platform="arm64" ;;
|
||||
esac
|
||||
|
||||
echo "$platform"
|
||||
@@ -800,12 +891,12 @@ updateXML() {
|
||||
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)
|
||||
|
||||
sed -i "s/<Value>password<\/Value>/<Value>$admin<\/Value>/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 -z "s/<Password>...............<Value \/>/<Password>\n <Value>$pw<\/Value>/g" -i "$asset"
|
||||
sed -z "s/<AdministratorPassword>...........<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset"
|
||||
sed -z "s/<AdministratorPassword>...............<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$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 -z "s|<Password>...........<Value \/>|<Password>\n <Value>$pw<\/Value>|g" "$asset"
|
||||
sed -i -z "s|<Password>...............<Value \/>|<Password>\n <Value>$pw<\/Value>|g" "$asset"
|
||||
sed -i -z "s|<AdministratorPassword>...........<Value \/>|<AdministratorPassword>\n <Value>$admin<\/Value>|g" "$asset"
|
||||
sed -i -z "s|<AdministratorPassword>...............<Value \/>|<AdministratorPassword>\n <Value>$admin<\/Value>|g" "$asset"
|
||||
|
||||
if [ -n "$EDITION" ]; then
|
||||
[[ "${EDITION^^}" == "CORE" ]] && EDITION="STANDARDCORE"
|
||||
@@ -922,12 +1013,13 @@ addDrivers() {
|
||||
addDriver "$version" "$drivers" "$target" "vioserial" || return 1
|
||||
addDriver "$version" "$drivers" "$target" "qemupciserial" || return 1
|
||||
|
||||
local dst="$src/\$OEM\$/\$\$/Drivers"
|
||||
mkdir -p "$dst" || return 1
|
||||
cp -Lr "$dest/." "$dst" || return 1
|
||||
|
||||
case "${version,,}" in
|
||||
"win11x64"* | "win2025"* )
|
||||
# Workaround Virtio GPU driver bug
|
||||
local dst="$src/\$OEM\$/\$\$/Drivers"
|
||||
mkdir -p "$dst" || return 1
|
||||
cp -Lr "$dest/." "$dst" || return 1
|
||||
rm -rf "$dest/viogpudo"
|
||||
;;
|
||||
esac
|
||||
@@ -1077,8 +1169,8 @@ buildImage() {
|
||||
|
||||
desc=$(printVersion "$DETECTED" "ISO")
|
||||
|
||||
local msg="Building $desc image..."
|
||||
info "$msg" && html "$msg"
|
||||
local msg="Building $desc image"
|
||||
info "$msg..." && html "$msg..."
|
||||
|
||||
[ -z "$LABEL" ] && LABEL="Windows"
|
||||
|
||||
@@ -1086,7 +1178,7 @@ buildImage() {
|
||||
error "Failed to locate file \"$ETFS\" in ISO image!" && return 1
|
||||
fi
|
||||
|
||||
size=$(du -h -b --max-depth=0 "$dir" | cut -f1)
|
||||
size=$(du -b --max-depth=0 "$dir" | cut -f1)
|
||||
size_gb=$(formatBytes "$size")
|
||||
space=$(df --output=avail -B 1 "$TMP" | tail -n 1)
|
||||
space_gb=$(formatBytes "$space")
|
||||
@@ -1095,6 +1187,8 @@ buildImage() {
|
||||
error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb." && return 1
|
||||
fi
|
||||
|
||||
/run/progress.sh "$out" "$size" "$msg ([P])..." &
|
||||
|
||||
if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
|
||||
|
||||
genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \
|
||||
@@ -1115,18 +1209,22 @@ buildImage() {
|
||||
|
||||
fi
|
||||
|
||||
fKill "progress.sh"
|
||||
|
||||
if [ -n "$failed" ]; then
|
||||
[ -s "$log" ] && echo "$(<"$log")"
|
||||
error "Failed to build image!" && return 1
|
||||
fi
|
||||
|
||||
local error=""
|
||||
local err=""
|
||||
local hide="Warning: creating filesystem that does not conform to ISO-9660."
|
||||
|
||||
[ -s "$log" ] && error="$(<"$log")"
|
||||
[[ "$error" != "$hide" ]] && echo "$error"
|
||||
[ -s "$log" ] && err="$(<"$log")"
|
||||
[[ "$err" != "$hide" ]] && echo "$err"
|
||||
|
||||
mv -f "$out" "$BOOT" || return 1
|
||||
! setOwner "$BOOT" && error "Failed to set the owner for \"$BOOT\" !"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
+80
-44
@@ -49,7 +49,7 @@ handle_curl_error() {
|
||||
|
||||
get_agent() {
|
||||
|
||||
local user_agent
|
||||
local browser_version
|
||||
|
||||
# Determine approximate latest Firefox release
|
||||
browser_version="$((124 + ($(date +%s) - 1710892800) / 2419200))"
|
||||
@@ -63,18 +63,12 @@ download_windows() {
|
||||
local id="$1"
|
||||
local lang="$2"
|
||||
local desc="$3"
|
||||
local sku_id=""
|
||||
local sku_url=""
|
||||
local iso_url=""
|
||||
local iso_json=""
|
||||
local language=""
|
||||
local session_id=""
|
||||
local user_agent=""
|
||||
local download_type=""
|
||||
local windows_version=""
|
||||
local iso_download_link=""
|
||||
local download_page_html=""
|
||||
local product_edition_id=""
|
||||
local ovw="" rtick="" mdt="" sku_id="" sku_url=""
|
||||
local iso_url="" iso_json="" language="" org_id=""
|
||||
local instance_id="" vls_url="" ov_url="" ov_data=""
|
||||
local session_id="" user_agent="" download_type=""
|
||||
local windows_version="" iso_download_link=""
|
||||
local download_page_html="" product_edition_id=""
|
||||
local language_skuid_json=""
|
||||
local profile="606624d44113"
|
||||
|
||||
@@ -83,13 +77,11 @@ download_windows() {
|
||||
|
||||
case "${id,,}" in
|
||||
"win11x64" ) windows_version="11" && download_type="1" ;;
|
||||
"win10x64" ) windows_version="10" && download_type="1" ;;
|
||||
"win11arm64" ) windows_version="11arm64" && download_type="2" ;;
|
||||
* ) error "Invalid VERSION specified, value \"$id\" is not recognized!" && return 1 ;;
|
||||
esac
|
||||
|
||||
local url="https://www.microsoft.com/en-us/software-download/windows$windows_version"
|
||||
[[ "${id,,}" == "win10"* ]] && url+="ISO"
|
||||
|
||||
# uuidgen: For MacOS (installed by default) and other systems (e.g. with no /proc) that don't have a kernel interface for generating random UUIDs
|
||||
session_id=$(cat /proc/sys/kernel/random/uuid 2> /dev/null || uuidgen --random)
|
||||
@@ -115,15 +107,65 @@ download_windows() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
[[ "$DEBUG" == [Yy1]* ]] && echo "Permit Session ID: $session_id"
|
||||
# Microsoft download "protection" requires the sessionId to be whitelisted through vlscppe.microsoft.com/tags
|
||||
|
||||
org_id="y6jn8c31"
|
||||
vls_url="https://vlscppe.microsoft.com/tags?org_id=$org_id&session_id=$session_id"
|
||||
|
||||
[[ "$DEBUG" == [Yy1]* ]] && echo "Getting Session ID: $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 -- "https://vlscppe.microsoft.com/tags?org_id=y6jn8c31&session_id=$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" || {
|
||||
# This should only happen if there's been some change to how this API works
|
||||
handle_curl_error "$?" "Microsoft"
|
||||
return $?
|
||||
}
|
||||
|
||||
# Microsoft download "protection" also requires an ov-df.microsoft.com request/reply
|
||||
# 1) Request mdt.js to get w and rticks. InstanceId is (currently) constant.
|
||||
|
||||
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"
|
||||
|
||||
[[ "$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") || {
|
||||
handle_curl_error "$?" "Microsoft"
|
||||
return $?
|
||||
}
|
||||
|
||||
if [[ $ov_data =~ [\?\&]w=([A-Fa-f0-9]+) ]]; then
|
||||
ovw="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
|
||||
if [[ $ov_data =~ rticks=\"\+?([0-9]+) ]]; then
|
||||
rticks="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
|
||||
if [[ -z $ovw || -z $rticks ]]; then
|
||||
error "Could not extract ov-df data from Microsoft server!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
[[ "$DEBUG" == [Yy1]* ]] && echo "$ovw"
|
||||
|
||||
sleep 0.2
|
||||
|
||||
# 2) Send a reply with session ID, current epoch and previously retrieved w and rticks
|
||||
|
||||
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"
|
||||
|
||||
[[ "$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" || {
|
||||
# This should only happen if there's been some change to how this API works
|
||||
handle_curl_error "$?" "Microsoft"
|
||||
return $?
|
||||
}
|
||||
|
||||
[[ "$DEBUG" == [Yy1]* ]] && echo -n "Getting language SKU ID: "
|
||||
|
||||
sku_url="https://www.microsoft.com/software-download-connector/api/getskuinformationbyproductedition?profile=$profile&ProductEditionId=$product_edition_id&SKU=undefined&friendlyFileName=undefined&Locale=en-US&sessionID=$session_id"
|
||||
language_skuid_json=$(curl --silent --max-time 30 --request GET --user-agent "$user_agent" --referer "$url" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$sku_url") || {
|
||||
handle_curl_error "$?" "Microsoft"
|
||||
@@ -145,7 +187,10 @@ download_windows() {
|
||||
# If any request is going to be blocked by Microsoft it's always this last one (the previous requests always seem to succeed)
|
||||
|
||||
iso_url="https://www.microsoft.com/software-download-connector/api/GetProductDownloadLinksBySku?profile=$profile&ProductEditionId=undefined&SKU=$sku_id&friendlyFileName=undefined&Locale=en-US&sessionID=$session_id"
|
||||
iso_json=$(curl --silent --max-time 30 --request GET --user-agent "$user_agent" --referer "$url" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$iso_url")
|
||||
iso_json=$(curl --silent --max-time 30 --request GET --user-agent "$user_agent" --referer "$url" --header "Accept:" --max-filesize 100K --fail --proto =https --tlsv1.2 --http1.1 -- "$iso_url") || {
|
||||
handle_curl_error "$?" "Microsoft"
|
||||
return $?
|
||||
}
|
||||
|
||||
if ! [ "$iso_json" ]; then
|
||||
# This should only happen if there's been some change to how this API works
|
||||
@@ -166,7 +211,7 @@ download_windows() {
|
||||
{ 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
|
||||
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"
|
||||
return 1
|
||||
fi
|
||||
@@ -180,13 +225,8 @@ download_windows_eval() {
|
||||
local id="$1"
|
||||
local lang="$2"
|
||||
local desc="$3"
|
||||
local filter=""
|
||||
local culture=""
|
||||
local compare=""
|
||||
local language=""
|
||||
local user_agent=""
|
||||
local enterprise_type=""
|
||||
local windows_version=""
|
||||
local filter="" culture="" compare="" language=""
|
||||
local user_agent="" enterprise_type="" windows_version=""
|
||||
|
||||
case "${id,,}" in
|
||||
"win11${PLATFORM,,}-enterprise-eval" )
|
||||
@@ -198,12 +238,6 @@ download_windows_eval() {
|
||||
"win11${PLATFORM,,}-enterprise-ltsc-eval" )
|
||||
enterprise_type="iot"
|
||||
windows_version="windows-11-iot-enterprise-ltsc-eval" ;;
|
||||
"win10${PLATFORM,,}-enterprise-eval" )
|
||||
enterprise_type="enterprise"
|
||||
windows_version="windows-10-enterprise" ;;
|
||||
"win10${PLATFORM,,}-enterprise-ltsc-eval" )
|
||||
enterprise_type="ltsc"
|
||||
windows_version="windows-10-enterprise" ;;
|
||||
"win2025-eval" )
|
||||
enterprise_type="server"
|
||||
windows_version="windows-server-2025" ;;
|
||||
@@ -230,6 +264,8 @@ download_windows_eval() {
|
||||
culture=$(getLanguage "$lang" "culture")
|
||||
|
||||
local country="${culture#*-}"
|
||||
local iso_download_link=""
|
||||
local iso_download_links=""
|
||||
local iso_download_page_html=""
|
||||
local url="https://www.microsoft.com/en-us/evalcenter/download-$windows_version"
|
||||
|
||||
@@ -349,7 +385,8 @@ getWindows() {
|
||||
info "$msg" && html "$msg"
|
||||
|
||||
case "${version,,}" in
|
||||
"win2008r2" | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
|
||||
"win2008r2" | "win81${PLATFORM,,}"* | "win10${PLATFORM,,}-enterprise"* | \
|
||||
"win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
|
||||
if [[ "${lang,,}" != "en" && "${lang,,}" != "en-"* ]]; then
|
||||
error "No download in the $language language available for $edition!"
|
||||
MIDO_URL="" && return 1
|
||||
@@ -367,16 +404,16 @@ getWindows() {
|
||||
esac
|
||||
|
||||
case "${version,,}" in
|
||||
"win10${PLATFORM,,}" | "win11${PLATFORM,,}" )
|
||||
"win11${PLATFORM,,}" )
|
||||
download_windows "$version" "$lang" "$edition" && return 0
|
||||
;;
|
||||
"win11${PLATFORM,,}-enterprise"* | "win10${PLATFORM,,}-enterprise"* )
|
||||
"win11${PLATFORM,,}-enterprise"* )
|
||||
download_windows_eval "$version" "$lang" "$edition" && return 0
|
||||
;;
|
||||
"win2025-eval" | "win2022-eval" | "win2019-eval" | "win2019-hv" | "win2016-eval" | "win2012r2-eval" )
|
||||
download_windows_eval "$version" "$lang" "$edition" && return 0
|
||||
;;
|
||||
"win81${PLATFORM,,}-enterprise"* | "win2008r2" )
|
||||
"win2008r2" | "win81${PLATFORM,,}"* | "win10${PLATFORM,,}-enterprise"* )
|
||||
;;
|
||||
* ) error "Invalid VERSION specified, value \"$version\" is not recognized!" ;;
|
||||
esac
|
||||
@@ -467,12 +504,8 @@ getESD() {
|
||||
local version="$2"
|
||||
local lang="$3"
|
||||
local desc="$4"
|
||||
local file
|
||||
local result
|
||||
local culture
|
||||
local language
|
||||
local edition
|
||||
local catalog
|
||||
local file result culture
|
||||
local language edition catalog
|
||||
|
||||
file=$(getCatalog "$version" "file")
|
||||
catalog=$(getCatalog "$version" "url")
|
||||
@@ -483,11 +516,14 @@ getESD() {
|
||||
error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1
|
||||
fi
|
||||
|
||||
local msg="Downloading catalog..."
|
||||
local msg="Downloading catalog from the Microsoft servers..."
|
||||
info "$msg" && html "$msg"
|
||||
|
||||
rm -rf "$dir"
|
||||
mkdir -p "$dir"
|
||||
|
||||
if ! makeDir "$dir"; then
|
||||
error "Failed to create directory \"$dir\" !" && return 1
|
||||
fi
|
||||
|
||||
local xFile="products.xml"
|
||||
local eFile="esd_edition.xml"
|
||||
|
||||
+98
-117
@@ -1,28 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
: "${QEMU_TIMEOUT:="110"}" # QEMU Termination timeout
|
||||
: "${SHUTDOWN:="Y"}" # Graceful ACPI shutdown
|
||||
: "${TIMEOUT:="115"}" # QEMU termination timeout
|
||||
|
||||
# Configure QEMU for graceful shutdown
|
||||
|
||||
QEMU_TERM=""
|
||||
QEMU_DIR="/run/shm"
|
||||
QEMU_PID="$QEMU_DIR/qemu.pid"
|
||||
QEMU_PTY="$QEMU_DIR/qemu.pty"
|
||||
QEMU_LOG="$QEMU_DIR/qemu.log"
|
||||
QEMU_OUT="$QEMU_DIR/qemu.out"
|
||||
QEMU_END="$QEMU_DIR/qemu.end"
|
||||
|
||||
rm -f "$QEMU_DIR/qemu.*"
|
||||
touch "$QEMU_LOG"
|
||||
|
||||
_trap() {
|
||||
func="$1" ; shift
|
||||
for sig ; do
|
||||
local func="$1"; shift
|
||||
local sig
|
||||
TRAP_PID=$BASHPID
|
||||
|
||||
for sig; do
|
||||
trap "$func $sig" "$sig"
|
||||
done
|
||||
}
|
||||
|
||||
app() {
|
||||
echo "$APP" && return 0
|
||||
}
|
||||
|
||||
boot() {
|
||||
|
||||
[ -f "$QEMU_END" ] && return 0
|
||||
@@ -35,17 +35,14 @@ boot() {
|
||||
grep -Fq "BOOTMGR is missing" "$QEMU_PTY" && fail="y"
|
||||
fi
|
||||
if [ -z "$fail" ]; then
|
||||
info "Windows started successfully, visit http://127.0.0.1:8006/ to view the screen..."
|
||||
info "$(app) started successfully, visit http://127.0.0.1:8006/ to view the screen..."
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
error "Timeout while waiting for QEMU to boot the machine!"
|
||||
|
||||
local pid
|
||||
pid=$(<"$QEMU_PID")
|
||||
{ kill -15 "$pid" || true; } 2>/dev/null
|
||||
error "Timeout while waiting for QEMU to boot the machine, aborting..."
|
||||
sKill "$QEMU_PID"
|
||||
|
||||
return 0
|
||||
}
|
||||
@@ -73,159 +70,143 @@ ready() {
|
||||
|
||||
finish() {
|
||||
|
||||
local pid
|
||||
local i=0
|
||||
local pid=""
|
||||
local reason=$1
|
||||
local pids=( "${SMB_PID:-}" "${NMB_PID:-}" "${DDN_PID:-}" "${TPM_PID:-}" "${WSD_PID:-}" \
|
||||
"${WEB_PID:-}" "${PASST_PID:-}" "${DNSMASQ_PID:-}" "${BALLOONING_PID:-}" )
|
||||
|
||||
touch "$QEMU_END"
|
||||
|
||||
if [ -s "$QEMU_PID" ]; then
|
||||
|
||||
pid=$(<"$QEMU_PID")
|
||||
error "Forcefully terminating Windows, reason: $reason..."
|
||||
{ kill -15 "$pid" || true; } 2>/dev/null
|
||||
|
||||
while isAlive "$pid"; do
|
||||
sleep 1
|
||||
# Workaround for zombie pid
|
||||
[ ! -s "$QEMU_PID" ] && break
|
||||
done
|
||||
if read -r pid <"$QEMU_PID"; then
|
||||
if [ -n "$pid" ] && isAlive "$pid"; then
|
||||
local display="$reason"
|
||||
case "$reason" in
|
||||
129 ) display="SIGHUP" ;;
|
||||
130 ) display="SIGINT" ;;
|
||||
131 ) display="SIGQUIT" ;;
|
||||
134 ) display="SIGABRT" ;;
|
||||
143 ) display="SIGTERM" ;;
|
||||
esac
|
||||
error "Forcefully terminating $(app), reason: $display..."
|
||||
{ disown "$pid" || :; kill -9 -- "$pid" || :; } 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$BOOT" ]; then
|
||||
# Remove CD-ROM ISO after install
|
||||
if ready; then
|
||||
touch "$STORAGE/windows.boot"
|
||||
local file="$STORAGE/windows.boot"
|
||||
touch "$file"
|
||||
! setOwner "$file" && error "Failed to set the owner for \"$file\" !"
|
||||
if [[ "$REMOVE" != [Nn]* ]]; then
|
||||
rm -f "$BOOT" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
pid="/var/run/tpm.pid"
|
||||
[ -s "$pid" ] && pKill "$(<"$pid")"
|
||||
rm -f "$pid"
|
||||
|
||||
pid="/var/run/wsdd.pid"
|
||||
[ -s "$pid" ] && pKill "$(<"$pid")"
|
||||
rm -f "$pid"
|
||||
|
||||
pid="/var/run/samba/nmbd.pid"
|
||||
[ -s "$pid" ] && pKill "$(<"$pid")"
|
||||
rm -f "$pid"
|
||||
|
||||
pid="/var/run/samba/smbd.pid"
|
||||
[ -s "$pid" ] && pKill "$(<"$pid")"
|
||||
rm -f "$pid"
|
||||
|
||||
mKill "${pids[@]}"
|
||||
closeNetwork
|
||||
|
||||
sleep 0.5
|
||||
echo "❯ Shutdown completed!"
|
||||
if ! waitPidFile "$QEMU_PID" 10; then
|
||||
warn "Timed out while waiting for $(app) to exit!"
|
||||
fi
|
||||
|
||||
(( reason != 1 )) && echo && echo "❯ Shutdown completed!"
|
||||
exit "$reason"
|
||||
}
|
||||
|
||||
terminal() {
|
||||
graceful_shutdown() {
|
||||
|
||||
local dev=""
|
||||
local sig="$1"
|
||||
local pid=""
|
||||
local code=0
|
||||
|
||||
if [ -s "$QEMU_OUT" ]; then
|
||||
[[ $BASHPID != "$TRAP_PID" ]] && return
|
||||
|
||||
local msg
|
||||
msg=$(<"$QEMU_OUT")
|
||||
|
||||
if [ -n "$msg" ]; then
|
||||
|
||||
if [[ "${msg,,}" != "char"* || "$msg" != *"serial0)" ]]; then
|
||||
echo "$msg"
|
||||
fi
|
||||
|
||||
dev="${msg#*/dev/p}"
|
||||
dev="/dev/p${dev%% *}"
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -c "$dev" ]; then
|
||||
dev=$(echo 'info chardev' | nc -q 1 -w 1 localhost "$MON_PORT" | tr -d '\000')
|
||||
dev="${dev#*serial0}"
|
||||
dev="${dev#*pty:}"
|
||||
dev="${dev%%$'\n'*}"
|
||||
dev="${dev%%$'\r'*}"
|
||||
fi
|
||||
|
||||
if [ ! -c "$dev" ]; then
|
||||
error "Device '$dev' not found!"
|
||||
finish 34 && return 34
|
||||
fi
|
||||
|
||||
QEMU_TERM="$dev"
|
||||
return 0
|
||||
}
|
||||
|
||||
_graceful_shutdown() {
|
||||
|
||||
local code=$?
|
||||
|
||||
set +e
|
||||
case "$sig" in
|
||||
SIGHUP) code=129 ;;
|
||||
SIGINT) code=130 ;;
|
||||
SIGQUIT) code=131 ;;
|
||||
SIGABRT) code=134 ;;
|
||||
SIGTERM) code=143 ;;
|
||||
esac
|
||||
|
||||
if [ -f "$QEMU_END" ]; then
|
||||
info "Received $1 while already shutting down..."
|
||||
echo && info "Received $1 signal while already shutting down..."
|
||||
return
|
||||
fi
|
||||
|
||||
set +e
|
||||
touch "$QEMU_END"
|
||||
info "Received $1, sending ACPI shutdown signal..."
|
||||
echo && info "Received $1 signal, sending ACPI shutdown signal..."
|
||||
|
||||
if [ ! -s "$QEMU_PID" ]; then
|
||||
error "QEMU PID file does not exist?"
|
||||
finish "$code" && return "$code"
|
||||
if [ ! -s "$QEMU_PID" ] || ! read -r pid <"$QEMU_PID"; then
|
||||
warn "QEMU PID file ($QEMU_PID) does not exist?"
|
||||
finish "$code"
|
||||
fi
|
||||
|
||||
local pid=""
|
||||
pid=$(<"$QEMU_PID")
|
||||
|
||||
if ! isAlive "$pid"; then
|
||||
error "QEMU process does not exist?"
|
||||
finish "$code" && return "$code"
|
||||
if [ -z "$pid" ] || ! isAlive "$pid"; then
|
||||
warn "QEMU process with PID $pid does not exist?"
|
||||
finish "$code"
|
||||
fi
|
||||
|
||||
if ! ready; then
|
||||
info "Cannot send ACPI signal during Windows setup, aborting..."
|
||||
finish "$code" && return "$code"
|
||||
info "Cannot send ACPI signal during $(app) setup, aborting..."
|
||||
sKill "$QEMU_PID"
|
||||
if ! waitPidFile "$QEMU_PID" 5; then
|
||||
warn "Timed out while waiting for $(app) to exit!"
|
||||
fi
|
||||
finish "$code"
|
||||
fi
|
||||
|
||||
# Send ACPI shutdown signal
|
||||
echo 'system_powerdown' | nc -q 1 -w 1 localhost "$MON_PORT" > /dev/null
|
||||
local cnt=0 abort=0 factor=3 offset=3 min max name
|
||||
|
||||
local cnt=0
|
||||
while [ "$cnt" -lt "$QEMU_TIMEOUT" ]; do
|
||||
[[ "$TIMEOUT" =~ ^[0-9]+$ ]] || TIMEOUT=115
|
||||
[ "$TIMEOUT" -ge 15 ] && factor=4 && offset=4
|
||||
[ "$TIMEOUT" -ge 30 ] && factor=5 && offset=5
|
||||
min=$((factor + offset + 1))
|
||||
[ "$TIMEOUT" -lt "$min" ] && TIMEOUT="$min"
|
||||
max=$(( TIMEOUT - offset ))
|
||||
abort=$(( max - factor ))
|
||||
name="$(app)"
|
||||
|
||||
sleep 1
|
||||
cnt=$((cnt+1))
|
||||
while [ "$cnt" -le "$max" ]; do
|
||||
|
||||
sleep 1 &
|
||||
local slp=$!
|
||||
|
||||
! isAlive "$pid" && break
|
||||
# Workaround for zombie pid
|
||||
[ ! -s "$QEMU_PID" ] && break
|
||||
|
||||
info "Waiting for Windows to shutdown... ($cnt/$QEMU_TIMEOUT)"
|
||||
if [ "$cnt" -ne "$abort" ]; then
|
||||
if [ "$cnt" -gt 0 ]; then
|
||||
info "Waiting for $name to shut down... ($cnt/$max)"
|
||||
fi
|
||||
else
|
||||
info "${name^} is still running, sending SIGTERM... ($cnt/$max)"
|
||||
{ kill -15 -- "$pid" || :; } 2>/dev/null
|
||||
fi
|
||||
|
||||
# Send ACPI shutdown signal
|
||||
echo 'system_powerdown' | nc -q 1 -w 1 localhost "$MON_PORT" > /dev/null
|
||||
if [ -S "$QEMU_DIR/monitor.sock" ]; then
|
||||
nc -q 1 -w 1 -U "$QEMU_DIR/monitor.sock" &> /dev/null <<<'system_powerdown' || :
|
||||
fi
|
||||
|
||||
wait $slp
|
||||
(( cnt++ ))
|
||||
|
||||
done
|
||||
|
||||
if [ "$cnt" -ge "$QEMU_TIMEOUT" ]; then
|
||||
error "Shutdown timeout reached, aborting..."
|
||||
fi
|
||||
|
||||
finish "$code" && return "$code"
|
||||
finish "$code"
|
||||
}
|
||||
|
||||
SERIAL="pty"
|
||||
MONITOR="telnet:localhost:$MON_PORT,server,nowait,nodelay"
|
||||
MONITOR+=" -daemonize -D $QEMU_LOG -pidfile $QEMU_PID"
|
||||
[[ "$SHUTDOWN" != [Yy1]* ]] && return 0
|
||||
[ -n "${QEMU_TIMEOUT:-}" ] && TIMEOUT="$QEMU_TIMEOUT"
|
||||
|
||||
_trap _graceful_shutdown SIGTERM SIGHUP SIGINT SIGABRT SIGQUIT
|
||||
_trap graceful_shutdown SIGTERM SIGHUP SIGABRT SIGQUIT
|
||||
|
||||
return 0
|
||||
|
||||
+27
-25
@@ -2,15 +2,16 @@
|
||||
set -Eeuo pipefail
|
||||
|
||||
: "${SAMBA:="Y"}" # Enable Samba
|
||||
: "${SAMBA_LEVEL:="1"}" # Logging level
|
||||
: "${SAMBA_DEBUG:="N"}" # Disable debug
|
||||
|
||||
tmp="/tmp/smb"
|
||||
rm -rf "$tmp"
|
||||
|
||||
rm -f /var/run/wsdd.pid
|
||||
rm -f /var/run/samba/nmbd.pid
|
||||
rm -f /var/run/samba/smbd.pid
|
||||
DDN_PID="/var/run/wsdd.pid"
|
||||
NMB_PID="/var/run/samba/nmbd.pid"
|
||||
SMB_PID="/var/run/samba/smbd.pid"
|
||||
|
||||
rm -f "$SMB_PID" "$NMB_PID" "$DDN_PID"
|
||||
|
||||
[[ "$SAMBA" == [Nn]* ]] && return 0
|
||||
[[ "$NETWORK" == [Nn]* ]] && return 0
|
||||
@@ -46,10 +47,21 @@ addShare() {
|
||||
local cfg="$5"
|
||||
local owner=""
|
||||
|
||||
mkdir -p "$dir" || return 1
|
||||
if [ ! -d "$dir" ]; then
|
||||
if ! mkdir -p "$dir"; then
|
||||
error "Failed to create shared folder ($dir)." && return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! ls -A "$dir" >/dev/null 2>&1; then
|
||||
error "Failed to access directory $dir" && return 1
|
||||
msg="No permission to access shared folder ($dir)."
|
||||
msg+=" If SELinux is active, you need to add the \":Z\" flag to the bind mount."
|
||||
error "$msg" && return 1
|
||||
fi
|
||||
|
||||
if [ ! -w "$dir" ]; then
|
||||
msg="shared folder ($dir) is not writeable!"
|
||||
warn "$msg"
|
||||
fi
|
||||
|
||||
if [ -z "$(ls -A "$dir")" ]; then
|
||||
@@ -67,7 +79,7 @@ addShare() {
|
||||
if [[ "$dir" == "$tmp" ]]; then
|
||||
|
||||
{ echo "--------------------------------------------------------"
|
||||
echo " $APP for $ENGINE v$(</run/version)..."
|
||||
echo " $APP for $ENGINE v$(</etc/version)..."
|
||||
echo " For support visit $SUPPORT"
|
||||
echo "--------------------------------------------------------"
|
||||
echo ""
|
||||
@@ -136,27 +148,18 @@ share="/shared"
|
||||
[ ! -d "$share" ] && [ -d "$STORAGE/data" ] && share="$STORAGE/data"
|
||||
[ ! -d "$share" ] && share="$tmp"
|
||||
|
||||
m1="Failed to add shared folder"
|
||||
m2="Please check its permissions."
|
||||
|
||||
if ! addShare "$share" "/shared" "Data" "Shared" "$SAMBA_CONFIG"; then
|
||||
error "$m1 '$share'. $m2" && return 0
|
||||
fi
|
||||
! addShare "$share" "/shared" "Data" "Shared" "$SAMBA_CONFIG" && return 0
|
||||
|
||||
if [ -d "/shared2" ]; then
|
||||
addShare "/shared2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || error "$m1 '/shared2'. $m2"
|
||||
else
|
||||
if [ -d "/data2" ]; then
|
||||
addShare "/data2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || error "$m1 '/data2'. $m2."
|
||||
fi
|
||||
addShare "/shared2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || :
|
||||
elif [ -d "/data2" ]; then
|
||||
addShare "/data2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || :
|
||||
fi
|
||||
|
||||
if [ -d "/shared3" ]; then
|
||||
addShare "/shared3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || error "$m1 '/shared3'. $m2"
|
||||
else
|
||||
if [ -d "/data3" ]; then
|
||||
addShare "/data3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || error "$m1 '/data3'. $m2"
|
||||
fi
|
||||
addShare "/shared3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || :
|
||||
elif [ -d "/data3" ]; then
|
||||
addShare "/data3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || :
|
||||
fi
|
||||
|
||||
# Create directories if missing
|
||||
@@ -205,10 +208,9 @@ else
|
||||
|
||||
# Enable Web Service Discovery on Vista and up
|
||||
[[ "$DEBUG" == [Yy1]* ]] && echo "Starting wsddn daemon..."
|
||||
|
||||
rm -f /var/log/wsddn.log
|
||||
|
||||
if ! wsddn -i "${interfaces%%,*}" -H "$hostname" --unixd --log-file=/var/log/wsddn.log --pid-file=/var/run/wsdd.pid; then
|
||||
if ! wsddn -i "${interfaces%%,*}" -H "$hostname" --unixd --log-file=/var/log/wsddn.log --pid-file="$DDN_PID"; then
|
||||
SAMBA_DEBUG="Y"
|
||||
error "Failed to start wsddn daemon!"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user