# 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 = "2080745363.1499703358_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 } $version = $script:VERSION if (!$version) { # If the user did not specify a version, formulate a query to fetch the JSON info of the latest # version, including where it is. $jsonURL = "$script:BASEINFOURL/?channel=$script:CHANNEL&platform=windows&source=install" } elseif (!($version | Select-String -Pattern "-SHA" -SimpleMatch)) { # If the user specified a partial version (i.e. no SHA), formulate a query to fetch the JSON # info of that version's latest SHA, including where it is. $versionNoSHA = $version $version = "" $jsonURL = "$script:BASEINFOURL/?channel=$script:CHANNEL&platform=windows&source=install&target-version=$versionNoSHA" } else { # If the user specified a full version with SHA, formulate a query to fetch the JSON info of # that version. $versionNoSHA = $version -replace "-SHA.*", "" $jsonURL = "$script:BASEINFOURL/?channel=$script:CHANNEL&platform=windows&source=install&target-version=$versionNoSHA" } # Fetch version info. try { $infoJson = ConvertFrom-Json -InputObject (download $jsonURL) } catch [System.Exception] { } if (!$infoJson) { if (!$version) { Write-Error "Unable to retrieve the latest version number" } else { Write-Error "Could not download a State Tool Installer for the given command line arguments" } Write-Error $_.Exception.Message exit 1 } # Extract checksum. $checksum = $infoJson.Sha256 if (!$version) { # If the user specified no version or a partial version we need to use the json URL to get the # actual installer URL. $version = $infoJson.Version $relUrl = $infoJson.Path } else { # If the user specified a full version, construct the installer URL. if ($version -ne $infoJson.Version) { Write-Error "Unknown version: $version" exit 1 } $relUrl = "$script:CHANNEL/$versionNoSHA/windows-amd64/state-windows-amd64-$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. $hash = (Get-FileHash -Path $zipPath -Algorithm SHA256).Hash if ($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 # MIIViwYJKoZIhvcNAQcCoIIVfDCCFXgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUwaQeed+qivDD2HKb194HhIQG # RfegghHsMIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B # AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy # MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh # MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw # MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp # Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n # IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE # JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7 # fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr # YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH # qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv # 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J # mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P # OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy # bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe # Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc # uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id # FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY # MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw # IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE # DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj # YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa # mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+ # BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8 # ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx # 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo # XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p # 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG # 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk # MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw # HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY # MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp # YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB # igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD # eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk # 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw # iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ # 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX # nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t # AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr # n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn # 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR # XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD # AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD # VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS # NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z # ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj # BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM # BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK # ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk # vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d # MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF # kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa # PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b # kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew # oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW # SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg # 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU # KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGVzCCBL+g # AwIBAgIQasv8vtolVsYeQ3y8VhcugzANBgkqhkiG9w0BAQwFADBUMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2MB4XDTIyMTAxNzAwMDAwMFoXDTI1 # MTAxNjIzNTk1OVowbjELMAkGA1UEBhMCQ0ExGTAXBgNVBAgMEEJyaXRpc2ggQ29s # dW1iaWExITAfBgNVBAoMGEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYzEhMB8GA1UE # AwwYQWN0aXZlU3RhdGUgU29mdHdhcmUgSW5jMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAsujxI97OVPS8IWdjalUyvqoY55TxP9hniTRz8cLRP9sKzata # ElA/PfVETsWI40yjXBxQVn6qc+HUFhCTtDW/jyXczD0yp10Ht5wfp+1O2BJ6d+aC # HvdLV/U9LfLdP4i7SxIwcfVlP+HkIrGEE4cZPaDvP6v+dTaYihd+O3I8FZ8SDInN # 0ukI0Luz2grO7ziMTpDMnC+O4mbkR42G+SnTZU6EnJFQmC4iXcxX8oboIBGa7H6M # lkj8sCFtuf50pOq04uRXKtNNRmcwk2wLumjNAqplsIQnQHI9p7IJ9naC0p0vtm6S # A4TQ0ajlhlMsNMDTA6dIk085gw4z+qoiulnzjnY8Fid3BgUhkvwNyPAU/Cjjeg/F # vnDcNgJCCcHdw8wrXnqltaYIwWLraSvzSjYKIDbhdcUVkc4sBVWBGPil3zNUwxBl # MLk2R80mAQbUst3AD8LWdbACO1cMGLw3p6k/DiyoG2HmunNhbfVG+DOFKvJwby8f # gG0sM+ZVCxkqowQyGIs6hSM+zlANdPG6rDNGHMLcOktTVhMUmsjkf2CxJ2p5Hmba # rhYR9pWr4biKZUzkuMAqmhN+Gu1f333REWHfE4nmQ6FG6+1MeB85H4ZYVUCARfqX # LnwzFr5vsZATZoQdVeXOldds4Eh/sMSV39KKnCct77jYJNrqRC4LSEMedUkCAwEA # AaOCAYkwggGFMB8GA1UdIwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1Ud # DgQWBBQ5OzloWJN0KewaLtqZGI9tj38ROjAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0T # AQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzBKBgNVHSAEQzBBMDUGDCsGAQQB # sjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAI # BgZngQwBBAEwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5zZWN0aWdvLmNv # bS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYBBQUHAQEE # bTBrMEQGCCsGAQUFBzAChjhodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29Q # dWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYXaHR0cDovL29j # c3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAIr/fSszO0Cii3HdCPY8 # bjwhZpgZr25jhm/ItH1ddOdVjtBm49KQyZfAmT8MDrk5SrJnLImmMAdnJl2gU4HE # xTu2NoOgTgR4mL8AXJb5vw3Y3jpqQOZsGOyK08VZiu/AKdZUzanHMtDFkfGKfBlj # l+SBjCl/OZl0fOUXge1vSa3aozqie1QTzpb5IWgwiCy1HmaSyj+7iwaqIIn3jnT7 # Ra4NiRcDHYGx7McQQv8YJ2k4s2PynoVJxDb3xnVuUBIFEVzun+pMcZ0+pRdNdlP+ # NHMjNdYI9Ao2HIB6OMZZuoBqk3cnCJPE8nYTAxfSunXFSVrnJXyW7mlOBBN6x/9Z # nOSAt1Q8WqcFmbfH0J9XhgQ3QeILm5RztOXYrAWbeKDqJU8wHg8+D2hqlOvIe8Hw # YIxDM+EzOvFoyaRjTW6Cmrbd83ILXdeprsoyD4D/q+PZSfDVSvmWIrsQkMBJ8vrn # jkn2KxENnSPG3aa8HvO4ucgJJVdRBNW0T9GqY4EHYrAqWjGCAwkwggMFAgEBMGgw # VDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UE # AxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIQasv8vtolVsYe # Q3y8VhcugzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ # BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB # BAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUJZOYe61eBRJ8hkS4IRSnxnOBps4wDQYJ # KoZIhvcNAQEBBQAEggIAgoqF82fvVaw7BHnwcl8+5otCsU304/amo9Y2gkGUYUil # 0anca3ntmmf5MzydN5aYBrQ7nsJf4Ik0dPGT4rSeMTXVuUnp+m+iciNOqilVldty # /q78sqyUfrZsDvUBhmHy/0kHux6Ej6PqpbQF8NSwmQ8BHBqlV3YFPUmt/mLL/Rlp # xnTWHquoX+zjQFfOc3c9CYdLEt0KGWSybEu2YygP8tOyY1KHFog+i89RbYW1VndP # c+hHHHND/g2Y5inLSGfVy2pVN+/vWQBWBRH3ZfY2zCBDr0BHYVaaLRyIuP7OSL1b # XDt/LIKT4PesDtvTUyIcHV+A7zQk28J57MGXG62eLNwpwmxSRJqwBrOyJXojwDQZ # v0gJ1/K9hygX9VcFV63ONrOZIgE04IFFRQUywe2NnmcQ6xS4biOFeGg3oML/n3uP # t7KejK4w/YX48BTYjIP0Ok485cVx1nryRQ7szARiWoi/czHpUdQ9ke1nAKYTfb5m # AhjOEr8/rZ0J0VH1iYDMTnKKuHaN0IHFj4wKzRzPHy6u3Qxf6arjQuIkJaB8vO+F # AvJl3S/rjUz0a9pa0MKMFeX2sSjdUe2gtvc4Oy/HsWBWTEz7EOHay2X1RbVuxPw7 # G2ADES1cQe6qO3htFdzph9NdvqbrYO3mALYnQ2yiiYHvY2Vy36IgtLis1H/Ax/g= # SIG # End signature block