knife-windows 1.7.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +26 -26
  3. data/CHANGELOG.md +139 -135
  4. data/DOC_CHANGES.md +22 -22
  5. data/Gemfile +13 -13
  6. data/README.md +404 -404
  7. data/RELEASE_NOTES.md +9 -9
  8. data/appveyor.yml +39 -39
  9. data/ci.gemfile +16 -16
  10. data/knife-windows.gemspec +26 -26
  11. data/lib/chef/knife/bootstrap/windows-chef-client-msi.erb +246 -246
  12. data/lib/chef/knife/bootstrap_windows_base.rb +443 -443
  13. data/lib/chef/knife/bootstrap_windows_ssh.rb +116 -116
  14. data/lib/chef/knife/bootstrap_windows_winrm.rb +102 -102
  15. data/lib/chef/knife/core/windows_bootstrap_context.rb +378 -378
  16. data/lib/chef/knife/knife_windows_base.rb +33 -33
  17. data/lib/chef/knife/windows_cert_generate.rb +155 -155
  18. data/lib/chef/knife/windows_cert_install.rb +68 -68
  19. data/lib/chef/knife/windows_helper.rb +36 -36
  20. data/lib/chef/knife/windows_listener_create.rb +107 -107
  21. data/lib/chef/knife/winrm.rb +122 -122
  22. data/lib/chef/knife/winrm_base.rb +128 -128
  23. data/lib/chef/knife/winrm_knife_base.rb +307 -307
  24. data/lib/chef/knife/winrm_session.rb +98 -98
  25. data/lib/chef/knife/winrm_shared_options.rb +47 -47
  26. data/lib/chef/knife/wsman_endpoint.rb +44 -44
  27. data/lib/chef/knife/wsman_test.rb +118 -118
  28. data/lib/knife-windows/path_helper.rb +242 -234
  29. data/lib/knife-windows/version.rb +6 -6
  30. data/spec/assets/fake_trusted_certs/excluded.txt +2 -0
  31. data/spec/assets/fake_trusted_certs/github.pem +42 -0
  32. data/spec/assets/fake_trusted_certs/google.crt +41 -0
  33. data/spec/assets/win_fake_trusted_cert_script.txt +89 -0
  34. data/spec/assets/win_template_rendered_with_bootstrap_install_command.txt +223 -223
  35. data/spec/assets/win_template_rendered_with_bootstrap_install_command_on_12_5_client.txt +223 -223
  36. data/spec/assets/win_template_rendered_without_bootstrap_install_command.txt +335 -335
  37. data/spec/assets/win_template_rendered_without_bootstrap_install_command_on_12_5_client.txt +335 -335
  38. data/spec/assets/win_template_unrendered.txt +246 -246
  39. data/spec/dummy_winrm_connection.rb +21 -21
  40. data/spec/functional/bootstrap_download_spec.rb +236 -236
  41. data/spec/spec_helper.rb +94 -94
  42. data/spec/unit/knife/bootstrap_options_spec.rb +157 -157
  43. data/spec/unit/knife/bootstrap_template_spec.rb +98 -98
  44. data/spec/unit/knife/bootstrap_windows_winrm_spec.rb +423 -423
  45. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +213 -177
  46. data/spec/unit/knife/windows_cert_generate_spec.rb +90 -90
  47. data/spec/unit/knife/windows_cert_install_spec.rb +51 -51
  48. data/spec/unit/knife/windows_listener_create_spec.rb +76 -76
  49. data/spec/unit/knife/winrm_session_spec.rb +95 -95
  50. data/spec/unit/knife/winrm_spec.rb +500 -500
  51. data/spec/unit/knife/wsman_test_spec.rb +209 -209
  52. metadata +7 -3
@@ -1,223 +1,223 @@
1
- @rem
2
- @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
- @rem License:: Apache License, Version 2.0
5
- @rem
6
- @rem Licensed under the Apache License, Version 2.0 (the "License");
7
- @rem you may not use this file except in compliance with the License.
8
- @rem You may obtain a copy of the License at
9
- @rem
10
- @rem http://www.apache.org/licenses/LICENSE-2.0
11
- @rem
12
- @rem Unless required by applicable law or agreed to in writing, software
13
- @rem distributed under the License is distributed on an "AS IS" BASIS,
14
- @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- @rem See the License for the specific language governing permissions and
16
- @rem limitations under the License.
17
- @rem
18
-
19
- @rem Use delayed environment expansion so that ERRORLEVEL can be evaluated with the
20
- @rem !ERRORLEVEL! syntax which evaluates at execution of the line of script, not when
21
- @rem the line is read. See help for the /E switch from cmd.exe /? .
22
- @setlocal ENABLEDELAYEDEXPANSION
23
-
24
-
25
-
26
- @set BOOTSTRAP_DIRECTORY=C:\chef
27
- @echo Checking for existing directory "%BOOTSTRAP_DIRECTORY%"...
28
- @if NOT EXIST %BOOTSTRAP_DIRECTORY% (
29
- @echo Existing directory not found, creating.
30
- @mkdir %BOOTSTRAP_DIRECTORY%
31
- ) else (
32
- @echo Existing directory found, skipping creation.
33
- )
34
-
35
- > C:\chef\wget.vbs (
36
- echo.url = WScript.Arguments.Named^("url"^)
37
- echo.path = WScript.Arguments.Named^("path"^)
38
- echo.proxy = null
39
- echo.'* Vaguely attempt to handle file:// scheme urls by url unescaping and switching all
40
- echo.'* / into . Also assume that file:/// is a local absolute path and that file://^<foo^>
41
- echo.'* is possibly a network file path.
42
- echo.If InStr^(url, "file://"^) = 1 Then
43
- echo.url = Unescape^(url^)
44
- echo.If InStr^(url, "file:///"^) = 1 Then
45
- echo.sourcePath = Mid^(url, Len^("file:///"^) + 1^)
46
- echo.Else
47
- echo.sourcePath = Mid^(url, Len^("file:"^) + 1^)
48
- echo.End If
49
- echo.sourcePath = Replace^(sourcePath, "/", "\"^)
50
- echo.
51
- echo.Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
52
- echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
53
- echo.objFSO.CopyFile sourcePath, path, true
54
- echo.Set objFSO = Nothing
55
- echo.
56
- echo.Else
57
- echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP"^)
58
- echo.Set wshShell = CreateObject^( "WScript.Shell" ^)
59
- echo.Set objUserVariables = wshShell.Environment^("USER"^)
60
- echo.
61
- echo.rem http proxy is optional
62
- echo.rem attempt to read from HTTP_PROXY env var first
63
- echo.On Error Resume Next
64
- echo.
65
- echo.If NOT ^(objUserVariables^("HTTP_PROXY"^) = ""^) Then
66
- echo.proxy = objUserVariables^("HTTP_PROXY"^)
67
- echo.
68
- echo.rem fall back to named arg
69
- echo.ElseIf NOT ^(WScript.Arguments.Named^("proxy"^) = ""^) Then
70
- echo.proxy = WScript.Arguments.Named^("proxy"^)
71
- echo.End If
72
- echo.
73
- echo.If NOT isNull^(proxy^) Then
74
- echo.rem setProxy method is only available on ServerXMLHTTP 6.0+
75
- echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP.6.0"^)
76
- echo.objXMLHTTP.setProxy 2, proxy
77
- echo.End If
78
- echo.
79
- echo.On Error Goto 0
80
- echo.
81
- echo.objXMLHTTP.open "GET", url, false
82
- echo.objXMLHTTP.send^(^)
83
- echo.If objXMLHTTP.Status = 200 Then
84
- echo.Set objADOStream = CreateObject^("ADODB.Stream"^)
85
- echo.objADOStream.Open
86
- echo.objADOStream.Type = 1
87
- echo.objADOStream.Write objXMLHTTP.ResponseBody
88
- echo.objADOStream.Position = 0
89
- echo.Set objFSO = Createobject^("Scripting.FileSystemObject"^)
90
- echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
91
- echo.Set objFSO = Nothing
92
- echo.objADOStream.SaveToFile path
93
- echo.objADOStream.Close
94
- echo.Set objADOStream = Nothing
95
- echo.End If
96
- echo.Set objXMLHTTP = Nothing
97
- echo.End If
98
-
99
- )
100
-
101
- > C:\chef\wget.ps1 (
102
- echo.param^(
103
- echo. [String] $remoteUrl,
104
- echo. [String] $localPath
105
- echo.^)
106
- echo.
107
- echo.$ProxyUrl = $env:http_proxy;
108
- echo.$webClient = new-object System.Net.WebClient;
109
- echo.
110
- echo.if ^($ProxyUrl -ne ''^) {
111
- echo. $WebProxy = New-Object System.Net.WebProxy^($ProxyUrl,$true^)
112
- echo. $WebClient.Proxy = $WebProxy
113
- echo.}
114
- echo.
115
- echo.$webClient.DownloadFile^($remoteUrl, $localPath^);
116
-
117
- )
118
-
119
- @rem Determine the version and the architecture
120
-
121
- @FOR /F "usebackq tokens=1-8 delims=.[] " %%A IN (`ver`) DO (
122
- @set WinMajor=%%D
123
- @set WinMinor=%%E
124
- @set WinBuild=%%F
125
- )
126
-
127
- @echo Detected Windows Version %WinMajor%.%WinMinor% Build %WinBuild%
128
-
129
- @set LATEST_OS_VERSION_MAJOR=6
130
- @set LATEST_OS_VERSION_MINOR=3
131
-
132
- @if /i %WinMajor% GTR %LATEST_OS_VERSION_MAJOR% goto VersionUnknown
133
- @if /i %WinMajor% EQU %LATEST_OS_VERSION_MAJOR% (
134
- @if /i %WinMinor% GTR %LATEST_OS_VERSION_MINOR% goto VersionUnknown
135
- )
136
-
137
- goto Version%WinMajor%.%WinMinor%
138
-
139
- :VersionUnknown
140
- @rem If this is an unknown version of windows set the default
141
- @set MACHINE_OS=2008r2
142
- @echo Warning: Unknown version of Windows, assuming default of Windows %MACHINE_OS%
143
- goto architecture_select
144
-
145
- :Version6.0
146
- @set MACHINE_OS=2008
147
- goto architecture_select
148
-
149
- :Version5.2
150
- @set MACHINE_OS=2003r2
151
- goto architecture_select
152
-
153
- :Version6.1
154
- @set MACHINE_OS=2008r2
155
- goto architecture_select
156
-
157
- :Version6.2
158
- @set MACHINE_OS=2012
159
- goto architecture_select
160
-
161
- @rem Currently Windows Server 2012 R2 is treated as equivalent to Windows Server 2012
162
- :Version6.3
163
- goto Version6.2
164
-
165
- :architecture_select
166
- goto Architecture%PROCESSOR_ARCHITEW6432%
167
-
168
- :Architecture
169
- goto Architecture%PROCESSOR_ARCHITECTURE%
170
-
171
- @rem If this is an unknown architecture set the default
172
- @set MACHINE_ARCH=i686
173
- goto install
174
-
175
- :Architecturex86
176
- @set MACHINE_ARCH=i686
177
- goto install
178
-
179
- :Architectureamd64
180
- @set MACHINE_ARCH=x86_64
181
- goto install
182
-
183
- :install
184
- @rem If user has provided the custom installation command for chef-client then execute it
185
- chef-client -o recipe[cbk1::rec2]
186
-
187
- @endlocal
188
-
189
- @echo off
190
-
191
-
192
- echo Writing validation key...
193
-
194
-
195
- echo Validation key written.
196
- @echo on
197
-
198
-
199
-
200
-
201
- > C:\chef\client.rb (
202
- echo.log_level :info
203
- echo.log_location STDOUT
204
- echo.
205
- echo.chef_server_url "https://localhost:443"
206
- echo.validation_client_name "chef-validator"
207
- echo.
208
- echo.file_cache_path "c:/chef/cache"
209
- echo.file_backup_path "c:/chef/backup"
210
- echo.cache_options ^({:path =^> "c:/chef/cache/checksums", :skip_expires =^> true}^)
211
- echo.
212
- echo.# Using default node name ^(fqdn^)
213
-
214
- )
215
-
216
- > C:\chef\first-boot.json (
217
- echo.{"run_list":null}
218
- )
219
-
220
- @echo Starting chef to bootstrap the node...
221
- SET "PATH=%PATH%;C:\ruby\bin;C:\opscode\chef\bin;C:\opscode\chef\embedded\bin"
222
- chef-client -c c:/chef/client.rb -j c:/chef/first-boot.json
223
-
1
+ @rem
2
+ @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
+ @rem License:: Apache License, Version 2.0
5
+ @rem
6
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
7
+ @rem you may not use this file except in compliance with the License.
8
+ @rem You may obtain a copy of the License at
9
+ @rem
10
+ @rem http://www.apache.org/licenses/LICENSE-2.0
11
+ @rem
12
+ @rem Unless required by applicable law or agreed to in writing, software
13
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
14
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ @rem See the License for the specific language governing permissions and
16
+ @rem limitations under the License.
17
+ @rem
18
+
19
+ @rem Use delayed environment expansion so that ERRORLEVEL can be evaluated with the
20
+ @rem !ERRORLEVEL! syntax which evaluates at execution of the line of script, not when
21
+ @rem the line is read. See help for the /E switch from cmd.exe /? .
22
+ @setlocal ENABLEDELAYEDEXPANSION
23
+
24
+
25
+
26
+ @set BOOTSTRAP_DIRECTORY=C:\chef
27
+ @echo Checking for existing directory "%BOOTSTRAP_DIRECTORY%"...
28
+ @if NOT EXIST %BOOTSTRAP_DIRECTORY% (
29
+ @echo Existing directory not found, creating.
30
+ @mkdir %BOOTSTRAP_DIRECTORY%
31
+ ) else (
32
+ @echo Existing directory found, skipping creation.
33
+ )
34
+
35
+ > C:\chef\wget.vbs (
36
+ echo.url = WScript.Arguments.Named^("url"^)
37
+ echo.path = WScript.Arguments.Named^("path"^)
38
+ echo.proxy = null
39
+ echo.'* Vaguely attempt to handle file:// scheme urls by url unescaping and switching all
40
+ echo.'* / into . Also assume that file:/// is a local absolute path and that file://^<foo^>
41
+ echo.'* is possibly a network file path.
42
+ echo.If InStr^(url, "file://"^) = 1 Then
43
+ echo.url = Unescape^(url^)
44
+ echo.If InStr^(url, "file:///"^) = 1 Then
45
+ echo.sourcePath = Mid^(url, Len^("file:///"^) + 1^)
46
+ echo.Else
47
+ echo.sourcePath = Mid^(url, Len^("file:"^) + 1^)
48
+ echo.End If
49
+ echo.sourcePath = Replace^(sourcePath, "/", "\"^)
50
+ echo.
51
+ echo.Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
52
+ echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
53
+ echo.objFSO.CopyFile sourcePath, path, true
54
+ echo.Set objFSO = Nothing
55
+ echo.
56
+ echo.Else
57
+ echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP"^)
58
+ echo.Set wshShell = CreateObject^( "WScript.Shell" ^)
59
+ echo.Set objUserVariables = wshShell.Environment^("USER"^)
60
+ echo.
61
+ echo.rem http proxy is optional
62
+ echo.rem attempt to read from HTTP_PROXY env var first
63
+ echo.On Error Resume Next
64
+ echo.
65
+ echo.If NOT ^(objUserVariables^("HTTP_PROXY"^) = ""^) Then
66
+ echo.proxy = objUserVariables^("HTTP_PROXY"^)
67
+ echo.
68
+ echo.rem fall back to named arg
69
+ echo.ElseIf NOT ^(WScript.Arguments.Named^("proxy"^) = ""^) Then
70
+ echo.proxy = WScript.Arguments.Named^("proxy"^)
71
+ echo.End If
72
+ echo.
73
+ echo.If NOT isNull^(proxy^) Then
74
+ echo.rem setProxy method is only available on ServerXMLHTTP 6.0+
75
+ echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP.6.0"^)
76
+ echo.objXMLHTTP.setProxy 2, proxy
77
+ echo.End If
78
+ echo.
79
+ echo.On Error Goto 0
80
+ echo.
81
+ echo.objXMLHTTP.open "GET", url, false
82
+ echo.objXMLHTTP.send^(^)
83
+ echo.If objXMLHTTP.Status = 200 Then
84
+ echo.Set objADOStream = CreateObject^("ADODB.Stream"^)
85
+ echo.objADOStream.Open
86
+ echo.objADOStream.Type = 1
87
+ echo.objADOStream.Write objXMLHTTP.ResponseBody
88
+ echo.objADOStream.Position = 0
89
+ echo.Set objFSO = Createobject^("Scripting.FileSystemObject"^)
90
+ echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
91
+ echo.Set objFSO = Nothing
92
+ echo.objADOStream.SaveToFile path
93
+ echo.objADOStream.Close
94
+ echo.Set objADOStream = Nothing
95
+ echo.End If
96
+ echo.Set objXMLHTTP = Nothing
97
+ echo.End If
98
+
99
+ )
100
+
101
+ > C:\chef\wget.ps1 (
102
+ echo.param^(
103
+ echo. [String] $remoteUrl,
104
+ echo. [String] $localPath
105
+ echo.^)
106
+ echo.
107
+ echo.$ProxyUrl = $env:http_proxy;
108
+ echo.$webClient = new-object System.Net.WebClient;
109
+ echo.
110
+ echo.if ^($ProxyUrl -ne ''^) {
111
+ echo. $WebProxy = New-Object System.Net.WebProxy^($ProxyUrl,$true^)
112
+ echo. $WebClient.Proxy = $WebProxy
113
+ echo.}
114
+ echo.
115
+ echo.$webClient.DownloadFile^($remoteUrl, $localPath^);
116
+
117
+ )
118
+
119
+ @rem Determine the version and the architecture
120
+
121
+ @FOR /F "usebackq tokens=1-8 delims=.[] " %%A IN (`ver`) DO (
122
+ @set WinMajor=%%D
123
+ @set WinMinor=%%E
124
+ @set WinBuild=%%F
125
+ )
126
+
127
+ @echo Detected Windows Version %WinMajor%.%WinMinor% Build %WinBuild%
128
+
129
+ @set LATEST_OS_VERSION_MAJOR=6
130
+ @set LATEST_OS_VERSION_MINOR=3
131
+
132
+ @if /i %WinMajor% GTR %LATEST_OS_VERSION_MAJOR% goto VersionUnknown
133
+ @if /i %WinMajor% EQU %LATEST_OS_VERSION_MAJOR% (
134
+ @if /i %WinMinor% GTR %LATEST_OS_VERSION_MINOR% goto VersionUnknown
135
+ )
136
+
137
+ goto Version%WinMajor%.%WinMinor%
138
+
139
+ :VersionUnknown
140
+ @rem If this is an unknown version of windows set the default
141
+ @set MACHINE_OS=2008r2
142
+ @echo Warning: Unknown version of Windows, assuming default of Windows %MACHINE_OS%
143
+ goto architecture_select
144
+
145
+ :Version6.0
146
+ @set MACHINE_OS=2008
147
+ goto architecture_select
148
+
149
+ :Version5.2
150
+ @set MACHINE_OS=2003r2
151
+ goto architecture_select
152
+
153
+ :Version6.1
154
+ @set MACHINE_OS=2008r2
155
+ goto architecture_select
156
+
157
+ :Version6.2
158
+ @set MACHINE_OS=2012
159
+ goto architecture_select
160
+
161
+ @rem Currently Windows Server 2012 R2 is treated as equivalent to Windows Server 2012
162
+ :Version6.3
163
+ goto Version6.2
164
+
165
+ :architecture_select
166
+ goto Architecture%PROCESSOR_ARCHITEW6432%
167
+
168
+ :Architecture
169
+ goto Architecture%PROCESSOR_ARCHITECTURE%
170
+
171
+ @rem If this is an unknown architecture set the default
172
+ @set MACHINE_ARCH=i686
173
+ goto install
174
+
175
+ :Architecturex86
176
+ @set MACHINE_ARCH=i686
177
+ goto install
178
+
179
+ :Architectureamd64
180
+ @set MACHINE_ARCH=x86_64
181
+ goto install
182
+
183
+ :install
184
+ @rem If user has provided the custom installation command for chef-client then execute it
185
+ chef-client -o recipe[cbk1::rec2]
186
+
187
+ @endlocal
188
+
189
+ @echo off
190
+
191
+
192
+ echo Writing validation key...
193
+
194
+
195
+ echo Validation key written.
196
+ @echo on
197
+
198
+
199
+
200
+
201
+ > C:\chef\client.rb (
202
+ echo.log_level :info
203
+ echo.log_location STDOUT
204
+ echo.
205
+ echo.chef_server_url "https://localhost:443"
206
+ echo.validation_client_name "chef-validator"
207
+ echo.
208
+ echo.file_cache_path "c:/chef/cache"
209
+ echo.file_backup_path "c:/chef/backup"
210
+ echo.cache_options ^({:path =^> "c:/chef/cache/checksums", :skip_expires =^> true}^)
211
+ echo.
212
+ echo.# Using default node name ^(fqdn^)
213
+
214
+ )
215
+
216
+ > C:\chef\first-boot.json (
217
+ echo.{"run_list":null}
218
+ )
219
+
220
+ @echo Starting chef to bootstrap the node...
221
+ SET "PATH=%PATH%;C:\ruby\bin;C:\opscode\chef\bin;C:\opscode\chef\embedded\bin"
222
+ chef-client -c c:/chef/client.rb -j c:/chef/first-boot.json
223
+
@@ -1,335 +1,335 @@
1
- @rem
2
- @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
- @rem License:: Apache License, Version 2.0
5
- @rem
6
- @rem Licensed under the Apache License, Version 2.0 (the "License");
7
- @rem you may not use this file except in compliance with the License.
8
- @rem You may obtain a copy of the License at
9
- @rem
10
- @rem http://www.apache.org/licenses/LICENSE-2.0
11
- @rem
12
- @rem Unless required by applicable law or agreed to in writing, software
13
- @rem distributed under the License is distributed on an "AS IS" BASIS,
14
- @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- @rem See the License for the specific language governing permissions and
16
- @rem limitations under the License.
17
- @rem
18
-
19
- @rem Use delayed environment expansion so that ERRORLEVEL can be evaluated with the
20
- @rem !ERRORLEVEL! syntax which evaluates at execution of the line of script, not when
21
- @rem the line is read. See help for the /E switch from cmd.exe /? .
22
- @setlocal ENABLEDELAYEDEXPANSION
23
-
24
-
25
-
26
- @set BOOTSTRAP_DIRECTORY=C:\chef
27
- @echo Checking for existing directory "%BOOTSTRAP_DIRECTORY%"...
28
- @if NOT EXIST %BOOTSTRAP_DIRECTORY% (
29
- @echo Existing directory not found, creating.
30
- @mkdir %BOOTSTRAP_DIRECTORY%
31
- ) else (
32
- @echo Existing directory found, skipping creation.
33
- )
34
-
35
- > C:\chef\wget.vbs (
36
- echo.url = WScript.Arguments.Named^("url"^)
37
- echo.path = WScript.Arguments.Named^("path"^)
38
- echo.proxy = null
39
- echo.'* Vaguely attempt to handle file:// scheme urls by url unescaping and switching all
40
- echo.'* / into . Also assume that file:/// is a local absolute path and that file://^<foo^>
41
- echo.'* is possibly a network file path.
42
- echo.If InStr^(url, "file://"^) = 1 Then
43
- echo.url = Unescape^(url^)
44
- echo.If InStr^(url, "file:///"^) = 1 Then
45
- echo.sourcePath = Mid^(url, Len^("file:///"^) + 1^)
46
- echo.Else
47
- echo.sourcePath = Mid^(url, Len^("file:"^) + 1^)
48
- echo.End If
49
- echo.sourcePath = Replace^(sourcePath, "/", "\"^)
50
- echo.
51
- echo.Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
52
- echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
53
- echo.objFSO.CopyFile sourcePath, path, true
54
- echo.Set objFSO = Nothing
55
- echo.
56
- echo.Else
57
- echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP"^)
58
- echo.Set wshShell = CreateObject^( "WScript.Shell" ^)
59
- echo.Set objUserVariables = wshShell.Environment^("USER"^)
60
- echo.
61
- echo.rem http proxy is optional
62
- echo.rem attempt to read from HTTP_PROXY env var first
63
- echo.On Error Resume Next
64
- echo.
65
- echo.If NOT ^(objUserVariables^("HTTP_PROXY"^) = ""^) Then
66
- echo.proxy = objUserVariables^("HTTP_PROXY"^)
67
- echo.
68
- echo.rem fall back to named arg
69
- echo.ElseIf NOT ^(WScript.Arguments.Named^("proxy"^) = ""^) Then
70
- echo.proxy = WScript.Arguments.Named^("proxy"^)
71
- echo.End If
72
- echo.
73
- echo.If NOT isNull^(proxy^) Then
74
- echo.rem setProxy method is only available on ServerXMLHTTP 6.0+
75
- echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP.6.0"^)
76
- echo.objXMLHTTP.setProxy 2, proxy
77
- echo.End If
78
- echo.
79
- echo.On Error Goto 0
80
- echo.
81
- echo.objXMLHTTP.open "GET", url, false
82
- echo.objXMLHTTP.send^(^)
83
- echo.If objXMLHTTP.Status = 200 Then
84
- echo.Set objADOStream = CreateObject^("ADODB.Stream"^)
85
- echo.objADOStream.Open
86
- echo.objADOStream.Type = 1
87
- echo.objADOStream.Write objXMLHTTP.ResponseBody
88
- echo.objADOStream.Position = 0
89
- echo.Set objFSO = Createobject^("Scripting.FileSystemObject"^)
90
- echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
91
- echo.Set objFSO = Nothing
92
- echo.objADOStream.SaveToFile path
93
- echo.objADOStream.Close
94
- echo.Set objADOStream = Nothing
95
- echo.End If
96
- echo.Set objXMLHTTP = Nothing
97
- echo.End If
98
-
99
- )
100
-
101
- > C:\chef\wget.ps1 (
102
- echo.param^(
103
- echo. [String] $remoteUrl,
104
- echo. [String] $localPath
105
- echo.^)
106
- echo.
107
- echo.$ProxyUrl = $env:http_proxy;
108
- echo.$webClient = new-object System.Net.WebClient;
109
- echo.
110
- echo.if ^($ProxyUrl -ne ''^) {
111
- echo. $WebProxy = New-Object System.Net.WebProxy^($ProxyUrl,$true^)
112
- echo. $WebClient.Proxy = $WebProxy
113
- echo.}
114
- echo.
115
- echo.$webClient.DownloadFile^($remoteUrl, $localPath^);
116
-
117
- )
118
-
119
- @rem Determine the version and the architecture
120
-
121
- @FOR /F "usebackq tokens=1-8 delims=.[] " %%A IN (`ver`) DO (
122
- @set WinMajor=%%D
123
- @set WinMinor=%%E
124
- @set WinBuild=%%F
125
- )
126
-
127
- @echo Detected Windows Version %WinMajor%.%WinMinor% Build %WinBuild%
128
-
129
- @set LATEST_OS_VERSION_MAJOR=6
130
- @set LATEST_OS_VERSION_MINOR=3
131
-
132
- @if /i %WinMajor% GTR %LATEST_OS_VERSION_MAJOR% goto VersionUnknown
133
- @if /i %WinMajor% EQU %LATEST_OS_VERSION_MAJOR% (
134
- @if /i %WinMinor% GTR %LATEST_OS_VERSION_MINOR% goto VersionUnknown
135
- )
136
-
137
- goto Version%WinMajor%.%WinMinor%
138
-
139
- :VersionUnknown
140
- @rem If this is an unknown version of windows set the default
141
- @set MACHINE_OS=2008r2
142
- @echo Warning: Unknown version of Windows, assuming default of Windows %MACHINE_OS%
143
- goto architecture_select
144
-
145
- :Version6.0
146
- @set MACHINE_OS=2008
147
- goto architecture_select
148
-
149
- :Version5.2
150
- @set MACHINE_OS=2003r2
151
- goto architecture_select
152
-
153
- :Version6.1
154
- @set MACHINE_OS=2008r2
155
- goto architecture_select
156
-
157
- :Version6.2
158
- @set MACHINE_OS=2012
159
- goto architecture_select
160
-
161
- @rem Currently Windows Server 2012 R2 is treated as equivalent to Windows Server 2012
162
- :Version6.3
163
- goto Version6.2
164
-
165
- :architecture_select
166
- goto Architecture%PROCESSOR_ARCHITEW6432%
167
-
168
- :Architecture
169
- goto Architecture%PROCESSOR_ARCHITECTURE%
170
-
171
- @rem If this is an unknown architecture set the default
172
- @set MACHINE_ARCH=i686
173
- goto install
174
-
175
- :Architecturex86
176
- @set MACHINE_ARCH=i686
177
- goto install
178
-
179
- :Architectureamd64
180
- @set MACHINE_ARCH=x86_64
181
- goto install
182
-
183
- :install
184
- @rem If user has provided the custom installation command for chef-client then execute it
185
- @rem Install Chef using chef-client MSI installer
186
-
187
- @set "LOCAL_DESTINATION_MSI_PATH=%TEMP%\chef-client-latest.msi"
188
- @set "CHEF_CLIENT_MSI_LOG_PATH=%TEMP%\chef-client-msi%RANDOM%.log"
189
-
190
- @rem Clear any pre-existing downloads
191
- @echo Checking for existing downloaded package at "%LOCAL_DESTINATION_MSI_PATH%"
192
- @if EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
193
- @echo Found existing downloaded package, deleting.
194
- @del /f /q "%LOCAL_DESTINATION_MSI_PATH%"
195
- @if ERRORLEVEL 1 (
196
- echo Warning: Failed to delete pre-existing package with status code !ERRORLEVEL! > "&2"
197
- )
198
- ) else (
199
- echo No existing downloaded packages to delete.
200
- )
201
-
202
- @rem If there is somehow a name collision, remove pre-existing log
203
- @if EXIST "%CHEF_CLIENT_MSI_LOG_PATH%" del /f /q "%CHEF_CLIENT_MSI_LOG_PATH%"
204
-
205
- @echo Attempting to download client package using PowerShell if available...
206
- @set "REMOTE_SOURCE_MSI_URL=https://www.chef.io/chef/download?p=windows&pv=%MACHINE_OS%&m=%MACHINE_ARCH%&DownloadContext=PowerShell&v=12"
207
- @set powershell_download=powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File C:\chef\wget.ps1 "%REMOTE_SOURCE_MSI_URL%" "%LOCAL_DESTINATION_MSI_PATH%"
208
- @echo !powershell_download!
209
- @call !powershell_download!
210
-
211
- @set DOWNLOAD_ERROR_STATUS=!ERRORLEVEL!
212
-
213
- @if ERRORLEVEL 1 (
214
- @echo Failed PowerShell download with status code !DOWNLOAD_ERROR_STATUS! > "&2"
215
- @if !DOWNLOAD_ERROR_STATUS!==0 set DOWNLOAD_ERROR_STATUS=2
216
- ) else (
217
- @rem Sometimes the error level is not set even when the download failed,
218
- @rem so check for the file to be sure it is there -- if it is not, we will retry
219
- @if NOT EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
220
- echo Failed download: download completed, but downloaded file not found > "&2"
221
- set DOWNLOAD_ERROR_STATUS=2
222
- ) else (
223
- echo Download via PowerShell succeeded.
224
- )
225
- )
226
-
227
- @if NOT %DOWNLOAD_ERROR_STATUS%==0 (
228
- @echo Warning: Failed to download "%REMOTE_SOURCE_MSI_URL%" to "%LOCAL_DESTINATION_MSI_PATH%"
229
- @echo Warning: Retrying download with cscript ...
230
-
231
- @if EXIST "%LOCAL_DESTINATION_MSI_PATH%" del /f /q "%LOCAL_DESTINATION_MSI_PATH%"
232
-
233
- @set "REMOTE_SOURCE_MSI_URL=https://www.chef.io/chef/download?p=windows&pv=%MACHINE_OS%&m=%MACHINE_ARCH%&v=12"
234
- cscript /nologo C:\chef\wget.vbs /url:"%REMOTE_SOURCE_MSI_URL%" /path:"%LOCAL_DESTINATION_MSI_PATH%"
235
-
236
- @if NOT ERRORLEVEL 1 (
237
- @rem Sometimes the error level is not set even when the download failed,
238
- @rem so check for the file to be sure it is there.
239
- @if NOT EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
240
- echo Failed download: download completed, but downloaded file not found > "&2"
241
- echo Exiting without bootstrapping due to download failure. > "&2"
242
- exit /b 1
243
- ) else (
244
- echo Download via cscript succeeded.
245
- )
246
- ) else (
247
- echo Failed to download "%REMOTE_SOURCE_MSI_URL%" with status code !ERRORLEVEL!. > "&2"
248
- echo Exiting without bootstrapping due to download failure. > "&2"
249
- exit /b 1
250
- )
251
- )
252
-
253
- @echo Installing downloaded client package...
254
-
255
- msiexec /qn /log "%CHEF_CLIENT_MSI_LOG_PATH%" /i "%LOCAL_DESTINATION_MSI_PATH%"
256
- @set MSIERRORCODE=!ERRORLEVEL!
257
- @if ERRORLEVEL 1 (
258
- @echo WARNING: Failed to install Chef Client MSI package in remote context with status code !MSIERRORCODE!.
259
- @echo WARNING: This may be due to a defect in operating system update KB2918614: http://support.microsoft.com/kb/2918614
260
- @set OLDLOGLOCATION="%CHEF_CLIENT_MSI_LOG_PATH%-fail.log"
261
- @move "%CHEF_CLIENT_MSI_LOG_PATH%" "!OLDLOGLOCATION!" > NUL
262
- @echo WARNING: Saving installation log of failure at !OLDLOGLOCATION!
263
- @echo WARNING: Retrying installation with local context...
264
- @schtasks /create /f /sc once /st 00:00:00 /tn chefclientbootstraptask /ru SYSTEM /rl HIGHEST /tr "cmd /c msiexec /qn /log '%CHEF_CLIENT_MSI_LOG_PATH%' /i '%LOCAL_DESTINATION_MSI_PATH%' & sleep 2 & waitfor /s %computername% /si chefclientinstalldone"
265
-
266
- @if ERRORLEVEL 1 (
267
- @echo ERROR: Failed to create Chef Client installation scheduled task with status code !ERRORLEVEL! > "&2"
268
- ) else (
269
- @echo Successfully created scheduled task to install Chef Client.
270
- @schtasks /run /tn chefclientbootstraptask
271
- @if ERRORLEVEL 1 (
272
- @echo ERROR: Failed to execut Chef Client installation scheduled task with status code !ERRORLEVEL!. > "&2"
273
- ) else (
274
- @echo Successfully started Chef Client installation scheduled task.
275
- @echo Waiting for installation to complete -- this may take a few minutes...
276
- waitfor chefclientinstalldone /t 600
277
- if ERRORLEVEL 1 (
278
- @echo ERROR: Timed out waiting for Chef Client package to install
279
- ) else (
280
- @echo Finished waiting for Chef Client package to install.
281
- )
282
- @schtasks /delete /f /tn chefclientbootstraptask > NUL
283
- )
284
- )
285
- ) else (
286
- @echo Successfully installed Chef Client package.
287
- )
288
-
289
-
290
- @if ERRORLEVEL 1 (
291
- echo Chef-client package failed to install with status code !ERRORLEVEL!. > "&2"
292
- echo See installation log for additional detail: %CHEF_CLIENT_MSI_LOG_PATH%. > "&2"
293
- ) else (
294
- @echo Installation completed successfully
295
- del /f /q "%CHEF_CLIENT_MSI_LOG_PATH%"
296
- )
297
-
298
-
299
- @endlocal
300
-
301
- @echo off
302
-
303
-
304
- echo Writing validation key...
305
-
306
-
307
- echo Validation key written.
308
- @echo on
309
-
310
-
311
-
312
-
313
- > C:\chef\client.rb (
314
- echo.log_level :info
315
- echo.log_location STDOUT
316
- echo.
317
- echo.chef_server_url "https://localhost:443"
318
- echo.validation_client_name "chef-validator"
319
- echo.
320
- echo.file_cache_path "c:/chef/cache"
321
- echo.file_backup_path "c:/chef/backup"
322
- echo.cache_options ^({:path =^> "c:/chef/cache/checksums", :skip_expires =^> true}^)
323
- echo.
324
- echo.# Using default node name ^(fqdn^)
325
-
326
- )
327
-
328
- > C:\chef\first-boot.json (
329
- echo.{"run_list":null}
330
- )
331
-
332
- @echo Starting chef to bootstrap the node...
333
- SET "PATH=%PATH%;C:\ruby\bin;C:\opscode\chef\bin;C:\opscode\chef\embedded\bin"
334
- chef-client -c c:/chef/client.rb -j c:/chef/first-boot.json
335
-
1
+ @rem
2
+ @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
+ @rem License:: Apache License, Version 2.0
5
+ @rem
6
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
7
+ @rem you may not use this file except in compliance with the License.
8
+ @rem You may obtain a copy of the License at
9
+ @rem
10
+ @rem http://www.apache.org/licenses/LICENSE-2.0
11
+ @rem
12
+ @rem Unless required by applicable law or agreed to in writing, software
13
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
14
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ @rem See the License for the specific language governing permissions and
16
+ @rem limitations under the License.
17
+ @rem
18
+
19
+ @rem Use delayed environment expansion so that ERRORLEVEL can be evaluated with the
20
+ @rem !ERRORLEVEL! syntax which evaluates at execution of the line of script, not when
21
+ @rem the line is read. See help for the /E switch from cmd.exe /? .
22
+ @setlocal ENABLEDELAYEDEXPANSION
23
+
24
+
25
+
26
+ @set BOOTSTRAP_DIRECTORY=C:\chef
27
+ @echo Checking for existing directory "%BOOTSTRAP_DIRECTORY%"...
28
+ @if NOT EXIST %BOOTSTRAP_DIRECTORY% (
29
+ @echo Existing directory not found, creating.
30
+ @mkdir %BOOTSTRAP_DIRECTORY%
31
+ ) else (
32
+ @echo Existing directory found, skipping creation.
33
+ )
34
+
35
+ > C:\chef\wget.vbs (
36
+ echo.url = WScript.Arguments.Named^("url"^)
37
+ echo.path = WScript.Arguments.Named^("path"^)
38
+ echo.proxy = null
39
+ echo.'* Vaguely attempt to handle file:// scheme urls by url unescaping and switching all
40
+ echo.'* / into . Also assume that file:/// is a local absolute path and that file://^<foo^>
41
+ echo.'* is possibly a network file path.
42
+ echo.If InStr^(url, "file://"^) = 1 Then
43
+ echo.url = Unescape^(url^)
44
+ echo.If InStr^(url, "file:///"^) = 1 Then
45
+ echo.sourcePath = Mid^(url, Len^("file:///"^) + 1^)
46
+ echo.Else
47
+ echo.sourcePath = Mid^(url, Len^("file:"^) + 1^)
48
+ echo.End If
49
+ echo.sourcePath = Replace^(sourcePath, "/", "\"^)
50
+ echo.
51
+ echo.Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
52
+ echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
53
+ echo.objFSO.CopyFile sourcePath, path, true
54
+ echo.Set objFSO = Nothing
55
+ echo.
56
+ echo.Else
57
+ echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP"^)
58
+ echo.Set wshShell = CreateObject^( "WScript.Shell" ^)
59
+ echo.Set objUserVariables = wshShell.Environment^("USER"^)
60
+ echo.
61
+ echo.rem http proxy is optional
62
+ echo.rem attempt to read from HTTP_PROXY env var first
63
+ echo.On Error Resume Next
64
+ echo.
65
+ echo.If NOT ^(objUserVariables^("HTTP_PROXY"^) = ""^) Then
66
+ echo.proxy = objUserVariables^("HTTP_PROXY"^)
67
+ echo.
68
+ echo.rem fall back to named arg
69
+ echo.ElseIf NOT ^(WScript.Arguments.Named^("proxy"^) = ""^) Then
70
+ echo.proxy = WScript.Arguments.Named^("proxy"^)
71
+ echo.End If
72
+ echo.
73
+ echo.If NOT isNull^(proxy^) Then
74
+ echo.rem setProxy method is only available on ServerXMLHTTP 6.0+
75
+ echo.Set objXMLHTTP = CreateObject^("MSXML2.ServerXMLHTTP.6.0"^)
76
+ echo.objXMLHTTP.setProxy 2, proxy
77
+ echo.End If
78
+ echo.
79
+ echo.On Error Goto 0
80
+ echo.
81
+ echo.objXMLHTTP.open "GET", url, false
82
+ echo.objXMLHTTP.send^(^)
83
+ echo.If objXMLHTTP.Status = 200 Then
84
+ echo.Set objADOStream = CreateObject^("ADODB.Stream"^)
85
+ echo.objADOStream.Open
86
+ echo.objADOStream.Type = 1
87
+ echo.objADOStream.Write objXMLHTTP.ResponseBody
88
+ echo.objADOStream.Position = 0
89
+ echo.Set objFSO = Createobject^("Scripting.FileSystemObject"^)
90
+ echo.If objFSO.Fileexists^(path^) Then objFSO.DeleteFile path
91
+ echo.Set objFSO = Nothing
92
+ echo.objADOStream.SaveToFile path
93
+ echo.objADOStream.Close
94
+ echo.Set objADOStream = Nothing
95
+ echo.End If
96
+ echo.Set objXMLHTTP = Nothing
97
+ echo.End If
98
+
99
+ )
100
+
101
+ > C:\chef\wget.ps1 (
102
+ echo.param^(
103
+ echo. [String] $remoteUrl,
104
+ echo. [String] $localPath
105
+ echo.^)
106
+ echo.
107
+ echo.$ProxyUrl = $env:http_proxy;
108
+ echo.$webClient = new-object System.Net.WebClient;
109
+ echo.
110
+ echo.if ^($ProxyUrl -ne ''^) {
111
+ echo. $WebProxy = New-Object System.Net.WebProxy^($ProxyUrl,$true^)
112
+ echo. $WebClient.Proxy = $WebProxy
113
+ echo.}
114
+ echo.
115
+ echo.$webClient.DownloadFile^($remoteUrl, $localPath^);
116
+
117
+ )
118
+
119
+ @rem Determine the version and the architecture
120
+
121
+ @FOR /F "usebackq tokens=1-8 delims=.[] " %%A IN (`ver`) DO (
122
+ @set WinMajor=%%D
123
+ @set WinMinor=%%E
124
+ @set WinBuild=%%F
125
+ )
126
+
127
+ @echo Detected Windows Version %WinMajor%.%WinMinor% Build %WinBuild%
128
+
129
+ @set LATEST_OS_VERSION_MAJOR=6
130
+ @set LATEST_OS_VERSION_MINOR=3
131
+
132
+ @if /i %WinMajor% GTR %LATEST_OS_VERSION_MAJOR% goto VersionUnknown
133
+ @if /i %WinMajor% EQU %LATEST_OS_VERSION_MAJOR% (
134
+ @if /i %WinMinor% GTR %LATEST_OS_VERSION_MINOR% goto VersionUnknown
135
+ )
136
+
137
+ goto Version%WinMajor%.%WinMinor%
138
+
139
+ :VersionUnknown
140
+ @rem If this is an unknown version of windows set the default
141
+ @set MACHINE_OS=2008r2
142
+ @echo Warning: Unknown version of Windows, assuming default of Windows %MACHINE_OS%
143
+ goto architecture_select
144
+
145
+ :Version6.0
146
+ @set MACHINE_OS=2008
147
+ goto architecture_select
148
+
149
+ :Version5.2
150
+ @set MACHINE_OS=2003r2
151
+ goto architecture_select
152
+
153
+ :Version6.1
154
+ @set MACHINE_OS=2008r2
155
+ goto architecture_select
156
+
157
+ :Version6.2
158
+ @set MACHINE_OS=2012
159
+ goto architecture_select
160
+
161
+ @rem Currently Windows Server 2012 R2 is treated as equivalent to Windows Server 2012
162
+ :Version6.3
163
+ goto Version6.2
164
+
165
+ :architecture_select
166
+ goto Architecture%PROCESSOR_ARCHITEW6432%
167
+
168
+ :Architecture
169
+ goto Architecture%PROCESSOR_ARCHITECTURE%
170
+
171
+ @rem If this is an unknown architecture set the default
172
+ @set MACHINE_ARCH=i686
173
+ goto install
174
+
175
+ :Architecturex86
176
+ @set MACHINE_ARCH=i686
177
+ goto install
178
+
179
+ :Architectureamd64
180
+ @set MACHINE_ARCH=x86_64
181
+ goto install
182
+
183
+ :install
184
+ @rem If user has provided the custom installation command for chef-client then execute it
185
+ @rem Install Chef using chef-client MSI installer
186
+
187
+ @set "LOCAL_DESTINATION_MSI_PATH=%TEMP%\chef-client-latest.msi"
188
+ @set "CHEF_CLIENT_MSI_LOG_PATH=%TEMP%\chef-client-msi%RANDOM%.log"
189
+
190
+ @rem Clear any pre-existing downloads
191
+ @echo Checking for existing downloaded package at "%LOCAL_DESTINATION_MSI_PATH%"
192
+ @if EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
193
+ @echo Found existing downloaded package, deleting.
194
+ @del /f /q "%LOCAL_DESTINATION_MSI_PATH%"
195
+ @if ERRORLEVEL 1 (
196
+ echo Warning: Failed to delete pre-existing package with status code !ERRORLEVEL! > "&2"
197
+ )
198
+ ) else (
199
+ echo No existing downloaded packages to delete.
200
+ )
201
+
202
+ @rem If there is somehow a name collision, remove pre-existing log
203
+ @if EXIST "%CHEF_CLIENT_MSI_LOG_PATH%" del /f /q "%CHEF_CLIENT_MSI_LOG_PATH%"
204
+
205
+ @echo Attempting to download client package using PowerShell if available...
206
+ @set "REMOTE_SOURCE_MSI_URL=https://www.chef.io/chef/download?p=windows&pv=%MACHINE_OS%&m=%MACHINE_ARCH%&DownloadContext=PowerShell&v=12"
207
+ @set powershell_download=powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File C:\chef\wget.ps1 "%REMOTE_SOURCE_MSI_URL%" "%LOCAL_DESTINATION_MSI_PATH%"
208
+ @echo !powershell_download!
209
+ @call !powershell_download!
210
+
211
+ @set DOWNLOAD_ERROR_STATUS=!ERRORLEVEL!
212
+
213
+ @if ERRORLEVEL 1 (
214
+ @echo Failed PowerShell download with status code !DOWNLOAD_ERROR_STATUS! > "&2"
215
+ @if !DOWNLOAD_ERROR_STATUS!==0 set DOWNLOAD_ERROR_STATUS=2
216
+ ) else (
217
+ @rem Sometimes the error level is not set even when the download failed,
218
+ @rem so check for the file to be sure it is there -- if it is not, we will retry
219
+ @if NOT EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
220
+ echo Failed download: download completed, but downloaded file not found > "&2"
221
+ set DOWNLOAD_ERROR_STATUS=2
222
+ ) else (
223
+ echo Download via PowerShell succeeded.
224
+ )
225
+ )
226
+
227
+ @if NOT %DOWNLOAD_ERROR_STATUS%==0 (
228
+ @echo Warning: Failed to download "%REMOTE_SOURCE_MSI_URL%" to "%LOCAL_DESTINATION_MSI_PATH%"
229
+ @echo Warning: Retrying download with cscript ...
230
+
231
+ @if EXIST "%LOCAL_DESTINATION_MSI_PATH%" del /f /q "%LOCAL_DESTINATION_MSI_PATH%"
232
+
233
+ @set "REMOTE_SOURCE_MSI_URL=https://www.chef.io/chef/download?p=windows&pv=%MACHINE_OS%&m=%MACHINE_ARCH%&v=12"
234
+ cscript /nologo C:\chef\wget.vbs /url:"%REMOTE_SOURCE_MSI_URL%" /path:"%LOCAL_DESTINATION_MSI_PATH%"
235
+
236
+ @if NOT ERRORLEVEL 1 (
237
+ @rem Sometimes the error level is not set even when the download failed,
238
+ @rem so check for the file to be sure it is there.
239
+ @if NOT EXIST "%LOCAL_DESTINATION_MSI_PATH%" (
240
+ echo Failed download: download completed, but downloaded file not found > "&2"
241
+ echo Exiting without bootstrapping due to download failure. > "&2"
242
+ exit /b 1
243
+ ) else (
244
+ echo Download via cscript succeeded.
245
+ )
246
+ ) else (
247
+ echo Failed to download "%REMOTE_SOURCE_MSI_URL%" with status code !ERRORLEVEL!. > "&2"
248
+ echo Exiting without bootstrapping due to download failure. > "&2"
249
+ exit /b 1
250
+ )
251
+ )
252
+
253
+ @echo Installing downloaded client package...
254
+
255
+ msiexec /qn /log "%CHEF_CLIENT_MSI_LOG_PATH%" /i "%LOCAL_DESTINATION_MSI_PATH%"
256
+ @set MSIERRORCODE=!ERRORLEVEL!
257
+ @if ERRORLEVEL 1 (
258
+ @echo WARNING: Failed to install Chef Client MSI package in remote context with status code !MSIERRORCODE!.
259
+ @echo WARNING: This may be due to a defect in operating system update KB2918614: http://support.microsoft.com/kb/2918614
260
+ @set OLDLOGLOCATION="%CHEF_CLIENT_MSI_LOG_PATH%-fail.log"
261
+ @move "%CHEF_CLIENT_MSI_LOG_PATH%" "!OLDLOGLOCATION!" > NUL
262
+ @echo WARNING: Saving installation log of failure at !OLDLOGLOCATION!
263
+ @echo WARNING: Retrying installation with local context...
264
+ @schtasks /create /f /sc once /st 00:00:00 /tn chefclientbootstraptask /ru SYSTEM /rl HIGHEST /tr "cmd /c msiexec /qn /log '%CHEF_CLIENT_MSI_LOG_PATH%' /i '%LOCAL_DESTINATION_MSI_PATH%' & sleep 2 & waitfor /s %computername% /si chefclientinstalldone"
265
+
266
+ @if ERRORLEVEL 1 (
267
+ @echo ERROR: Failed to create Chef Client installation scheduled task with status code !ERRORLEVEL! > "&2"
268
+ ) else (
269
+ @echo Successfully created scheduled task to install Chef Client.
270
+ @schtasks /run /tn chefclientbootstraptask
271
+ @if ERRORLEVEL 1 (
272
+ @echo ERROR: Failed to execut Chef Client installation scheduled task with status code !ERRORLEVEL!. > "&2"
273
+ ) else (
274
+ @echo Successfully started Chef Client installation scheduled task.
275
+ @echo Waiting for installation to complete -- this may take a few minutes...
276
+ waitfor chefclientinstalldone /t 600
277
+ if ERRORLEVEL 1 (
278
+ @echo ERROR: Timed out waiting for Chef Client package to install
279
+ ) else (
280
+ @echo Finished waiting for Chef Client package to install.
281
+ )
282
+ @schtasks /delete /f /tn chefclientbootstraptask > NUL
283
+ )
284
+ )
285
+ ) else (
286
+ @echo Successfully installed Chef Client package.
287
+ )
288
+
289
+
290
+ @if ERRORLEVEL 1 (
291
+ echo Chef-client package failed to install with status code !ERRORLEVEL!. > "&2"
292
+ echo See installation log for additional detail: %CHEF_CLIENT_MSI_LOG_PATH%. > "&2"
293
+ ) else (
294
+ @echo Installation completed successfully
295
+ del /f /q "%CHEF_CLIENT_MSI_LOG_PATH%"
296
+ )
297
+
298
+
299
+ @endlocal
300
+
301
+ @echo off
302
+
303
+
304
+ echo Writing validation key...
305
+
306
+
307
+ echo Validation key written.
308
+ @echo on
309
+
310
+
311
+
312
+
313
+ > C:\chef\client.rb (
314
+ echo.log_level :info
315
+ echo.log_location STDOUT
316
+ echo.
317
+ echo.chef_server_url "https://localhost:443"
318
+ echo.validation_client_name "chef-validator"
319
+ echo.
320
+ echo.file_cache_path "c:/chef/cache"
321
+ echo.file_backup_path "c:/chef/backup"
322
+ echo.cache_options ^({:path =^> "c:/chef/cache/checksums", :skip_expires =^> true}^)
323
+ echo.
324
+ echo.# Using default node name ^(fqdn^)
325
+
326
+ )
327
+
328
+ > C:\chef\first-boot.json (
329
+ echo.{"run_list":null}
330
+ )
331
+
332
+ @echo Starting chef to bootstrap the node...
333
+ SET "PATH=%PATH%;C:\ruby\bin;C:\opscode\chef\bin;C:\opscode\chef\embedded\bin"
334
+ chef-client -c c:/chef/client.rb -j c:/chef/first-boot.json
335
+