wins/install.ps1

673 lines
26 KiB
PowerShell

<#
.SYNOPSIS
Installs Rancher Wins to create Windows Worker Nodes.
.DESCRIPTION
Run the script to install all Rancher Wins related needs.
.NOTES
Environment variables:
System Agent Variables
- CATTLE_AGENT_LOGLEVEL (default: debug)
- CATTLE_AGENT_CONFIG_DIR (default: C:/etc/rancher/agent)
- CATTLE_AGENT_VAR_DIR (default: C:/var/lib/rancher/agent)
Rancher 2.6+ Variables
- CATTLE_SERVER
- CATTLE_TOKEN
- CATTLE_CA_CHECKSUM
- CATTLE_ROLE_CONTROLPLANE=false
- CATTLE_ROLE_ETCD=false
- CATTLE_ROLE_WORKER=false
- CATTLE_LABELS
- CATTLE_TAINTS
Advanced Environment Variables
- CATTLE_AGENT_BINARY_URL (default: latest GitHub release)
- CATTLE_PRESERVE_WORKDIR (default: false)
- CATTLE_REMOTE_ENABLED (default: true)
- CATTLE_ID (default: autogenerate)
- CATTLE_AGENT_BINARY_LOCAL (default: false)
- CATTLE_AGENT_BINARY_LOCAL_LOCATION (default: )
- CSI_PROXY_URL (default: )
- CSI_PROXY_VERSION (default: )
- CSI_PROXY_KUBELET_PATH (default: )
.EXAMPLE
#>
#Make sure this params matches the CmdletBinding below
param (
[Parameter()]
[String]
$Address,
[Parameter()]
[String]
$CaChecksum,
[Parameter()]
[String]
$InternalAddress,
[Parameter()]
[String]
$Label,
[Parameter()]
[String]
$NodeName,
[Parameter()]
[String]
$Server,
[Parameter()]
[String]
$Taint,
[Parameter()]
[String]
$Token,
[Parameter()]
[Switch]
$Worker
)
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
$FALLBACK = "v0.3.0"
function Invoke-WinsInstaller {
[CmdletBinding()]
param (
[Parameter()]
[String]
$Address,
[Parameter()]
[String]
$CaChecksum,
[Parameter()]
[String]
$InternalAddress,
[Parameter()]
[String]
$Label,
[Parameter()]
[String]
$NodeName,
[Parameter()]
[String]
$Server,
[Parameter()]
[String]
$Taint,
[Parameter()]
[String]
$Token,
[Parameter()]
[Switch]
$Worker
)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
function Write-LogInfo {
Write-Host -NoNewline -ForegroundColor Blue "INFO: "
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
}
function Write-LogWarn {
Write-Host -NoNewline -ForegroundColor DarkYellow "WARN: "
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
}
function Write-LogError {
Write-Host -NoNewline -ForegroundColor DarkRed "ERROR: "
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
}
function Write-LogFatal {
Write-Host -NoNewline -ForegroundColor DarkRed "FATA: "
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
exit 255
}
function Get-StringHash {
[CmdletBinding()]
param (
[Parameter()]
[string]
$Value
)
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write($Value)
$writer.Flush()
$stringAsStream.Position = 0
return (Get-FileHash -InputStream $stringAsStream -Algorithm SHA256).Hash.ToLower()
}
function Get-Args {
if ($Address) {
$env:CATTLE_ADDRESS = $Address
}
if ($CaChecksum) {
$env:CATTLE_CA_CHECKSUM = $CaChecksum
}
if ($InternalAddress) {
$env:CATTLE_INTERNAL_ADDRESS = $InternalAddress
}
if ($Label) {
if ($env:CATTLE_LABELS) {
$env:CATTLE_LABELS += ",$Label"
}
else {
$env:CATTLE_LABELS = $Label
}
}
if ($NodeName) {
$env:CATTLE_NODE_NAME = $NodeName
}
if ($Server) {
$env:CATTLE_SERVER = $Server
}
if ($Taint) {
if ($env:CATTLE_TAINTS) {
$env:CATTLE_TAINTS += ",$Taint"
}
else {
$env:CATTLE_TAINTS = $Taint
}
}
if ($Token) {
$env:CATTLE_TOKEN = $Token
}
if ($Worker) {
$env:CATTLE_ROLE_WORKER = "true"
}
}
function Set-Path {
$env:PATH += ";C:\var\lib\rancher\rke2\bin;C:\usr\local\bin"
$environment = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
$environment = $environment.Insert($environment.Length, ";C:\var\lib\rancher\rke2\bin;C:\usr\local\bin")
[System.Environment]::SetEnvironmentVariable("Path", $environment, "Machine")
}
function Set-Environment {
$env:CURL_CAFLAG = "--ssl-no-revoke"
if (-Not $env:CATTLE_ROLE_CONTROLPLANE) {
$env:CATTLE_ROLE_CONTROLPLANE = "false"
}
if (-Not $env:CATTLE_ROLE_ETCD) {
$env:CATTLE_ROLE_ETCD = "false"
}
if (-Not $env:CATTLE_ROLE_WORKER) {
$env:CATTLE_ROLE_WORKER = "false"
}
if (-Not $env:CATTLE_REMOTE_ENABLED) {
$env:CATTLE_REMOTE_ENABLED = "true"
}
else {
$env:CATTLE_REMOTE_ENABLED = $env:CATTLE_REMOTE_ENABLED.ToLower()
}
if (-Not $env:CATTLE_PRESERVE_WORKDIR) {
$env:CATTLE_PRESERVE_WORKDIR = "false"
}
else {
$env:CATTLE_PRESERVE_WORKDIR = $env:CATTLE_PRESERVE_WORKDIR.ToLower()
}
if (-Not $env:CATTLE_AGENT_LOGLEVEL) {
$env:CATTLE_AGENT_LOGLEVEL = "debug"
}
else {
$env:CATTLE_AGENT_LOGLEVEL = $env:CATTLE_AGENT_LOGLEVEL.ToLower()
}
if ($env:CATTLE_AGENT_BINARY_LOCAL -eq "true") {
if (-Not $env:CATTLE_AGENT_BINARY_LOCAL_LOCATION) {
Write-LogFatal "No local binary location was specified"
}
$env:BINARY_SOURCE = "local"
}
else {
$env:BINARY_SOURCE = "remote"
if (-Not $env:CATTLE_AGENT_BINARY_URL -and $env:CATTLE_AGENT_BINARY_BASE_URL) {
$env:CATTLE_AGENT_BINARY_URL = "$env:CATTLE_AGENT_BINARY_BASE_URL/wins.exe"
}
if (-Not $env:CATTLE_AGENT_BINARY_URL) {
$rateLimit = $(curl.exe --connect-timeout 60 --max-time 300 $env:CURL_CAFLAG -sfL "https://api.github.com/rate_limit") | ConvertFrom-Json
if ($rateLimit.rate.remaining -eq 0) {
Write-LogInfo "Error contacting GitHub to retrieve the latest version, falling back to version: $FALLBACK"
$env:VERSION = $FALLBACK
}
else {
try {
$env:VERSION = $(curl.exe --connect-timeout 60 $env:CURL_CAFLAG -sfL "https://api.github.com/repos/rancher/wins/releases/latest" | ConvertFrom-Json).tag_name
}
catch {
Write-LogInfo "Error contacting GitHub to retrieve the latest version, falling back to version: $FALLBACK"
$env:VERSION = $FALLBACK
}
}
$env:CATTLE_AGENT_BINARY_URL = "https://github.com/rancher/wins/releases/download/$env:VERSION/wins.exe"
$env:BINARY_SOURCE = "upstream"
}
}
if ($env:CATTLE_REMOTE_ENABLED -eq "true") {
if (-Not $env:CATTLE_TOKEN) {
Write-LogFatal "Environment variable CATTLE_TOKEN was not set. Will not retrieve a remote connection configuration from Rancher2"
}
if (-Not $env:CATTLE_SERVER) {
Write-LogFatal "Environment variable CATTLE_SERVER was not set"
}
}
if (-Not $env:CATTLE_AGENT_CONFIG_DIR) {
$env:CATTLE_AGENT_CONFIG_DIR = "C:/etc/rancher/wins"
Write-LogInfo "Using default agent configuration directory $( $env:CATTLE_AGENT_CONFIG_DIR )"
}
if (-Not (Test-Path $env:CATTLE_AGENT_CONFIG_DIR)) {
New-Item -Path $env:CATTLE_AGENT_CONFIG_DIR -ItemType Directory -Force | Out-Null
}
# copy powershell for wins
Copy-Item $($(Get-Command powershell).Source) "$env:CATTLE_AGENT_CONFIG_DIR/powershell.exe"
if (-Not $env:CATTLE_AGENT_VAR_DIR) {
$env:CATTLE_AGENT_VAR_DIR = "C:/var/lib/rancher/agent"
Write-LogInfo "Using default agent var directory $( $env:CATTLE_AGENT_VAR_DIR )"
}
if (-Not (Test-Path $env:CATTLE_AGENT_VAR_DIR)) {
New-Item -Path $env:CATTLE_AGENT_VAR_DIR -ItemType Directory -Force | Out-Null
}
if (-Not $env:CATTLE_AGENT_BIN_PREFIX) {
$env:CATTLE_AGENT_BIN_PREFIX = "c:/usr/local"
}
if (-Not (Test-Path $env:CATTLE_AGENT_BIN_PREFIX)) {
New-Item -Path $env:CATTLE_AGENT_BIN_PREFIX -ItemType Directory -Force | Out-Null
}
$env:CATTLE_ADDRESS = Get-Address -Value $env:CATTLE_ADDRESS
$env:CATTLE_INTERNAL_ADDRESS = Get-Address -Value $env:CATTLE_INTERNAL_ADDRESS
}
function Test-Architecture() {
if ($env:PROCESSOR_ARCHITECTURE -ne "AMD64") {
Write-LogFatal "Unsupported architecture $( $env:PROCESSOR_ARCHITECTUR )"
}
}
function Invoke-WinsAgentDownload() {
if (-Not (Test-Path "$env:CATTLE_AGENT_BIN_PREFIX/bin")) {
New-Item -Path "$env:CATTLE_AGENT_BIN_PREFIX/bin" -ItemType Directory -Force | Out-Null
}
if ($env:CATTLE_AGENT_BINARY_LOCAL -eq "true") {
Write-LogInfo "Using local Wins installer from $($env:CATTLE_AGENT_BINARY_LOCAL_LOCATION)"
Copy-Item -Path $env:CATTLE_AGENT_BINARY_LOCAL_LOCATION -Destination "$env:CATTLE_AGENT_BIN_PREFIX/bin/wins.exe"
}
else {
Write-LogInfo "Downloading Wins from $($env:CATTLE_AGENT_BINARY_URL)"
if ($env:BINARY_SOURCE -ne "upstream") {
$env:CURL_BIN_CAFLAG = $env:CURL_CAFLAG
}
else {
$env:CURL_BIN_CAFLAG = ""
}
$retries = 0
while ($retries -lt 6) {
$responseCode = $(curl.exe --connect-timeout 60 --max-time 300 --write-out "%{http_code}\n" $env:CURL_BIN_CAFLAG -sfL "$($env:CATTLE_AGENT_BINARY_URL)" -o "$env:CATTLE_AGENT_BIN_PREFIX/bin/wins.exe")
switch ( $responseCode ) {
{ "ok200", 200 } {
Write-LogInfo "Successfully downloaded the wins binary."
$retries = 99
break
}
default {
Write-LogError "$responseCode received while downloading the wins binary. Sleeping for 5 seconds and trying again."
Start-Sleep -Seconds 5
$retries++
continue
}
}
}
}
if (-Not (Test-Path "$env:CATTLE_AGENT_BIN_PREFIX/bin/wins.exe")) {
Write-LogFatal "Wins.exe doesn't appear to have been installed."
}
}
function Test-CaCheckSum() {
$caCertsPath = "cacerts"
$env:RANCHER_CERT = Join-Path -Path $env:CATTLE_AGENT_CONFIG_DIR -ChildPath "ranchercert"
if (-Not $env:CATTLE_CA_CHECKSUM) {
return
}
curl.exe --insecure -sfL $env:CATTLE_SERVER/$caCertsPath -o $env:RANCHER_CERT
if (-Not(Test-Path -Path $env:RANCHER_CERT)) {
Write-Error "The environment variable CATTLE_CA_CHECKSUM is set but there is no CA certificate configured at $( $env:CATTLE_SERVER )/$( $caCertsPath )) "
exit 1
}
if ($LASTEXITCODE -ne 0) {
Write-Error "Value from $( $env:CATTLE_SERVER )/$( $caCertsPath ) does not look like an x509 certificate, exited with $( $LASTEXITCODE ) "
Write-Error "Retrieved cacerts:"
Get-Content $env:RANCHER_CERT
exit 1
}
else {
Write-LogInfo "Value from $( $env:CATTLE_SERVER )/$( $caCertsPath ) is an x509 certificate"
}
$env:CATTLE_SERVER_CHECKSUM = (Get-FileHash -Path $env:RANCHER_CERT -Algorithm SHA256).Hash.ToLower()
if ($env:CATTLE_SERVER_CHECKSUM -ne $env:CATTLE_CA_CHECKSUM) {
Remove-Item -Path $env:RANCHER_CERT -Force
Write-LogError "Configured cacerts checksum $( $env:CATTLE_SERVER_CHECKSUM ) does not match given -CaCheckSum $( $env:CATTLE_CA_CHECKSUM ) "
Write-LogError "Please check if the correct certificate is configured at $( $env:CATTLE_SERVER )/$( $caCertsPath ) ."
exit 1
}
Import-Certificate -FilePath $env:RANCHER_CERT -CertStoreLocation Cert:\LocalMachine\Root | Out-Null
}
function Test-RancherConnection {
$env:RANCHER_SUCCESS = $false
if ($env:CATTLE_SERVER -and ($env:CATTLE_REMOTE_ENABLED -eq "true")) {
$retries = 0
while ($retries -lt 6) {
$responseCode = $(curl.exe --connect-timeout 60 --max-time 60 --write-out "%{http_code}\n" $env:CURL_CAFLAG -sfL "$env:CATTLE_SERVER/healthz")
switch ( $responseCode ) {
{ $_ -in "ok200", 200 } {
Write-LogInfo "Successfully tested Rancher connection."
$env:RANCHER_SUCCESS = $true
$retries = 99
break
}
default {
Write-LogError "$responseCode received while testing Rancher connection. Sleeping for 5 seconds and trying again."
Start-Sleep -Seconds 5
$retries++
continue
}
}
}
if (!$env:RANCHER_SUCCESS) {
Write-LogFatal "Error connecting to Rancher. Perhaps -CaCheckSum needs to be set?"
}
}
}
function Test-CaRequired {
$env:CA_REQUIRED = $false
if ($env:CATTLE_SERVER -and ($env:CATTLE_REMOTE_ENABLED -eq "true")) {
$retries = 0
while ($retries -lt 6) {
curl.exe --connect-timeout 60 --max-time 60 -sfL "$env:CATTLE_SERVER/healthz"
switch ($LASTEXITCODE) {
0 {
Write-LogInfo "Determined CA is not necessary to connect to Rancher."
$env:CATTLE_CA_CHECKSUM = ""
$retries = 99
break
}
{ $_ -in 60, 77 } {
Write-LogInfo "Determined CA is necessary to connect to Rancher."
$env:CA_REQUIRED = $true
$retries = 99
break
}
default {
Write-LogError "Error while connecting to Rancher to verify CA necessity. Sleeping for 5 seconds and trying again."
Start-Sleep -Seconds 5
$retries++
continue
}
}
}
}
}
function Get-RancherConnectionInfo() {
if ($env:CATTLE_REMOTE_ENABLED -eq "true") {
$retries = 0
while ($retries -lt 6) {
$responseCode = $(curl.exe --connect-timeout 60 --max-time 60 --write-out "%{http_code}\n" $env:CURL_CAFLAG -sfL "$env:CATTLE_SERVER/v3/connect/agent" -o $env:CATTLE_AGENT_VAR_DIR/rancher2_connection_info.json -H "Authorization: Bearer $($env:CATTLE_TOKEN)" -H "X-Cattle-Id: $($env:CATTLE_ID)" -H "X-Cattle-Role-Worker: $($env:CATTLE_ROLE_WORKER)" -H "X-Cattle-Labels: $($env:CATTLE_LABELS)" -H "X-Cattle-Taints: $($env:CATTLE_TAINTS)" -H "X-Cattle-Address: $($env:CATTLE_ADDRESS)" -H "X-Cattle-Internal-Address: $($env:CATTLE_INTERNAL_ADDRESS)" -H "Content-Type: application/json")
switch ( $responseCode ) {
{ $_ -in "ok200", 200 } {
Write-LogInfo "Successfully downloaded Rancher connection information."
$retries = 99
break
}
default {
Write-LogError "$responseCode received while downloading Rancher connection information. Sleeping for 5 seconds and trying again."
Start-Sleep -Seconds 5
$retries++
continue
}
}
}
}
}
function Set-WinsConfig() {
$winsConfig =
@"
white_list:
processPaths:
- $($env:CATTLE_AGENT_CONFIG_DIR)/powershell.exe
- $($env:CATTLE_AGENT_CONFIG_DIR)/wins-upgrade.exe
- C:/etc/wmi-exporter/wmi-exporter.exe
- C:/etc/windows-exporter/windows-exporter.exe
proxyPorts:
- 9796
"@
Add-Content -Path $env:CATTLE_AGENT_CONFIG_DIR/config -Value $winsConfig
$agentConfig =
@"
systemagent:
workDirectory: $($env:CATTLE_AGENT_VAR_DIR)/work
appliedPlanDirectory: $($env:CATTLE_AGENT_VAR_DIR)/applied
remoteEnabled: $($env:CATTLE_REMOTE_ENABLED)
preserveWorkDirectory: $($env:CATTLE_PRESERVE_WORKDIR)
"@
Add-Content -Path $env:CATTLE_AGENT_CONFIG_DIR/config -Value $agentConfig
if ($env:CATTLE_REMOTE_ENABLED -eq "true") {
Add-Content -Path $env:CATTLE_AGENT_CONFIG_DIR/config -Value " connectionInfoFile: $env:CATTLE_AGENT_VAR_DIR/rancher2_connection_info.json"
}
if ((Test-Path -Path $env:RANCHER_CERT) -and ($env:CA_REQUIRED -eq "true")) {
$tlsConfig =
@"
tls-config:
certFilePath: $($($env:RANCHER_CERT).Replace("\\","/"))
"@
Add-Content -Path $env:CATTLE_AGENT_CONFIG_DIR/config -Value $tlsConfig
}
}
function Set-CsiProxyConfig() {
$proxyConfig =
@"
csi-proxy:
url: $($env:CSI_PROXY_URL)
version: $($env:CSI_PROXY_VERSION)
kubeletPath: $($env:CSI_PROXY_KUBELET_PATH)
"@
Add-Content -Path $env:CATTLE_AGENT_CONFIG_DIR/config -Value $proxyConfig
}
function Stop-Agent() {
[CmdletBinding()]
param (
[Parameter()]
[string]
$ServiceName
)
Write-LogInfo "Checking if $ServiceName service exists"
if ((Get-Service -Name $ServiceName -ErrorAction SilentlyContinue)) {
Write-LogInfo "$ServiceName service found, stopping now"
Stop-Service -Name $ServiceName
while ((Get-Service -Name $ServiceName).Status -ne 'Stopped') {
Write-LogInfo "Waiting for $ServiceName service to stop"
Start-Sleep -s 5
}
}
else {
Write-LogInfo "$ServiceName isn't installed, continuing"
}
}
function New-CattleId() {
if (-Not $env:CATTLE_ID) {
Write-LogInfo "Generating Cattle ID"
if (Test-Path -Path "$($env:CATTLE_AGENT_CONFIG_DIR)/cattle-id") {
$env:CATTLE_ID = Get-Content -Path "$($env:CATTLE_AGENT_CONFIG_DIR)/cattle-id"
Write-LogInfo "Cattle ID was already detected as $($env:CATTLE_ID). Not generating a new one."
return
}
$stream = [IO.MemoryStream]::new([Text.Encoding]::UTF8.GetBytes($env:COMPUTERNAME))
$env:CATTLE_ID = (Get-FileHash -InputStream $stream -Algorithm SHA256).Hash.ToLower().Substring(0, 62)
Set-Content -Path "$($env:CATTLE_AGENT_CONFIG_DIR)/cattle-id" -Value $env:CATTLE_ID
return
}
Write-LogInfo "Not generating Cattle ID"
}
function Get-Address() {
[CmdletBinding()]
param (
[Parameter()]
[String]
$Value
)
if (!$Value) {
# If nothing is given, return empty (it will be automatically determined later if empty)
return ""
}
# If given address is a network interface on the system, retrieve configured IP on that interface (only the first configured IP is taken)
elseif (Get-NetAdapter -Name $Value -ErrorAction SilentlyContinue) {
return $(Get-NetIpConfiguration | Where-Object { $null -ne $_.IPv4DefaultGateway -and $_.NetAdapter.Status -ne "Disconnected" }).IPv4Address.IPAddress
}
# Loop through cloud provider options to get IP from metadata, if not found return given value
else {
switch ($Value) {
awslocal { return curl.exe --connect-timeout 60 --max-time 60 -s http://169.254.169.254/latest/meta-data/local-ipv4 }
awspublic { return curl.exe --connect-timeout 60 --max-time 60 -s http://169.254.169.254/latest/meta-data/public-ipv4 }
doprivate { return curl.exe --connect-timeout 60 --max-time 60 -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address }
dopublic { return curl.exe --connect-timeout 60 --max-time 60 -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address }
azprivate { return curl.exe --connect-timeout 60 --max-time 60 -s -H Metadata:true "http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/privateIpAddress?api-version=2017-08-01&format=text" }
azpublic { return curl.exe --connect-timeout 60 --max-time 60 -s -H Metadata:true "http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-08-01&format=text" }
gceinternal { return curl.exe --connect-timeout 60 --max-time 60 -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip }
gceexternal { return curl.exe --connect-timeout 60 --max-time 60 -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip }
packetlocal { return curl.exe --connect-timeout 60 --max-time 60 -s https://metadata.packet.net/2009-04-04/meta-data/local-ipv4 }
packetpublic { return curl.exe --connect-timeout 60 --max-time 60 -s https://metadata.packet.net/2009-04-04/meta-data/public-ipv4 }
ipify { return curl.exe --connect-timeout 60 --max-time 60 -s https://api.ipify.org }
default {
return $Value
}
}
}
}
function Copy-WinsForCharts() {
$winsForChartsPath = "c:/windows"
if (-Not (Test-Path $winsForChartsPath)) {
New-Item $winsForChartsPath -ItemType Directory
}
Copy-Item -Path "$env:CATTLE_AGENT_BIN_PREFIX/bin/wins.exe" -Destination "$winsForChartsPath/wins.exe" -Force
}
function Confirm-WindowsFeatures {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[String[]]
$RequiredFeatures
)
foreach ($feature in $RequiredFeatures) {
$f = Get-WindowsFeature -Name $feature
if (-not $f.Installed) {
Write-LogFatal "Windows feature: '$feature' is not installed. Please run: Install-WindowsFeature -Name $feature"
}
else {
Write-LogInfo "Windows feature: '$feature' is installed. Installation will proceed."
}
}
}
function Invoke-WinsAgentInstall() {
$serviceName = "rancher-wins"
Get-Args
Set-Environment
Set-Path
Test-CaCheckSum
if ($env:CATTLE_CA_CHECKSUM) {
Test-CaRequired
}
Test-RancherConnection
Stop-Agent -ServiceName $serviceName
Invoke-WinsAgentDownload
Copy-WinsForCharts
Set-WinsConfig
if($env:CSI_PROXY_URL -and $env:CSI_PROXY_VERSION -and $env:CSI_PROXY_KUBELET_PATH) {
Set-CsiProxyConfig
}
if ($env:CATTLE_TOKEN) {
New-CattleId
Get-RancherConnectionInfo
}
$newEnv = @()
$PROXY_ENV_INFO = Get-ChildItem env: | Where-Object { $_.Name -Match "^(NO|HTTP|HTTPS)_PROXY" } | ForEach-Object { "$($_.Name)=$($_.Value)" }
if ($PROXY_ENV_INFO) {
netsh winhttp set proxy $env:HTTPS_PROXY
Set-ItemProperty -path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ProxyEnable -value 1
Set-ItemProperty -path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ProxyServer -value "https=$env:HTTPS_PROXY;http=$env:HTTP_PROXY"
Set-ItemProperty -path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ProxyOverride -value $env:NO_PROXY.Replace(',',';')
$newEnv += $PROXY_ENV_INFO
if(Test-Path -Path HKLM:SYSTEM\CurrentControlSet\Services\$serviceName) {
Set-ItemProperty HKLM:SYSTEM\CurrentControlSet\Services\$serviceName -Name Environment -Value $([string]$newEnv)
}
else {
New-Item HKLM:SYSTEM\CurrentControlSet\Services\$serviceName
New-ItemProperty HKLM:SYSTEM\CurrentControlSet\Services\$serviceName -Name Environment -PropertyType MultiString -Value $([string]$newEnv)
}
}
try {
Write-LogInfo "Checking if $serviceName service exists."
Get-Service -Name $serviceName
}
catch {
Write-LogInfo "$serviceName service not found, enabling agent service."
Push-Location c:\usr\local\bin
wins.exe srv app run --register
Pop-Location
Start-Sleep -s 5
}
Write-LogInfo "Starting $serviceName service."
Start-Service -Name $serviceName
while ((Get-Service $serviceName).Status -ne 'Running') {
Write-LogInfo "Waiting for $serviceName service to start."
Start-Sleep -s 5
}
}
Confirm-WindowsFeatures -RequiredFeatures @("Containers")
Invoke-WinsAgentInstall
}