Compare commits

...

11 Commits

Author SHA1 Message Date
Kroese 4d01a81586 build: Use Firefox impersonation while checking links (#1681) 2026-03-23 15:17:26 +01:00
Kroese d8e51d8965 build: Add workflow to validate download links (#1680) 2026-03-23 13:36:57 +01:00
Kroese 8d4788f7c0 build: Update WSDD version to v1.23 (#1679) 2026-03-23 11:31:04 +01:00
Kroese 8ec135d826 build: Update VirtIO drivers to v1.9.53 (#1678) 2026-03-23 11:26:50 +01:00
huulme 0400f5f45d docs: Higher quality video thumbnail (#1671) 2026-03-09 11:50:01 -04:00
Azim Muradov 588969ae5f fix: Path to "Desktop" folder on Windows XP (#1625)
Fix path to "Desktop" folder to work correctly with different locales on Windows XP.
2026-01-13 13:43:48 +01:00
Kroese c7aac1edcf build: Update QEMU base image to v7.29 (#1583) 2025-11-22 05:02:48 +01:00
renovate[bot] ea03c67a04 chore(deps): update actions/checkout action to v6 (#1580) 2025-11-21 12:38:58 +01:00
Gamal Moussa bdb0488151 refactor: replace PID cleanup with loop (#1579) 2025-11-20 08:49:24 +01:00
Kroese ad6f87046a build: Update VirtIO drivers to v1.9.49 (#1570) 2025-11-14 07:18:24 +01:00
Kroese e7a3894210 fix: Update Workspaces configuration (#1569) 2025-11-14 06:26:07 +01:00
31 changed files with 99 additions and 55 deletions
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "../codespaces.yml", "dockerComposeFile": "../codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
-1
View File
@@ -15,6 +15,5 @@
"onAutoForward": "ignore" "onAutoForward": "ignore"
}, },
"dockerComposeFile": "codespaces.yml", "dockerComposeFile": "codespaces.yml",
"workspaceFolder": "/workspaces/windows",
"initializeCommand": "docker system prune --all --force" "initializeCommand": "docker system prune --all --force"
} }
+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
steps: steps:
- -
name: Checkout name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- -
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
steps: steps:
- -
name: Checkout name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
- -
name: Run ShellCheck name: Run ShellCheck
uses: ludeeus/action-shellcheck@master uses: ludeeus/action-shellcheck@master
+12 -10
View File
@@ -12,13 +12,15 @@ jobs:
dockerHubDescription: dockerHubDescription:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 -
- name: Checkout repo
name: Docker Hub Description uses: actions/checkout@v6
uses: peter-evans/dockerhub-description@v5 -
with: name: Docker Hub Description
username: ${{ secrets.DOCKERHUB_USERNAME }} uses: peter-evans/dockerhub-description@v5
password: ${{ secrets.DOCKERHUB_TOKEN }} with:
repository: ${{ secrets.DOCKERHUB_REPO }} username: ${{ secrets.DOCKERHUB_USERNAME }}
short-description: ${{ github.event.repository.description }} password: ${{ secrets.DOCKERHUB_TOKEN }}
readme-filepath: ./readme.md repository: ${{ secrets.DOCKERHUB_REPO }}
short-description: ${{ github.event.repository.description }}
readme-filepath: ./readme.md
+67
View File
@@ -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 ))
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
steps: steps:
- -
name: Checkout name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
- -
name: Spelling name: Spelling
uses: reviewdog/action-misspell@v1 uses: reviewdog/action-misspell@v1
+3 -3
View File
@@ -3,7 +3,7 @@
ARG VERSION_ARG="latest" ARG VERSION_ARG="latest"
FROM scratch AS build-amd64 FROM scratch AS build-amd64
COPY --from=qemux/qemu:7.28 / / COPY --from=qemux/qemu:7.29 / /
ARG TARGETARCH ARG TARGETARCH
ARG DEBCONF_NOWARNINGS="yes" ARG DEBCONF_NOWARNINGS="yes"
@@ -19,7 +19,7 @@ RUN set -eu && \
cabextract \ cabextract \
libxml2-utils \ libxml2-utils \
libarchive-tools && \ libarchive-tools && \
wget "https://github.com/gershnik/wsdd-native/releases/download/v1.22/wsddn_1.22_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q && \ wget "https://github.com/gershnik/wsdd-native/releases/download/v1.23/wsddn_1.23_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q && \
dpkg -i /tmp/wsddn.deb && \ dpkg -i /tmp/wsddn.deb && \
apt-get clean && \ apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
@@ -27,7 +27,7 @@ RUN set -eu && \
COPY --chmod=755 ./src /run/ COPY --chmod=755 ./src /run/
COPY --chmod=755 ./assets /run/assets COPY --chmod=755 ./assets /run/assets
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.48-0/virtio-win-1.9.48.tar.xz /var/drivers.txz ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.53-0/virtio-win-1.9.53.tar.xz /var/drivers.txz
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64 FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
FROM build-${TARGETARCH} FROM build-${TARGETARCH}
+1 -1
View File
@@ -22,7 +22,7 @@ Windows inside a Docker container.
## Video 📺 ## Video 📺
[![Youtube](https://img.youtube.com/vi/xhGYobuG508/0.jpg)](https://www.youtube.com/watch?v=xhGYobuG508) [![Youtube](https://img.youtube.com/vi/xhGYobuG508/maxresdefault.jpg)](https://www.youtube.com/watch?v=xhGYobuG508)
## Usage 🐳 ## Usage 🐳
+1 -1
View File
@@ -1766,7 +1766,7 @@ prepareInstall() {
echo "" echo ""
echo "Call Domain.MoveHere(LocalAdminADsPath, \"$username\")" echo "Call Domain.MoveHere(LocalAdminADsPath, \"$username\")"
echo "" 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 "With oLink"
echo " .TargetPath = \"\\\\host.lan\\Data\"" echo " .TargetPath = \"\\\\host.lan\\Data\""
echo " .Save" echo " .Save"
+12 -15
View File
@@ -76,6 +76,12 @@ finish() {
local pid local pid
local cnt=0 local cnt=0
local reason=$1 local reason=$1
local pids=(
"/var/run/tpm.pid"
"/var/run/wsdd.pid"
"/var/run/samba/nmbd.pid"
"/var/run/samba/smbd.pid"
)
touch "$QEMU_END" touch "$QEMU_END"
@@ -114,21 +120,12 @@ finish() {
fi fi
fi fi
pid="/var/run/tpm.pid" for pid in "${pids[@]}"; do
[ -s "$pid" ] && pKill "$(<"$pid")" if [[ -s "$pid" ]]; then
rm -f "$pid" pKill "$(cat "$pid")"
fi
pid="/var/run/wsdd.pid" rm -f "$pid"
[ -s "$pid" ] && pKill "$(<"$pid")" done
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"
closeNetwork closeNetwork