Files
SilverMetal/windows/tests/Assert-IsoStructure.ps1
sysadmin ee3528f360
Some checks failed
Build SilverMetal Enhanced - Windows ISO / build (pull_request) Failing after 1m17s
ci(welcome): fail the build if the Welcome payload isn't baked (guard against green-but-broken image)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 04:02:50 +01:00

53 lines
2.8 KiB
PowerShell

#Requires -Version 5.1
<# SilverMetal Enhanced - Windows | Offline ISO structure assertions.
The reliable CI gate that needs NO nested virtualization: proves the built
ISO baked the answer file + hardening payload correctly. Full boot-and-Verify
(QEMU + OVMF + swtpm) is a follow-on stage that needs nested virt.
Exit 0 = all assertions pass; non-zero = failures.
#>
[CmdletBinding()] param([Parameter(Mandatory)][string]$IsoPath)
Set-StrictMode -Version Latest; $ErrorActionPreference = 'Stop'
$fail = 0
function Assert { param([string]$Name,[bool]$Cond)
if ($Cond) { Write-Host "[PASS] $Name" -ForegroundColor Green }
else { Write-Host "[FAIL] $Name" -ForegroundColor Red; $script:fail++ }
}
if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator))) { throw 'must run elevated (WIM mount).' }
$img = Mount-DiskImage -ImagePath $IsoPath -PassThru
$mount = Join-Path $env:TEMP 'sm-assert-wim'
$null = New-Item -ItemType Directory -Force $mount
try {
$drive = ($img | Get-Volume).DriveLetter + ':'
Assert 'autounattend.xml at ISO root' (Test-Path "$drive\autounattend.xml")
$wim = "$drive\sources\install.wim"
Assert 'sources\install.wim present' (Test-Path $wim)
if (Test-Path $wim) {
$idx = (Get-WindowsImage -ImagePath $wim | Where-Object ImageName -match 'IoT Enterprise LTSC' | Select-Object -First 1).ImageIndex
if (-not $idx) { $idx = 1 }
Mount-WindowsImage -ImagePath $wim -Index $idx -Path $mount -ReadOnly | Out-Null
try {
$sc = Join-Path $mount 'Windows\Setup\Scripts\SetupComplete.cmd'
Assert 'SetupComplete.cmd baked into WIM' (Test-Path $sc)
$mods = Get-ChildItem (Join-Path $mount 'Windows\Setup\Scripts\hardening') -Filter *.ps1 -EA SilentlyContinue
Assert 'hardening modules baked (>=9 .ps1)' ($mods.Count -ge 9)
Assert 'Verify script baked' (Test-Path (Join-Path $mount 'Windows\Setup\Scripts\hardening\Verify-SilverMetalWindows.ps1'))
# Welcome app payload assertions (skipped when Welcome is intentionally disabled).
if ($env:SILVERMETAL_WELCOME_ENABLED -ne '0') {
$welcomeExe = Join-Path $mount 'Program Files\SilverOS\Welcome\SilverOS.Welcome.App.exe'
Assert 'Welcome exe baked into WIM' (Test-Path $welcomeExe)
$welcomeFlavours = Get-ChildItem (Join-Path $mount 'Program Files\SilverOS\Welcome\flavours') -Filter '*.json' -EA SilentlyContinue
Assert 'Welcome flavours baked (>=1 .json)' ($welcomeFlavours.Count -ge 1)
}
} finally { Dismount-WindowsImage -Path $mount -Discard | Out-Null }
}
} finally { Dismount-DiskImage -ImagePath $IsoPath | Out-Null }
Write-Host "`n$($fail) assertion(s) failed."
exit $fail