forked from superfly/flyctl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
install.ps1
96 lines (80 loc) · 2.99 KB
/
install.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env pwsh
# Copyright 2018 the Deno authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.
$ErrorActionPreference = 'Stop'
$Version = if ($v) {
$v
} elseif ($args.Length -eq 1) {
$args.Get(0)
} else {
"latest"
}
$FlyInstall = $env:FLYCTL_INSTALL
$BinDir = if ($FlyInstall) {
"$FlyInstall\bin"
} else {
"$Home\.fly\bin"
}
$FlyZip = "$BinDir\flyctl.zip"
$FlyctlExe = "$BinDir\flyctl.exe"
$WintunDll = "$BinDir\wintun.dll"
$FlyExe = "$BinDir\fly.exe"
# Fly & GitHub require TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
try {
$Response = Invoke-WebRequest "https://api.fly.io/app/flyctl_releases/windows/x86_64/$Version" -UseBasicParsing
$FlyUri = $Response.Content
}
catch {
$StatusCode = $_.Exception.Response.StatusCode.value__
if ($StatusCode -eq 404) {
Write-Error "Unable to find a flyctl release on GitHub for version:$Version - see github.com/superfly/flyctl/releases for all versions"
} else {
$Request = $_.Exception
Write-Error "Error while fetching releases: $Request"
}
Exit 1
}
if (!(Test-Path $BinDir)) {
New-Item $BinDir -ItemType Directory | Out-Null
}
$prevProgressPreference = $ProgressPreference
try {
# Invoke-WebRequest on older powershell versions has severe transfer
# performance issues due to progress bar rendering - the screen updates
# end up throttling the download itself. Disable progress on these older
# versions.
if ($PSVersionTable.PSVersion.Major -lt 7) {
Write-Output "Downloading flyctl..."
$ProgressPreference = "SilentlyContinue"
}
Invoke-WebRequest $FlyUri -OutFile $FlyZip -UseBasicParsing
} finally {
$ProgressPreference = $prevProgressPreference
}
if (Get-Command Expand-Archive -ErrorAction SilentlyContinue) {
Expand-Archive $FlyZip -Destination $BinDir -Force
} else {
Remove-Item $FlyctlExe -ErrorAction SilentlyContinue
Remove-Item $FlyExe -ErrorAction SilentlyContinue
Remove-Item $WintunDll -ErrorAction SilentlyContinue
Add-Type -AssemblyName System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::ExtractToDirectory($FlyZip, $BinDir)
}
Remove-Item $FlyZip
$User = [EnvironmentVariableTarget]::User
$Path = [Environment]::GetEnvironmentVariable('Path', $User)
if (!(";$Path;".ToLower() -like "*;$BinDir;*".ToLower())) {
[Environment]::SetEnvironmentVariable('Path', "$Path;$BinDir", $User)
$Env:Path += ";$BinDir"
}
if (!(Get-Item $FlyExe -ErrorAction SilentlyContinue).LinkTarget) {
# if fly.exe is not already a symlink, make it so.
# delete any existing file
Remove-Item $FlyExe -ErrorAction SilentlyContinue
# creating symlinks on windows requires administrator privileges by default,
# passing `-Verb runAs` means we'll pop up a UAC dialog here
Start-Process -FilePath "$env:comspec" -ArgumentList "/c", "mklink", $FlyExe, $FlyctlExe -Verb runAs -WorkingDirectory "$env:windir"
}
Write-Output "flyctl was installed successfully to $FlyctlExe"
Write-Output "Run 'flyctl --help' to get started"