chef-config 12.22.1 → 12.22.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,34 +1,34 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "chef-config/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "chef-config"
8
- spec.version = ChefConfig::VERSION
9
- spec.authors = ["Adam Jacob"]
10
- spec.email = ["adam@chef.io"]
11
-
12
- spec.summary = %q{Chef's default configuration and config loading}
13
- spec.homepage = "https://github.com/chef/chef"
14
- spec.license = "Apache-2.0"
15
-
16
- spec.require_paths = ["lib"]
17
-
18
- spec.add_dependency "mixlib-shellout", "~> 2.0"
19
- spec.add_dependency "mixlib-config", "~> 2.0"
20
- spec.add_dependency "fuzzyurl"
21
- spec.add_dependency "addressable"
22
-
23
- spec.add_development_dependency "rake", "~> 10.0"
24
-
25
- %w{rspec-core rspec-expectations rspec-mocks}.each do |rspec|
26
- spec.add_development_dependency(rspec, "~> 3.2")
27
- end
28
-
29
- spec.files = %w{Rakefile LICENSE README.md} + Dir.glob("*.gemspec") +
30
- Dir.glob("{lib,spec}/**/*", File::FNM_DOTMATCH).reject { |f| File.directory?(f) }
31
-
32
- spec.bindir = "bin"
33
- spec.executables = []
34
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "chef-config/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chef-config"
8
+ spec.version = ChefConfig::VERSION
9
+ spec.authors = ["Adam Jacob"]
10
+ spec.email = ["adam@chef.io"]
11
+
12
+ spec.summary = %q{Chef's default configuration and config loading}
13
+ spec.homepage = "https://github.com/chef/chef"
14
+ spec.license = "Apache-2.0"
15
+
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_dependency "mixlib-shellout", "~> 2.0"
19
+ spec.add_dependency "mixlib-config", "~> 2.0"
20
+ spec.add_dependency "fuzzyurl"
21
+ spec.add_dependency "addressable"
22
+
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ %w{rspec-core rspec-expectations rspec-mocks}.each do |rspec|
26
+ spec.add_development_dependency(rspec, "~> 3.2")
27
+ end
28
+
29
+ spec.files = %w{Rakefile LICENSE README.md} + Dir.glob("*.gemspec") +
30
+ Dir.glob("{lib,spec}/**/*", File::FNM_DOTMATCH).reject { |f| File.directory?(f) }
31
+
32
+ spec.bindir = "bin"
33
+ spec.executables = []
34
+ end
@@ -1,20 +1,20 @@
1
- #
2
- # Copyright:: Copyright 2015-2016, Chef Software, Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- module ChefConfig
19
-
20
- end
1
+ #
2
+ # Copyright:: Copyright 2015-2016, Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ module ChefConfig
19
+
20
+ end
@@ -1,1097 +1,1097 @@
1
- #
2
- # Author:: Adam Jacob (<adam@chef.io>)
3
- # Author:: Christopher Brown (<cb@chef.io>)
4
- # Author:: AJ Christensen (<aj@chef.io>)
5
- # Author:: Mark Mzyk (<mmzyk@chef.io>)
6
- # Author:: Kyle Goodwin (<kgoodwin@primerevenue.com>)
7
- # Copyright:: Copyright 2008-2016, Chef Software Inc.
8
- # License:: Apache License, Version 2.0
9
- #
10
- # Licensed under the Apache License, Version 2.0 (the "License");
11
- # you may not use this file except in compliance with the License.
12
- # You may obtain a copy of the License at
13
- #
14
- # http://www.apache.org/licenses/LICENSE-2.0
15
- #
16
- # Unless required by applicable law or agreed to in writing, software
17
- # distributed under the License is distributed on an "AS IS" BASIS,
18
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
- # See the License for the specific language governing permissions and
20
- # limitations under the License.
21
-
22
- require "mixlib/config"
23
- require "pathname"
24
-
25
- require "chef-config/fips"
26
- require "chef-config/logger"
27
- require "chef-config/windows"
28
- require "chef-config/path_helper"
29
- require "chef-config/mixin/fuzzy_hostname_matcher"
30
-
31
- require "mixlib/shellout"
32
- require "uri"
33
- require "addressable/uri"
34
- require "openssl"
35
- require "yaml"
36
-
37
- module ChefConfig
38
-
39
- class Config
40
-
41
- extend Mixlib::Config
42
- extend ChefConfig::Mixin::FuzzyHostnameMatcher
43
-
44
- # Evaluates the given string as config.
45
- #
46
- # +filename+ is used for context in stacktraces, but doesn't need to be the name of an actual file.
47
- def self.from_string(string, filename)
48
- instance_eval(string, filename, 1)
49
- end
50
-
51
- def self.inspect
52
- configuration.inspect
53
- end
54
-
55
- def self.platform_specific_path(path)
56
- path = PathHelper.cleanpath(path)
57
- if ChefConfig.windows?
58
- # turns \etc\chef\client.rb and \var\chef\client.rb into C:/chef/client.rb
59
- # Some installations will be on different drives so use the drive that
60
- # the expanded path to __FILE__ is found.
61
- drive = windows_installation_drive
62
- if drive && path[0] == '\\' && path.split('\\')[2] == "chef"
63
- path = PathHelper.join(drive, path.split('\\', 3)[2])
64
- end
65
- end
66
- path
67
- end
68
-
69
- def self.windows_installation_drive
70
- if ChefConfig.windows?
71
- drive = File.expand_path(__FILE__).split("/", 2)[0]
72
- drive = ENV["SYSTEMDRIVE"] if drive.to_s == ""
73
- drive
74
- end
75
- end
76
-
77
- def self.add_formatter(name, file_path = nil)
78
- formatters << [name, file_path]
79
- end
80
-
81
- def self.add_event_logger(logger)
82
- event_handlers << logger
83
- end
84
-
85
- def self.apply_extra_config_options(extra_config_options)
86
- if extra_config_options
87
- extra_parsed_options = extra_config_options.inject({}) do |memo, option|
88
- # Sanity check value.
89
- if option.empty? || !option.include?("=")
90
- raise UnparsableConfigOption, "Unparsable config option #{option.inspect}"
91
- end
92
- # Split including whitespace if someone does truly odd like
93
- # --config-option "foo = bar"
94
- key, value = option.split(/\s*=\s*/, 2)
95
- # Call to_sym because Chef::Config expects only symbol keys. Also
96
- # runs a simple parse on the string for some common types.
97
- memo[key.to_sym] = YAML.safe_load(value)
98
- memo
99
- end
100
- merge!(extra_parsed_options)
101
- end
102
- end
103
-
104
- # Config file to load (client.rb, knife.rb, etc. defaults set differently in knife, chef-client, etc.)
105
- configurable(:config_file)
106
-
107
- default(:config_dir) do
108
- if config_file
109
- PathHelper.dirname(PathHelper.canonical_path(config_file, false))
110
- else
111
- PathHelper.join(user_home, ".chef", "")
112
- end
113
- end
114
-
115
- default :formatters, []
116
-
117
- def self.is_valid_url?(uri)
118
- url = uri.to_s.strip
119
- /^http:\/\// =~ url || /^https:\/\// =~ url || /^chefzero:/ =~ url
120
- end
121
- # Override the config dispatch to set the value of multiple server options simultaneously
122
- #
123
- # === Parameters
124
- # url<String>:: String to be set for all of the chef-server-api URL's
125
- #
126
- configurable(:chef_server_url).writes_value do |uri|
127
- unless is_valid_url? uri
128
- raise ConfigurationError, "#{uri} is an invalid chef_server_url."
129
- end
130
- uri.to_s.strip
131
- end
132
-
133
- # When you are using ActiveSupport, they monkey-patch 'daemonize' into Kernel.
134
- # So while this is basically identical to what method_missing would do, we pull
135
- # it up here and get a real method written so that things get dispatched
136
- # properly.
137
- configurable(:daemonize).writes_value { |v| v }
138
-
139
- # The root where all local chef object data is stored. cookbooks, data bags,
140
- # environments are all assumed to be in separate directories under this.
141
- # chef-solo uses these directories for input data. knife commands
142
- # that upload or download files (such as knife upload, knife role from file,
143
- # etc.) work.
144
- default :chef_repo_path do
145
- if configuration[:cookbook_path]
146
- if configuration[:cookbook_path].kind_of?(String)
147
- File.expand_path("..", configuration[:cookbook_path])
148
- else
149
- configuration[:cookbook_path].map do |path|
150
- File.expand_path("..", path)
151
- end
152
- end
153
- elsif configuration[:cookbook_artifact_path]
154
- File.expand_path("..", configuration[:cookbook_artifact_path])
155
- else
156
- cache_path
157
- end
158
- end
159
-
160
- def self.find_chef_repo_path(cwd)
161
- # In local mode, we auto-discover the repo root by looking for a path with "cookbooks" under it.
162
- # This allows us to run config-free.
163
- path = cwd
164
- until File.directory?(PathHelper.join(path, "cookbooks")) || File.directory?(PathHelper.join(path, "cookbook_artifacts"))
165
- new_path = File.expand_path("..", path)
166
- if new_path == path
167
- ChefConfig.logger.warn("No cookbooks directory found at or above current directory. Assuming #{cwd}.")
168
- return cwd
169
- end
170
- path = new_path
171
- end
172
- ChefConfig.logger.info("Auto-discovered chef repository at #{path}")
173
- path
174
- end
175
-
176
- def self.derive_path_from_chef_repo_path(child_path)
177
- if chef_repo_path.kind_of?(String)
178
- PathHelper.join(chef_repo_path, child_path)
179
- else
180
- chef_repo_path.uniq.map { |path| PathHelper.join(path, child_path) }
181
- end
182
- end
183
-
184
- # Location of acls on disk. String or array of strings.
185
- # Defaults to <chef_repo_path>/acls.
186
- default(:acl_path) { derive_path_from_chef_repo_path("acls") }
187
-
188
- # Location of clients on disk. String or array of strings.
189
- # Defaults to <chef_repo_path>/clients.
190
- default(:client_path) { derive_path_from_chef_repo_path("clients") }
191
-
192
- # Location of client keys on disk. String or array of strings.
193
- # Defaults to <chef_repo_path>/client_keys.
194
- default(:client_key_path) { derive_path_from_chef_repo_path("client_keys") }
195
-
196
- # Location of containers on disk. String or array of strings.
197
- # Defaults to <chef_repo_path>/containers.
198
- default(:container_path) { derive_path_from_chef_repo_path("containers") }
199
-
200
- # Location of cookbook_artifacts on disk. String or array of strings.
201
- # Defaults to <chef_repo_path>/cookbook_artifacts.
202
- default(:cookbook_artifact_path) { derive_path_from_chef_repo_path("cookbook_artifacts") }
203
-
204
- # Location of cookbooks on disk. String or array of strings.
205
- # Defaults to <chef_repo_path>/cookbooks. If chef_repo_path
206
- # is not specified, this is set to [/var/chef/cookbooks, /var/chef/site-cookbooks]).
207
- default(:cookbook_path) do
208
- if configuration[:chef_repo_path]
209
- derive_path_from_chef_repo_path("cookbooks")
210
- else
211
- Array(derive_path_from_chef_repo_path("cookbooks")).flatten +
212
- Array(derive_path_from_chef_repo_path("site-cookbooks")).flatten
213
- end
214
- end
215
-
216
- # Location of data bags on disk. String or array of strings.
217
- # Defaults to <chef_repo_path>/data_bags.
218
- default(:data_bag_path) { derive_path_from_chef_repo_path("data_bags") }
219
-
220
- # Location of environments on disk. String or array of strings.
221
- # Defaults to <chef_repo_path>/environments.
222
- default(:environment_path) { derive_path_from_chef_repo_path("environments") }
223
-
224
- # Location of groups on disk. String or array of strings.
225
- # Defaults to <chef_repo_path>/groups.
226
- default(:group_path) { derive_path_from_chef_repo_path("groups") }
227
-
228
- # Location of nodes on disk. String or array of strings.
229
- # Defaults to <chef_repo_path>/nodes.
230
- default(:node_path) { derive_path_from_chef_repo_path("nodes") }
231
-
232
- # Location of policies on disk. String or array of strings.
233
- # Defaults to <chef_repo_path>/policies.
234
- default(:policy_path) { derive_path_from_chef_repo_path("policies") }
235
-
236
- # Location of policy_groups on disk. String or array of strings.
237
- # Defaults to <chef_repo_path>/policy_groups.
238
- default(:policy_group_path) { derive_path_from_chef_repo_path("policy_groups") }
239
-
240
- # Location of roles on disk. String or array of strings.
241
- # Defaults to <chef_repo_path>/roles.
242
- default(:role_path) { derive_path_from_chef_repo_path("roles") }
243
-
244
- # Location of users on disk. String or array of strings.
245
- # Defaults to <chef_repo_path>/users.
246
- default(:user_path) { derive_path_from_chef_repo_path("users") }
247
-
248
- # Location of policies on disk. String or array of strings.
249
- # Defaults to <chef_repo_path>/policies.
250
- default(:policy_path) { derive_path_from_chef_repo_path("policies") }
251
-
252
- # Turn on "path sanity" by default. See also: http://wiki.opscode.com/display/chef/User+Environment+PATH+Sanity
253
- default :enforce_path_sanity, true
254
-
255
- # Formatted Chef Client output is a beta feature, disabled by default:
256
- default :formatter, "null"
257
-
258
- # The number of times the client should retry when registering with the server
259
- default :client_registration_retries, 5
260
-
261
- # An array of paths to search for knife exec scripts if they aren't in the current directory
262
- default :script_path, []
263
-
264
- # The root of all caches (checksums, cache and backup). If local mode is on,
265
- # this is under the user's home directory.
266
- default(:cache_path) do
267
- if local_mode
268
- PathHelper.join(config_dir, "local-mode-cache")
269
- else
270
- primary_cache_root = platform_specific_path("/var")
271
- primary_cache_path = platform_specific_path("/var/chef")
272
- # Use /var/chef as the cache path only if that folder exists and we can read and write
273
- # into it, or /var exists and we can read and write into it (we'll create /var/chef later).
274
- # Otherwise, we'll create .chef under the user's home directory and use that as
275
- # the cache path.
276
- unless path_accessible?(primary_cache_path) || path_accessible?(primary_cache_root)
277
- secondary_cache_path = PathHelper.join(user_home, ".chef")
278
- ChefConfig.logger.info("Unable to access cache at #{primary_cache_path}. Switching cache to #{secondary_cache_path}")
279
- secondary_cache_path
280
- else
281
- primary_cache_path
282
- end
283
- end
284
- end
285
-
286
- # Returns true only if the path exists and is readable and writeable for the user.
287
- def self.path_accessible?(path)
288
- File.exists?(path) && File.readable?(path) && File.writable?(path)
289
- end
290
-
291
- # Where cookbook files are stored on the server (by content checksum)
292
- default(:checksum_path) { PathHelper.join(cache_path, "checksums") }
293
-
294
- # Where chef's cache files should be stored
295
- default(:file_cache_path) { PathHelper.join(cache_path, "cache") }
296
-
297
- # Where backups of chef-managed files should go
298
- default(:file_backup_path) { PathHelper.join(cache_path, "backup") }
299
-
300
- # The chef-client (or solo) lockfile.
301
- #
302
- # If your `file_cache_path` resides on a NFS (or non-flock()-supporting
303
- # fs), it's recommended to set this to something like
304
- # '/tmp/chef-client-running.pid'
305
- default(:lockfile) { PathHelper.join(file_cache_path, "chef-client-running.pid") }
306
-
307
- ## Daemonization Settings ##
308
- # What user should Chef run as?
309
- default :user, nil
310
- default :group, nil
311
- default :umask, 0022
312
-
313
- # Valid log_levels are:
314
- # * :debug
315
- # * :info
316
- # * :warn
317
- # * :fatal
318
- # These work as you'd expect. There is also a special `:auto` setting.
319
- # When set to :auto, Chef will auto adjust the log verbosity based on
320
- # context. When a tty is available (usually because the user is running chef
321
- # in a console), the log level is set to :warn, and output formatters are
322
- # used as the primary mode of output. When a tty is not available, the
323
- # logger is the primary mode of output, and the log level is set to :info
324
- default :log_level, :auto
325
-
326
- # Logging location as either an IO stream or string representing log file path
327
- default :log_location, STDOUT
328
-
329
- # Using `force_formatter` causes chef to default to formatter output when STDOUT is not a tty
330
- default :force_formatter, false
331
-
332
- # Using `force_logger` causes chef to default to logger output when STDOUT is a tty
333
- default :force_logger, false
334
-
335
- # Using 'stream_execute_output' will have Chef always stream the execute output
336
- default :stream_execute_output, false
337
-
338
- # Using `show_download_progress` will display the overall progress
339
- # of a remote file download
340
- default :show_download_progress, false
341
- # How often to update the progress meter, in percent
342
- default :download_progress_interval, 10
343
-
344
- default :http_retry_count, 5
345
- default :http_retry_delay, 5
346
- default :interval, nil
347
- default :once, nil
348
- default :json_attribs, nil
349
- # toggle info level log items that can create a lot of output
350
- default :verbose_logging, true
351
- default :node_name, nil
352
- default :diff_disabled, false
353
- default :diff_filesize_threshold, 10000000
354
- default :diff_output_threshold, 1000000
355
- default :local_mode, false
356
-
357
- # Configures the mode of operation for ChefFS, which is applied to the
358
- # ChefFS-based knife commands and chef-client's local mode. (ChefFS-based
359
- # knife commands include: knife delete, knife deps, knife diff, knife down,
360
- # knife edit, knife list, knife show, knife upload, and knife xargs.)
361
- #
362
- # Valid values are:
363
- # * "static": ChefFS only manages objects that exist in a traditional Chef
364
- # Repo as of Chef 11.
365
- # * "everything": ChefFS manages all object types that existed on the OSS
366
- # Chef 11 server.
367
- # * "hosted_everything": ChefFS manages all object types as of the Chef 12
368
- # Server, including RBAC objects and Policyfile objects (new to Chef 12).
369
- default :repo_mode do
370
- if local_mode && !chef_zero.osc_compat
371
- "hosted_everything"
372
- elsif chef_server_url =~ /\/+organizations\/.+/
373
- "hosted_everything"
374
- else
375
- "everything"
376
- end
377
- end
378
-
379
- default :pid_file, nil
380
-
381
- # Whether Chef Zero local mode should bind to a port. All internal requests
382
- # will go through the socketless code path regardless, so the socket is
383
- # only needed if other processes will connect to the local mode server.
384
- #
385
- # For compatibility this is set to true but it will be changed to false in
386
- # the future.
387
- default :listen, true
388
-
389
- config_context :chef_zero do
390
- config_strict_mode true
391
- default(:enabled) { ChefConfig::Config.local_mode }
392
- default :host, "localhost"
393
- default :port, 8889.upto(9999) # Will try ports from 8889-9999 until one works
394
-
395
- # When set to a String, Chef Zero disables multitenant support. This is
396
- # what you want when using Chef Zero to serve a single Chef Repo. Setting
397
- # this to `false` enables multi-tenant.
398
- default :single_org, "chef"
399
-
400
- # Whether Chef Zero should operate in a mode analogous to OSS Chef Server
401
- # 11 (true) or Chef Server 12 (false). Chef Zero can still serve
402
- # policyfile objects in Chef 11 mode, as long as `repo_mode` is set to
403
- # "hosted_everything". The primary differences are:
404
- # * Chef 11 mode doesn't support multi-tennant, so there is no
405
- # distinction between global and org-specific objects (since there are
406
- # no orgs).
407
- # * Chef 11 mode doesn't expose RBAC objects
408
- default :osc_compat, false
409
- end
410
- default :chef_server_url, "https://localhost:443"
411
-
412
- default(:chef_server_root) do
413
- # if the chef_server_url is a path to an organization, aka
414
- # 'some_url.../organizations/*' then remove the '/organization/*' by default
415
- if configuration[:chef_server_url] =~ /\/organizations\/\S*$/
416
- configuration[:chef_server_url].split("/")[0..-3].join("/")
417
- elsif configuration[:chef_server_url] # default to whatever chef_server_url is
418
- configuration[:chef_server_url]
419
- else
420
- "https://localhost:443"
421
- end
422
- end
423
-
424
- default :rest_timeout, 300
425
- default :yum_timeout, 900
426
- default :yum_lock_timeout, 30
427
- default :solo, false
428
-
429
- # Are we running in old Chef Solo legacy mode?
430
- default :solo_legacy_mode, false
431
-
432
- default :splay, nil
433
- default :why_run, false
434
- default :color, false
435
- default :client_fork, true
436
- default :ez, false
437
- default :enable_reporting, true
438
- default :enable_reporting_url_fatals, false
439
- # Possible values for :audit_mode
440
- # :enabled, :disabled, :audit_only,
441
- #
442
- # TODO: 11 Dec 2014: Currently audit-mode is an experimental feature
443
- # and is disabled by default. When users choose to enable audit-mode,
444
- # a warning is issued in application/client#reconfigure.
445
- # This can be removed when audit-mode is enabled by default.
446
- default :audit_mode, :disabled
447
-
448
- # Chef only needs ohai to run the hostname plugin for the most basic
449
- # functionality. If the rest of the ohai plugins are not needed (like in
450
- # most of our testing scenarios)
451
- default :minimal_ohai, false
452
-
453
- ###
454
- # Policyfile Settings
455
- #
456
- # Policyfile is a feature where a node gets its run list and cookbook
457
- # version set from a single document on the server instead of expanding the
458
- # run list and having the server compute the cookbook version set based on
459
- # environment constraints.
460
- #
461
- # Policyfiles are auto-versioned. The user groups nodes by `policy_name`,
462
- # which generally describes a hosts's functional role, and `policy_group`,
463
- # which generally groups nodes by deployment phase (a.k.a., "environment").
464
- # The Chef Server maps a given set of `policy_name` plus `policy_group` to
465
- # a particular revision of a policy.
466
-
467
- default :policy_name, nil
468
- default :policy_group, nil
469
-
470
- # Policyfiles can have multiple run lists, via the named run list feature.
471
- # Generally this will be set by a CLI option via Chef::Application::Client,
472
- # but it could be set in client.rb if desired.
473
-
474
- default :named_run_list, nil
475
-
476
- # During initial development, users were required to set `use_policyfile true`
477
- # in `client.rb` to opt-in to policyfile use. Chef Client now examines
478
- # configuration, node json, and the stored node to determine if policyfile
479
- # usage is desired. This flag is still honored if set, but is unnecessary.
480
- default :use_policyfile, false
481
-
482
- # Policyfiles can be used in a native mode (default) or compatibility mode.
483
- # Native mode requires Chef Server 12.1 (it can be enabled via feature flag
484
- # on some prior versions). In native mode, policies and associated
485
- # cookbooks are accessed via feature-specific APIs. In compat mode,
486
- # policies are stored as data bags and cookbooks are stored at the
487
- # cookbooks/ endpoint. Compatibility mode can be dangerous on existing Chef
488
- # Servers; it's recommended to upgrade your Chef Server rather than use
489
- # compatibility mode. Compatibility mode remains available so you can use
490
- # policyfiles with servers that don't yet support the native endpoints.
491
- default :policy_document_native_api, true
492
-
493
- # When policyfiles are used in compatibility mode, `policy_name` and
494
- # `policy_group` are instead specified using a combined configuration
495
- # setting, `deployment_group`. For example, if policy_name should be
496
- # "webserver" and policy_group should be "staging", then `deployment_group`
497
- # should be set to "webserver-staging", which is the name of the data bag
498
- # item that the policy will be stored as. NOTE: this setting only has an
499
- # effect if `policy_document_native_api` is set to `false`.
500
- default :deployment_group, nil
501
-
502
- # Set these to enable SSL authentication / mutual-authentication
503
- # with the server
504
-
505
- # Client side SSL cert/key for mutual auth
506
- default :ssl_client_cert, nil
507
- default :ssl_client_key, nil
508
-
509
- # Whether or not to verify the SSL cert for all HTTPS requests. When set to
510
- # :verify_peer (default), all HTTPS requests will be validated regardless of other
511
- # SSL verification settings. When set to :verify_none no HTTPS requests will
512
- # be validated.
513
- default :ssl_verify_mode, :verify_peer
514
-
515
- # Whether or not to verify the SSL cert for HTTPS requests to the Chef
516
- # server API. If set to `true`, the server's cert will be validated
517
- # regardless of the :ssl_verify_mode setting. This is set to `true` when
518
- # running in local-mode.
519
- # NOTE: This is a workaround until verify_peer is enabled by default.
520
- default(:verify_api_cert) { ChefConfig::Config.local_mode }
521
-
522
- # Path to the default CA bundle files.
523
- default :ssl_ca_path, nil
524
- default(:ssl_ca_file) do
525
- if ChefConfig.windows? && embedded_dir
526
- cacert_path = File.join(embedded_dir, "ssl/certs/cacert.pem")
527
- cacert_path if File.exist?(cacert_path)
528
- else
529
- nil
530
- end
531
- end
532
-
533
- # A directory that contains additional SSL certificates to trust. Any
534
- # certificates in this directory will be added to whatever CA bundle ruby
535
- # is using. Use this to add self-signed certs for your Chef Server or local
536
- # HTTP file servers.
537
- default(:trusted_certs_dir) { PathHelper.join(config_dir, "trusted_certs") }
538
-
539
- # A directory that contains additional configuration scripts to load for chef-client
540
- default(:client_d_dir) { PathHelper.join(config_dir, "client.d") }
541
-
542
- # A directory that contains additional configuration scripts to load for solo
543
- default(:solo_d_dir) { PathHelper.join(config_dir, "solo.d") }
544
-
545
- # A directory that contains additional configuration scripts to load for
546
- # the workstation config
547
- default(:config_d_dir) { PathHelper.join(config_dir, "config.d") }
548
-
549
- # Where should chef-solo download recipes from?
550
- default :recipe_url, nil
551
-
552
- # Set to true if Chef is to set OpenSSL to run in FIPS mode
553
- default(:fips) do
554
- # CHEF_FIPS is used in testing to override checking for system level
555
- # enablement. There are 3 possible values that this variable may have:
556
- # nil - no override and the system will be checked
557
- # empty - FIPS is NOT enabled
558
- # a non empty value - FIPS is enabled
559
- if ENV["CHEF_FIPS"] == ""
560
- false
561
- else
562
- !ENV["CHEF_FIPS"].nil? || ChefConfig.fips?
563
- end
564
- end
565
-
566
- # Initialize openssl
567
- def self.init_openssl
568
- if fips
569
- enable_fips_mode
570
- end
571
- end
572
-
573
- # Sets the version of the signed header authentication protocol to use (see
574
- # the 'mixlib-authorization' project for more detail). Currently, versions
575
- # 1.0, 1.1, and 1.3 are available.
576
- default :authentication_protocol_version do
577
- if fips
578
- "1.3"
579
- else
580
- "1.1"
581
- end
582
- end
583
-
584
- # This key will be used to sign requests to the Chef server. This location
585
- # must be writable by Chef during initial setup when generating a client
586
- # identity on the server.
587
- #
588
- # The chef-server will look up the public key for the client using the
589
- # `node_name` of the client.
590
- #
591
- # If chef-zero is enabled, this defaults to nil (no authentication).
592
- default(:client_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/client.pem") }
593
-
594
- # When registering the client, should we allow the client key location to
595
- # be a symlink? eg: /etc/chef/client.pem -> /etc/chef/prod-client.pem
596
- # If the path of the key goes through a directory like /tmp this should
597
- # never be set to true or its possibly an easily exploitable security hole.
598
- default :follow_client_key_symlink, false
599
-
600
- # This secret is used to decrypt encrypted data bag items.
601
- default(:encrypted_data_bag_secret) do
602
- if File.exist?(platform_specific_path("/etc/chef/encrypted_data_bag_secret"))
603
- platform_specific_path("/etc/chef/encrypted_data_bag_secret")
604
- else
605
- nil
606
- end
607
- end
608
-
609
- # As of Chef 11.0, version "1" is the default encrypted data bag item
610
- # format. Version "2" is available which adds encrypt-then-mac protection.
611
- # To maintain compatibility, versions other than 1 must be opt-in.
612
- #
613
- # Set this to `2` if you have chef-client 11.6.0+ in your infrastructure.
614
- # Set this to `3` if you have chef-client 11.?.0+, ruby 2 and OpenSSL >= 1.0.1 in your infrastructure. (TODO)
615
- default :data_bag_encrypt_version, 1
616
-
617
- # When reading data bag items, any supported version is accepted. However,
618
- # if all encrypted data bags have been generated with the version 2 format,
619
- # it is recommended to disable support for earlier formats to improve
620
- # security. For example, the version 2 format is identical to version 1
621
- # except for the addition of an HMAC, so an attacker with MITM capability
622
- # could downgrade an encrypted data bag to version 1 as part of an attack.
623
- default :data_bag_decrypt_minimum_version, 0
624
-
625
- # If there is no file in the location given by `client_key`, chef-client
626
- # will temporarily use the "validator" identity to generate one. If the
627
- # `client_key` is not present and the `validation_key` is also not present,
628
- # chef-client will not be able to authenticate to the server.
629
- #
630
- # The `validation_key` is never used if the `client_key` exists.
631
- #
632
- # If chef-zero is enabled, this defaults to nil (no authentication).
633
- default(:validation_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/validation.pem") }
634
- default :validation_client_name, "chef-validator"
635
-
636
- # When creating a new client via the validation_client account, Chef 11
637
- # servers allow the client to generate a key pair locally and send the
638
- # public key to the server. This is more secure and helps offload work from
639
- # the server, enhancing scalability. If enabled and the remote server
640
- # implements only the Chef 10 API, client registration will not work
641
- # properly.
642
- #
643
- # The default value is `true`. Set to `false` to disable client-side key
644
- # generation (server generates client keys).
645
- default(:local_key_generation) { true }
646
-
647
- # Zypper package provider gpg checks. Set to true to enable package
648
- # gpg signature checking. This will be default in the
649
- # future. Setting to false disables the warnings.
650
- # Leaving this set to nil or false is a security hazard!
651
- default :zypper_check_gpg, nil
652
-
653
- # Report Handlers
654
- default :report_handlers, []
655
-
656
- # Event Handlers
657
- default :event_handlers, []
658
-
659
- default :disable_event_loggers, false
660
-
661
- # Exception Handlers
662
- default :exception_handlers, []
663
-
664
- # Start handlers
665
- default :start_handlers, []
666
-
667
- # Syntax Check Cache. Knife keeps track of files that is has already syntax
668
- # checked by storing files in this directory. `syntax_check_cache_path` is
669
- # the new (and preferred) configuration setting. If not set, knife will
670
- # fall back to using cache_options[:path], which is deprecated but exists in
671
- # many client configs generated by pre-Chef-11 bootstrappers.
672
- default(:syntax_check_cache_path) { cache_options[:path] }
673
-
674
- # Deprecated:
675
- # Move this to the default value of syntax_cache_path when this is removed.
676
- default(:cache_options) { { :path => PathHelper.join(config_dir, "syntaxcache") } }
677
-
678
- # Whether errors should be raised for deprecation warnings. When set to
679
- # `false` (the default setting), a warning is emitted but code using
680
- # deprecated methods/features/etc. should work normally otherwise. When set
681
- # to `true`, usage of deprecated methods/features will raise a
682
- # `DeprecatedFeatureError`. This is used by Chef's tests to ensure that
683
- # deprecated functionality is not used internally by Chef. End users
684
- # should generally leave this at the default setting (especially in
685
- # production), but it may be useful when testing cookbooks or other code if
686
- # the user wishes to aggressively address deprecations.
687
- default(:treat_deprecation_warnings_as_errors) do
688
- # Using an environment variable allows this setting to be inherited in
689
- # tests that spawn new processes.
690
- ENV.key?("CHEF_TREAT_DEPRECATION_WARNINGS_AS_ERRORS")
691
- end
692
-
693
- # Whether the resource count should be updated for log resource
694
- # on running chef-client
695
- default :count_log_resource_updates, true
696
-
697
- # knife configuration data
698
- config_context :knife do
699
- # XXX: none of these default values are applied to knife (and would create a backcompat
700
- # break in knife if this bug was fixed since many of the defaults below are wrong). this appears
701
- # to be the start of an attempt to be able to use config_strict_mode true? if so, this approach
702
- # is fraught with peril because this namespace is used by every knife plugin in the wild and
703
- # we would need to validate every cli option in every knife attribute out there and list them all here.
704
- #
705
- # based on the way that people may define `knife[:foobar] = "something"` for the knife-foobar
706
- # gem plugin i'm pretty certain we can never turn on anything like config_string_mode since
707
- # any config value may be a typo or it may be in some gem in some knife plugin we don't know about.
708
- #
709
- # we do still need to maintain at least one of these so that the knife config hash gets
710
- # created.
711
- #
712
- # this whole situation is deeply unsatisfying.
713
- default :ssh_port, nil
714
- default :ssh_user, nil
715
- default :ssh_attribute, nil
716
- default :ssh_gateway, nil
717
- default :bootstrap_version, nil
718
- default :bootstrap_proxy, nil
719
- default :bootstrap_template, nil
720
- default :secret, nil
721
- default :secret_file, nil
722
- default :identity_file, nil
723
- default :host_key_verify, nil
724
- default :forward_agent, nil
725
- default :sort_status_reverse, nil
726
- default :hints, {}
727
- end
728
-
729
- def self.set_defaults_for_windows
730
- # Those lists of regular expressions define what chef considers a
731
- # valid user and group name
732
- # From http://technet.microsoft.com/en-us/library/cc776019(WS.10).aspx
733
- principal_valid_regex_part = '[^"\/\\\\\[\]\:;|=,+*?<>]+'
734
- default :user_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
735
- default :group_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
736
-
737
- default :fatal_windows_admin_check, false
738
- end
739
-
740
- def self.set_defaults_for_nix
741
- # Those lists of regular expressions define what chef considers a
742
- # valid user and group name
743
- #
744
- # user/group cannot start with '-', '+' or '~'
745
- # user/group cannot contain ':', ',' or non-space-whitespace or null byte
746
- # everything else is allowed (UTF-8, spaces, etc) and we delegate to your O/S useradd program to barf or not
747
- # copies: http://anonscm.debian.org/viewvc/pkg-shadow/debian/trunk/debian/patches/506_relaxed_usernames?view=markup
748
- default :user_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
749
- default :group_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
750
- end
751
-
752
- # Those lists of regular expressions define what chef considers a
753
- # valid user and group name
754
- if ChefConfig.windows?
755
- set_defaults_for_windows
756
- else
757
- set_defaults_for_nix
758
- end
759
-
760
- # This provides a hook which rspec can stub so that we can avoid twiddling
761
- # global state in tests.
762
- def self.env
763
- ENV
764
- end
765
-
766
- def self.windows_home_path
767
- ChefConfig.logger.deprecation("Chef::Config.windows_home_path is now deprecated. Consider using Chef::Util::PathHelper.home instead.")
768
- PathHelper.home
769
- end
770
-
771
- # returns a platform specific path to the user home dir if set, otherwise default to current directory.
772
- default( :user_home ) { PathHelper.home || Dir.pwd }
773
-
774
- # Enable file permission fixup for selinux. Fixup will be done
775
- # only if selinux is enabled in the system.
776
- default :enable_selinux_file_permission_fixup, true
777
-
778
- # Use atomic updates (i.e. move operation) while updating contents
779
- # of the files resources. When set to false copy operation is
780
- # used to update files.
781
- #
782
- # NOTE: CHANGING THIS SETTING MAY CAUSE CORRUPTION, DATA LOSS AND
783
- # INSTABILITY.
784
- default :file_atomic_update, true
785
-
786
- # There are 3 possible values for this configuration setting.
787
- # true => file staging is done in the destination directory
788
- # false => file staging is done via tempfiles under ENV['TMP']
789
- # :auto => file staging will try using destination directory if possible and
790
- # will fall back to ENV['TMP'] if destination directory is not usable.
791
- default :file_staging_uses_destdir, :auto
792
-
793
- # Exit if another run is in progress and the chef-client is unable to
794
- # get the lock before time expires. If nil, no timeout is enforced. (Exits
795
- # immediately if 0.)
796
- default :run_lock_timeout, nil
797
-
798
- # Number of worker threads for syncing cookbooks in parallel. Increasing
799
- # this number can result in gateway errors from the server (namely 503 and 504).
800
- # If you are seeing this behavior while using the default setting, reducing
801
- # the number of threads will help.
802
- default :cookbook_sync_threads, 10
803
-
804
- # At the beginning of the Chef Client run, the cookbook manifests are downloaded which
805
- # contain URLs for every file in every relevant cookbook. Most of the files
806
- # (recipes, resources, providers, libraries, etc) are immediately synchronized
807
- # at the start of the run. The handling of "files" and "templates" directories,
808
- # however, have two modes of operation. They can either all be downloaded immediately
809
- # at the start of the run (no_lazy_load==true) or else they can be lazily loaded as
810
- # cookbook_file or template resources are converged which require them (no_lazy_load==false).
811
- #
812
- # The advantage of lazily loading these files is that unnecessary files are not
813
- # synchronized. This may be useful to users with large files checked into cookbooks which
814
- # are only selectively downloaded to a subset of clients which use the cookbook. However,
815
- # better solutions are to either isolate large files into individual cookbooks and only
816
- # include those cookbooks in the run lists of the servers that need them -- or move to
817
- # using remote_file and a more appropriate backing store like S3 for large file
818
- # distribution.
819
- #
820
- # The disadvantages of lazily loading files are that users some time find it
821
- # confusing that their cookbooks are not fully synchronzied to the cache initially,
822
- # and more importantly the time-sensitive URLs which are in the manifest may time
823
- # out on long Chef runs before the resource that uses the file is converged
824
- # (leading to many confusing 403 errors on template/cookbook_file resources).
825
- #
826
- default :no_lazy_load, true
827
-
828
- # Default for the chef_gem compile_time attribute. Nil is the same as true but will emit
829
- # warnings on every use of chef_gem prompting the user to be explicit. If the user sets this to
830
- # true then the user will get backcompat behavior but with a single nag warning that cookbooks
831
- # may break with this setting in the future. The false setting is the recommended setting and
832
- # will become the default.
833
- default :chef_gem_compile_time, nil
834
-
835
- # A whitelisted array of attributes you want sent over the wire when node
836
- # data is saved.
837
- # The default setting is nil, which collects all data. Setting to [] will not
838
- # collect any data for save.
839
- default :automatic_attribute_whitelist, nil
840
- default :default_attribute_whitelist, nil
841
- default :normal_attribute_whitelist, nil
842
- default :override_attribute_whitelist, nil
843
-
844
- # Pull down all the rubygems versions from rubygems and cache them the first time we do a gem_package or
845
- # chef_gem install. This is memory-expensive and will grow without bounds, but will reduce network
846
- # round trips.
847
- default :rubygems_cache_enabled, false
848
-
849
- config_context :windows_service do
850
- # Set `watchdog_timeout` to the number of seconds to wait for a chef-client run
851
- # to finish
852
- default :watchdog_timeout, 2 * (60 * 60) # 2 hours
853
- end
854
-
855
- # Add an empty and non-strict config_context for chefdk. This lets the user
856
- # have code like `chefdk.generator_cookbook "/path/to/cookbook"` in their
857
- # config.rb, and it will be ignored by tools like knife and ohai. ChefDK
858
- # itself can define the config options it accepts and enable strict mode,
859
- # and that will only apply when running `chef` commands.
860
- config_context :chefdk do
861
- end
862
-
863
- # Configuration options for Data Collector reporting. These settings allow
864
- # the user to configure where to send their Data Collector data, what token
865
- # to send, and whether Data Collector should report its findings in client
866
- # mode vs. solo mode.
867
- config_context :data_collector do
868
- # Full URL to the endpoint that will receive our data. If nil, the
869
- # data collector will not run.
870
- # Ex: http://my-data-collector.mycompany.com/ingest
871
- default(:server_url) do
872
- if config_parent.solo || config_parent.local_mode
873
- nil
874
- else
875
- File.join(config_parent.chef_server_url, "/data-collector")
876
- end
877
- end
878
-
879
- # An optional pre-shared token to pass as an HTTP header (x-data-collector-token)
880
- # that can be used to determine whether or not the poster of this
881
- # run data should be trusted.
882
- # Ex: some-uuid-here
883
- default :token, nil
884
-
885
- # The Chef mode during which Data Collector is allowed to function. This
886
- # can be used to run Data Collector only when running as Chef Solo but
887
- # not when using Chef Client.
888
- # Options: :solo (for both Solo Legacy Mode and Client Local Mode), :client, :both
889
- default :mode, :both
890
-
891
- # When the Data Collector cannot send the "starting a run" message to
892
- # the Data Collector server, the Data Collector will be disabled for that
893
- # run. In some situations, such as highly-regulated environments, it
894
- # may be more reasonable to prevent Chef from performing the actual run.
895
- # In these situations, setting this value to true will cause the Chef
896
- # run to raise an exception before starting any converge activities.
897
- default :raise_on_failure, false
898
-
899
- # A user-supplied Organization string that can be sent in payloads
900
- # generated by the DataCollector when Chef is run in Solo mode. This
901
- # allows users to associate their Solo nodes with faux organizations
902
- # without the nodes being connected to an actual Chef Server.
903
- default :organization, nil
904
- end
905
-
906
- configurable(:http_proxy)
907
- configurable(:http_proxy_user)
908
- configurable(:http_proxy_pass)
909
- configurable(:https_proxy)
910
- configurable(:https_proxy_user)
911
- configurable(:https_proxy_pass)
912
- configurable(:ftp_proxy)
913
- configurable(:ftp_proxy_user)
914
- configurable(:ftp_proxy_pass)
915
- configurable(:no_proxy)
916
-
917
- # Public method that users should call to export proxies to the appropriate
918
- # environment variables. This method should be called after the config file is
919
- # parsed and loaded.
920
- # TODO add some post-file-parsing logic that automatically calls this so
921
- # users don't have to
922
- def self.export_proxies
923
- export_proxy("http", http_proxy, http_proxy_user, http_proxy_pass) if http_proxy
924
- export_proxy("https", https_proxy, https_proxy_user, https_proxy_pass) if https_proxy
925
- export_proxy("ftp", ftp_proxy, ftp_proxy_user, ftp_proxy_pass) if ftp_proxy
926
- export_no_proxy(no_proxy) if no_proxy
927
- end
928
-
929
- # Character classes for Addressable
930
- # See https://www.ietf.org/rfc/rfc3986.txt 3.2.1
931
- # The user part may not have a : in it
932
- USER = Addressable::URI::CharacterClasses::UNRESERVED + Addressable::URI::CharacterClasses::SUB_DELIMS
933
- # The password part may have any valid USERINFO characters
934
- PASSWORD = USER + "\\:"
935
-
936
- # Builds a proxy uri and exports it to the appropriate environment variables. Examples:
937
- # http://username:password@hostname:port
938
- # https://username@hostname:port
939
- # ftp://hostname:port
940
- # when
941
- # scheme = "http", "https", or "ftp"
942
- # hostport = hostname:port or scheme://hostname:port
943
- # user = username
944
- # pass = password
945
- # @api private
946
- def self.export_proxy(scheme, path, user, pass)
947
- path = "#{scheme}://#{path}" unless path.include?("://")
948
- # URI.split returns the following parts:
949
- # [scheme, userinfo, host, port, registry, path, opaque, query, fragment]
950
- uri = Addressable::URI.encode(path, Addressable::URI)
951
-
952
- if user && !user.empty?
953
- userinfo = Addressable::URI.encode_component(user, USER)
954
- if pass
955
- userinfo << ":#{Addressable::URI.encode_component(pass, PASSWORD)}"
956
- end
957
- uri.userinfo = userinfo
958
- end
959
-
960
- path = uri.to_s
961
- ENV["#{scheme}_proxy".downcase] = path unless ENV["#{scheme}_proxy".downcase]
962
- ENV["#{scheme}_proxy".upcase] = path unless ENV["#{scheme}_proxy".upcase]
963
- end
964
-
965
- # @api private
966
- def self.export_no_proxy(value)
967
- ENV["no_proxy"] = value unless ENV["no_proxy"]
968
- ENV["NO_PROXY"] = value unless ENV["NO_PROXY"]
969
- end
970
-
971
- # Given a scheme, host, and port, return the correct proxy URI based on the
972
- # set environment variables, unless exluded by no_proxy, in which case nil
973
- # is returned
974
- def self.proxy_uri(scheme, host, port)
975
- proxy_env_var = ENV["#{scheme}_proxy"].to_s.strip
976
-
977
- # Check if the proxy string contains a scheme. If not, add the url's scheme to the
978
- # proxy before parsing. The regex /^.*:\/\// matches, for example, http://. Reusing proxy
979
- # here since we are really just trying to get the string built correctly.
980
- proxy = if !proxy_env_var.empty?
981
- if proxy_env_var =~ /^.*:\/\//
982
- URI.parse(proxy_env_var)
983
- else
984
- URI.parse("#{scheme}://#{proxy_env_var}")
985
- end
986
- end
987
-
988
- return proxy unless fuzzy_hostname_match_any?(host, ENV["no_proxy"])
989
- end
990
-
991
- # Chef requires an English-language UTF-8 locale to function properly. We attempt
992
- # to use the 'locale -a' command and search through a list of preferences until we
993
- # find one that we can use. On Ubuntu systems we should find 'C.UTF-8' and be
994
- # able to use that even if there is no English locale on the server, but Mac, Solaris,
995
- # AIX, etc do not have that locale. We then try to find an English locale and fall
996
- # back to 'C' if we do not. The choice of fallback is pick-your-poison. If we try
997
- # to do the work to return a non-US UTF-8 locale then we fail inside of providers when
998
- # things like 'svn info' return Japanese and we can't parse them. OTOH, if we pick 'C' then
999
- # we will blow up on UTF-8 characters. Between the warn we throw and the Encoding
1000
- # exception that ruby will throw it is more obvious what is broken if we drop UTF-8 by
1001
- # default rather than drop English.
1002
- #
1003
- # If there is no 'locale -a' then we return 'en_US.UTF-8' since that is the most commonly
1004
- # available English UTF-8 locale. However, all modern POSIXen should support 'locale -a'.
1005
- def self.guess_internal_locale
1006
- # https://github.com/chef/chef/issues/2181
1007
- # Some systems have the `locale -a` command, but the result has
1008
- # invalid characters for the default encoding.
1009
- #
1010
- # For example, on CentOS 6 with ENV['LANG'] = "en_US.UTF-8",
1011
- # `locale -a`.split fails with ArgumentError invalid UTF-8 encoding.
1012
- cmd = Mixlib::ShellOut.new("locale -a").run_command
1013
- cmd.error!
1014
- locales = cmd.stdout.split
1015
- case
1016
- when locales.include?("C.UTF-8")
1017
- "C.UTF-8"
1018
- when locales.include?("en_US.UTF-8"), locales.include?("en_US.utf8")
1019
- "en_US.UTF-8"
1020
- when locales.include?("en.UTF-8")
1021
- "en.UTF-8"
1022
- else
1023
- # Will match en_ZZ.UTF-8, en_ZZ.utf-8, en_ZZ.UTF8, en_ZZ.utf8
1024
- guesses = locales.select { |l| l =~ /^en_.*UTF-?8$/i }
1025
- unless guesses.empty?
1026
- guessed_locale = guesses.first
1027
- # Transform into the form en_ZZ.UTF-8
1028
- guessed_locale.gsub(/UTF-?8$/i, "UTF-8")
1029
- else
1030
- ChefConfig.logger.warn "Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support."
1031
- "C"
1032
- end
1033
- end
1034
- rescue
1035
- if ChefConfig.windows?
1036
- ChefConfig.logger.debug "Defaulting to locale en_US.UTF-8 on Windows, until it matters that we do something else."
1037
- else
1038
- ChefConfig.logger.debug "No usable locale -a command found, assuming you have en_US.UTF-8 installed."
1039
- end
1040
- "en_US.UTF-8"
1041
- end
1042
-
1043
- default :internal_locale, guess_internal_locale
1044
-
1045
- # Force UTF-8 Encoding, for when we fire up in the 'C' locale or other strange locales (e.g.
1046
- # japanese windows encodings). If we do not do this, then knife upload will fail when a cookbook's
1047
- # README.md has UTF-8 characters that do not encode in whatever surrounding encoding we have been
1048
- # passed. Effectively, the Chef Ecosystem is globally UTF-8 by default. Anyone who wants to be
1049
- # able to upload Shift_JIS or ISO-8859-1 files needs to mark *those* files explicitly with
1050
- # magic tags to make ruby correctly identify the encoding being used. Changing this default will
1051
- # break Chef community cookbooks and is very highly discouraged.
1052
- default :ruby_encoding, Encoding::UTF_8
1053
-
1054
- default :rubygems_url, "https://rubygems.org"
1055
-
1056
- # This controls the behavior of resource cloning (and CHEF-3694 warnings). For Chef < 12 the behavior
1057
- # has been that this is 'true', in Chef 13 this will change to false. Setting this to 'true' in Chef
1058
- # 13 is not a viable or supported migration strategy since Chef 13 community cookbooks will be expected
1059
- # to break with this setting set to 'true'.
1060
- default :resource_cloning, true
1061
-
1062
- # If installed via an omnibus installer, this gives the path to the
1063
- # "embedded" directory which contains all of the software packaged with
1064
- # omnibus. This is used to locate the cacert.pem file on windows.
1065
- def self.embedded_dir
1066
- Pathname.new(_this_file).ascend do |path|
1067
- if path.basename.to_s == "embedded"
1068
- return path.to_s
1069
- end
1070
- end
1071
-
1072
- nil
1073
- end
1074
-
1075
- # Path to this file in the current install.
1076
- def self._this_file
1077
- File.expand_path(__FILE__)
1078
- end
1079
-
1080
- # Set fips mode in openssl. Do any patching necessary to make
1081
- # sure Chef runs do not crash.
1082
- # @api private
1083
- def self.enable_fips_mode
1084
- OpenSSL.fips_mode = true
1085
- require "digest"
1086
- require "digest/sha1"
1087
- require "digest/md5"
1088
- # Remove pre-existing constants if they do exist to reduce the
1089
- # amount of log spam and warnings.
1090
- Digest.send(:remove_const, "SHA1") if Digest.const_defined?("SHA1")
1091
- Digest.const_set("SHA1", OpenSSL::Digest::SHA1)
1092
- OpenSSL::Digest.send(:remove_const, "MD5") if OpenSSL::Digest.const_defined?("MD5")
1093
- OpenSSL::Digest.const_set("MD5", Digest::MD5)
1094
- ChefConfig.logger.debug "FIPS mode is enabled."
1095
- end
1096
- end
1097
- end
1
+ #
2
+ # Author:: Adam Jacob (<adam@chef.io>)
3
+ # Author:: Christopher Brown (<cb@chef.io>)
4
+ # Author:: AJ Christensen (<aj@chef.io>)
5
+ # Author:: Mark Mzyk (<mmzyk@chef.io>)
6
+ # Author:: Kyle Goodwin (<kgoodwin@primerevenue.com>)
7
+ # Copyright:: Copyright 2008-2016, Chef Software Inc.
8
+ # License:: Apache License, Version 2.0
9
+ #
10
+ # Licensed under the Apache License, Version 2.0 (the "License");
11
+ # you may not use this file except in compliance with the License.
12
+ # You may obtain a copy of the License at
13
+ #
14
+ # http://www.apache.org/licenses/LICENSE-2.0
15
+ #
16
+ # Unless required by applicable law or agreed to in writing, software
17
+ # distributed under the License is distributed on an "AS IS" BASIS,
18
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ # See the License for the specific language governing permissions and
20
+ # limitations under the License.
21
+
22
+ require "mixlib/config"
23
+ require "pathname"
24
+
25
+ require "chef-config/fips"
26
+ require "chef-config/logger"
27
+ require "chef-config/windows"
28
+ require "chef-config/path_helper"
29
+ require "chef-config/mixin/fuzzy_hostname_matcher"
30
+
31
+ require "mixlib/shellout"
32
+ require "uri"
33
+ require "addressable/uri"
34
+ require "openssl"
35
+ require "yaml"
36
+
37
+ module ChefConfig
38
+
39
+ class Config
40
+
41
+ extend Mixlib::Config
42
+ extend ChefConfig::Mixin::FuzzyHostnameMatcher
43
+
44
+ # Evaluates the given string as config.
45
+ #
46
+ # +filename+ is used for context in stacktraces, but doesn't need to be the name of an actual file.
47
+ def self.from_string(string, filename)
48
+ instance_eval(string, filename, 1)
49
+ end
50
+
51
+ def self.inspect
52
+ configuration.inspect
53
+ end
54
+
55
+ def self.platform_specific_path(path)
56
+ path = PathHelper.cleanpath(path)
57
+ if ChefConfig.windows?
58
+ # turns \etc\chef\client.rb and \var\chef\client.rb into C:/chef/client.rb
59
+ # Some installations will be on different drives so use the drive that
60
+ # the expanded path to __FILE__ is found.
61
+ drive = windows_installation_drive
62
+ if drive && path[0] == '\\' && path.split('\\')[2] == "chef"
63
+ path = PathHelper.join(drive, path.split('\\', 3)[2])
64
+ end
65
+ end
66
+ path
67
+ end
68
+
69
+ def self.windows_installation_drive
70
+ if ChefConfig.windows?
71
+ drive = File.expand_path(__FILE__).split("/", 2)[0]
72
+ drive = ENV["SYSTEMDRIVE"] if drive.to_s == ""
73
+ drive
74
+ end
75
+ end
76
+
77
+ def self.add_formatter(name, file_path = nil)
78
+ formatters << [name, file_path]
79
+ end
80
+
81
+ def self.add_event_logger(logger)
82
+ event_handlers << logger
83
+ end
84
+
85
+ def self.apply_extra_config_options(extra_config_options)
86
+ if extra_config_options
87
+ extra_parsed_options = extra_config_options.inject({}) do |memo, option|
88
+ # Sanity check value.
89
+ if option.empty? || !option.include?("=")
90
+ raise UnparsableConfigOption, "Unparsable config option #{option.inspect}"
91
+ end
92
+ # Split including whitespace if someone does truly odd like
93
+ # --config-option "foo = bar"
94
+ key, value = option.split(/\s*=\s*/, 2)
95
+ # Call to_sym because Chef::Config expects only symbol keys. Also
96
+ # runs a simple parse on the string for some common types.
97
+ memo[key.to_sym] = YAML.safe_load(value)
98
+ memo
99
+ end
100
+ merge!(extra_parsed_options)
101
+ end
102
+ end
103
+
104
+ # Config file to load (client.rb, knife.rb, etc. defaults set differently in knife, chef-client, etc.)
105
+ configurable(:config_file)
106
+
107
+ default(:config_dir) do
108
+ if config_file
109
+ PathHelper.dirname(PathHelper.canonical_path(config_file, false))
110
+ else
111
+ PathHelper.join(user_home, ".chef", "")
112
+ end
113
+ end
114
+
115
+ default :formatters, []
116
+
117
+ def self.is_valid_url?(uri)
118
+ url = uri.to_s.strip
119
+ /^http:\/\// =~ url || /^https:\/\// =~ url || /^chefzero:/ =~ url
120
+ end
121
+ # Override the config dispatch to set the value of multiple server options simultaneously
122
+ #
123
+ # === Parameters
124
+ # url<String>:: String to be set for all of the chef-server-api URL's
125
+ #
126
+ configurable(:chef_server_url).writes_value do |uri|
127
+ unless is_valid_url? uri
128
+ raise ConfigurationError, "#{uri} is an invalid chef_server_url."
129
+ end
130
+ uri.to_s.strip
131
+ end
132
+
133
+ # When you are using ActiveSupport, they monkey-patch 'daemonize' into Kernel.
134
+ # So while this is basically identical to what method_missing would do, we pull
135
+ # it up here and get a real method written so that things get dispatched
136
+ # properly.
137
+ configurable(:daemonize).writes_value { |v| v }
138
+
139
+ # The root where all local chef object data is stored. cookbooks, data bags,
140
+ # environments are all assumed to be in separate directories under this.
141
+ # chef-solo uses these directories for input data. knife commands
142
+ # that upload or download files (such as knife upload, knife role from file,
143
+ # etc.) work.
144
+ default :chef_repo_path do
145
+ if configuration[:cookbook_path]
146
+ if configuration[:cookbook_path].kind_of?(String)
147
+ File.expand_path("..", configuration[:cookbook_path])
148
+ else
149
+ configuration[:cookbook_path].map do |path|
150
+ File.expand_path("..", path)
151
+ end
152
+ end
153
+ elsif configuration[:cookbook_artifact_path]
154
+ File.expand_path("..", configuration[:cookbook_artifact_path])
155
+ else
156
+ cache_path
157
+ end
158
+ end
159
+
160
+ def self.find_chef_repo_path(cwd)
161
+ # In local mode, we auto-discover the repo root by looking for a path with "cookbooks" under it.
162
+ # This allows us to run config-free.
163
+ path = cwd
164
+ until File.directory?(PathHelper.join(path, "cookbooks")) || File.directory?(PathHelper.join(path, "cookbook_artifacts"))
165
+ new_path = File.expand_path("..", path)
166
+ if new_path == path
167
+ ChefConfig.logger.warn("No cookbooks directory found at or above current directory. Assuming #{cwd}.")
168
+ return cwd
169
+ end
170
+ path = new_path
171
+ end
172
+ ChefConfig.logger.info("Auto-discovered chef repository at #{path}")
173
+ path
174
+ end
175
+
176
+ def self.derive_path_from_chef_repo_path(child_path)
177
+ if chef_repo_path.kind_of?(String)
178
+ PathHelper.join(chef_repo_path, child_path)
179
+ else
180
+ chef_repo_path.uniq.map { |path| PathHelper.join(path, child_path) }
181
+ end
182
+ end
183
+
184
+ # Location of acls on disk. String or array of strings.
185
+ # Defaults to <chef_repo_path>/acls.
186
+ default(:acl_path) { derive_path_from_chef_repo_path("acls") }
187
+
188
+ # Location of clients on disk. String or array of strings.
189
+ # Defaults to <chef_repo_path>/clients.
190
+ default(:client_path) { derive_path_from_chef_repo_path("clients") }
191
+
192
+ # Location of client keys on disk. String or array of strings.
193
+ # Defaults to <chef_repo_path>/client_keys.
194
+ default(:client_key_path) { derive_path_from_chef_repo_path("client_keys") }
195
+
196
+ # Location of containers on disk. String or array of strings.
197
+ # Defaults to <chef_repo_path>/containers.
198
+ default(:container_path) { derive_path_from_chef_repo_path("containers") }
199
+
200
+ # Location of cookbook_artifacts on disk. String or array of strings.
201
+ # Defaults to <chef_repo_path>/cookbook_artifacts.
202
+ default(:cookbook_artifact_path) { derive_path_from_chef_repo_path("cookbook_artifacts") }
203
+
204
+ # Location of cookbooks on disk. String or array of strings.
205
+ # Defaults to <chef_repo_path>/cookbooks. If chef_repo_path
206
+ # is not specified, this is set to [/var/chef/cookbooks, /var/chef/site-cookbooks]).
207
+ default(:cookbook_path) do
208
+ if configuration[:chef_repo_path]
209
+ derive_path_from_chef_repo_path("cookbooks")
210
+ else
211
+ Array(derive_path_from_chef_repo_path("cookbooks")).flatten +
212
+ Array(derive_path_from_chef_repo_path("site-cookbooks")).flatten
213
+ end
214
+ end
215
+
216
+ # Location of data bags on disk. String or array of strings.
217
+ # Defaults to <chef_repo_path>/data_bags.
218
+ default(:data_bag_path) { derive_path_from_chef_repo_path("data_bags") }
219
+
220
+ # Location of environments on disk. String or array of strings.
221
+ # Defaults to <chef_repo_path>/environments.
222
+ default(:environment_path) { derive_path_from_chef_repo_path("environments") }
223
+
224
+ # Location of groups on disk. String or array of strings.
225
+ # Defaults to <chef_repo_path>/groups.
226
+ default(:group_path) { derive_path_from_chef_repo_path("groups") }
227
+
228
+ # Location of nodes on disk. String or array of strings.
229
+ # Defaults to <chef_repo_path>/nodes.
230
+ default(:node_path) { derive_path_from_chef_repo_path("nodes") }
231
+
232
+ # Location of policies on disk. String or array of strings.
233
+ # Defaults to <chef_repo_path>/policies.
234
+ default(:policy_path) { derive_path_from_chef_repo_path("policies") }
235
+
236
+ # Location of policy_groups on disk. String or array of strings.
237
+ # Defaults to <chef_repo_path>/policy_groups.
238
+ default(:policy_group_path) { derive_path_from_chef_repo_path("policy_groups") }
239
+
240
+ # Location of roles on disk. String or array of strings.
241
+ # Defaults to <chef_repo_path>/roles.
242
+ default(:role_path) { derive_path_from_chef_repo_path("roles") }
243
+
244
+ # Location of users on disk. String or array of strings.
245
+ # Defaults to <chef_repo_path>/users.
246
+ default(:user_path) { derive_path_from_chef_repo_path("users") }
247
+
248
+ # Location of policies on disk. String or array of strings.
249
+ # Defaults to <chef_repo_path>/policies.
250
+ default(:policy_path) { derive_path_from_chef_repo_path("policies") }
251
+
252
+ # Turn on "path sanity" by default. See also: http://wiki.opscode.com/display/chef/User+Environment+PATH+Sanity
253
+ default :enforce_path_sanity, true
254
+
255
+ # Formatted Chef Client output is a beta feature, disabled by default:
256
+ default :formatter, "null"
257
+
258
+ # The number of times the client should retry when registering with the server
259
+ default :client_registration_retries, 5
260
+
261
+ # An array of paths to search for knife exec scripts if they aren't in the current directory
262
+ default :script_path, []
263
+
264
+ # The root of all caches (checksums, cache and backup). If local mode is on,
265
+ # this is under the user's home directory.
266
+ default(:cache_path) do
267
+ if local_mode
268
+ PathHelper.join(config_dir, "local-mode-cache")
269
+ else
270
+ primary_cache_root = platform_specific_path("/var")
271
+ primary_cache_path = platform_specific_path("/var/chef")
272
+ # Use /var/chef as the cache path only if that folder exists and we can read and write
273
+ # into it, or /var exists and we can read and write into it (we'll create /var/chef later).
274
+ # Otherwise, we'll create .chef under the user's home directory and use that as
275
+ # the cache path.
276
+ unless path_accessible?(primary_cache_path) || path_accessible?(primary_cache_root)
277
+ secondary_cache_path = PathHelper.join(user_home, ".chef")
278
+ ChefConfig.logger.info("Unable to access cache at #{primary_cache_path}. Switching cache to #{secondary_cache_path}")
279
+ secondary_cache_path
280
+ else
281
+ primary_cache_path
282
+ end
283
+ end
284
+ end
285
+
286
+ # Returns true only if the path exists and is readable and writeable for the user.
287
+ def self.path_accessible?(path)
288
+ File.exists?(path) && File.readable?(path) && File.writable?(path)
289
+ end
290
+
291
+ # Where cookbook files are stored on the server (by content checksum)
292
+ default(:checksum_path) { PathHelper.join(cache_path, "checksums") }
293
+
294
+ # Where chef's cache files should be stored
295
+ default(:file_cache_path) { PathHelper.join(cache_path, "cache") }
296
+
297
+ # Where backups of chef-managed files should go
298
+ default(:file_backup_path) { PathHelper.join(cache_path, "backup") }
299
+
300
+ # The chef-client (or solo) lockfile.
301
+ #
302
+ # If your `file_cache_path` resides on a NFS (or non-flock()-supporting
303
+ # fs), it's recommended to set this to something like
304
+ # '/tmp/chef-client-running.pid'
305
+ default(:lockfile) { PathHelper.join(file_cache_path, "chef-client-running.pid") }
306
+
307
+ ## Daemonization Settings ##
308
+ # What user should Chef run as?
309
+ default :user, nil
310
+ default :group, nil
311
+ default :umask, 0022
312
+
313
+ # Valid log_levels are:
314
+ # * :debug
315
+ # * :info
316
+ # * :warn
317
+ # * :fatal
318
+ # These work as you'd expect. There is also a special `:auto` setting.
319
+ # When set to :auto, Chef will auto adjust the log verbosity based on
320
+ # context. When a tty is available (usually because the user is running chef
321
+ # in a console), the log level is set to :warn, and output formatters are
322
+ # used as the primary mode of output. When a tty is not available, the
323
+ # logger is the primary mode of output, and the log level is set to :info
324
+ default :log_level, :auto
325
+
326
+ # Logging location as either an IO stream or string representing log file path
327
+ default :log_location, STDOUT
328
+
329
+ # Using `force_formatter` causes chef to default to formatter output when STDOUT is not a tty
330
+ default :force_formatter, false
331
+
332
+ # Using `force_logger` causes chef to default to logger output when STDOUT is a tty
333
+ default :force_logger, false
334
+
335
+ # Using 'stream_execute_output' will have Chef always stream the execute output
336
+ default :stream_execute_output, false
337
+
338
+ # Using `show_download_progress` will display the overall progress
339
+ # of a remote file download
340
+ default :show_download_progress, false
341
+ # How often to update the progress meter, in percent
342
+ default :download_progress_interval, 10
343
+
344
+ default :http_retry_count, 5
345
+ default :http_retry_delay, 5
346
+ default :interval, nil
347
+ default :once, nil
348
+ default :json_attribs, nil
349
+ # toggle info level log items that can create a lot of output
350
+ default :verbose_logging, true
351
+ default :node_name, nil
352
+ default :diff_disabled, false
353
+ default :diff_filesize_threshold, 10000000
354
+ default :diff_output_threshold, 1000000
355
+ default :local_mode, false
356
+
357
+ # Configures the mode of operation for ChefFS, which is applied to the
358
+ # ChefFS-based knife commands and chef-client's local mode. (ChefFS-based
359
+ # knife commands include: knife delete, knife deps, knife diff, knife down,
360
+ # knife edit, knife list, knife show, knife upload, and knife xargs.)
361
+ #
362
+ # Valid values are:
363
+ # * "static": ChefFS only manages objects that exist in a traditional Chef
364
+ # Repo as of Chef 11.
365
+ # * "everything": ChefFS manages all object types that existed on the OSS
366
+ # Chef 11 server.
367
+ # * "hosted_everything": ChefFS manages all object types as of the Chef 12
368
+ # Server, including RBAC objects and Policyfile objects (new to Chef 12).
369
+ default :repo_mode do
370
+ if local_mode && !chef_zero.osc_compat
371
+ "hosted_everything"
372
+ elsif chef_server_url =~ /\/+organizations\/.+/
373
+ "hosted_everything"
374
+ else
375
+ "everything"
376
+ end
377
+ end
378
+
379
+ default :pid_file, nil
380
+
381
+ # Whether Chef Zero local mode should bind to a port. All internal requests
382
+ # will go through the socketless code path regardless, so the socket is
383
+ # only needed if other processes will connect to the local mode server.
384
+ #
385
+ # For compatibility this is set to true but it will be changed to false in
386
+ # the future.
387
+ default :listen, true
388
+
389
+ config_context :chef_zero do
390
+ config_strict_mode true
391
+ default(:enabled) { ChefConfig::Config.local_mode }
392
+ default :host, "localhost"
393
+ default :port, 8889.upto(9999) # Will try ports from 8889-9999 until one works
394
+
395
+ # When set to a String, Chef Zero disables multitenant support. This is
396
+ # what you want when using Chef Zero to serve a single Chef Repo. Setting
397
+ # this to `false` enables multi-tenant.
398
+ default :single_org, "chef"
399
+
400
+ # Whether Chef Zero should operate in a mode analogous to OSS Chef Server
401
+ # 11 (true) or Chef Server 12 (false). Chef Zero can still serve
402
+ # policyfile objects in Chef 11 mode, as long as `repo_mode` is set to
403
+ # "hosted_everything". The primary differences are:
404
+ # * Chef 11 mode doesn't support multi-tennant, so there is no
405
+ # distinction between global and org-specific objects (since there are
406
+ # no orgs).
407
+ # * Chef 11 mode doesn't expose RBAC objects
408
+ default :osc_compat, false
409
+ end
410
+ default :chef_server_url, "https://localhost:443"
411
+
412
+ default(:chef_server_root) do
413
+ # if the chef_server_url is a path to an organization, aka
414
+ # 'some_url.../organizations/*' then remove the '/organization/*' by default
415
+ if configuration[:chef_server_url] =~ /\/organizations\/\S*$/
416
+ configuration[:chef_server_url].split("/")[0..-3].join("/")
417
+ elsif configuration[:chef_server_url] # default to whatever chef_server_url is
418
+ configuration[:chef_server_url]
419
+ else
420
+ "https://localhost:443"
421
+ end
422
+ end
423
+
424
+ default :rest_timeout, 300
425
+ default :yum_timeout, 900
426
+ default :yum_lock_timeout, 30
427
+ default :solo, false
428
+
429
+ # Are we running in old Chef Solo legacy mode?
430
+ default :solo_legacy_mode, false
431
+
432
+ default :splay, nil
433
+ default :why_run, false
434
+ default :color, false
435
+ default :client_fork, true
436
+ default :ez, false
437
+ default :enable_reporting, true
438
+ default :enable_reporting_url_fatals, false
439
+ # Possible values for :audit_mode
440
+ # :enabled, :disabled, :audit_only,
441
+ #
442
+ # TODO: 11 Dec 2014: Currently audit-mode is an experimental feature
443
+ # and is disabled by default. When users choose to enable audit-mode,
444
+ # a warning is issued in application/client#reconfigure.
445
+ # This can be removed when audit-mode is enabled by default.
446
+ default :audit_mode, :disabled
447
+
448
+ # Chef only needs ohai to run the hostname plugin for the most basic
449
+ # functionality. If the rest of the ohai plugins are not needed (like in
450
+ # most of our testing scenarios)
451
+ default :minimal_ohai, false
452
+
453
+ ###
454
+ # Policyfile Settings
455
+ #
456
+ # Policyfile is a feature where a node gets its run list and cookbook
457
+ # version set from a single document on the server instead of expanding the
458
+ # run list and having the server compute the cookbook version set based on
459
+ # environment constraints.
460
+ #
461
+ # Policyfiles are auto-versioned. The user groups nodes by `policy_name`,
462
+ # which generally describes a hosts's functional role, and `policy_group`,
463
+ # which generally groups nodes by deployment phase (a.k.a., "environment").
464
+ # The Chef Server maps a given set of `policy_name` plus `policy_group` to
465
+ # a particular revision of a policy.
466
+
467
+ default :policy_name, nil
468
+ default :policy_group, nil
469
+
470
+ # Policyfiles can have multiple run lists, via the named run list feature.
471
+ # Generally this will be set by a CLI option via Chef::Application::Client,
472
+ # but it could be set in client.rb if desired.
473
+
474
+ default :named_run_list, nil
475
+
476
+ # During initial development, users were required to set `use_policyfile true`
477
+ # in `client.rb` to opt-in to policyfile use. Chef Client now examines
478
+ # configuration, node json, and the stored node to determine if policyfile
479
+ # usage is desired. This flag is still honored if set, but is unnecessary.
480
+ default :use_policyfile, false
481
+
482
+ # Policyfiles can be used in a native mode (default) or compatibility mode.
483
+ # Native mode requires Chef Server 12.1 (it can be enabled via feature flag
484
+ # on some prior versions). In native mode, policies and associated
485
+ # cookbooks are accessed via feature-specific APIs. In compat mode,
486
+ # policies are stored as data bags and cookbooks are stored at the
487
+ # cookbooks/ endpoint. Compatibility mode can be dangerous on existing Chef
488
+ # Servers; it's recommended to upgrade your Chef Server rather than use
489
+ # compatibility mode. Compatibility mode remains available so you can use
490
+ # policyfiles with servers that don't yet support the native endpoints.
491
+ default :policy_document_native_api, true
492
+
493
+ # When policyfiles are used in compatibility mode, `policy_name` and
494
+ # `policy_group` are instead specified using a combined configuration
495
+ # setting, `deployment_group`. For example, if policy_name should be
496
+ # "webserver" and policy_group should be "staging", then `deployment_group`
497
+ # should be set to "webserver-staging", which is the name of the data bag
498
+ # item that the policy will be stored as. NOTE: this setting only has an
499
+ # effect if `policy_document_native_api` is set to `false`.
500
+ default :deployment_group, nil
501
+
502
+ # Set these to enable SSL authentication / mutual-authentication
503
+ # with the server
504
+
505
+ # Client side SSL cert/key for mutual auth
506
+ default :ssl_client_cert, nil
507
+ default :ssl_client_key, nil
508
+
509
+ # Whether or not to verify the SSL cert for all HTTPS requests. When set to
510
+ # :verify_peer (default), all HTTPS requests will be validated regardless of other
511
+ # SSL verification settings. When set to :verify_none no HTTPS requests will
512
+ # be validated.
513
+ default :ssl_verify_mode, :verify_peer
514
+
515
+ # Whether or not to verify the SSL cert for HTTPS requests to the Chef
516
+ # server API. If set to `true`, the server's cert will be validated
517
+ # regardless of the :ssl_verify_mode setting. This is set to `true` when
518
+ # running in local-mode.
519
+ # NOTE: This is a workaround until verify_peer is enabled by default.
520
+ default(:verify_api_cert) { ChefConfig::Config.local_mode }
521
+
522
+ # Path to the default CA bundle files.
523
+ default :ssl_ca_path, nil
524
+ default(:ssl_ca_file) do
525
+ if ChefConfig.windows? && embedded_dir
526
+ cacert_path = File.join(embedded_dir, "ssl/certs/cacert.pem")
527
+ cacert_path if File.exist?(cacert_path)
528
+ else
529
+ nil
530
+ end
531
+ end
532
+
533
+ # A directory that contains additional SSL certificates to trust. Any
534
+ # certificates in this directory will be added to whatever CA bundle ruby
535
+ # is using. Use this to add self-signed certs for your Chef Server or local
536
+ # HTTP file servers.
537
+ default(:trusted_certs_dir) { PathHelper.join(config_dir, "trusted_certs") }
538
+
539
+ # A directory that contains additional configuration scripts to load for chef-client
540
+ default(:client_d_dir) { PathHelper.join(config_dir, "client.d") }
541
+
542
+ # A directory that contains additional configuration scripts to load for solo
543
+ default(:solo_d_dir) { PathHelper.join(config_dir, "solo.d") }
544
+
545
+ # A directory that contains additional configuration scripts to load for
546
+ # the workstation config
547
+ default(:config_d_dir) { PathHelper.join(config_dir, "config.d") }
548
+
549
+ # Where should chef-solo download recipes from?
550
+ default :recipe_url, nil
551
+
552
+ # Set to true if Chef is to set OpenSSL to run in FIPS mode
553
+ default(:fips) do
554
+ # CHEF_FIPS is used in testing to override checking for system level
555
+ # enablement. There are 3 possible values that this variable may have:
556
+ # nil - no override and the system will be checked
557
+ # empty - FIPS is NOT enabled
558
+ # a non empty value - FIPS is enabled
559
+ if ENV["CHEF_FIPS"] == ""
560
+ false
561
+ else
562
+ !ENV["CHEF_FIPS"].nil? || ChefConfig.fips?
563
+ end
564
+ end
565
+
566
+ # Initialize openssl
567
+ def self.init_openssl
568
+ if fips
569
+ enable_fips_mode
570
+ end
571
+ end
572
+
573
+ # Sets the version of the signed header authentication protocol to use (see
574
+ # the 'mixlib-authorization' project for more detail). Currently, versions
575
+ # 1.0, 1.1, and 1.3 are available.
576
+ default :authentication_protocol_version do
577
+ if fips
578
+ "1.3"
579
+ else
580
+ "1.1"
581
+ end
582
+ end
583
+
584
+ # This key will be used to sign requests to the Chef server. This location
585
+ # must be writable by Chef during initial setup when generating a client
586
+ # identity on the server.
587
+ #
588
+ # The chef-server will look up the public key for the client using the
589
+ # `node_name` of the client.
590
+ #
591
+ # If chef-zero is enabled, this defaults to nil (no authentication).
592
+ default(:client_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/client.pem") }
593
+
594
+ # When registering the client, should we allow the client key location to
595
+ # be a symlink? eg: /etc/chef/client.pem -> /etc/chef/prod-client.pem
596
+ # If the path of the key goes through a directory like /tmp this should
597
+ # never be set to true or its possibly an easily exploitable security hole.
598
+ default :follow_client_key_symlink, false
599
+
600
+ # This secret is used to decrypt encrypted data bag items.
601
+ default(:encrypted_data_bag_secret) do
602
+ if File.exist?(platform_specific_path("/etc/chef/encrypted_data_bag_secret"))
603
+ platform_specific_path("/etc/chef/encrypted_data_bag_secret")
604
+ else
605
+ nil
606
+ end
607
+ end
608
+
609
+ # As of Chef 11.0, version "1" is the default encrypted data bag item
610
+ # format. Version "2" is available which adds encrypt-then-mac protection.
611
+ # To maintain compatibility, versions other than 1 must be opt-in.
612
+ #
613
+ # Set this to `2` if you have chef-client 11.6.0+ in your infrastructure.
614
+ # Set this to `3` if you have chef-client 11.?.0+, ruby 2 and OpenSSL >= 1.0.1 in your infrastructure. (TODO)
615
+ default :data_bag_encrypt_version, 1
616
+
617
+ # When reading data bag items, any supported version is accepted. However,
618
+ # if all encrypted data bags have been generated with the version 2 format,
619
+ # it is recommended to disable support for earlier formats to improve
620
+ # security. For example, the version 2 format is identical to version 1
621
+ # except for the addition of an HMAC, so an attacker with MITM capability
622
+ # could downgrade an encrypted data bag to version 1 as part of an attack.
623
+ default :data_bag_decrypt_minimum_version, 0
624
+
625
+ # If there is no file in the location given by `client_key`, chef-client
626
+ # will temporarily use the "validator" identity to generate one. If the
627
+ # `client_key` is not present and the `validation_key` is also not present,
628
+ # chef-client will not be able to authenticate to the server.
629
+ #
630
+ # The `validation_key` is never used if the `client_key` exists.
631
+ #
632
+ # If chef-zero is enabled, this defaults to nil (no authentication).
633
+ default(:validation_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/validation.pem") }
634
+ default :validation_client_name, "chef-validator"
635
+
636
+ # When creating a new client via the validation_client account, Chef 11
637
+ # servers allow the client to generate a key pair locally and send the
638
+ # public key to the server. This is more secure and helps offload work from
639
+ # the server, enhancing scalability. If enabled and the remote server
640
+ # implements only the Chef 10 API, client registration will not work
641
+ # properly.
642
+ #
643
+ # The default value is `true`. Set to `false` to disable client-side key
644
+ # generation (server generates client keys).
645
+ default(:local_key_generation) { true }
646
+
647
+ # Zypper package provider gpg checks. Set to true to enable package
648
+ # gpg signature checking. This will be default in the
649
+ # future. Setting to false disables the warnings.
650
+ # Leaving this set to nil or false is a security hazard!
651
+ default :zypper_check_gpg, nil
652
+
653
+ # Report Handlers
654
+ default :report_handlers, []
655
+
656
+ # Event Handlers
657
+ default :event_handlers, []
658
+
659
+ default :disable_event_loggers, false
660
+
661
+ # Exception Handlers
662
+ default :exception_handlers, []
663
+
664
+ # Start handlers
665
+ default :start_handlers, []
666
+
667
+ # Syntax Check Cache. Knife keeps track of files that is has already syntax
668
+ # checked by storing files in this directory. `syntax_check_cache_path` is
669
+ # the new (and preferred) configuration setting. If not set, knife will
670
+ # fall back to using cache_options[:path], which is deprecated but exists in
671
+ # many client configs generated by pre-Chef-11 bootstrappers.
672
+ default(:syntax_check_cache_path) { cache_options[:path] }
673
+
674
+ # Deprecated:
675
+ # Move this to the default value of syntax_cache_path when this is removed.
676
+ default(:cache_options) { { :path => PathHelper.join(config_dir, "syntaxcache") } }
677
+
678
+ # Whether errors should be raised for deprecation warnings. When set to
679
+ # `false` (the default setting), a warning is emitted but code using
680
+ # deprecated methods/features/etc. should work normally otherwise. When set
681
+ # to `true`, usage of deprecated methods/features will raise a
682
+ # `DeprecatedFeatureError`. This is used by Chef's tests to ensure that
683
+ # deprecated functionality is not used internally by Chef. End users
684
+ # should generally leave this at the default setting (especially in
685
+ # production), but it may be useful when testing cookbooks or other code if
686
+ # the user wishes to aggressively address deprecations.
687
+ default(:treat_deprecation_warnings_as_errors) do
688
+ # Using an environment variable allows this setting to be inherited in
689
+ # tests that spawn new processes.
690
+ ENV.key?("CHEF_TREAT_DEPRECATION_WARNINGS_AS_ERRORS")
691
+ end
692
+
693
+ # Whether the resource count should be updated for log resource
694
+ # on running chef-client
695
+ default :count_log_resource_updates, true
696
+
697
+ # knife configuration data
698
+ config_context :knife do
699
+ # XXX: none of these default values are applied to knife (and would create a backcompat
700
+ # break in knife if this bug was fixed since many of the defaults below are wrong). this appears
701
+ # to be the start of an attempt to be able to use config_strict_mode true? if so, this approach
702
+ # is fraught with peril because this namespace is used by every knife plugin in the wild and
703
+ # we would need to validate every cli option in every knife attribute out there and list them all here.
704
+ #
705
+ # based on the way that people may define `knife[:foobar] = "something"` for the knife-foobar
706
+ # gem plugin i'm pretty certain we can never turn on anything like config_string_mode since
707
+ # any config value may be a typo or it may be in some gem in some knife plugin we don't know about.
708
+ #
709
+ # we do still need to maintain at least one of these so that the knife config hash gets
710
+ # created.
711
+ #
712
+ # this whole situation is deeply unsatisfying.
713
+ default :ssh_port, nil
714
+ default :ssh_user, nil
715
+ default :ssh_attribute, nil
716
+ default :ssh_gateway, nil
717
+ default :bootstrap_version, nil
718
+ default :bootstrap_proxy, nil
719
+ default :bootstrap_template, nil
720
+ default :secret, nil
721
+ default :secret_file, nil
722
+ default :identity_file, nil
723
+ default :host_key_verify, nil
724
+ default :forward_agent, nil
725
+ default :sort_status_reverse, nil
726
+ default :hints, {}
727
+ end
728
+
729
+ def self.set_defaults_for_windows
730
+ # Those lists of regular expressions define what chef considers a
731
+ # valid user and group name
732
+ # From http://technet.microsoft.com/en-us/library/cc776019(WS.10).aspx
733
+ principal_valid_regex_part = '[^"\/\\\\\[\]\:;|=,+*?<>]+'
734
+ default :user_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
735
+ default :group_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
736
+
737
+ default :fatal_windows_admin_check, false
738
+ end
739
+
740
+ def self.set_defaults_for_nix
741
+ # Those lists of regular expressions define what chef considers a
742
+ # valid user and group name
743
+ #
744
+ # user/group cannot start with '-', '+' or '~'
745
+ # user/group cannot contain ':', ',' or non-space-whitespace or null byte
746
+ # everything else is allowed (UTF-8, spaces, etc) and we delegate to your O/S useradd program to barf or not
747
+ # copies: http://anonscm.debian.org/viewvc/pkg-shadow/debian/trunk/debian/patches/506_relaxed_usernames?view=markup
748
+ default :user_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
749
+ default :group_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
750
+ end
751
+
752
+ # Those lists of regular expressions define what chef considers a
753
+ # valid user and group name
754
+ if ChefConfig.windows?
755
+ set_defaults_for_windows
756
+ else
757
+ set_defaults_for_nix
758
+ end
759
+
760
+ # This provides a hook which rspec can stub so that we can avoid twiddling
761
+ # global state in tests.
762
+ def self.env
763
+ ENV
764
+ end
765
+
766
+ def self.windows_home_path
767
+ ChefConfig.logger.deprecation("Chef::Config.windows_home_path is now deprecated. Consider using Chef::Util::PathHelper.home instead.")
768
+ PathHelper.home
769
+ end
770
+
771
+ # returns a platform specific path to the user home dir if set, otherwise default to current directory.
772
+ default( :user_home ) { PathHelper.home || Dir.pwd }
773
+
774
+ # Enable file permission fixup for selinux. Fixup will be done
775
+ # only if selinux is enabled in the system.
776
+ default :enable_selinux_file_permission_fixup, true
777
+
778
+ # Use atomic updates (i.e. move operation) while updating contents
779
+ # of the files resources. When set to false copy operation is
780
+ # used to update files.
781
+ #
782
+ # NOTE: CHANGING THIS SETTING MAY CAUSE CORRUPTION, DATA LOSS AND
783
+ # INSTABILITY.
784
+ default :file_atomic_update, true
785
+
786
+ # There are 3 possible values for this configuration setting.
787
+ # true => file staging is done in the destination directory
788
+ # false => file staging is done via tempfiles under ENV['TMP']
789
+ # :auto => file staging will try using destination directory if possible and
790
+ # will fall back to ENV['TMP'] if destination directory is not usable.
791
+ default :file_staging_uses_destdir, :auto
792
+
793
+ # Exit if another run is in progress and the chef-client is unable to
794
+ # get the lock before time expires. If nil, no timeout is enforced. (Exits
795
+ # immediately if 0.)
796
+ default :run_lock_timeout, nil
797
+
798
+ # Number of worker threads for syncing cookbooks in parallel. Increasing
799
+ # this number can result in gateway errors from the server (namely 503 and 504).
800
+ # If you are seeing this behavior while using the default setting, reducing
801
+ # the number of threads will help.
802
+ default :cookbook_sync_threads, 10
803
+
804
+ # At the beginning of the Chef Client run, the cookbook manifests are downloaded which
805
+ # contain URLs for every file in every relevant cookbook. Most of the files
806
+ # (recipes, resources, providers, libraries, etc) are immediately synchronized
807
+ # at the start of the run. The handling of "files" and "templates" directories,
808
+ # however, have two modes of operation. They can either all be downloaded immediately
809
+ # at the start of the run (no_lazy_load==true) or else they can be lazily loaded as
810
+ # cookbook_file or template resources are converged which require them (no_lazy_load==false).
811
+ #
812
+ # The advantage of lazily loading these files is that unnecessary files are not
813
+ # synchronized. This may be useful to users with large files checked into cookbooks which
814
+ # are only selectively downloaded to a subset of clients which use the cookbook. However,
815
+ # better solutions are to either isolate large files into individual cookbooks and only
816
+ # include those cookbooks in the run lists of the servers that need them -- or move to
817
+ # using remote_file and a more appropriate backing store like S3 for large file
818
+ # distribution.
819
+ #
820
+ # The disadvantages of lazily loading files are that users some time find it
821
+ # confusing that their cookbooks are not fully synchronzied to the cache initially,
822
+ # and more importantly the time-sensitive URLs which are in the manifest may time
823
+ # out on long Chef runs before the resource that uses the file is converged
824
+ # (leading to many confusing 403 errors on template/cookbook_file resources).
825
+ #
826
+ default :no_lazy_load, true
827
+
828
+ # Default for the chef_gem compile_time attribute. Nil is the same as true but will emit
829
+ # warnings on every use of chef_gem prompting the user to be explicit. If the user sets this to
830
+ # true then the user will get backcompat behavior but with a single nag warning that cookbooks
831
+ # may break with this setting in the future. The false setting is the recommended setting and
832
+ # will become the default.
833
+ default :chef_gem_compile_time, nil
834
+
835
+ # A whitelisted array of attributes you want sent over the wire when node
836
+ # data is saved.
837
+ # The default setting is nil, which collects all data. Setting to [] will not
838
+ # collect any data for save.
839
+ default :automatic_attribute_whitelist, nil
840
+ default :default_attribute_whitelist, nil
841
+ default :normal_attribute_whitelist, nil
842
+ default :override_attribute_whitelist, nil
843
+
844
+ # Pull down all the rubygems versions from rubygems and cache them the first time we do a gem_package or
845
+ # chef_gem install. This is memory-expensive and will grow without bounds, but will reduce network
846
+ # round trips.
847
+ default :rubygems_cache_enabled, false
848
+
849
+ config_context :windows_service do
850
+ # Set `watchdog_timeout` to the number of seconds to wait for a chef-client run
851
+ # to finish
852
+ default :watchdog_timeout, 2 * (60 * 60) # 2 hours
853
+ end
854
+
855
+ # Add an empty and non-strict config_context for chefdk. This lets the user
856
+ # have code like `chefdk.generator_cookbook "/path/to/cookbook"` in their
857
+ # config.rb, and it will be ignored by tools like knife and ohai. ChefDK
858
+ # itself can define the config options it accepts and enable strict mode,
859
+ # and that will only apply when running `chef` commands.
860
+ config_context :chefdk do
861
+ end
862
+
863
+ # Configuration options for Data Collector reporting. These settings allow
864
+ # the user to configure where to send their Data Collector data, what token
865
+ # to send, and whether Data Collector should report its findings in client
866
+ # mode vs. solo mode.
867
+ config_context :data_collector do
868
+ # Full URL to the endpoint that will receive our data. If nil, the
869
+ # data collector will not run.
870
+ # Ex: http://my-data-collector.mycompany.com/ingest
871
+ default(:server_url) do
872
+ if config_parent.solo || config_parent.local_mode
873
+ nil
874
+ else
875
+ File.join(config_parent.chef_server_url, "/data-collector")
876
+ end
877
+ end
878
+
879
+ # An optional pre-shared token to pass as an HTTP header (x-data-collector-token)
880
+ # that can be used to determine whether or not the poster of this
881
+ # run data should be trusted.
882
+ # Ex: some-uuid-here
883
+ default :token, nil
884
+
885
+ # The Chef mode during which Data Collector is allowed to function. This
886
+ # can be used to run Data Collector only when running as Chef Solo but
887
+ # not when using Chef Client.
888
+ # Options: :solo (for both Solo Legacy Mode and Client Local Mode), :client, :both
889
+ default :mode, :both
890
+
891
+ # When the Data Collector cannot send the "starting a run" message to
892
+ # the Data Collector server, the Data Collector will be disabled for that
893
+ # run. In some situations, such as highly-regulated environments, it
894
+ # may be more reasonable to prevent Chef from performing the actual run.
895
+ # In these situations, setting this value to true will cause the Chef
896
+ # run to raise an exception before starting any converge activities.
897
+ default :raise_on_failure, false
898
+
899
+ # A user-supplied Organization string that can be sent in payloads
900
+ # generated by the DataCollector when Chef is run in Solo mode. This
901
+ # allows users to associate their Solo nodes with faux organizations
902
+ # without the nodes being connected to an actual Chef Server.
903
+ default :organization, nil
904
+ end
905
+
906
+ configurable(:http_proxy)
907
+ configurable(:http_proxy_user)
908
+ configurable(:http_proxy_pass)
909
+ configurable(:https_proxy)
910
+ configurable(:https_proxy_user)
911
+ configurable(:https_proxy_pass)
912
+ configurable(:ftp_proxy)
913
+ configurable(:ftp_proxy_user)
914
+ configurable(:ftp_proxy_pass)
915
+ configurable(:no_proxy)
916
+
917
+ # Public method that users should call to export proxies to the appropriate
918
+ # environment variables. This method should be called after the config file is
919
+ # parsed and loaded.
920
+ # TODO add some post-file-parsing logic that automatically calls this so
921
+ # users don't have to
922
+ def self.export_proxies
923
+ export_proxy("http", http_proxy, http_proxy_user, http_proxy_pass) if http_proxy
924
+ export_proxy("https", https_proxy, https_proxy_user, https_proxy_pass) if https_proxy
925
+ export_proxy("ftp", ftp_proxy, ftp_proxy_user, ftp_proxy_pass) if ftp_proxy
926
+ export_no_proxy(no_proxy) if no_proxy
927
+ end
928
+
929
+ # Character classes for Addressable
930
+ # See https://www.ietf.org/rfc/rfc3986.txt 3.2.1
931
+ # The user part may not have a : in it
932
+ USER = Addressable::URI::CharacterClasses::UNRESERVED + Addressable::URI::CharacterClasses::SUB_DELIMS
933
+ # The password part may have any valid USERINFO characters
934
+ PASSWORD = USER + "\\:"
935
+
936
+ # Builds a proxy uri and exports it to the appropriate environment variables. Examples:
937
+ # http://username:password@hostname:port
938
+ # https://username@hostname:port
939
+ # ftp://hostname:port
940
+ # when
941
+ # scheme = "http", "https", or "ftp"
942
+ # hostport = hostname:port or scheme://hostname:port
943
+ # user = username
944
+ # pass = password
945
+ # @api private
946
+ def self.export_proxy(scheme, path, user, pass)
947
+ path = "#{scheme}://#{path}" unless path.include?("://")
948
+ # URI.split returns the following parts:
949
+ # [scheme, userinfo, host, port, registry, path, opaque, query, fragment]
950
+ uri = Addressable::URI.encode(path, Addressable::URI)
951
+
952
+ if user && !user.empty?
953
+ userinfo = Addressable::URI.encode_component(user, USER)
954
+ if pass
955
+ userinfo << ":#{Addressable::URI.encode_component(pass, PASSWORD)}"
956
+ end
957
+ uri.userinfo = userinfo
958
+ end
959
+
960
+ path = uri.to_s
961
+ ENV["#{scheme}_proxy".downcase] = path unless ENV["#{scheme}_proxy".downcase]
962
+ ENV["#{scheme}_proxy".upcase] = path unless ENV["#{scheme}_proxy".upcase]
963
+ end
964
+
965
+ # @api private
966
+ def self.export_no_proxy(value)
967
+ ENV["no_proxy"] = value unless ENV["no_proxy"]
968
+ ENV["NO_PROXY"] = value unless ENV["NO_PROXY"]
969
+ end
970
+
971
+ # Given a scheme, host, and port, return the correct proxy URI based on the
972
+ # set environment variables, unless exluded by no_proxy, in which case nil
973
+ # is returned
974
+ def self.proxy_uri(scheme, host, port)
975
+ proxy_env_var = ENV["#{scheme}_proxy"].to_s.strip
976
+
977
+ # Check if the proxy string contains a scheme. If not, add the url's scheme to the
978
+ # proxy before parsing. The regex /^.*:\/\// matches, for example, http://. Reusing proxy
979
+ # here since we are really just trying to get the string built correctly.
980
+ proxy = if !proxy_env_var.empty?
981
+ if proxy_env_var =~ /^.*:\/\//
982
+ URI.parse(proxy_env_var)
983
+ else
984
+ URI.parse("#{scheme}://#{proxy_env_var}")
985
+ end
986
+ end
987
+
988
+ return proxy unless fuzzy_hostname_match_any?(host, ENV["no_proxy"])
989
+ end
990
+
991
+ # Chef requires an English-language UTF-8 locale to function properly. We attempt
992
+ # to use the 'locale -a' command and search through a list of preferences until we
993
+ # find one that we can use. On Ubuntu systems we should find 'C.UTF-8' and be
994
+ # able to use that even if there is no English locale on the server, but Mac, Solaris,
995
+ # AIX, etc do not have that locale. We then try to find an English locale and fall
996
+ # back to 'C' if we do not. The choice of fallback is pick-your-poison. If we try
997
+ # to do the work to return a non-US UTF-8 locale then we fail inside of providers when
998
+ # things like 'svn info' return Japanese and we can't parse them. OTOH, if we pick 'C' then
999
+ # we will blow up on UTF-8 characters. Between the warn we throw and the Encoding
1000
+ # exception that ruby will throw it is more obvious what is broken if we drop UTF-8 by
1001
+ # default rather than drop English.
1002
+ #
1003
+ # If there is no 'locale -a' then we return 'en_US.UTF-8' since that is the most commonly
1004
+ # available English UTF-8 locale. However, all modern POSIXen should support 'locale -a'.
1005
+ def self.guess_internal_locale
1006
+ # https://github.com/chef/chef/issues/2181
1007
+ # Some systems have the `locale -a` command, but the result has
1008
+ # invalid characters for the default encoding.
1009
+ #
1010
+ # For example, on CentOS 6 with ENV['LANG'] = "en_US.UTF-8",
1011
+ # `locale -a`.split fails with ArgumentError invalid UTF-8 encoding.
1012
+ cmd = Mixlib::ShellOut.new("locale -a").run_command
1013
+ cmd.error!
1014
+ locales = cmd.stdout.split
1015
+ case
1016
+ when locales.include?("C.UTF-8")
1017
+ "C.UTF-8"
1018
+ when locales.include?("en_US.UTF-8"), locales.include?("en_US.utf8")
1019
+ "en_US.UTF-8"
1020
+ when locales.include?("en.UTF-8")
1021
+ "en.UTF-8"
1022
+ else
1023
+ # Will match en_ZZ.UTF-8, en_ZZ.utf-8, en_ZZ.UTF8, en_ZZ.utf8
1024
+ guesses = locales.select { |l| l =~ /^en_.*UTF-?8$/i }
1025
+ unless guesses.empty?
1026
+ guessed_locale = guesses.first
1027
+ # Transform into the form en_ZZ.UTF-8
1028
+ guessed_locale.gsub(/UTF-?8$/i, "UTF-8")
1029
+ else
1030
+ ChefConfig.logger.warn "Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support."
1031
+ "C"
1032
+ end
1033
+ end
1034
+ rescue
1035
+ if ChefConfig.windows?
1036
+ ChefConfig.logger.debug "Defaulting to locale en_US.UTF-8 on Windows, until it matters that we do something else."
1037
+ else
1038
+ ChefConfig.logger.debug "No usable locale -a command found, assuming you have en_US.UTF-8 installed."
1039
+ end
1040
+ "en_US.UTF-8"
1041
+ end
1042
+
1043
+ default :internal_locale, guess_internal_locale
1044
+
1045
+ # Force UTF-8 Encoding, for when we fire up in the 'C' locale or other strange locales (e.g.
1046
+ # japanese windows encodings). If we do not do this, then knife upload will fail when a cookbook's
1047
+ # README.md has UTF-8 characters that do not encode in whatever surrounding encoding we have been
1048
+ # passed. Effectively, the Chef Ecosystem is globally UTF-8 by default. Anyone who wants to be
1049
+ # able to upload Shift_JIS or ISO-8859-1 files needs to mark *those* files explicitly with
1050
+ # magic tags to make ruby correctly identify the encoding being used. Changing this default will
1051
+ # break Chef community cookbooks and is very highly discouraged.
1052
+ default :ruby_encoding, Encoding::UTF_8
1053
+
1054
+ default :rubygems_url, "https://rubygems.org"
1055
+
1056
+ # This controls the behavior of resource cloning (and CHEF-3694 warnings). For Chef < 12 the behavior
1057
+ # has been that this is 'true', in Chef 13 this will change to false. Setting this to 'true' in Chef
1058
+ # 13 is not a viable or supported migration strategy since Chef 13 community cookbooks will be expected
1059
+ # to break with this setting set to 'true'.
1060
+ default :resource_cloning, true
1061
+
1062
+ # If installed via an omnibus installer, this gives the path to the
1063
+ # "embedded" directory which contains all of the software packaged with
1064
+ # omnibus. This is used to locate the cacert.pem file on windows.
1065
+ def self.embedded_dir
1066
+ Pathname.new(_this_file).ascend do |path|
1067
+ if path.basename.to_s == "embedded"
1068
+ return path.to_s
1069
+ end
1070
+ end
1071
+
1072
+ nil
1073
+ end
1074
+
1075
+ # Path to this file in the current install.
1076
+ def self._this_file
1077
+ File.expand_path(__FILE__)
1078
+ end
1079
+
1080
+ # Set fips mode in openssl. Do any patching necessary to make
1081
+ # sure Chef runs do not crash.
1082
+ # @api private
1083
+ def self.enable_fips_mode
1084
+ OpenSSL.fips_mode = true
1085
+ require "digest"
1086
+ require "digest/sha1"
1087
+ require "digest/md5"
1088
+ # Remove pre-existing constants if they do exist to reduce the
1089
+ # amount of log spam and warnings.
1090
+ Digest.send(:remove_const, "SHA1") if Digest.const_defined?("SHA1")
1091
+ Digest.const_set("SHA1", OpenSSL::Digest::SHA1)
1092
+ OpenSSL::Digest.send(:remove_const, "MD5") if OpenSSL::Digest.const_defined?("MD5")
1093
+ OpenSSL::Digest.const_set("MD5", Digest::MD5)
1094
+ ChefConfig.logger.debug "FIPS mode is enabled."
1095
+ end
1096
+ end
1097
+ end