| param ( | |
| [Parameter(Mandatory = $true)] | |
| [string] $Node, | |
| [Parameter(Mandatory = $true)] | |
| [string] $SessionId, | |
| [Parameter(Mandatory = $true)] | |
| [string] $FQDN | |
| ) | |
| function GetDirectUrlFromIp ($ip) { | |
| $ip_dash=$ip -replace "\.","-" | |
| $url="https://ip${ip_dash}-${SessionId}.direct.${FQDN}" | |
| return $url | |
| } | |
| function WaitForUrl ($url) { | |
| write-host $url | |
| do { | |
| try{ | |
| invoke-webrequest -UseBasicParsing -uri $url | Out-Null | |
| } catch {} | |
| $status = $? | |
| sleep 1 | |
| } until($status) | |
| } | |
| function GetNodeRoutableIp ($nodeName) { | |
| $JQFilter='.instances[] | select (.hostname == \"{0}\") | .routable_ip' -f $nodeName | |
| $rip = (invoke-webrequest -UseBasicParsing -uri "https://$FQDN/sessions/$SessionId").Content | jq -r $JQFilter | |
| IF([string]::IsNullOrEmpty($rip)) { | |
| Write-Host "Could not fetch IP for node $nodeName" | |
| exit 1 | |
| } | |
| return $rip | |
| } | |
| function Set-UseUnsafeHeaderParsing | |
| { | |
| param( | |
| [Parameter(Mandatory,ParameterSetName='Enable')] | |
| [switch]$Enable, | |
| [Parameter(Mandatory,ParameterSetName='Disable')] | |
| [switch]$Disable | |
| ) | |
| $ShouldEnable = $PSCmdlet.ParameterSetName -eq 'Enable' | |
| $netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection]) | |
| if($netAssembly) | |
| { | |
| $bindingFlags = [Reflection.BindingFlags] 'Static,GetProperty,NonPublic' | |
| $settingsType = $netAssembly.GetType('System.Net.Configuration.SettingsSectionInternal') | |
| $instance = $settingsType.InvokeMember('Section', $bindingFlags, $null, $null, @()) | |
| if($instance) | |
| { | |
| $bindingFlags = 'NonPublic','Instance' | |
| $useUnsafeHeaderParsingField = $settingsType.GetField('useUnsafeHeaderParsing', $bindingFlags) | |
| if($useUnsafeHeaderParsingField) | |
| { | |
| $useUnsafeHeaderParsingField.SetValue($instance, $ShouldEnable) | |
| } | |
| } | |
| } | |
| } | |
| $ProgressPreference = 'SilentlyContinue' | |
| $ErrorActionPreference = 'Stop' | |
| Set-UseUnsafeHeaderParsing -Enable | |
| Start-Transcript -path ("C:\{0}.log" -f $MyInvocation.MyCommand.Name) -append | |
| add-type @" | |
| using System.Net; | |
| using System.Security.Cryptography.X509Certificates; | |
| public class IDontCarePolicy : ICertificatePolicy { | |
| public IDontCarePolicy() {} | |
| public bool CheckValidationResult( | |
| ServicePoint sPoint, X509Certificate cert, | |
| WebRequest wRequest, int certProb) { | |
| return true; | |
| } | |
| } | |
| "@ | |
| [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 | |
| [System.Net.ServicePointManager]::CertificatePolicy = new-object IDontCarePolicy | |
| $dtr_ip = GetNodeRoutableIp $Node | |
| $dtr_url = GetDirectUrlFromIp $dtr_ip | |
| $dtr_hostname = $dtr_url -replace "https://","" | |
| WaitForUrl "${dtr_url}/ca" | |
| invoke-webrequest -UseBasicParsing -uri "$dtr_url/ca" -o c:\ca.crt | |
| $cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 c:\ca.crt | |
| $store = new-object System.Security.Cryptography.X509Certificates.X509Store('Root','localmachine') | |
| $store.Open('ReadWrite') | |
| $store.Add($cert) | |
| $store.Close() | |
| Stop-Transcript | |