-
Notifications
You must be signed in to change notification settings - Fork 161
/
bootstrapper.ps1
146 lines (137 loc) · 5.68 KB
/
bootstrapper.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
function Get-Boxstarter {
Param(
[string] $Version = "2.10.3",
[switch] $Force
)
if(!(Test-Admin)) {
$bootstrapperFile = ${function:Get-Boxstarter}.File
if($bootstrapperFile) {
Write-Host "User is not running with administrative rights. Attempting to elevate..."
$command = "-ExecutionPolicy bypass -noexit -command . '$bootstrapperFile';Get-Boxstarter $($args)"
Start-Process powershell -verb runas -argumentlist $command
}
else {
Write-Host "User is not running with administrative rights.`nPlease open a PowerShell console as administrator and try again."
}
return
}
$badPolicy = $false
@("Restricted", "AllSigned") | ? { $_ -eq (Get-ExecutionPolicy).ToString() } | % {
Write-Host "Your current PowerShell Execution Policy is set to '$(Get-ExecutionPolicy)' and will prohibit boxstarter from operating propperly."
Write-Host "Please use Set-ExecutionPolicy to change the policy to RemoteSigned or Unrestricted."
$badPolicy = $true
}
if($badPolicy) { return }
Write-Output "Welcome to the Boxstarter Module installer!"
if(Check-Chocolatey -Force:$Force){
Write-Output "Chocolatey installed, Installing Boxstarter Modules."
$chocoVersion = "2.9.17"
try {
New-Object -TypeName Version -ArgumentList $chocoVersion.split('-')[0] | Out-Null
$command = "cinst Boxstarter -y"
}
catch{
# if there is no -v then its an older version with no -y
$command = "cinst Boxstarter"
}
$command += " --version $version"
Invoke-Expression $command
Import-Module "$env:ProgramData\boxstarter\boxstarter.chocolatey\boxstarter.chocolatey.psd1" -Force
$Message = "Boxstarter Module Installer completed"
}
else {
$Message = "Did not detect Chocolatey and unable to install. Installation of Boxstarter has been aborted."
}
if($Force) {
Write-Host $Message
}
else {
Read-Host $Message
}
}
function Check-Chocolatey {
Param(
[switch] $Force
)
if(-not $env:ChocolateyInstall -or -not (Test-Path "$env:ChocolateyInstall\bin\choco.exe")){
$message = "Chocolatey is going to be downloaded and installed on your machine. If you do not have the .NET Framework Version 4 or greater, that will also be downloaded and installed."
Write-Host $message
if($Force -OR (Confirm-Install)){
$exitCode = Enable-Net40
if($exitCode -ne 0) {
Write-Warning ".net install returned $exitCode. You likely need to reboot your computer before proceeding with the install."
return $false
}
$env:ChocolateyInstall = "$env:programdata\chocolatey"
New-Item $env:ChocolateyInstall -Force -type directory | Out-Null
$url="https://chocolatey.org/api/v2/package/chocolatey/"
$wc=new-object net.webclient
$wp=[system.net.WebProxy]::GetDefaultProxy()
$wp.UseDefaultCredentials=$true
$wc.Proxy=$wp
iex ($wc.DownloadString("https://chocolatey.org/install.ps1"))
$env:path="$env:path;$env:ChocolateyInstall\bin"
}
else{
return $false
}
}
return $true
}
function Is64Bit { [IntPtr]::Size -eq 8 }
function Enable-Net40 {
if(Is64Bit) {$fx="framework64"} else {$fx="framework"}
if(!(test-path "$env:windir\Microsoft.Net\$fx\v4.0.30319")) {
Write-Host "Downloading .net 4.5..."
Get-HttpToFile "https://download.microsoft.com/download/b/a/4/ba4a7e71-2906-4b2d-a0e1-80cf16844f5f/dotnetfx45_full_x86_x64.exe" "$env:temp\net45.exe"
Write-Host "Installing .net 4.5..."
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "$env:temp\net45.exe"
$pinfo.Verb="runas"
$pinfo.Arguments = "/quiet /norestart /log $env:temp\net45.log"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$e = $p.ExitCode
if($e -ne 0){
Write-Host "Installer exited with $e"
}
return $e
}
return 0
}
function Get-HttpToFile ($url, $file){
Write-Verbose "Downloading $url to $file"
if(Test-Path $file){Remove-Item $file -Force}
$downloader=new-object net.webclient
$wp=[system.net.WebProxy]::GetDefaultProxy()
$wp.UseDefaultCredentials=$true
$downloader.Proxy=$wp
try {
$downloader.DownloadFile($url, $file)
}
catch{
if($VerbosePreference -eq "Continue"){
Write-Error $($_.Exception | fl * -Force | Out-String)
}
throw $_
}
}
function Confirm-Install {
$caption = "Installing Chocolatey"
$message = "Do you want to proceed?"
$yes = new-Object System.Management.Automation.Host.ChoiceDescription "&Yes","Yes";
$no = new-Object System.Management.Automation.Host.ChoiceDescription "&No","No";
$choices = [System.Management.Automation.Host.ChoiceDescription[]]($yes,$no);
$answer = $host.ui.PromptForChoice($caption,$message,$choices,0)
switch ($answer){
0 {return $true; break}
1 {return $false; break}
}
}
function Test-Admin {
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object System.Security.Principal.WindowsPrincipal( $identity )
return $principal.IsInRole( [System.Security.Principal.WindowsBuiltInRole]::Administrator )
}