17 lines
1.8 KiB
PowerShell
17 lines
1.8 KiB
PowerShell
$ErrorActionPreference = 'Stop'
|
|
$manifest = Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'manifest.json') | ConvertFrom-Json
|
|
$payloads = @()
|
|
foreach ($entry in $manifest.files) {
|
|
$copy = Join-Path $PSScriptRoot $entry.path
|
|
foreach ($path in @($entry.original,$copy)) {
|
|
if ((Get-Item -LiteralPath $path).Length -ne $entry.bytes -or (Get-FileHash -LiteralPath $path).Hash -ne $entry.original_sha256) { throw "Mismatch $path" }
|
|
}
|
|
$payloads += [pscustomobject]@{path=$entry.path;bytes=$entry.bytes;sha256=$entry.original_sha256;original_equal=$true}
|
|
}
|
|
$inventory = @(Get-ChildItem -LiteralPath $PSScriptRoot -Recurse -File | Where-Object {$_.FullName -ne (Join-Path $PSScriptRoot 'readback.json')} | Sort-Object FullName | ForEach-Object {[pscustomobject]@{path=$_.FullName.Substring($PSScriptRoot.Length+1).Replace('\','/');bytes=$_.Length;sha256=(Get-FileHash -LiteralPath $_.FullName).Hash}})
|
|
$expected = @($manifest.files.path) + @('README.md','archive.ps1','verify-readback.ps1','manifest.json')
|
|
if (Compare-Object ($expected|Sort-Object) ($inventory.path|Sort-Object)) { throw 'Archive inventory mismatch' }
|
|
$result = [ordered]@{checked_utc=[DateTime]::UtcNow.ToString('o');pass=$true;scope='Independent original/copy reads; exact final inventory excluding readback self-reference';manifest_sha256=(Get-FileHash -LiteralPath (Join-Path $PSScriptRoot 'manifest.json')).Hash;payload_count=$payloads.Count;payload_bytes=($payloads|Measure-Object bytes -Sum).Sum;payloads=$payloads;inventory=$inventory;final_file_count=$inventory.Count+1}
|
|
[IO.File]::WriteAllText((Join-Path $PSScriptRoot 'readback.json'),($result|ConvertTo-Json -Depth 6)+"`n",[Text.UTF8Encoding]::new($false))
|
|
[pscustomobject]$result | Select-Object pass,payload_count,payload_bytes,final_file_count,manifest_sha256 | ConvertTo-Json
|