You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PowerShell
		
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PowerShell
		
	
# 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
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
$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..."
 | 
						|
  Retry-Command {
 | 
						|
    $ProgressPreference = "SilentlyContinue"
 | 
						|
    Invoke-WebRequest -UserAgent $UserAgent -Uri $URL -OutFile $TmpPath
 | 
						|
  }
 | 
						|
 | 
						|
  $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
 | 
						|
}
 |