Files
pxe-server/playbook/winpe-status-push.ps1
cproudlock d8c64bef2b Add conditional BIOS-update sub-stage on idx=1
winpe-status-push.ps1 now accepts -CurrentStage / -StageIndex
params so callers can override the default "WinPE: PESetup / WIM
apply" string. Backwards compatible.

startnet.cmd: after the existing initial WinPE status push,
inspect $BIOS_STATUS for the "->" marker that check-bios.cmd
writes when an update was actually applied or staged. If present,
fire a second idx=1 push with stage="WinPE: BIOS firmware update -
<status>". No-op for clean "up to date" / "no update in catalog"
runs.

imaging.html: at stage_idx=1 with "bios" in current_stage, swap
friendly label to "Updating BIOS firmware" with a do-NOT-power-off
hint. Bays without firmware updates show the default "Booting from
PXE" label as before.

boot.wim startnet.cmd updated via wimupdate so live PXE clients
pick it up at next boot.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:26:31 -04:00

78 lines
2.5 KiB
PowerShell

# winpe-status-push.ps1 - Posts "WinPE: PESetup / WIM apply" status to the
# PXE webapp /imaging/status endpoint so the imaging dashboard reflects
# this bay BEFORE Run-ShopfloorSetup.ps1 takes over post-PPKG.
#
# Runs in WinPE's stripped PowerShell - cannot rely on Get-NetAdapter,
# Get-CimInstance, or the NetTCPIP module (none are present in stock
# WinPE). Uses wmic for both serial and MAC.
#
# Best-effort: never blocks imaging. All steps log to
# X:\Windows\Temp\winpe-status-push.log; failures are swallowed.
param(
[string]$PxeServer = '172.16.9.1',
[int]$Port = 9009,
[int]$TimeoutSec = 5,
[string]$PCType = $env:PCTYPE,
[string]$CurrentStage = 'WinPE: PESetup / WIM apply',
[int]$StageIndex = 1
)
$logFile = 'X:\Windows\Temp\winpe-status-push.log'
function Log {
param([string]$msg)
try { "$(Get-Date -Format s) $msg" | Out-File -FilePath $logFile -Append -Encoding utf8 } catch { }
}
Log "=== winpe-status-push start ==="
Log "server=${PxeServer}:${Port} pctype=$PCType"
# Serial via wmic. Always available in WinPE 10+.
$serial = ''
try {
$line = (& wmic bios get serialnumber /value 2>$null | Where-Object { $_ -match '=' } | Select-Object -First 1)
if ($line) { $serial = ($line -split '=', 2)[1].Trim() }
} catch { Log "serial wmic exception: $_" }
Log "serial=$serial"
# MAC via wmic NIC enumeration. NetEnabled filter restricts to up adapters.
$mac = ''
try {
$macLines = & wmic nic where 'NetEnabled=TRUE' get MacAddress /value 2>$null |
Where-Object { $_ -match 'MacAddress=' }
if ($macLines) {
$first = ($macLines | Select-Object -First 1)
$mac = (($first -split '=', 2)[1]).Trim() -replace '-', ':'
}
} catch { Log "mac wmic exception: $_" }
Log "mac=$mac"
if (-not $serial) {
Log "no serial captured - aborting POST"
exit 0
}
# Compose JSON. ConvertTo-Json works in WinPE.
$payload = @{
serial = $serial
pctype = $PCType
current_stage = $CurrentStage
stage_index = $StageIndex
stage_total = 8
status = 'in_progress'
}
if ($mac) { $payload.mac = $mac }
$body = $payload | ConvertTo-Json -Compress
$uri = "http://${PxeServer}:${Port}/imaging/status"
Log "POST $uri body=$body"
try {
$resp = Invoke-WebRequest -Uri $uri -Method POST -Body $body `
-ContentType 'application/json' -UseBasicParsing -TimeoutSec $TimeoutSec -ErrorAction Stop
Log "OK http=$($resp.StatusCode)"
} catch {
Log "ERR $($_.Exception.Message)"
}
exit 0