Created
February 21, 2018 19:12
-
-
Save ferventcoder/d0aa1703a7d302fce79e7a4cc13797c0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# use an internal repository to download Chocolatey nupkg to the local path: | |
$packageRepo = '<INSERT REPO URL>' | |
# uncomment if you want to download the file from a remote OData (HTTP/HTTPS) internal url (such as Artifactory, Nexus, ProGet, or Chocolatey.Server) | |
#$searchUrl = ($packageRepo.Trim('/'), 'Packages()?$filter=(Id%20eq%20%27chocolatey%27)%20and%20IsLatestVersion') -join '/' | |
# UPDATE THIS PATH | |
$localChocolateyPackageFilePath = "$env:SystemDrive\choco-setup\packages\chocolatey.0.10.0.nupkg" | |
# Determine unzipping method | |
# 7zip is the most compatible, but you need an internally hosted 7za.exe. | |
# Make sure the version matches for the arguments as well. | |
# Built-in does not work with Server Core, but if you have PowerShell 5 | |
# it uses Expand-Archive instead of COM | |
$unzipMethod = 'builtin' | |
#$unzipMethod = '7zip' | |
#$7zipUrl = 'https://chocolatey.org/7za.exe' (download this file, host internally, and update this to internal) | |
$ChocoInstallPath = "$($env:SystemDrive)\ProgramData\Chocolatey\bin" | |
$env:ChocolateyInstall = "$($env:SystemDrive)\ProgramData\Chocolatey" | |
$env:Path += ";$ChocoInstallPath" | |
$DebugPreference = "Continue"; | |
# if you really want to see debugging output related to the | |
# installation, uncomment the next line | |
#$env:ChocolateyEnvironmentDebug = 'true' | |
function Get-Downloader { | |
param ( | |
[string]$url | |
) | |
$downloader = new-object System.Net.WebClient | |
$defaultCreds = [System.Net.CredentialCache]::DefaultCredentials | |
if ($defaultCreds -ne $null) { | |
$downloader.Credentials = $defaultCreds | |
} | |
$ignoreProxy = $env:chocolateyIgnoreProxy | |
if ($ignoreProxy -ne $null -and $ignoreProxy -eq 'true') { | |
Write-Debug "Explicitly bypassing proxy due to user environment variable" | |
$downloader.Proxy = [System.Net.GlobalProxySelection]::GetEmptyWebProxy() | |
} else { | |
# check if a proxy is required | |
$explicitProxy = $env:chocolateyProxyLocation | |
$explicitProxyUser = $env:chocolateyProxyUser | |
$explicitProxyPassword = $env:chocolateyProxyPassword | |
if ($explicitProxy -ne $null -and $explicitProxy -ne '') { | |
# explicit proxy | |
$proxy = New-Object System.Net.WebProxy($explicitProxy, $true) | |
if ($explicitProxyPassword -ne $null -and $explicitProxyPassword -ne '') { | |
$passwd = ConvertTo-SecureString $explicitProxyPassword -AsPlainText -Force | |
$proxy.Credentials = New-Object System.Management.Automation.PSCredential ($explicitProxyUser, $passwd) | |
} | |
Write-Debug "Using explicit proxy server '$explicitProxy'." | |
$downloader.Proxy = $proxy | |
} elseif (!$downloader.Proxy.IsBypassed($url)) { | |
# system proxy (pass through) | |
$creds = $defaultCreds | |
if ($creds -eq $null) { | |
Write-Debug "Default credentials were null. Attempting backup method" | |
$cred = get-credential | |
$creds = $cred.GetNetworkCredential(); | |
} | |
$proxyaddress = $downloader.Proxy.GetProxy($url).Authority | |
Write-Debug "Using system proxy server '$proxyaddress'." | |
$proxy = New-Object System.Net.WebProxy($proxyaddress) | |
$proxy.Credentials = $creds | |
$downloader.Proxy = $proxy | |
} | |
} | |
return $downloader | |
} | |
function Download-File { | |
param ( | |
[string]$url, | |
[string]$file | |
) | |
#Write-Output "Downloading $url to $file" | |
$downloader = Get-Downloader $url | |
$downloader.DownloadFile($url, $file) | |
} | |
function Download-Package { | |
param ( | |
[string]$packageODataSearchUrl, | |
[string]$file | |
) | |
$downloader = Get-Downloader $packageODataSearchUrl | |
Write-Output "Querying latest package from $packageODataSearchUrl" | |
[xml]$pkg = $downloader.DownloadString($packageODataSearchUrl) | |
$packageDownloadUrl = $pkg.feed.entry.content.src | |
Write-Output "Downloading $packageDownloadUrl to $file" | |
$downloader.DownloadFile($packageDownloadUrl, $file) | |
} | |
function Install-LocalChocolateyPackage { | |
param ( | |
[string]$chocolateyPackageFilePath = '' | |
) | |
if ($chocolateyPackageFilePath -eq $null -or $chocolateyPackageFilePath -eq '') { | |
throw "You must specify a local package to run the local install." | |
} | |
if (!(Test-Path($chocolateyPackageFilePath))) { | |
throw "No file exists at $chocolateyPackageFilePath" | |
} | |
if ($env:TEMP -eq $null) { | |
$env:TEMP = Join-Path $env:SystemDrive 'temp' | |
} | |
$chocTempDir = Join-Path $env:TEMP "chocolatey" | |
$tempDir = Join-Path $chocTempDir "chocInstall" | |
if (![System.IO.Directory]::Exists($tempDir)) {[System.IO.Directory]::CreateDirectory($tempDir)} | |
$file = Join-Path $tempDir "chocolatey.zip" | |
Copy-Item $chocolateyPackageFilePath $file -Force | |
# unzip the package | |
Write-Output "Extracting $file to $tempDir..." | |
if ($unzipMethod -eq '7zip') { | |
$7zaExe = Join-Path $tempDir '7za.exe' | |
if (-Not (Test-Path ($7zaExe))) { | |
Write-Output "Downloading 7-Zip commandline tool prior to extraction." | |
# download 7zip | |
Download-File $7zipUrl "$7zaExe" | |
} | |
$params = "x -o`"$tempDir`" -bd -y `"$file`"" | |
# use more robust Process as compared to Start-Process -Wait (which doesn't | |
# wait for the process to finish in PowerShell v3) | |
$process = New-Object System.Diagnostics.Process | |
$process.StartInfo = New-Object System.Diagnostics.ProcessStartInfo($7zaExe, $params) | |
$process.StartInfo.RedirectStandardOutput = $true | |
$process.StartInfo.UseShellExecute = $false | |
$process.StartInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden | |
$process.Start() | Out-Null | |
$process.BeginOutputReadLine() | |
$process.WaitForExit() | |
$exitCode = $process.ExitCode | |
$process.Dispose() | |
$errorMessage = "Unable to unzip package using 7zip. Perhaps try setting `$env:chocolateyUseWindowsCompression = 'true' and call install again. Error:" | |
switch ($exitCode) { | |
0 { break } | |
1 { throw "$errorMessage Some files could not be extracted" } | |
2 { throw "$errorMessage 7-Zip encountered a fatal error while extracting the files" } | |
7 { throw "$errorMessage 7-Zip command line error" } | |
8 { throw "$errorMessage 7-Zip out of memory" } | |
255 { throw "$errorMessage Extraction cancelled by the user" } | |
default { throw "$errorMessage 7-Zip signalled an unknown error (code $exitCode)" } | |
} | |
} else { | |
if ($PSVersionTable.PSVersion.Major -lt 5) { | |
try { | |
$shellApplication = new-object -com shell.application | |
$zipPackage = $shellApplication.NameSpace($file) | |
$destinationFolder = $shellApplication.NameSpace($tempDir) | |
$destinationFolder.CopyHere($zipPackage.Items(),0x10) | |
} catch { | |
throw "Unable to unzip package using built-in compression. Set `$env:chocolateyUseWindowsCompression = 'false' and call install again to use 7zip to unzip. Error: `n $_" | |
} | |
} else { | |
Expand-Archive -Path "$file" -DestinationPath "$tempDir" -Force | |
} | |
} | |
# Call chocolatey install | |
Write-Output "Installing chocolatey on this machine" | |
$toolsFolder = Join-Path $tempDir "tools" | |
$chocInstallPS1 = Join-Path $toolsFolder "chocolateyInstall.ps1" | |
& $chocInstallPS1 | |
Write-Output 'Ensuring chocolatey commands are on the path' | |
$chocInstallVariableName = "ChocolateyInstall" | |
$chocoPath = [Environment]::GetEnvironmentVariable($chocInstallVariableName) | |
if ($chocoPath -eq $null -or $chocoPath -eq '') { | |
$chocoPath = 'C:\ProgramData\Chocolatey' | |
} | |
$chocoExePath = Join-Path $chocoPath 'bin' | |
if ($($env:Path).ToLower().Contains($($chocoExePath).ToLower()) -eq $false) { | |
$env:Path = [Environment]::GetEnvironmentVariable('Path',[System.EnvironmentVariableTarget]::Machine); | |
} | |
} | |
# Idempotence - do not install Chocolatey if it is already installed | |
if (!(Test-Path $ChocoInstallPath)) { | |
# download the package to the local path | |
if ($searchUrl) { | |
Download-Package $searchUrl $localChocolateyPackageFilePath | |
} | |
# Install Chocolatey | |
Install-LocalChocolateyPackage $localChocolateyPackageFilePath | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment