chef 0.10.0.beta.5 → 0.10.0.beta.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/lib/chef/application.rb +13 -1
  2. data/lib/chef/application/client.rb +4 -2
  3. data/lib/chef/application/knife.rb +26 -2
  4. data/lib/chef/application/solo.rb +4 -3
  5. data/lib/chef/client.rb +2 -1
  6. data/lib/chef/cookbook_version.rb +2 -1
  7. data/lib/chef/knife.rb +129 -37
  8. data/lib/chef/knife/cookbook_metadata.rb +8 -3
  9. data/lib/chef/knife/cookbook_site_install.rb +3 -127
  10. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  11. data/lib/chef/knife/cookbook_test.rb +13 -2
  12. data/lib/chef/knife/core/cookbook_scm_repo.rb +149 -0
  13. data/lib/chef/knife/core/generic_presenter.rb +184 -0
  14. data/lib/chef/knife/core/node_editor.rb +127 -0
  15. data/lib/chef/knife/core/node_presenter.rb +103 -0
  16. data/lib/chef/knife/core/object_loader.rb +75 -0
  17. data/lib/chef/knife/{subcommand_loader.rb → core/subcommand_loader.rb} +1 -1
  18. data/lib/chef/knife/core/text_formatter.rb +100 -0
  19. data/lib/chef/knife/{ui.rb → core/ui.rb} +53 -73
  20. data/lib/chef/knife/data_bag_from_file.rb +8 -2
  21. data/lib/chef/knife/environment_from_file.rb +14 -3
  22. data/lib/chef/knife/node_edit.rb +14 -105
  23. data/lib/chef/knife/node_from_file.rb +6 -1
  24. data/lib/chef/knife/node_show.rb +6 -0
  25. data/lib/chef/knife/role_from_file.rb +6 -1
  26. data/lib/chef/knife/search.rb +34 -19
  27. data/lib/chef/knife/status.rb +15 -1
  28. data/lib/chef/mixin/recipe_definition_dsl_core.rb +1 -4
  29. data/lib/chef/mixin/shell_out.rb +1 -0
  30. data/lib/chef/node.rb +17 -5
  31. data/lib/chef/resource.rb +42 -19
  32. data/lib/chef/rest.rb +14 -6
  33. data/lib/chef/rest/auth_credentials.rb +1 -1
  34. data/lib/chef/rest/rest_request.rb +26 -1
  35. data/lib/chef/runner.rb +2 -9
  36. data/lib/chef/version.rb +1 -1
  37. metadata +11 -7
  38. data/lib/chef/knife/bootstrap/client-install.vbs +0 -80
  39. data/lib/chef/knife/bootstrap/windows-gems.erb +0 -34
  40. data/lib/chef/knife/windows_bootstrap.rb +0 -157
@@ -372,34 +372,57 @@ F
372
372
  @not_if
373
373
  end
374
374
 
375
+ def defined_at
376
+ if cookbook_name && recipe_name && source_line
377
+ "#{cookbook_name}::#{recipe_name} line #{source_line.split(':')[1]}"
378
+ elsif source_line
379
+ file, line_no = source_line.split(':')
380
+ "#{file} line #{line_no}"
381
+ else
382
+ "dynamically defined"
383
+ end
384
+ end
385
+
375
386
  def run_action(action)
387
+ Chef::Log.info("Processing #{self} action #{action} (#{defined_at})")
388
+
376
389
  # ensure that we don't leave @updated_by_last_action set to true
377
390
  # on accident
378
391
  updated_by_last_action(false)
379
392
 
380
- # Check if this resource has an only_if block -- if it does,
381
- # evaluate the only_if block and skip the resource if
382
- # appropriate.
383
- if only_if
384
- unless Chef::Mixin::Command.only_if(only_if, only_if_args)
385
- Chef::Log.debug("Skipping #{self} due to only_if")
386
- return
393
+ begin
394
+ # Check if this resource has an only_if block -- if it does,
395
+ # evaluate the only_if block and skip the resource if
396
+ # appropriate.
397
+ if only_if
398
+ unless Chef::Mixin::Command.only_if(only_if, only_if_args)
399
+ Chef::Log.debug("Skipping #{self} due to only_if")
400
+ return
401
+ end
387
402
  end
388
- end
389
403
 
390
- # Check if this resource has a not_if block -- if it does,
391
- # evaluate the not_if block and skip the resource if
392
- # appropriate.
393
- if not_if
394
- unless Chef::Mixin::Command.not_if(not_if, not_if_args)
395
- Chef::Log.debug("Skipping #{self} due to not_if")
396
- return
404
+ # Check if this resource has a not_if block -- if it does,
405
+ # evaluate the not_if block and skip the resource if
406
+ # appropriate.
407
+ if not_if
408
+ unless Chef::Mixin::Command.not_if(not_if, not_if_args)
409
+ Chef::Log.debug("Skipping #{self} due to not_if")
410
+ return
411
+ end
397
412
  end
398
- end
399
413
 
400
- provider = Chef::Platform.provider_for_resource(self)
401
- provider.load_current_resource
402
- provider.send("action_#{action}")
414
+ provider = Chef::Platform.provider_for_resource(self)
415
+ provider.load_current_resource
416
+ provider.send("action_#{action}")
417
+ rescue => e
418
+ if ignore_failure
419
+ Chef::Log.error("#{self} (#{defined_at}) had an error: #{e.message}")
420
+ else
421
+ Chef::Log.error("#{self} (#{defined_at}) has had an error")
422
+ msg = e.message
423
+ raise e.exception("#{self} (#{defined_at}) had an error: #{e.message}")
424
+ end
425
+ end
403
426
  end
404
427
 
405
428
  def updated_by_last_action(true_or_false)
@@ -24,7 +24,6 @@ require 'net/https'
24
24
  require 'uri'
25
25
  require 'chef/json_compat'
26
26
  require 'tempfile'
27
- require 'chef/api_client'
28
27
  require 'chef/rest/auth_credentials'
29
28
  require 'chef/rest/rest_request'
30
29
  require 'chef/monkey_patches/string'
@@ -64,6 +63,10 @@ class Chef
64
63
  end
65
64
 
66
65
  # Register the client
66
+ #--
67
+ # Requires you to load chef/api_client beforehand. explicit require is removed since
68
+ # most users of this class have no need for chef/api_client. This functionality
69
+ # should be moved anyway...
67
70
  def register(name=Chef::Config[:node_name], destination=Chef::Config[:client_key])
68
71
  if (File.exists?(destination) && !File.writable?(destination))
69
72
  raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination} - check permissions?"
@@ -229,7 +232,7 @@ class Chef
229
232
  exception = Chef::JSONCompat.from_json(response.body)
230
233
  msg = "HTTP Request Returned #{response.code} #{response.message}: "
231
234
  msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
232
- Chef::Log.warn(msg)
235
+ Chef::Log.info(msg)
233
236
  end
234
237
  response.error!
235
238
  end
@@ -284,6 +287,9 @@ class Chef
284
287
 
285
288
  res = yield rest_request
286
289
 
290
+ rescue SocketError, Errno::ETIMEDOUT => e
291
+ e.message.replace "Error connecting to #{url} - #{e.message}"
292
+ raise e
287
293
  rescue Errno::ECONNREFUSED
288
294
  if http_retry_count - http_attempts + 1 > 0
289
295
  Chef::Log.error("Connection refused connecting to #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
@@ -298,11 +304,13 @@ class Chef
298
304
  retry
299
305
  end
300
306
  raise Timeout::Error, "Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
301
- rescue Net::HTTPServerException
302
- if res.kind_of?(Net::HTTPForbidden)
307
+ rescue Net::HTTPFatalError => e
308
+ case e.response
309
+ when Net::HTTPServiceUnavailable
303
310
  if http_retry_count - http_attempts + 1 > 0
304
- Chef::Log.error("Received 403 Forbidden against #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
305
- sleep(http_retry_delay)
311
+ sleep_time = 1 + (2 ** http_attempts) + rand(2 ** http_attempts)
312
+ Chef::Log.error("Service Unavailable for #{url}, retrying #{http_attempts}/#{http_retry_count} in #{sleep_time}s")
313
+ sleep(sleep_time)
306
314
  retry
307
315
  end
308
316
  end
@@ -58,7 +58,7 @@ class Chef
58
58
  @raw_key = IO.read(key_file).strip
59
59
  @key = OpenSSL::PKey::RSA.new(@raw_key)
60
60
  rescue SystemCallError, IOError => e
61
- Chef::Log.fatal "Failed to read the private key #{key_file}: #{e.inspect}, #{e.backtrace}"
61
+ Chef::Log.warn "Failed to read the private key #{key_file}: #{e.inspect}"
62
62
  raise Chef::Exceptions::PrivateKeyMissing, "I cannot read #{key_file}, which you told me to use to sign requests!"
63
63
  rescue OpenSSL::PKey::RSAError
64
64
  msg = "The file #{key_file} does not contain a correctly formatted private key.\n"
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
3
  # Author:: Thom May (<thom@clearairturbulence.org>)
4
4
  # Author:: Nuo Yan (<nuo@opscode.com>)
@@ -23,11 +23,35 @@
23
23
  require 'uri'
24
24
  require 'net/http'
25
25
  require 'chef/rest/cookie_jar'
26
+
27
+ # To load faster, we only want ohai's version string.
28
+ # However, in ohai before 0.6.0, the version is defined
29
+ # in ohai, not ohai/version
30
+ begin
31
+ require 'ohai/version' #used in user agent string.
32
+ rescue LoadError
33
+ require 'ohai'
34
+ end
35
+
26
36
  require 'chef/version'
27
37
 
28
38
  class Chef
29
39
  class REST
30
40
  class RESTRequest
41
+
42
+ engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
43
+
44
+ UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +http://opscode.com)"
45
+ DEFAULT_UA = "Chef Client" << UA_COMMON
46
+
47
+ def self.user_agent=(ua)
48
+ @user_agent = ua
49
+ end
50
+
51
+ def self.user_agent
52
+ @user_agent ||= DEFAULT_UA
53
+ end
54
+
31
55
  attr_reader :method, :url, :headers, :http_client, :http_request
32
56
 
33
57
  def initialize(method, url, req_body, base_headers={})
@@ -181,6 +205,7 @@ class Chef
181
205
  @http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
182
206
  # Optionally handle HTTP Basic Authentication
183
207
  @http_request.basic_auth(url.user, url.password) if url.user
208
+ @http_request['User-Agent'] = self.class.user_agent
184
209
  end
185
210
 
186
211
  end
@@ -74,15 +74,8 @@ class Chef
74
74
 
75
75
  # Execute each resource.
76
76
  run_context.resource_collection.execute_each_resource do |resource|
77
- begin
78
- Chef::Log.debug("Processing #{resource} on #{run_context.node.name}")
79
-
80
- # Execute each of this resource's actions.
81
- Array(resource.action).each {|action| run_action(resource, action)}
82
- rescue => e
83
- Chef::Log.error("#{resource} (#{resource.source_line}) had an error:\n#{e}\n#{e.backtrace.join("\n")}")
84
- raise e unless resource.ignore_failure
85
- end
77
+ # Execute each of this resource's actions.
78
+ Array(resource.action).each {|action| run_action(resource, action) }
86
79
  end
87
80
 
88
81
  # Run all our :delayed actions
@@ -17,7 +17,7 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '0.10.0.beta.5'
20
+ VERSION = '0.10.0.beta.6'
21
21
  end
22
22
 
23
23
  # NOTE: the Chef::Version class is defined in version_class.rb
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 7
5
- version: 0.10.0.beta.5
5
+ version: 0.10.0.beta.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Adam Jacob
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-31 00:00:00 -07:00
13
+ date: 2011-04-04 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -295,11 +295,9 @@ files:
295
295
  - lib/chef/json_compat.rb
296
296
  - lib/chef/knife/bootstrap/archlinux-gems.erb
297
297
  - lib/chef/knife/bootstrap/centos5-gems.erb
298
- - lib/chef/knife/bootstrap/client-install.vbs
299
298
  - lib/chef/knife/bootstrap/fedora13-gems.erb
300
299
  - lib/chef/knife/bootstrap/ubuntu10.04-apt.erb
301
300
  - lib/chef/knife/bootstrap/ubuntu10.04-gems.erb
302
- - lib/chef/knife/bootstrap/windows-gems.erb
303
301
  - lib/chef/knife/bootstrap.rb
304
302
  - lib/chef/knife/client_bulk_delete.rb
305
303
  - lib/chef/knife/client_create.rb
@@ -325,8 +323,17 @@ files:
325
323
  - lib/chef/knife/cookbook_site_share.rb
326
324
  - lib/chef/knife/cookbook_site_show.rb
327
325
  - lib/chef/knife/cookbook_site_unshare.rb
326
+ - lib/chef/knife/cookbook_site_vendor.rb
328
327
  - lib/chef/knife/cookbook_test.rb
329
328
  - lib/chef/knife/cookbook_upload.rb
329
+ - lib/chef/knife/core/cookbook_scm_repo.rb
330
+ - lib/chef/knife/core/generic_presenter.rb
331
+ - lib/chef/knife/core/node_editor.rb
332
+ - lib/chef/knife/core/node_presenter.rb
333
+ - lib/chef/knife/core/object_loader.rb
334
+ - lib/chef/knife/core/subcommand_loader.rb
335
+ - lib/chef/knife/core/text_formatter.rb
336
+ - lib/chef/knife/core/ui.rb
330
337
  - lib/chef/knife/data_bag_create.rb
331
338
  - lib/chef/knife/data_bag_delete.rb
332
339
  - lib/chef/knife/data_bag_edit.rb
@@ -361,12 +368,9 @@ files:
361
368
  - lib/chef/knife/search.rb
362
369
  - lib/chef/knife/ssh.rb
363
370
  - lib/chef/knife/status.rb
364
- - lib/chef/knife/subcommand_loader.rb
365
371
  - lib/chef/knife/tag_create.rb
366
372
  - lib/chef/knife/tag_delete.rb
367
373
  - lib/chef/knife/tag_list.rb
368
- - lib/chef/knife/ui.rb
369
- - lib/chef/knife/windows_bootstrap.rb
370
374
  - lib/chef/knife.rb
371
375
  - lib/chef/log.rb
372
376
  - lib/chef/mash.rb
@@ -1,80 +0,0 @@
1
- '
2
- ' Author:: Doug MacEachern <dougm@vmware.com>
3
- ' Copyright:: Copyright (c) 2010 VMware, Inc.
4
- ' License:: Apache License, Version 2.0
5
- '
6
- ' Licensed under the Apache License, Version 2.0 (the "License");
7
- ' you may not use this file except in compliance with the License.
8
- ' You may obtain a copy of the License at
9
- '
10
- ' http://www.apache.org/licenses/LICENSE-2.0
11
- '
12
- ' Unless required by applicable law or agreed to in writing, software
13
- ' distributed under the License is distributed on an "AS IS" BASIS,
14
- ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- ' See the License for the specific language governing permissions and
16
- ' limitations under the License.
17
- '
18
- ' download & install ruby && install chef client gems
19
-
20
- Exe = "rubyinstaller-1.8.7-p249-rc2.exe"
21
- Url = "http://rubyforge.org/frs/download.php/69034/" & Exe
22
- Dst = "C:\Ruby"
23
- Proxy = ""
24
- If WScript.Arguments.Count = 1 Then
25
- Proxy = WScript.Arguments.Item(0)
26
- WScript.Echo "Using HTTP proxy=" & Proxy
27
- End If
28
-
29
- Set Shell = CreateObject("WScript.Shell")
30
- Set Fs = CreateObject("Scripting.FileSystemObject")
31
- If Fs.FileExists(Exe) Then
32
- WScript.Echo "Using existing " & Exe
33
- Else
34
- WScript.Echo "Downloading " & Url
35
- Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
36
- If Proxy <> "" Then
37
- Http.setProxy 2, Proxy, ""
38
- End If
39
- Http.Open "GET", Url, False
40
- Http.Send
41
- Set BinaryStream = CreateObject("ADODB.Stream")
42
- BinaryStream.Type = 1
43
- BinaryStream.Open
44
- BinaryStream.Write Http.ResponseBody
45
- BinaryStream.SaveToFile Exe, 2
46
- BinaryStream.Close
47
- End If
48
-
49
- Ruby = Dst & "\bin\ruby.exe"
50
-
51
- If Fs.FileExists(Ruby) Then
52
- WScript.Echo Dst & " exists"
53
- Else
54
- WScript.Echo "Installing " & Exe & " to " & Dst
55
- Cmd = Exe & " /dir=" & Dst & " /verysilent /tasks=assocfiles,modpath"
56
- WScript.Echo Cmd
57
- Set Exec = Shell.Exec(Cmd)
58
- Do Until Exec.StdOut.AtEndOfStream
59
- Line = Exec.StdOut.ReadLine()
60
- Wscript.Echo Line
61
- Loop
62
- End If
63
-
64
- GemProxy = ""
65
- If Proxy <> "" Then
66
- GemProxy = " --http-proxy=http://" & Proxy
67
- End If
68
-
69
- Cmd = Ruby & " " & Dst & "\bin\gem install" & GemProxy & " --no-ri --no-rdoc chef ruby-wmi windows-pr win32-open3 rubyzip"
70
- WScript.Echo Cmd
71
- Set Exec = Shell.Exec(Cmd)
72
- Do Until Exec.StdOut.AtEndOfStream
73
- Line = Exec.StdOut.ReadLine()
74
- Wscript.Echo Line
75
- Loop
76
- Do Until Exec.StdErr.AtEndOfStream
77
- Line = Exec.StdErr.ReadLine()
78
- Wscript.Echo Line
79
- Loop
80
-
@@ -1,34 +0,0 @@
1
- cscript /nologo client-install.vbs <%= @config[:proxy] %>
2
-
3
- > c:/chef/etc/client.rb (
4
- @echo.log_level :info
5
- @echo.log_location STDOUT
6
- @echo.chef_server_url "<%= Chef::Config[:chef_server_url] %>"
7
- @echo.validation_client_name "<%= Chef::Config[:validation_client_name] %>"
8
- @echo.client_key "c:/chef/etc/client.pem"
9
- @echo.validation_key "c:/chef/etc/validation.pem"
10
- @echo.checksum_path "c:/chef/var/checksums"
11
- @echo.file_cache_path "c:/chef/var/cache"
12
- @echo.file_backup_path "c:/chef/var/backup"
13
- @echo.cache_options ^( {:path, "c:/chef/var/cache/checksums", :skip_expires, true} ^)
14
- <% if Chef::Config[:http_proxy] != nil %>
15
- @echo.http_proxy "<%= Chef::Config[:http_proxy] %>"
16
- <% end %>
17
- <% if Chef::Config[:https_proxy] != nil %>
18
- @echo.https_proxy "<%= Chef::Config[:https_proxy] %>"
19
- <% end %>
20
- <% if Chef::Config[:no_proxy] != nil %>
21
- @echo.no_proxy "<%= Chef::Config[:no_proxy] %>"
22
- <% end %>
23
- <% if @config[:chef_node_name] == nil %>
24
- @echo.# Using default node name
25
- <% else %>
26
- @echo.node_name "<%= @config[:chef_node_name] %>"
27
- <% end %>
28
- )
29
-
30
- > c:/chef/etc/first-boot.json (
31
- @echo.<%= { "run_list" => @run_list }.to_json %>
32
- )
33
-
34
- c:/ruby/bin/ruby c:/ruby/bin/chef-client -c c:/chef/etc/client.rb -j c:/chef/etc/first-boot.json -l <%= Chef::Config[:log_level] %>"
@@ -1,157 +0,0 @@
1
- #
2
- # Author:: Doug MacEachern <dougm@vmware.com>
3
- # Copyright:: Copyright (c) 2010 VMware, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require 'fileutils'
20
-
21
- class Chef
22
- class Knife
23
- class WindowsBootstrap < Chef::Knife::Bootstrap
24
-
25
- deps do
26
- require 'chef/knife/bootstrap.rb'
27
- end
28
-
29
- banner "knife windows bootstrap FQDN [RUN LIST...] (options)"
30
-
31
- option :user,
32
- :short => "-x USERNAME",
33
- :long => "--user USERNAME",
34
- :description => "The Windows username"
35
-
36
- option :password,
37
- :short => "-P PASSWORD",
38
- :long => "--password PASSWORD",
39
- :description => "The Windows password"
40
-
41
- option :chef_node_name,
42
- :short => "-N NAME",
43
- :long => "--node-name NAME",
44
- :description => "The Chef node name for your new node"
45
-
46
- option :distro,
47
- :short => "-d DISTRO",
48
- :long => "--distro DISTRO",
49
- :description => "Bootstrap a distro using a template",
50
- :default => "windows-gems"
51
-
52
- option :template_file,
53
- :long => "--template-file TEMPLATE",
54
- :description => "Full path to location of template to use",
55
- :default => false
56
-
57
- option :run_list,
58
- :short => "-r RUN_LIST",
59
- :long => "--run-list RUN_LIST",
60
- :description => "Comma separated list of roles/recipes to apply",
61
- :proc => lambda { |o| o.split(",") },
62
- :default => []
63
-
64
- def is_mounted
65
- @net_use ||= Chef::Util::Windows::NetUse.new(@admin_share)
66
- begin
67
- @net_use.get_info
68
- return true
69
- rescue
70
- return false
71
- end
72
- end
73
-
74
- def mount_admin_share
75
- if @add_mount && !is_mounted
76
- use = {
77
- :remote => @admin_share, :local => '',
78
- :username => config[:user], :password => config[:password]
79
- }
80
- @net_use.add(use)
81
- if is_mounted
82
- ui.info("Mounted #{@admin_share} for copying files")
83
- else
84
- ui.fatal("Failed to mount #{@admin_share}")
85
- exit 1
86
- end
87
- end
88
- end
89
-
90
- def unmount_admin_share
91
- if @add_mount && is_mounted
92
- Chef::Log.debug("Unmounting #{@admin_share}")
93
- @net_use.delete
94
- end
95
- end
96
-
97
- def psexec(args)
98
- cmd = ['psexec', @unc_path, "-h", "-w", 'c:\chef\tmp']
99
- if config[:user]
100
- cmd << "-u" << config[:user]
101
- end
102
- if config[:password]
103
- cmd << "-p" << config[:password]
104
- end
105
- cmd << args
106
- cmd = cmd.join(' ')
107
- Chef::Log.debug("system #{cmd}")
108
- system(cmd)
109
- end
110
-
111
- def run
112
- require 'chef/util/windows/net_use'
113
-
114
- if @name_args.first == nil
115
- ui.error("Must pass a node name/ip to windows bootstrap")
116
- exit 1
117
- end
118
-
119
- config[:server_name] = @name_args.first
120
- if Chef::Config[:http_proxy]
121
- uri = URI.parse(Chef::Config[:http_proxy])
122
- config[:proxy] = "#{uri.host}:#{uri.port}"
123
- end
124
-
125
- @unc_path = "\\\\#{config[:server_name]}"
126
- @admin_share = "#{@unc_path}\\c$"
127
- path = "#{@admin_share}\\chef"
128
- etc = "#{path}\\etc"
129
- tmp = "#{path}\\tmp"
130
-
131
- $stdout.sync = true
132
-
133
- command = render_template(load_template(config[:bootstrap_template]))
134
-
135
- ui.info("Bootstrapping Chef on #{config[:server_name]}")
136
-
137
- @add_mount = config[:user] != nil && !is_mounted
138
- mount_admin_share
139
-
140
- begin
141
- [etc, tmp, "#{path}\\log"].each do |dir|
142
- unless File.exists?(dir)
143
- Chef::Log.debug("mkdir_p #{dir}")
144
- FileUtils.mkdir_p(dir)
145
- end
146
- end
147
- File.open("#{tmp}\\bootstrap.bat", 'w') {|f| f.write(command) }
148
- FileUtils.cp(File.join(File.dirname(__FILE__), 'bootstrap', 'client-install.vbs'), tmp)
149
- FileUtils.cp(Chef::Config[:validation_key], etc)
150
- psexec("cmd.exe /c bootstrap.bat")
151
- ensure
152
- unmount_admin_share
153
- end
154
- end
155
- end
156
- end
157
- end