NODEDC_PLATFORM/tools/dc-amd-pair/pair-dc-amd-proxy.ps1

72 lines
2.6 KiB
PowerShell

[CmdletBinding()]
param(
[string]$NasAddress = '172.22.0.222',
[int]$Port = 8790
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# Windows PowerShell 5.1 does not necessarily autoload this assembly, unlike
# newer PowerShell editions. Load it before resolving HttpClientHandler.
Add-Type -AssemblyName System.Net.Http
if ($Port -lt 1 -or $Port -gt 65535) {
throw "Port must be between 1 and 65535: $Port"
}
$null = [Net.IPAddress]::Parse($NasAddress)
$docker = (Get-Command docker -CommandType Application -ErrorAction Stop | Select-Object -First 1).Path
if ([string]::IsNullOrWhiteSpace($docker)) {
throw 'Docker CLI executable could not be resolved.'
}
# The token is read inside the already-running connector installation. It is
# never written to disk by this script and never printed to the console.
$token = $null
$body = $null
$handler = $null
$client = $null
$content = $null
$response = $null
try {
$token = (& $docker exec dc-amd-connector node -e "process.stdout.write(require('fs').readFileSync('/run/dc-amd-secrets/connector-access','utf8').trim())").Trim()
if ($LASTEXITCODE -ne 0) {
throw 'Unable to read the local connector access value. Check that dc-amd-connector is running.'
}
if ($token -notmatch '^[A-Za-z0-9_-]{48,256}$') {
throw 'The local connector access value has an invalid format.'
}
$body = '{"connectorAccessToken":"' + $token + '"}'
$handler = [System.Net.Http.HttpClientHandler]::new()
# Pair only with the NAS LAN address. Do not use a Windows or VPN proxy for
# this one-time local handoff.
$handler.UseProxy = $false
$client = [System.Net.Http.HttpClient]::new($handler)
$client.Timeout = [TimeSpan]::FromSeconds(20)
$content = [System.Net.Http.StringContent]::new($body, [System.Text.Encoding]::UTF8, 'application/json')
$response = $client.PostAsync("http://$NasAddress`:$Port/api/pair", $content).GetAwaiter().GetResult()
$responseBody = $response.Content.ReadAsStringAsync().GetAwaiter().GetResult()
if ([int]$response.StatusCode -ne 201) {
throw "NAS pairing was rejected (HTTP $([int]$response.StatusCode))."
}
$result = $responseBody | ConvertFrom-Json
if ($result.ok -ne $true -or $result.state -ne 'paired') {
throw 'NAS pairing returned an unexpected result.'
}
Write-Host 'AMD connector paired with NAS. No secret value was displayed.'
}
finally {
if ($response) { $response.Dispose() }
if ($content) { $content.Dispose() }
if ($client) { $client.Dispose() }
if ($handler) { $handler.Dispose() }
$body = $null
$token = $null
Remove-Variable -Name body -ErrorAction SilentlyContinue
Remove-Variable -Name token -ErrorAction SilentlyContinue
}