# Copyright 2019-2022 ActiveState Software Inc. All rights reserved. <# .EXAMPLE install.ps1 -b branchToInstall #> Set-StrictMode -Off # URL to fetch update infos from. $script:BASEINFOURL = "https://platform.activestate.com/sv/state-update/api/v1/info" # URL to fetch installer archive from $script:BASEFILEURL = "https://state-tool.s3.amazonaws.com/update/state" # The name of the remove archive to download $script:ARCHIVENAME = "state-installer.zip" # Name of the installer executable to ultimately use $script:INSTALLERNAME = "state-install\\state-installer.exe" # Channel the installer will target $script:CHANNEL = "release" # The version to install (autodetermined to be the latest if left unspecified) $script:VERSION = "" $script:SESSION_TOKEN_VERIFY = -join ("{", "TOKEN", "}") $script:SESSION_TOKEN = "pdli01" $script:SESSION_TOKEN_VALUE = "" if ("$SESSION_TOKEN" -ne "$SESSION_TOKEN_VERIFY") { $script:SESSION_TOKEN_VALUE = $script:SESSION_TOKEN } function getopt([string] $opt, [string] $default, [string[]] $arr) { for ($i = 0; $i -le $arr.Length; $i++) { $arg = $arr[$i] if ($arg -eq $opt -and $arr.Length -ge ($i + 2)) { return $arr[$i + 1] } } return $default } $script:CHANNEL = getopt "-b" $script:CHANNEL $args $script:VERSION = getopt "-v" $script:VERSION $args function download([string] $url, [string] $out) { [int]$Retrycount = "0" do { try { $downloader = new-object System.Net.WebClient if ($out -eq "") { return $downloader.DownloadString($url) } else { return $downloader.DownloadFile($url, $out) } } catch { if ($Retrycount -gt 5) { Write-Error "Could not download after 5 retries." throw $_ } else { Write-Host "Could not download, retrying..." Write-Host $_ $Retrycount = $Retrycount + 1 } } } While ($true) } function tempDir() { $parent = [System.IO.Path]::GetTempPath() [string]$name = [System.Guid]::NewGuid() New-Item -ItemType Directory -Path (Join-Path $parent $name) } function progress([string] $msg) { Write-Host "• $msg..." -NoNewline } function progress_done() { $greenCheck = @{ Object = [Char]8730 ForegroundColor = 'Green' NoNewLine = $true } Write-Host @greenCheck Write-Host ' Done' -ForegroundColor Green } function progress_fail() { Write-Host 'x Failed' -ForegroundColor Red } function error([string] $msg) { Write-Host $msg -ForegroundColor Red } if (!$script:VERSION) { # Determine the latest version to fetch and parse info. $jsonURL = "$script:BASEINFOURL/?channel=$script:CHANNEL&platform=windows&source=install" $infoJson = ConvertFrom-Json -InputObject (download $jsonURL) $version = $infoJson.Version $checksum = $infoJson.Sha256 $relUrl = $infoJson.Path } else { $relUrl = "$script:CHANNEL/$script:VERSION/windows-amd64/state-windows-amd64-$script:VERSION.zip" } # Fetch the requested or latest version. progress "Preparing Installer for State Tool Package Manager version $version" $zipURL = "$script:BASEFILEURL/$relUrl" $tmpParentPath = tempDir $zipPath = Join-Path $tmpParentPath $script:ARCHIVENAME $exePath = Join-Path $tmpParentPath $script:INSTALLERNAME try { download $zipURL $zipPath } catch [System.Exception] { progress_fail Write-Error "Could not download $zipURL to $zipPath." Write-Error $_.Exception.Message exit 1 } # Verify checksum if possible. $hash = (Get-FileHash -Path $zipPath -Algorithm SHA256).Hash if ($checksum -and $hash -ne $checksum) { Write-Warning "SHA256 sum did not match:" Write-Warning "Expected: $checksum" Write-Warning "Received: $hash" Write-Warning "Aborting installation" exit 1 } # Extract it. try { Expand-Archive -ErrorAction Stop -LiteralPath $zipPath -DestinationPath $tmpParentPath } catch { progress_fail Write-Error $_.Exception.Message exit 1 } progress_done Write-Host "" $OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 $PSDefaultParameterValues['*:Encoding'] = 'utf8' [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 # Run the installer. $env:ACTIVESTATE_SESSION_TOKEN = $script:SESSION_TOKEN_VALUE & $exePath $args --source-installer="install.ps1" $success = $? if (Test-Path env:ACTIVESTATE_SESSION_TOKEN) { Remove-Item Env:\ACTIVESTATE_SESSION_TOKEN } if ( !$success ) { exit 1 } # SIG # Begin signature block # MIIOGgYJKoZIhvcNAQcCoIIOCzCCDgcCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUlSoLKi4PYpHV+yPVb6f7iq5B # 9x2gggtRMIIFVDCCBDygAwIBAgIRAI+/xW/5m0RjSTHEdvWZn3swDQYJKoZIhvcN # AQELBQAwfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl # cjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQw # IgYDVQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwHhcNMjAxMDAxMDAw # MDAwWhcNMjIxMDAxMjM1OTU5WjCBujELMAkGA1UEBhMCQ0ExDzANBgNVBBEMBlY2 # RTJLMzEZMBcGA1UECAwQQnJpdGlzaCBDb2x1bWJpYTESMBAGA1UEBwwJVmFuY291 # dmVyMSUwIwYDVQQJDBwxMTc3IEhhc3RpbmdzIFN0IFcgVW5pdCAxMDAwMSEwHwYD # VQQKDBhBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMxITAfBgNVBAMMGEFjdGl2ZVN0 # YXRlIFNvZnR3YXJlIEluYzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB # AKJ1fz+Zf9YDjH1+cvShqe6dLasMpZwekPfQqK8T3q95Y5E1qPRIc1OZcDXuG103 # 5ngZfgL8rwSCqQck+unE3TjNzAK+ShnhD0txkz4cGTbw1CJ/EI/QhBwLv4Sf/Jbs # B4wAsocaUUzUqqkMwkzJPhBQvVhYEHSil2vRZZMOM9MfBmKrdITz5pDF3dSPDTBj # B33VvBJks9IDnFQGBVy01aB8H7BRu63/DqAFpSJJctP6HAzgfnkj9pd4A2JDPu/6 # 2P0gHBrt24OKxsBLR0LEWIW/yA4KtHi14nWDQUdnEHHDt7H5fqPwwYzSYi+5XtAk # e2dagFmEDPHRmCCKtmu+m1UCAwEAAaOCAZAwggGMMB8GA1UdIwQYMBaAFA7hOqhT # OjHVir7Bu61nGgOFrTQOMB0GA1UdDgQWBBTo1zsdZmk/DJ85GLCeigTRoep65jAO # BgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcD # AzARBglghkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIw # JTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQB # MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGln # b1JTQUNvZGVTaWduaW5nQ0EuY3JsMHMGCCsGAQUFBwEBBGcwZTA+BggrBgEFBQcw # AoYyaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBQ29kZVNpZ25pbmdD # QS5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG # SIb3DQEBCwUAA4IBAQAlX5Wi+wawAMijiN5IAFyaGrd3cpSCndCdWvS6KQ6o9f67 # zml6JdTL94PhRwGTe0o+aOrFMOPIx/f/83IS0YLduIhcVfIYXzGeMcXFG9Z1FzHI # 2eT52hxnfThR8gIho3D5ETDFV48IaHmh9VgbxF8r8yVZ/0ufMFrqxWctZqTXmJJw # OTPC6ztnLaZ6cd4dju26RNVFOVQyO6+G5vCitk45kTsd7Jl1RC0J6Qm/LYWCw1Gb # cyPjQv3pKnrBd8Ux3ZW286c9ZzpZfvK7ETw19usW0NNw+RGJRQaqZWUTu4J7NLix # Oj++c97i2uPCAG1o4kW0BfUxRnhZOty3yh5jJc05MIIF9TCCA92gAwIBAgIQHaJI # MG+bJhjQguCWfTPTajANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK # ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0Eg # Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgxMTAyMDAwMDAwWhcNMzAxMjMx # MjM1OTU5WjB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVz # dGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQx # JDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZI # hvcNAQEBBQADggEPADCCAQoCggEBAIYijTKFehifSfCWL2MIHi3cfJ8Uz+MmtiVm # KUCGVEZ0MWLFEO2yhyemmcuVMMBW9aR1xqkOUGKlUZEQauBLYq798PgYrKf/7i4z # IPoMGYmobHutAMNhodxpZW0fbieW15dRhqb0J+V8aouVHltg1X7XFpKcAC9o95ft # anK+ODtj3o+/bkxBXRIgCFnoOc2P0tbPBrRXBbZOoT5Xax+YvMRi1hsLjcdmG0qf # nYHEckC14l/vC0X/o84Xpi1VsLewvFRqnbyNVlPG8Lp5UEks9wO5/i9lNfIi6iwH # r0bZ+UYc3Ix8cSjz/qfGFN1VkW6KEQ3fBiSVfQ+noXw62oY1YdMCAwEAAaOCAWQw # ggFgMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQO # 4TqoUzox1Yq+wbutZxoDha00DjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgw # BgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAwYIKwYBBQUHAwgwEQYDVR0gBAow # CDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0 # LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr # BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv # bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov # L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEATWNQ7Uc0SmGk # 295qKoyb8QAAHh1iezrXMsL2s+Bjs/thAIiaG20QBwRPvrjqiXgi6w9G7PNGXkBG # iRL0C3danCpBOvzW9Ovn9xWVM8Ohgyi33i/klPeFM4MtSkBIv5rCT0qxjyT0s4E3 # 07dksKYjalloUkJf/wTr4XRleQj1qZPea3FAmZa6ePG5yOLDCBaxq2NayBWAbXRe # SnV+pbjDbLXP30p5h1zHQE1jNfYw08+1Cg4LBH+gS667o6XQhACTPlNdNKUANWls # vp8gJRANGftQkGG+OY96jk32nw4e/gdREmaDJhlIlc5KycF/8zoFm/lv34h/wCOe # 0h5DekUxwZxNqfBZslkZ6GqNKQQCd3xLS81wvjqyVVp4Pry7bwMQJXcVNIr5NsxD # kuS6T/FikyglVyn7URnHoSVAaoRXxrKdsbwcCtp8Z359LukoTBh+xHsxQXGaSyns # Cz1XUNLK3f2eBVHlRHjdAd6xdZgNVCT98E7j4viDvXK6yz067vBeF5Jobchh+abx # KgoLpbn0nu6YMgWFnuv5gynTxix9vTp3Los3QqBqgu07SqqUEKThDfgXxbZaeTMY # kuO1dfih6Y4KJR7kHvGfWocj/5+kUZ77OYARzdu1xKeogG/lU9Tg46LC0lsa+jIm # LWpXcBw8pFguo/NbSwfcMlnzh6cabVgxggIzMIICLwIBATCBkTB8MQswCQYDVQQG # EwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm # b3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28g # UlNBIENvZGUgU2lnbmluZyBDQQIRAI+/xW/5m0RjSTHEdvWZn3swCQYFKw4DAhoF # AKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisG # AQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcN # AQkEMRYEFGPzlhDqWsBxntiKm3vVdNwobd4gMA0GCSqGSIb3DQEBAQUABIIBAH10 # FeDYSfeSFY38TrDM3THjWiySdzZSOaJaqPnUIT5TSpZa+KKquTXQR9h3dz/ywKcD # KPwYJWy3KtZ9QGfE7zPDCx6YUguOrQMYULXan+gHcXEOk0IBcZCMgIF9tVtMzYfJ # LnZnioZdjUb+ikSYvobwXqTIEDiX9996V5ZyziT37hLaGAFyRBVEU09nK4gglaOH # zrQZTw6AoFKPszmaXuii2ykPAtkzu1ZdDvdNMrZqiQoVB4jzf3YEhVkxW5kJyumQ # B5sw5SaTCGIlzh8wymSE8fmWZvUlUqECvyh3/mh01YN+VpU1kMs8lxRVEBk0NdLt # sehSBAsfxq73yvE8+xk= # SIG # End signature block