123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- # Copyright (c) 2016 The Chromium Authors. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- # Note: to run this on e.g. OSX for adhoc testing or debugging in case Windows
- # is not around:
- #
- # pwsh
- # PS ...> $ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
- # PS ...> ./.cipd_impl.ps1 -CipdBinary _cipd.exe `
- # -BackendURL https://chrome-infra-packages.appspot.com `
- # -VersionFile ./cipd_client_version
- # file _cipd.exe
- param(
- # Path to download the CIPD binary to.
- [Parameter(Mandatory = $true)]
- [string]
- $CipdBinary,
- # CIPD platform to download the client for.
- [string]
- $Platform = "windows-amd64",
- # E.g. "https://chrome-infra-packages.appspot.com".
- [Parameter(Mandatory = $true)]
- [string]
- $BackendURL,
- # Path to the cipd_client_version file with the client version.
- [Parameter(Mandatory = $true)]
- [string]
- $VersionFile
- )
- # Import PowerShell<=5 Get-Filehash from Microsoft.PowerShell.Utility.
- # This prevents loading of incompatible Get-FileHash from PowerShell 6+ $PSModulePath.
- # See: crbug.com/1443163.
- Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
- $DepotToolsPath = Split-Path $MyInvocation.MyCommand.Path -Parent
- # Put depot_tool's git revision into the user agent string.
- try {
- $DepotToolsVersion = &git -C $DepotToolsPath rev-parse HEAD 2>&1
- if ($LastExitCode -eq 0) {
- $UserAgent = "depot_tools/$DepotToolsVersion"
- } else {
- $UserAgent = "depot_tools/???"
- }
- } catch [System.Management.Automation.CommandNotFoundException] {
- $UserAgent = "depot_tools/no_git/???"
- }
- $Env:CIPD_HTTP_USER_AGENT_PREFIX = $UserAgent
- # Returns the expected SHA256 hex digest for the given platform reading it from
- # *.digests file.
- function Get-Expected-SHA256($platform) {
- $digestsFile = $VersionFile+".digests"
- foreach ($line in Get-Content $digestsFile) {
- if ($line -match "^([0-9a-z\-]+)\s+sha256\s+([0-9a-f]+)$") {
- if ($Matches[1] -eq $platform) {
- return $Matches[2]
- }
- }
- }
- throw "No SHA256 digests for $platform in $digestsFile"
- }
- # Retry a command with a delay between each.
- function Retry-Command {
- [CmdletBinding()]
- param (
- [Parameter(Mandatory = $true)]
- [scriptblock]
- $Command,
- [int]
- $MaxAttempts = 3,
- [timespan]
- $Delay = (New-TimeSpan -Seconds 5)
- )
- $attempt = 0
- while ($attempt -lt $MaxAttempts) {
- try {
- Invoke-Command -ScriptBlock $Command
- return
- }
- catch {
- $attempt += 1
- $exception = $_.Exception.InnerException
- if ($attempt -lt $MaxAttempts) {
- Write-Output "FAILURE: " + $_
- Write-Output "Retrying after a short nap..."
- Start-Sleep -Seconds $Delay.TotalSeconds
- } else {
- throw $exception
- }
- }
- }
- }
- # Check is url in the NO_PROXY of Environment?
- function Is-UrlInNoProxy {
- [CmdletBinding()]
- param (
- [Parameter(Mandatory)]
- [string]$Url
- )
- $NoProxy = $Env:NO_PROXY
- if ([string]::IsNullOrEmpty($NoProxy)) {
- return $false
- }
- $NoProxyList = $NoProxy -split ',' | ForEach-Object { $_.Trim().ToLower() }
- $UriHost = ([uri]$Url).Host.ToLower()
- foreach ($entry in $NoProxyList) {
- if ($entry.StartsWith('.')) {
- if ($UriHost.EndsWith($entry.Substring(1))) {
- return $true
- }
- } elseif ($entry -eq $UriHost) {
- return $true
- }
- }
- return $false
- }
- $ExpectedSHA256 = Get-Expected-SHA256 $Platform
- $Version = (Get-Content $VersionFile).Trim()
- $URL = "$BackendURL/client?platform=$Platform&version=$Version"
- # Fetch the binary now that the lock is ours.
- $TmpPath = $CipdBinary + ".tmp." + $PID
- try {
- Write-Output "Downloading CIPD client for $Platform from $URL..."
- $Parameters = @{
- UserAgent = $UserAgent
- Uri = $URL
- OutFile = $TmpPath
- }
- if ($Env:HTTPS_PROXY) {
- $Proxy = $Env:HTTPS_PROXY
- } elseif ($Env:HTTP_PROXY) {
- $Proxy = $Env:HTTP_PROXY
- } elseif ($Env:ALL_PROXY) {
- $Proxy = $Env:ALL_PROXY
- } else {
- $Proxy = $null
- }
- $UrlNotInNoProxy = -not (Is-UrlInNoProxy -Url $URL)
- if ($UrlNotInNoProxy -and $Proxy) {
- Write-Output "Using Proxy $Proxy..."
- $Parameters.Proxy = $Proxy
- }
- Retry-Command {
- $ProgressPreference = "SilentlyContinue"
- Invoke-WebRequest @Parameters
- }
- $ActualSHA256 = (Get-FileHash -Path $TmpPath -Algorithm "SHA256").Hash.toLower()
- if ($ActualSHA256 -ne $ExpectedSHA256) {
- throw "Invalid SHA256 digest: $ActualSHA256 != $ExpectedSHA256"
- }
- Move-Item -LiteralPath $TmpPath -Destination $CipdBinary -Force
- } catch {
- Remove-Item -Path $TmpPath -ErrorAction Ignore
- throw # Re raise any error
- }
|