chef 11.14.0.alpha.2-x86-mingw32 → 11.14.0.alpha.3-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/bin/chef-service-manager +1 -1
  3. data/lib/chef/application.rb +8 -2
  4. data/lib/chef/chef_fs/command_line.rb +4 -4
  5. data/lib/chef/chef_fs/file_system.rb +3 -3
  6. data/lib/chef/chef_fs/parallelizer.rb +66 -90
  7. data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +35 -0
  8. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +279 -0
  9. data/lib/chef/config.rb +36 -2
  10. data/lib/chef/cookbook/cookbook_version_loader.rb +0 -1
  11. data/lib/chef/cookbook/synchronizer.rb +64 -42
  12. data/lib/chef/cookbook_uploader.rb +4 -25
  13. data/lib/chef/cookbook_version.rb +12 -11
  14. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +18 -1
  15. data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +1 -3
  16. data/lib/chef/knife/bootstrap.rb +23 -1
  17. data/lib/chef/knife/bootstrap/chef-aix.erb +58 -0
  18. data/lib/chef/knife/bootstrap/chef-full.erb +16 -13
  19. data/lib/chef/knife/core/bootstrap_context.rb +25 -1
  20. data/lib/chef/knife/list.rb +9 -8
  21. data/lib/chef/knife/serve.rb +44 -0
  22. data/lib/chef/knife/show.rb +2 -3
  23. data/lib/chef/knife/ssh.rb +1 -0
  24. data/lib/chef/mixin/create_path.rb +20 -4
  25. data/lib/chef/node.rb +19 -3
  26. data/lib/chef/platform/provider_mapping.rb +0 -1
  27. data/lib/chef/platform/query_helpers.rb +4 -3
  28. data/lib/chef/provider/env/windows.rb +10 -3
  29. data/lib/chef/provider/file.rb +1 -1
  30. data/lib/chef/provider/mount.rb +84 -42
  31. data/lib/chef/provider/package/freebsd/base.rb +92 -0
  32. data/lib/chef/provider/package/freebsd/pkg.rb +113 -0
  33. data/lib/chef/provider/package/freebsd/pkgng.rb +80 -0
  34. data/lib/chef/provider/package/freebsd/port.rb +70 -0
  35. data/lib/chef/providers.rb +3 -1
  36. data/lib/chef/resource/chef_gem.rb +2 -1
  37. data/lib/chef/resource/freebsd_package.rb +39 -3
  38. data/lib/chef/resource/lwrp_base.rb +2 -2
  39. data/lib/chef/resource/mount.rb +9 -9
  40. data/lib/chef/util/threaded_job_queue.rb +61 -0
  41. data/lib/chef/version.rb +1 -1
  42. data/lib/chef/version/platform.rb +2 -0
  43. data/lib/chef/whitelist.rb +82 -0
  44. data/lib/chef/win32/registry.rb +0 -1
  45. data/lib/chef/win32/version.rb +4 -3
  46. data/spec/functional/win32/versions_spec.rb +4 -4
  47. data/spec/integration/client/ipv6_spec.rb +1 -1
  48. data/spec/integration/knife/chef_fs_data_store_spec.rb +1 -1
  49. data/spec/integration/knife/chef_repo_path_spec.rb +4 -1
  50. data/spec/integration/knife/common_options_spec.rb +9 -9
  51. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +2 -2
  52. data/spec/integration/knife/deps_spec.rb +3 -0
  53. data/spec/integration/knife/list_spec.rb +3 -0
  54. data/spec/integration/knife/raw_spec.rb +5 -2
  55. data/spec/integration/knife/redirection_spec.rb +4 -1
  56. data/spec/integration/knife/serve_spec.rb +57 -0
  57. data/spec/integration/knife/show_spec.rb +3 -0
  58. data/spec/support/pedant/run_pedant.rb +1 -0
  59. data/spec/support/platform_helpers.rb +7 -5
  60. data/spec/support/shared/context/config.rb +21 -0
  61. data/spec/support/shared/functional/file_resource.rb +52 -0
  62. data/spec/unit/chef_fs/parallelizer.rb +482 -0
  63. data/spec/unit/client_spec.rb +4 -2
  64. data/spec/unit/config_spec.rb +66 -12
  65. data/spec/unit/knife/bootstrap_spec.rb +6 -0
  66. data/spec/unit/knife/core/bootstrap_context_spec.rb +31 -1
  67. data/spec/unit/node_spec.rb +73 -3
  68. data/spec/unit/provider/mount_spec.rb +102 -79
  69. data/spec/unit/provider/package/{freebsd_spec.rb → freebsd/pkg_spec.rb} +19 -32
  70. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +155 -0
  71. data/spec/unit/provider/package/freebsd/port_spec.rb +160 -0
  72. data/spec/unit/resource/chef_gem_spec.rb +5 -0
  73. data/spec/unit/resource/freebsd_package_spec.rb +63 -11
  74. data/spec/unit/resource/mount_spec.rb +11 -0
  75. data/spec/unit/role_spec.rb +5 -1
  76. data/spec/unit/run_lock_spec.rb +2 -0
  77. data/spec/unit/util/threaded_job_queue_spec.rb +51 -0
  78. data/spec/unit/version/platform_spec.rb +1 -1
  79. metadata +176 -161
  80. data/lib/chef/provider/package/freebsd.rb +0 -149
data/lib/chef/config.rb CHANGED
@@ -142,7 +142,7 @@ class Chef
142
142
  end
143
143
  end
144
144
  else
145
- platform_specific_path("/var/chef")
145
+ cache_path
146
146
  end
147
147
  end
148
148
 
@@ -240,10 +240,28 @@ class Chef
240
240
  if local_mode
241
241
  "#{config_dir}local-mode-cache"
242
242
  else
243
- platform_specific_path("/var/chef")
243
+ primary_cache_root = platform_specific_path("/var")
244
+ primary_cache_path = platform_specific_path("/var/chef")
245
+ # Use /var/chef as the cache path only if that folder exists and we can read and write
246
+ # into it, or /var exists and we can read and write into it (we'll create /var/chef later).
247
+ # Otherwise, we'll create .chef under the user's home directory and use that as
248
+ # the cache path.
249
+ unless path_accessible?(primary_cache_path) || path_accessible?(primary_cache_root)
250
+ secondary_cache_path = File.join(user_home, '.chef')
251
+ secondary_cache_path.gsub!(File::SEPARATOR, platform_path_separator) # Safety, mainly for Windows...
252
+ Chef::Log.info("Unable to access cache at #{primary_cache_path}. Switching cache to #{secondary_cache_path}")
253
+ secondary_cache_path
254
+ else
255
+ primary_cache_path
256
+ end
244
257
  end
245
258
  end
246
259
 
260
+ # Returns true only if the path exists and is readable and writeable for the user.
261
+ def self.path_accessible?(path)
262
+ File.exists?(path) && File.readable?(path) && File.writable?(path)
263
+ end
264
+
247
265
  # Where cookbook files are stored on the server (by content checksum)
248
266
  default(:checksum_path) { path_join(cache_path, "checksums") }
249
267
 
@@ -307,6 +325,7 @@ class Chef
307
325
  config_strict_mode true
308
326
  default(:enabled) { Chef::Config.local_mode }
309
327
  default :port, 8889
328
+ default :host, 'localhost'
310
329
  end
311
330
  default :chef_server_url, "https://localhost:443"
312
331
 
@@ -552,6 +571,21 @@ class Chef
552
571
  # immediately if 0.)
553
572
  default :run_lock_timeout, nil
554
573
 
574
+ # Number of worker threads for syncing cookbooks in parallel. Increasing
575
+ # this number can result in gateway errors from the server (namely 503 and 504).
576
+ # If you are seeing this behavior while using the default setting, reducing
577
+ # the number of threads will help.
578
+ default :cookbook_sync_threads, 10
579
+
580
+ # A whitelisted array of attributes you want sent over the wire when node
581
+ # data is saved.
582
+ # The default setting is nil, which collects all data. Setting to [] will not
583
+ # collect any data for save.
584
+ default :automatic_attribute_whitelist, nil
585
+ default :default_attribute_whitelist, nil
586
+ default :normal_attribute_whitelist, nil
587
+ default :override_attribute_whitelist, nil
588
+
555
589
  # If installed via an omnibus installer, this gives the path to the
556
590
  # "embedded" directory which contains all of the software packaged with
557
591
  # omnibus. This is used to locate the cacert.pem file on windows.
@@ -1,5 +1,4 @@
1
1
 
2
- require 'chef/config'
3
2
  require 'chef/cookbook_version'
4
3
  require 'chef/cookbook/chefignore'
5
4
  require 'chef/cookbook/metadata'
@@ -1,4 +1,5 @@
1
1
  require 'chef/client'
2
+ require 'chef/util/threaded_job_queue'
2
3
  require 'singleton'
3
4
 
4
5
  class Chef
@@ -56,6 +57,8 @@ class Chef
56
57
  # Synchronizes the locally cached copies of cookbooks with the files on the
57
58
  # server.
58
59
  class CookbookSynchronizer
60
+ CookbookFile = Struct.new(:cookbook, :segment, :manifest_record)
61
+
59
62
  def initialize(cookbooks_by_name, events)
60
63
  @eager_segments = Chef::CookbookVersion::COOKBOOK_SEGMENTS.dup
61
64
  unless Chef::Config[:no_lazy_load]
@@ -87,6 +90,38 @@ class Chef
87
90
  @cookbooks_by_name.key?(cookbook_name)
88
91
  end
89
92
 
93
+ def files
94
+ @files ||= cookbooks.inject([]) do |memo, cookbook|
95
+ @eager_segments.each do |segment|
96
+ cookbook.manifest[segment].each do |manifest_record|
97
+ memo << CookbookFile.new(cookbook, segment, manifest_record)
98
+ end
99
+ end
100
+ memo
101
+ end
102
+ end
103
+
104
+ def files_by_cookbook
105
+ files.group_by { |file| file.cookbook }
106
+ end
107
+
108
+ def files_remaining_by_cookbook
109
+ @files_remaining_by_cookbook ||= begin
110
+ files_by_cookbook.inject({}) do |memo, (cookbook, files)|
111
+ memo[cookbook] = files.size
112
+ memo
113
+ end
114
+ end
115
+ end
116
+
117
+ def mark_file_synced(file)
118
+ files_remaining_by_cookbook[file.cookbook] -= 1
119
+
120
+ if files_remaining_by_cookbook[file.cookbook] == 0
121
+ @events.synchronized_cookbook(file.cookbook.name)
122
+ end
123
+ end
124
+
90
125
  # Synchronizes all the cookbooks from the chef-server.
91
126
  #)
92
127
  # === Returns
@@ -97,14 +132,19 @@ class Chef
97
132
 
98
133
  clear_obsoleted_cookbooks
99
134
 
100
- @events.cookbook_sync_start(cookbook_count)
135
+ queue = Chef::Util::ThreadedJobQueue.new
101
136
 
102
- # Synchronize each of the node's cookbooks, and add to the
103
- # valid_cache_entries hash.
104
- cookbooks.each do |cookbook|
105
- sync_cookbook(cookbook)
137
+ files.each do |file|
138
+ queue << lambda do |lock|
139
+ sync_file(file)
140
+ lock.synchronize { mark_file_synced(file) }
141
+ end
106
142
  end
107
143
 
144
+ @events.cookbook_sync_start(cookbook_count)
145
+ queue.process(Chef::Config[:cookbook_sync_threads])
146
+ update_cookbook_filenames
147
+
108
148
  rescue Exception => e
109
149
  @events.cookbook_sync_failed(cookbooks, e)
110
150
  raise
@@ -129,61 +169,43 @@ class Chef
129
169
  @events.cookbook_clean_complete
130
170
  end
131
171
 
132
- # Sync the eagerly loaded files contained by +cookbook+
133
- #
134
- # === Arguments
135
- # cookbook<Chef::Cookbook>:: The cookbook to update
136
- # valid_cache_entries<Hash>:: Out-param; Added to this hash are the files that
137
- # were referred to by this cookbook
138
- def sync_cookbook(cookbook)
139
- Chef::Log.debug("Synchronizing cookbook #{cookbook.name} #{cookbook.version}")
140
-
141
- # files and templates are lazily loaded, and will be done later.
142
-
143
- @eager_segments.each do |segment|
144
- segment_filenames = Array.new
145
- cookbook.manifest[segment].each do |manifest_record|
146
-
147
- cache_filename = sync_file_in_cookbook(cookbook, manifest_record)
148
- # make the segment filenames a full path.
149
- full_path_cache_filename = cache.load(cache_filename, false)
150
- segment_filenames << full_path_cache_filename
151
- end
172
+ def update_cookbook_filenames
173
+ files_by_cookbook.each do |cookbook, cookbook_files|
174
+ files_by_segment = cookbook_files.group_by { |file| file.segment }
175
+ @eager_segments.each do |segment|
176
+ segment_files = files_by_segment[segment]
177
+ next unless segment_files
152
178
 
153
- # replace segment filenames with a full-path one.
154
- if segment.to_sym == :recipes
155
- cookbook.recipe_filenames = segment_filenames
156
- elsif segment.to_sym == :attributes
157
- cookbook.attribute_filenames = segment_filenames
158
- else
159
- cookbook.segment_filenames(segment).replace(segment_filenames)
179
+ filenames = segment_files.map { |file| file.manifest_record['path'] }
180
+ cookbook.replace_segment_filenames(segment, filenames)
160
181
  end
161
182
  end
162
- @events.synchronized_cookbook(cookbook.name)
163
183
  end
164
184
 
165
185
  # Sync an individual file if needed. If there is an up to date copy
166
- # locally, nothing is done.
186
+ # locally, nothing is done. Updates +file+'s manifest with the full path to
187
+ # the cached file.
167
188
  #
168
189
  # === Arguments
169
- # file_manifest::: A Hash of the form {"path" => 'relative/path', "url" => "location to fetch the file"}
190
+ # file<CookbookFile>
170
191
  # === Returns
171
- # Path to the cached file as a String
172
- def sync_file_in_cookbook(cookbook, file_manifest)
173
- cache_filename = File.join("cookbooks", cookbook.name, file_manifest['path'])
192
+ # Full path to the cached file as a String
193
+ def sync_file(file)
194
+ cache_filename = File.join("cookbooks", file.cookbook.name, file.manifest_record['path'])
174
195
  mark_cached_file_valid(cache_filename)
175
196
 
176
197
  # If the checksums are different between on-disk (current) and on-server
177
198
  # (remote, per manifest), do the update. This will also execute if there
178
199
  # is no current checksum.
179
- if !cached_copy_up_to_date?(cache_filename, file_manifest['checksum'])
180
- download_file(file_manifest['url'], cache_filename)
181
- @events.updated_cookbook_file(cookbook.name, cache_filename)
200
+ if !cached_copy_up_to_date?(cache_filename, file.manifest_record['checksum'])
201
+ download_file(file.manifest_record['url'], cache_filename)
202
+ @events.updated_cookbook_file(file.cookbook.name, cache_filename)
182
203
  else
183
204
  Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
184
205
  end
185
206
 
186
- cache_filename
207
+ # Update the manifest with the full path to the cached file
208
+ file.manifest_record['path'] = cache.load(cache_filename, false)
187
209
  end
188
210
 
189
211
  def cached_copy_up_to_date?(local_path, expected_checksum)
@@ -7,29 +7,12 @@ require 'chef/digester'
7
7
  require 'chef/cookbook_version'
8
8
  require 'chef/cookbook/syntax_check'
9
9
  require 'chef/cookbook/file_system_file_vendor'
10
+ require 'chef/util/threaded_job_queue'
10
11
  require 'chef/sandbox'
11
- require 'thread'
12
12
 
13
13
  class Chef
14
14
  class CookbookUploader
15
15
 
16
- def self.work_queue
17
- @work_queue ||= Queue.new
18
- end
19
-
20
- def self.setup_worker_threads(concurrency=10)
21
- @worker_threads ||= begin
22
- work_queue
23
- (1..concurrency).map do
24
- Thread.new do
25
- loop do
26
- work_queue.pop.call
27
- end
28
- end
29
- end
30
- end
31
- end
32
-
33
16
  attr_reader :cookbooks
34
17
  attr_reader :path
35
18
  attr_reader :opts
@@ -61,8 +44,6 @@ class Chef
61
44
  end
62
45
 
63
46
  def upload_cookbooks
64
- Thread.abort_on_exception = true
65
-
66
47
  # Syntax Check
67
48
  validate_cookbooks
68
49
  # generate checksums of cookbook files and create a sandbox
@@ -77,7 +58,7 @@ class Chef
77
58
 
78
59
  Chef::Log.info("Uploading files")
79
60
 
80
- self.class.setup_worker_threads(concurrency)
61
+ queue = Chef::Util::ThreadedJobQueue.new
81
62
 
82
63
  checksums_to_upload = Set.new
83
64
 
@@ -86,15 +67,13 @@ class Chef
86
67
  if info['needs_upload'] == true
87
68
  checksums_to_upload << checksum
88
69
  Chef::Log.info("Uploading #{checksum_files[checksum]} (checksum hex = #{checksum}) to #{info['url']}")
89
- self.class.work_queue << uploader_function_for(checksum_files[checksum], checksum, info['url'], checksums_to_upload)
70
+ queue << uploader_function_for(checksum_files[checksum], checksum, info['url'], checksums_to_upload)
90
71
  else
91
72
  Chef::Log.debug("#{checksum_files[checksum]} has not changed")
92
73
  end
93
74
  end
94
75
 
95
- until checksums_to_upload.empty?
96
- sleep 0.1
97
- end
76
+ queue.process(@concurrency)
98
77
 
99
78
  sandbox_url = new_sandbox['uri']
100
79
  Chef::Log.debug("Committing sandbox")
@@ -20,9 +20,6 @@
20
20
  # limitations under the License.
21
21
 
22
22
  require 'chef/log'
23
- require 'chef/node'
24
- require 'chef/resource_definition_list'
25
- require 'chef/recipe'
26
23
  require 'chef/cookbook/file_vendor'
27
24
  require 'chef/cookbook/metadata'
28
25
  require 'chef/version_class'
@@ -169,14 +166,7 @@ class Chef
169
166
  next unless @manifest.has_key?(segment)
170
167
  filenames = @manifest[segment].map{|manifest_record| manifest_record['name']}
171
168
 
172
- if segment == :recipes
173
- self.recipe_filenames = filenames
174
- elsif segment == :attributes
175
- self.attribute_filenames = filenames
176
- else
177
- segment_filenames(segment).clear
178
- filenames.each { |filename| segment_filenames(segment) << filename }
179
- end
169
+ replace_segment_filenames(segment, filenames)
180
170
  end
181
171
  end
182
172
 
@@ -272,6 +262,17 @@ class Chef
272
262
  end
273
263
  end
274
264
 
265
+ def replace_segment_filenames(segment, filenames)
266
+ case segment.to_sym
267
+ when :recipes
268
+ self.recipe_filenames = filenames
269
+ when :attributes
270
+ self.attribute_filenames = filenames
271
+ else
272
+ segment_filenames(segment).replace(filenames)
273
+ end
274
+ end
275
+
275
276
  # Query whether a template file +template_filename+ is available. File
276
277
  # specificity for the given +node+ is obeyed in the lookup.
277
278
  def has_template_for_node?(node, template_filename)
@@ -88,7 +88,7 @@ E
88
88
  def format_rest_error
89
89
  Array(Chef::JSONCompat.from_json(exception.response.body)["error"]).join('; ')
90
90
  rescue Exception
91
- exception.response.body
91
+ safe_format_rest_error
92
92
  end
93
93
 
94
94
  def username
@@ -107,6 +107,23 @@ E
107
107
  exception.response.body =~ /synchronize the clock/i
108
108
  end
109
109
 
110
+ def safe_format_rest_error
111
+ # When we get 504 from the server, sometimes the response body is non-readable.
112
+ #
113
+ # Stack trace:
114
+ #
115
+ # NoMethodError: undefined method `closed?' for nil:NilClass
116
+ # .../lib/ruby/1.9.1/net/http.rb:2789:in `stream_check'
117
+ # .../lib/ruby/1.9.1/net/http.rb:2709:in `read_body'
118
+ # .../lib/ruby/1.9.1/net/http.rb:2736:in `body'
119
+ # .../lib/chef/formatters/error_inspectors/api_error_formatting.rb:91:in `rescue in format_rest_error'
120
+ begin
121
+ exception.response.body
122
+ rescue Exception
123
+ "Cannot fetch the contents of the response."
124
+ end
125
+ end
126
+
110
127
  end
111
128
  end
112
129
  end
@@ -65,7 +65,7 @@ class Chef
65
65
  when Net::HTTPNotFound
66
66
  when Net::HTTPInternalServerError
67
67
  describe_500_error(error_description)
68
- when Net::HTTPBadGateway, Net::HTTPServiceUnavailable
68
+ when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut
69
69
  describe_503_error(error_description)
70
70
  else
71
71
  describe_http_error(error_description)
@@ -76,5 +76,3 @@ class Chef
76
76
  end
77
77
  end
78
78
  end
79
-
80
-
@@ -154,6 +154,26 @@ class Chef
154
154
  :description => "A file containing the secret key to use to encrypt data bag item values",
155
155
  :proc => Proc.new { |sf| Chef::Config[:knife][:secret_file] = sf }
156
156
 
157
+ option :bootstrap_url,
158
+ :long => "--bootstrap-url URL",
159
+ :description => "URL to a custom installation script",
160
+ :proc => Proc.new { |u| Chef::Config[:knife][:bootstrap_url] = u }
161
+
162
+ option :bootstrap_install_command,
163
+ :long => "--bootstrap-install-command COMMANDS",
164
+ :description => "Custom command to install chef-client",
165
+ :proc => Proc.new { |ic| Chef::Config[:knife][:bootstrap_install_command] = ic }
166
+
167
+ option :bootstrap_wget_options,
168
+ :long => "--bootstrap-wget-options OPTIONS",
169
+ :description => "Add options to wget when installing chef-client",
170
+ :proc => Proc.new { |wo| Chef::Config[:knife][:bootstrap_wget_options] = wo }
171
+
172
+ option :bootstrap_curl_options,
173
+ :long => "--bootstrap-curl-options OPTIONS",
174
+ :description => "Add options to curl when install chef-client",
175
+ :proc => Proc.new { |co| Chef::Config[:knife][:bootstrap_curl_options] = co }
176
+
157
177
  def find_template(template=nil)
158
178
  # Are we bootstrapping using an already shipped template?
159
179
  if config[:template_file]
@@ -206,7 +226,9 @@ class Chef
206
226
  begin
207
227
  knife_ssh.run
208
228
  rescue Net::SSH::AuthenticationFailed
209
- unless config[:ssh_password]
229
+ if config[:ssh_password]
230
+ raise
231
+ else
210
232
  ui.info("Failed to authenticate #{config[:ssh_user]} - trying password auth")
211
233
  knife_ssh_with_password_auth.run
212
234
  end
@@ -0,0 +1,58 @@
1
+ ksh -c '
2
+
3
+ function exists {
4
+ if type $1 >/dev/null 2>&1
5
+ then
6
+ return 0
7
+ else
8
+ return 1
9
+ fi
10
+ }
11
+
12
+ if ! exists /usr/bin/chef-client; then
13
+ <% if @chef_config[:aix_package] -%>
14
+ # Read the download URL/location from knife.rb with option aix_package
15
+ rm -rf /tmp/chef_installer # ensure there no older pkg
16
+ echo "<%= @chef_config[:aix_package] %>"
17
+ perl -e '\''use LWP::Simple; getprint($ARGV[0]);'\'' <%= @chef_config[:aix_package] %> > /tmp/chef_installer
18
+ installp -aYF -d /tmp/chef_installer chef
19
+ <% else -%>
20
+ echo ":aix_package location is not set in knife.rb"
21
+ exit
22
+ <% end -%>
23
+ fi
24
+
25
+ mkdir -p /etc/chef
26
+
27
+ cat > /etc/chef/validation.pem <<'EOP'
28
+ <%= validation_key %>
29
+ EOP
30
+ chmod 0600 /etc/chef/validation.pem
31
+
32
+ <% if encrypted_data_bag_secret -%>
33
+ cat > /etc/chef/encrypted_data_bag_secret <<'EOP'
34
+ <%= encrypted_data_bag_secret %>
35
+ EOP
36
+ chmod 0600 /etc/chef/encrypted_data_bag_secret
37
+ <% end -%>
38
+
39
+ <%# Generate Ohai Hints -%>
40
+ <% unless @chef_config[:knife][:hints].nil? || @chef_config[:knife][:hints].empty? -%>
41
+ mkdir -p /etc/chef/ohai/hints
42
+
43
+ <% @chef_config[:knife][:hints].each do |name, hash| -%>
44
+ cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
45
+ <%= hash.to_json %>
46
+ EOP
47
+ <% end -%>
48
+ <% end -%>
49
+
50
+ cat > /etc/chef/client.rb <<'EOP'
51
+ <%= config_content %>
52
+ EOP
53
+
54
+ cat > /etc/chef/first-boot.json <<'EOP'
55
+ <%= first_boot.to_json %>
56
+ EOP
57
+
58
+ <%= start_chef %>'