chef-config 12.4.0.rc.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 47261ae6b047e19623d6d7a6ce2d6d591f0a6bcf
4
+ data.tar.gz: 6412fc7b6d5c90b1517b82362ccedf52542ff910
5
+ SHA512:
6
+ metadata.gz: a1aeadc54e73f8e5f48d136f79a0cbf2d4d8d9d784557602f44a70918eceee7f26d9e95f62ba0872e729aa6beee7d99958a09f7fe457af52d9c66b8842497347
7
+ data.tar.gz: 387d9ee9742dde18cb99735ac2b8e2803442d4a5958ab0cc02e9080230e2b49e2a2e66b534dc8fc572704b13dda8f186c65efcd582084bc4f9e792a9264211ae
data/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # ChefConfig
2
+
3
+ This repo is experimental. Use at your own risk.
4
+
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'rubygems/package_task'
3
+
4
+ VERSION = IO.read(File.expand_path("../../VERSION", __FILE__)).strip
5
+
6
+ Dir[File.expand_path("../*gemspec", __FILE__)].reverse.each do |gemspec_path|
7
+ gemspec = eval(IO.read(gemspec_path))
8
+ Gem::PackageTask.new(gemspec).define
9
+ end
10
+
11
+ desc "Build and install a chef-config gem"
12
+ task :install => [:package] do
13
+ sh %{gem install pkg/chef-config-#{ChefConfig::VERSION}.gem --no-rdoc --no-ri}
14
+ end
15
+
16
+ task :default => :spec
17
+
18
+ desc "Run standard specs"
19
+ RSpec::Core::RakeTask.new(:spec) do |t|
20
+ t.pattern = FileList['spec/**/*_spec.rb']
21
+ end
22
+
23
+ desc "Regenerate lib/chef/version.rb from VERSION file"
24
+ task :version do
25
+ contents = <<-VERSION_RB
26
+ # Copyright:: Copyright (c) 2010-2015 Chef Software, Inc.
27
+ # License:: Apache License, Version 2.0
28
+ #
29
+ # Licensed under the Apache License, Version 2.0 (the "License");
30
+ # you may not use this file except in compliance with the License.
31
+ # You may obtain a copy of the License at
32
+ #
33
+ # http://www.apache.org/licenses/LICENSE-2.0
34
+ #
35
+ # Unless required by applicable law or agreed to in writing, software
36
+ # distributed under the License is distributed on an "AS IS" BASIS,
37
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
38
+ # See the License for the specific language governing permissions and
39
+ # limitations under the License.
40
+
41
+ #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
42
+ # NOTE: This file is generated by running `rake version` in the top level of
43
+ # this repo. Do not edit this manually. Edit the VERSION file and run the rake
44
+ # task instead.
45
+ #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
46
+
47
+ module ChefConfig
48
+ VERSION = '#{VERSION}'
49
+ end
50
+
51
+ VERSION_RB
52
+ version_rb_path = File.expand_path("../lib/chef-config/version.rb", __FILE__)
53
+ IO.write(version_rb_path, contents)
54
+ end
55
+
@@ -0,0 +1,20 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2015 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
@@ -0,0 +1,744 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Author:: AJ Christensen (<aj@opscode.com>)
5
+ # Author:: Mark Mzyk (<mmzyk@opscode.com>)
6
+ # Author:: Kyle Goodwin (<kgoodwin@primerevenue.com>)
7
+ # Copyright:: Copyright (c) 2008 Opscode, 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/logger'
26
+ require 'chef-config/windows'
27
+ require 'chef-config/path_helper'
28
+ require 'mixlib/shellout'
29
+
30
+ module ChefConfig
31
+
32
+ class Config
33
+
34
+ extend Mixlib::Config
35
+
36
+ # Evaluates the given string as config.
37
+ #
38
+ # +filename+ is used for context in stacktraces, but doesn't need to be the name of an actual file.
39
+ def self.from_string(string, filename)
40
+ self.instance_eval(string, filename, 1)
41
+ end
42
+
43
+ def self.inspect
44
+ configuration.inspect
45
+ end
46
+
47
+ def self.platform_specific_path(path)
48
+ path = PathHelper.cleanpath(path)
49
+ if ChefConfig.windows?
50
+ # turns \etc\chef\client.rb and \var\chef\client.rb into C:/chef/client.rb
51
+ if env['SYSTEMDRIVE'] && path[0] == '\\' && path.split('\\')[2] == 'chef'
52
+ path = PathHelper.join(env['SYSTEMDRIVE'], path.split('\\', 3)[2])
53
+ end
54
+ end
55
+ path
56
+ end
57
+
58
+ def self.add_formatter(name, file_path=nil)
59
+ formatters << [name, file_path]
60
+ end
61
+
62
+ def self.add_event_logger(logger)
63
+ event_handlers << logger
64
+ end
65
+
66
+ # Config file to load (client.rb, knife.rb, etc. defaults set differently in knife, chef-client, etc.)
67
+ configurable(:config_file)
68
+
69
+ default(:config_dir) do
70
+ if config_file
71
+ PathHelper.dirname(config_file)
72
+ else
73
+ PathHelper.join(user_home, ".chef", "")
74
+ end
75
+ end
76
+
77
+ default :formatters, []
78
+
79
+ # Override the config dispatch to set the value of multiple server options simultaneously
80
+ #
81
+ # === Parameters
82
+ # url<String>:: String to be set for all of the chef-server-api URL's
83
+ #
84
+ configurable(:chef_server_url).writes_value { |url| url.to_s.strip }
85
+
86
+ # When you are using ActiveSupport, they monkey-patch 'daemonize' into Kernel.
87
+ # So while this is basically identical to what method_missing would do, we pull
88
+ # it up here and get a real method written so that things get dispatched
89
+ # properly.
90
+ configurable(:daemonize).writes_value { |v| v }
91
+
92
+ # The root where all local chef object data is stored. cookbooks, data bags,
93
+ # environments are all assumed to be in separate directories under this.
94
+ # chef-solo uses these directories for input data. knife commands
95
+ # that upload or download files (such as knife upload, knife role from file,
96
+ # etc.) work.
97
+ default :chef_repo_path do
98
+ if self.configuration[:cookbook_path]
99
+ if self.configuration[:cookbook_path].kind_of?(String)
100
+ File.expand_path('..', self.configuration[:cookbook_path])
101
+ else
102
+ self.configuration[:cookbook_path].map do |path|
103
+ File.expand_path('..', path)
104
+ end
105
+ end
106
+ else
107
+ cache_path
108
+ end
109
+ end
110
+
111
+ def self.find_chef_repo_path(cwd)
112
+ # In local mode, we auto-discover the repo root by looking for a path with "cookbooks" under it.
113
+ # This allows us to run config-free.
114
+ path = cwd
115
+ until File.directory?(PathHelper.join(path, "cookbooks"))
116
+ new_path = File.expand_path('..', path)
117
+ if new_path == path
118
+ ChefConfig.logger.warn("No cookbooks directory found at or above current directory. Assuming #{Dir.pwd}.")
119
+ return Dir.pwd
120
+ end
121
+ path = new_path
122
+ end
123
+ ChefConfig.logger.info("Auto-discovered chef repository at #{path}")
124
+ path
125
+ end
126
+
127
+ def self.derive_path_from_chef_repo_path(child_path)
128
+ if chef_repo_path.kind_of?(String)
129
+ PathHelper.join(chef_repo_path, child_path)
130
+ else
131
+ chef_repo_path.map { |path| PathHelper.join(path, child_path)}
132
+ end
133
+ end
134
+
135
+ # Location of acls on disk. String or array of strings.
136
+ # Defaults to <chef_repo_path>/acls.
137
+ # Only applies to Enterprise Chef commands.
138
+ default(:acl_path) { derive_path_from_chef_repo_path('acls') }
139
+
140
+ # Location of clients on disk. String or array of strings.
141
+ # Defaults to <chef_repo_path>/acls.
142
+ default(:client_path) { derive_path_from_chef_repo_path('clients') }
143
+
144
+ # Location of cookbooks on disk. String or array of strings.
145
+ # Defaults to <chef_repo_path>/cookbooks. If chef_repo_path
146
+ # is not specified, this is set to [/var/chef/cookbooks, /var/chef/site-cookbooks]).
147
+ default(:cookbook_path) do
148
+ if self.configuration[:chef_repo_path]
149
+ derive_path_from_chef_repo_path('cookbooks')
150
+ else
151
+ Array(derive_path_from_chef_repo_path('cookbooks')).flatten +
152
+ Array(derive_path_from_chef_repo_path('site-cookbooks')).flatten
153
+ end
154
+ end
155
+
156
+ # Location of containers on disk. String or array of strings.
157
+ # Defaults to <chef_repo_path>/containers.
158
+ # Only applies to Enterprise Chef commands.
159
+ default(:container_path) { derive_path_from_chef_repo_path('containers') }
160
+
161
+ # Location of data bags on disk. String or array of strings.
162
+ # Defaults to <chef_repo_path>/data_bags.
163
+ default(:data_bag_path) { derive_path_from_chef_repo_path('data_bags') }
164
+
165
+ # Location of environments on disk. String or array of strings.
166
+ # Defaults to <chef_repo_path>/environments.
167
+ default(:environment_path) { derive_path_from_chef_repo_path('environments') }
168
+
169
+ # Location of groups on disk. String or array of strings.
170
+ # Defaults to <chef_repo_path>/groups.
171
+ # Only applies to Enterprise Chef commands.
172
+ default(:group_path) { derive_path_from_chef_repo_path('groups') }
173
+
174
+ # Location of nodes on disk. String or array of strings.
175
+ # Defaults to <chef_repo_path>/nodes.
176
+ default(:node_path) { derive_path_from_chef_repo_path('nodes') }
177
+
178
+ # Location of roles on disk. String or array of strings.
179
+ # Defaults to <chef_repo_path>/roles.
180
+ default(:role_path) { derive_path_from_chef_repo_path('roles') }
181
+
182
+ # Location of users on disk. String or array of strings.
183
+ # Defaults to <chef_repo_path>/users.
184
+ # Does not apply to Enterprise Chef commands.
185
+ default(:user_path) { derive_path_from_chef_repo_path('users') }
186
+
187
+ # Location of policies on disk. String or array of strings.
188
+ # Defaults to <chef_repo_path>/policies.
189
+ default(:policy_path) { derive_path_from_chef_repo_path('policies') }
190
+
191
+ # Turn on "path sanity" by default. See also: http://wiki.opscode.com/display/chef/User+Environment+PATH+Sanity
192
+ default :enforce_path_sanity, true
193
+
194
+ # Formatted Chef Client output is a beta feature, disabled by default:
195
+ default :formatter, "null"
196
+
197
+ # The number of times the client should retry when registering with the server
198
+ default :client_registration_retries, 5
199
+
200
+ # An array of paths to search for knife exec scripts if they aren't in the current directory
201
+ default :script_path, []
202
+
203
+ # The root of all caches (checksums, cache and backup). If local mode is on,
204
+ # this is under the user's home directory.
205
+ default(:cache_path) do
206
+ if local_mode
207
+ PathHelper.join(config_dir, 'local-mode-cache')
208
+ else
209
+ primary_cache_root = platform_specific_path("/var")
210
+ primary_cache_path = platform_specific_path("/var/chef")
211
+ # Use /var/chef as the cache path only if that folder exists and we can read and write
212
+ # into it, or /var exists and we can read and write into it (we'll create /var/chef later).
213
+ # Otherwise, we'll create .chef under the user's home directory and use that as
214
+ # the cache path.
215
+ unless path_accessible?(primary_cache_path) || path_accessible?(primary_cache_root)
216
+ secondary_cache_path = PathHelper.join(user_home, '.chef')
217
+ ChefConfig.logger.info("Unable to access cache at #{primary_cache_path}. Switching cache to #{secondary_cache_path}")
218
+ secondary_cache_path
219
+ else
220
+ primary_cache_path
221
+ end
222
+ end
223
+ end
224
+
225
+ # Returns true only if the path exists and is readable and writeable for the user.
226
+ def self.path_accessible?(path)
227
+ File.exists?(path) && File.readable?(path) && File.writable?(path)
228
+ end
229
+
230
+ # Where cookbook files are stored on the server (by content checksum)
231
+ default(:checksum_path) { PathHelper.join(cache_path, "checksums") }
232
+
233
+ # Where chef's cache files should be stored
234
+ default(:file_cache_path) { PathHelper.join(cache_path, "cache") }
235
+
236
+ # Where backups of chef-managed files should go
237
+ default(:file_backup_path) { PathHelper.join(cache_path, "backup") }
238
+
239
+ # The chef-client (or solo) lockfile.
240
+ #
241
+ # If your `file_cache_path` resides on a NFS (or non-flock()-supporting
242
+ # fs), it's recommended to set this to something like
243
+ # '/tmp/chef-client-running.pid'
244
+ default(:lockfile) { PathHelper.join(file_cache_path, "chef-client-running.pid") }
245
+
246
+ ## Daemonization Settings ##
247
+ # What user should Chef run as?
248
+ default :user, nil
249
+ default :group, nil
250
+ default :umask, 0022
251
+
252
+ # Valid log_levels are:
253
+ # * :debug
254
+ # * :info
255
+ # * :warn
256
+ # * :fatal
257
+ # These work as you'd expect. There is also a special `:auto` setting.
258
+ # When set to :auto, Chef will auto adjust the log verbosity based on
259
+ # context. When a tty is available (usually because the user is running chef
260
+ # in a console), the log level is set to :warn, and output formatters are
261
+ # used as the primary mode of output. When a tty is not available, the
262
+ # logger is the primary mode of output, and the log level is set to :info
263
+ default :log_level, :auto
264
+
265
+ # Logging location as either an IO stream or string representing log file path
266
+ default :log_location, STDOUT
267
+
268
+ # Using `force_formatter` causes chef to default to formatter output when STDOUT is not a tty
269
+ default :force_formatter, false
270
+
271
+ # Using `force_logger` causes chef to default to logger output when STDOUT is a tty
272
+ default :force_logger, false
273
+
274
+ default :http_retry_count, 5
275
+ default :http_retry_delay, 5
276
+ default :interval, nil
277
+ default :once, nil
278
+ default :json_attribs, nil
279
+ # toggle info level log items that can create a lot of output
280
+ default :verbose_logging, true
281
+ default :node_name, nil
282
+ default :diff_disabled, false
283
+ default :diff_filesize_threshold, 10000000
284
+ default :diff_output_threshold, 1000000
285
+ default :local_mode, false
286
+
287
+ default :pid_file, nil
288
+
289
+ # Whether Chef Zero local mode should bind to a port. All internal requests
290
+ # will go through the socketless code path regardless, so the socket is
291
+ # only needed if other processes will connect to the local mode server.
292
+ #
293
+ # For compatibility this is set to true but it will be changed to false in
294
+ # the future.
295
+ default :listen, true
296
+
297
+ config_context :chef_zero do
298
+ config_strict_mode true
299
+ default(:enabled) { ChefConfig::Config.local_mode }
300
+ default :host, 'localhost'
301
+ default :port, 8889.upto(9999) # Will try ports from 8889-9999 until one works
302
+ end
303
+ default :chef_server_url, "https://localhost:443"
304
+
305
+ default(:chef_server_root) do
306
+ # if the chef_server_url is a path to an organization, aka
307
+ # 'some_url.../organizations/*' then remove the '/organization/*' by default
308
+ if self.configuration[:chef_server_url] =~ /\/organizations\/\S*$/
309
+ self.configuration[:chef_server_url].split('/')[0..-3].join('/')
310
+ elsif self.configuration[:chef_server_url] # default to whatever chef_server_url is
311
+ self.configuration[:chef_server_url]
312
+ else
313
+ "https://localhost:443"
314
+ end
315
+ end
316
+
317
+ default :rest_timeout, 300
318
+ default :yum_timeout, 900
319
+ default :yum_lock_timeout, 30
320
+ default :solo, false
321
+ default :splay, nil
322
+ default :why_run, false
323
+ default :color, false
324
+ default :client_fork, true
325
+ default :ez, false
326
+ default :enable_reporting, true
327
+ default :enable_reporting_url_fatals, false
328
+ # Possible values for :audit_mode
329
+ # :enabled, :disabled, :audit_only,
330
+ #
331
+ # TODO: 11 Dec 2014: Currently audit-mode is an experimental feature
332
+ # and is disabled by default. When users choose to enable audit-mode,
333
+ # a warning is issued in application/client#reconfigure.
334
+ # This can be removed when audit-mode is enabled by default.
335
+ default :audit_mode, :disabled
336
+
337
+ # Chef only needs ohai to run the hostname plugin for the most basic
338
+ # functionality. If the rest of the ohai plugins are not needed (like in
339
+ # most of our testing scenarios)
340
+ default :minimal_ohai, false
341
+
342
+ # Policyfile is a feature where a node gets its run list and cookbook
343
+ # version set from a single document on the server instead of expanding the
344
+ # run list and having the server compute the cookbook version set based on
345
+ # environment constraints.
346
+ default :use_policyfile, false
347
+
348
+ # Policyfiles can be used in a native mode (default) or compatibility mode.
349
+ # Native mode requires Chef Server 12.1 (it can be enabled via feature flag
350
+ # on some prior versions). In native mode, policies and associated
351
+ # cookbooks are accessed via feature-specific APIs. In compat mode,
352
+ # policies are stored as data bags and cookbooks are stored at the
353
+ # cookbooks/ endpoint. Compatibility mode can be dangerous on existing Chef
354
+ # Servers; it's recommended to upgrade your Chef Server rather than use
355
+ # compatibility mode. Compatibility mode remains available so you can use
356
+ # policyfiles with servers that don't yet support the native endpoints.
357
+ default :policy_document_native_api, true
358
+
359
+ # Set these to enable SSL authentication / mutual-authentication
360
+ # with the server
361
+
362
+ # Client side SSL cert/key for mutual auth
363
+ default :ssl_client_cert, nil
364
+ default :ssl_client_key, nil
365
+
366
+ # Whether or not to verify the SSL cert for all HTTPS requests. When set to
367
+ # :verify_peer (default), all HTTPS requests will be validated regardless of other
368
+ # SSL verification settings. When set to :verify_none no HTTPS requests will
369
+ # be validated.
370
+ default :ssl_verify_mode, :verify_peer
371
+
372
+ # Whether or not to verify the SSL cert for HTTPS requests to the Chef
373
+ # server API. If set to `true`, the server's cert will be validated
374
+ # regardless of the :ssl_verify_mode setting. This is set to `true` when
375
+ # running in local-mode.
376
+ # NOTE: This is a workaround until verify_peer is enabled by default.
377
+ default(:verify_api_cert) { ChefConfig::Config.local_mode }
378
+
379
+ # Path to the default CA bundle files.
380
+ default :ssl_ca_path, nil
381
+ default(:ssl_ca_file) do
382
+ if ChefConfig.windows? and embedded_path = embedded_dir
383
+ cacert_path = File.join(embedded_path, "ssl/certs/cacert.pem")
384
+ cacert_path if File.exist?(cacert_path)
385
+ else
386
+ nil
387
+ end
388
+ end
389
+
390
+ # A directory that contains additional SSL certificates to trust. Any
391
+ # certificates in this directory will be added to whatever CA bundle ruby
392
+ # is using. Use this to add self-signed certs for your Chef Server or local
393
+ # HTTP file servers.
394
+ default(:trusted_certs_dir) { PathHelper.join(config_dir, "trusted_certs") }
395
+
396
+ # Where should chef-solo download recipes from?
397
+ default :recipe_url, nil
398
+
399
+ # Sets the version of the signed header authentication protocol to use (see
400
+ # the 'mixlib-authorization' project for more detail). Currently, versions
401
+ # 1.0 and 1.1 are available; however, the chef-server must first be
402
+ # upgraded to support version 1.1 before clients can begin using it.
403
+ #
404
+ # Version 1.1 of the protocol is required when using a `node_name` greater
405
+ # than ~90 bytes (~90 ascii characters), so chef-client will automatically
406
+ # switch to using version 1.1 when `node_name` is too large for the 1.0
407
+ # protocol. If you intend to use large node names, ensure that your server
408
+ # supports version 1.1. Automatic detection of large node names means that
409
+ # users will generally not need to manually configure this.
410
+ #
411
+ # In the future, this configuration option may be replaced with an
412
+ # automatic negotiation scheme.
413
+ default :authentication_protocol_version, "1.0"
414
+
415
+ # This key will be used to sign requests to the Chef server. This location
416
+ # must be writable by Chef during initial setup when generating a client
417
+ # identity on the server.
418
+ #
419
+ # The chef-server will look up the public key for the client using the
420
+ # `node_name` of the client.
421
+ #
422
+ # If chef-zero is enabled, this defaults to nil (no authentication).
423
+ default(:client_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/client.pem") }
424
+
425
+ # When registering the client, should we allow the client key location to
426
+ # be a symlink? eg: /etc/chef/client.pem -> /etc/chef/prod-client.pem
427
+ # If the path of the key goes through a directory like /tmp this should
428
+ # never be set to true or its possibly an easily exploitable security hole.
429
+ default :follow_client_key_symlink, false
430
+
431
+ # This secret is used to decrypt encrypted data bag items.
432
+ default(:encrypted_data_bag_secret) do
433
+ if File.exist?(platform_specific_path("/etc/chef/encrypted_data_bag_secret"))
434
+ platform_specific_path("/etc/chef/encrypted_data_bag_secret")
435
+ else
436
+ nil
437
+ end
438
+ end
439
+
440
+ # As of Chef 11.0, version "1" is the default encrypted data bag item
441
+ # format. Version "2" is available which adds encrypt-then-mac protection.
442
+ # To maintain compatibility, versions other than 1 must be opt-in.
443
+ #
444
+ # Set this to `2` if you have chef-client 11.6.0+ in your infrastructure.
445
+ # Set this to `3` if you have chef-client 11.?.0+, ruby 2 and OpenSSL >= 1.0.1 in your infrastructure. (TODO)
446
+ default :data_bag_encrypt_version, 1
447
+
448
+ # When reading data bag items, any supported version is accepted. However,
449
+ # if all encrypted data bags have been generated with the version 2 format,
450
+ # it is recommended to disable support for earlier formats to improve
451
+ # security. For example, the version 2 format is identical to version 1
452
+ # except for the addition of an HMAC, so an attacker with MITM capability
453
+ # could downgrade an encrypted data bag to version 1 as part of an attack.
454
+ default :data_bag_decrypt_minimum_version, 0
455
+
456
+ # If there is no file in the location given by `client_key`, chef-client
457
+ # will temporarily use the "validator" identity to generate one. If the
458
+ # `client_key` is not present and the `validation_key` is also not present,
459
+ # chef-client will not be able to authenticate to the server.
460
+ #
461
+ # The `validation_key` is never used if the `client_key` exists.
462
+ #
463
+ # If chef-zero is enabled, this defaults to nil (no authentication).
464
+ default(:validation_key) { chef_zero.enabled ? nil : platform_specific_path("/etc/chef/validation.pem") }
465
+ default :validation_client_name, "chef-validator"
466
+
467
+ # When creating a new client via the validation_client account, Chef 11
468
+ # servers allow the client to generate a key pair locally and send the
469
+ # public key to the server. This is more secure and helps offload work from
470
+ # the server, enhancing scalability. If enabled and the remote server
471
+ # implements only the Chef 10 API, client registration will not work
472
+ # properly.
473
+ #
474
+ # The default value is `true`. Set to `false` to disable client-side key
475
+ # generation (server generates client keys).
476
+ default(:local_key_generation) { true }
477
+
478
+ # Zypper package provider gpg checks. Set to true to enable package
479
+ # gpg signature checking. This will be default in the
480
+ # future. Setting to false disables the warnings.
481
+ # Leaving this set to nil or false is a security hazard!
482
+ default :zypper_check_gpg, nil
483
+
484
+ # Report Handlers
485
+ default :report_handlers, []
486
+
487
+ # Event Handlers
488
+ default :event_handlers, []
489
+
490
+ default :disable_event_loggers, false
491
+
492
+ # Exception Handlers
493
+ default :exception_handlers, []
494
+
495
+ # Start handlers
496
+ default :start_handlers, []
497
+
498
+ # Syntax Check Cache. Knife keeps track of files that is has already syntax
499
+ # checked by storing files in this directory. `syntax_check_cache_path` is
500
+ # the new (and preferred) configuration setting. If not set, knife will
501
+ # fall back to using cache_options[:path], which is deprecated but exists in
502
+ # many client configs generated by pre-Chef-11 bootstrappers.
503
+ default(:syntax_check_cache_path) { cache_options[:path] }
504
+
505
+ # Deprecated:
506
+ # Move this to the default value of syntax_cache_path when this is removed.
507
+ default(:cache_options) { { :path => PathHelper.join(config_dir, "syntaxcache") } }
508
+
509
+ # Whether errors should be raised for deprecation warnings. When set to
510
+ # `false` (the default setting), a warning is emitted but code using
511
+ # deprecated methods/features/etc. should work normally otherwise. When set
512
+ # to `true`, usage of deprecated methods/features will raise a
513
+ # `DeprecatedFeatureError`. This is used by Chef's tests to ensure that
514
+ # deprecated functionality is not used internally by Chef. End users
515
+ # should generally leave this at the default setting (especially in
516
+ # production), but it may be useful when testing cookbooks or other code if
517
+ # the user wishes to aggressively address deprecations.
518
+ default(:treat_deprecation_warnings_as_errors) do
519
+ # Using an environment variable allows this setting to be inherited in
520
+ # tests that spawn new processes.
521
+ ENV.key?("CHEF_TREAT_DEPRECATION_WARNINGS_AS_ERRORS")
522
+ end
523
+
524
+ # knife configuration data
525
+ config_context :knife do
526
+ default :ssh_port, nil
527
+ default :ssh_user, nil
528
+ default :ssh_attribute, nil
529
+ default :ssh_gateway, nil
530
+ default :bootstrap_version, nil
531
+ default :bootstrap_proxy, nil
532
+ default :bootstrap_template, nil
533
+ default :secret, nil
534
+ default :secret_file, nil
535
+ default :identity_file, nil
536
+ default :host_key_verify, nil
537
+ default :forward_agent, nil
538
+ default :sort_status_reverse, nil
539
+ default :hints, {}
540
+ end
541
+
542
+ def self.set_defaults_for_windows
543
+ # Those lists of regular expressions define what chef considers a
544
+ # valid user and group name
545
+ # From http://technet.microsoft.com/en-us/library/cc776019(WS.10).aspx
546
+ principal_valid_regex_part = '[^"\/\\\\\[\]\:;|=,+*?<>]+'
547
+ default :user_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
548
+ default :group_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ]
549
+
550
+ default :fatal_windows_admin_check, false
551
+ end
552
+
553
+ def self.set_defaults_for_nix
554
+ # Those lists of regular expressions define what chef considers a
555
+ # valid user and group name
556
+ #
557
+ # user/group cannot start with '-', '+' or '~'
558
+ # user/group cannot contain ':', ',' or non-space-whitespace or null byte
559
+ # everything else is allowed (UTF-8, spaces, etc) and we delegate to your O/S useradd program to barf or not
560
+ # copies: http://anonscm.debian.org/viewvc/pkg-shadow/debian/trunk/debian/patches/506_relaxed_usernames?view=markup
561
+ default :user_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
562
+ default :group_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ]
563
+ end
564
+
565
+ # Those lists of regular expressions define what chef considers a
566
+ # valid user and group name
567
+ if ChefConfig.windows?
568
+ set_defaults_for_windows
569
+ else
570
+ set_defaults_for_nix
571
+ end
572
+
573
+ # This provides a hook which rspec can stub so that we can avoid twiddling
574
+ # global state in tests.
575
+ def self.env
576
+ ENV
577
+ end
578
+
579
+ def self.windows_home_path
580
+ ChefConfig.logger.deprecation("Chef::Config.windows_home_path is now deprecated. Consider using Chef::Util::PathHelper.home instead.")
581
+ PathHelper.home
582
+ end
583
+
584
+ # returns a platform specific path to the user home dir if set, otherwise default to current directory.
585
+ default( :user_home ) { PathHelper.home || Dir.pwd }
586
+
587
+ # Enable file permission fixup for selinux. Fixup will be done
588
+ # only if selinux is enabled in the system.
589
+ default :enable_selinux_file_permission_fixup, true
590
+
591
+ # Use atomic updates (i.e. move operation) while updating contents
592
+ # of the files resources. When set to false copy operation is
593
+ # used to update files.
594
+ default :file_atomic_update, true
595
+
596
+ # There are 3 possible values for this configuration setting.
597
+ # true => file staging is done in the destination directory
598
+ # false => file staging is done via tempfiles under ENV['TMP']
599
+ # :auto => file staging will try using destination directory if possible and
600
+ # will fall back to ENV['TMP'] if destination directory is not usable.
601
+ default :file_staging_uses_destdir, :auto
602
+
603
+ # Exit if another run is in progress and the chef-client is unable to
604
+ # get the lock before time expires. If nil, no timeout is enforced. (Exits
605
+ # immediately if 0.)
606
+ default :run_lock_timeout, nil
607
+
608
+ # Number of worker threads for syncing cookbooks in parallel. Increasing
609
+ # this number can result in gateway errors from the server (namely 503 and 504).
610
+ # If you are seeing this behavior while using the default setting, reducing
611
+ # the number of threads will help.
612
+ default :cookbook_sync_threads, 10
613
+
614
+ # At the beginning of the Chef Client run, the cookbook manifests are downloaded which
615
+ # contain URLs for every file in every relevant cookbook. Most of the files
616
+ # (recipes, resources, providers, libraries, etc) are immediately synchronized
617
+ # at the start of the run. The handling of "files" and "templates" directories,
618
+ # however, have two modes of operation. They can either all be downloaded immediately
619
+ # at the start of the run (no_lazy_load==true) or else they can be lazily loaded as
620
+ # cookbook_file or template resources are converged which require them (no_lazy_load==false).
621
+ #
622
+ # The advantage of lazily loading these files is that unnecessary files are not
623
+ # synchronized. This may be useful to users with large files checked into cookbooks which
624
+ # are only selectively downloaded to a subset of clients which use the cookbook. However,
625
+ # better solutions are to either isolate large files into individual cookbooks and only
626
+ # include those cookbooks in the run lists of the servers that need them -- or move to
627
+ # using remote_file and a more appropriate backing store like S3 for large file
628
+ # distribution.
629
+ #
630
+ # The disadvantages of lazily loading files are that users some time find it
631
+ # confusing that their cookbooks are not fully synchronzied to the cache initially,
632
+ # and more importantly the time-sensitive URLs which are in the manifest may time
633
+ # out on long Chef runs before the resource that uses the file is converged
634
+ # (leading to many confusing 403 errors on template/cookbook_file resources).
635
+ #
636
+ default :no_lazy_load, true
637
+
638
+ # Default for the chef_gem compile_time attribute. Nil is the same as true but will emit
639
+ # warnings on every use of chef_gem prompting the user to be explicit. If the user sets this to
640
+ # true then the user will get backcompat behavior but with a single nag warning that cookbooks
641
+ # may break with this setting in the future. The false setting is the recommended setting and
642
+ # will become the default.
643
+ default :chef_gem_compile_time, nil
644
+
645
+ # A whitelisted array of attributes you want sent over the wire when node
646
+ # data is saved.
647
+ # The default setting is nil, which collects all data. Setting to [] will not
648
+ # collect any data for save.
649
+ default :automatic_attribute_whitelist, nil
650
+ default :default_attribute_whitelist, nil
651
+ default :normal_attribute_whitelist, nil
652
+ default :override_attribute_whitelist, nil
653
+
654
+ config_context :windows_service do
655
+ # Set `watchdog_timeout` to the number of seconds to wait for a chef-client run
656
+ # to finish
657
+ default :watchdog_timeout, 2 * (60 * 60) # 2 hours
658
+ end
659
+
660
+ # Chef requires an English-language UTF-8 locale to function properly. We attempt
661
+ # to use the 'locale -a' command and search through a list of preferences until we
662
+ # find one that we can use. On Ubuntu systems we should find 'C.UTF-8' and be
663
+ # able to use that even if there is no English locale on the server, but Mac, Solaris,
664
+ # AIX, etc do not have that locale. We then try to find an English locale and fall
665
+ # back to 'C' if we do not. The choice of fallback is pick-your-poison. If we try
666
+ # to do the work to return a non-US UTF-8 locale then we fail inside of providers when
667
+ # things like 'svn info' return Japanese and we can't parse them. OTOH, if we pick 'C' then
668
+ # we will blow up on UTF-8 characters. Between the warn we throw and the Encoding
669
+ # exception that ruby will throw it is more obvious what is broken if we drop UTF-8 by
670
+ # default rather than drop English.
671
+ #
672
+ # If there is no 'locale -a' then we return 'en_US.UTF-8' since that is the most commonly
673
+ # available English UTF-8 locale. However, all modern POSIXen should support 'locale -a'.
674
+ def self.guess_internal_locale
675
+ # https://github.com/opscode/chef/issues/2181
676
+ # Some systems have the `locale -a` command, but the result has
677
+ # invalid characters for the default encoding.
678
+ #
679
+ # For example, on CentOS 6 with ENV['LANG'] = "en_US.UTF-8",
680
+ # `locale -a`.split fails with ArgumentError invalid UTF-8 encoding.
681
+ cmd = Mixlib::ShellOut.new("locale -a").run_command
682
+ cmd.error!
683
+ locales = cmd.stdout.split
684
+ case
685
+ when locales.include?('C.UTF-8')
686
+ 'C.UTF-8'
687
+ when locales.include?('en_US.UTF-8'), locales.include?('en_US.utf8')
688
+ 'en_US.UTF-8'
689
+ when locales.include?('en.UTF-8')
690
+ 'en.UTF-8'
691
+ else
692
+ # Will match en_ZZ.UTF-8, en_ZZ.utf-8, en_ZZ.UTF8, en_ZZ.utf8
693
+ guesses = locales.select { |l| l =~ /^en_.*UTF-?8$/i }
694
+ unless guesses.empty?
695
+ guessed_locale = guesses.first
696
+ # Transform into the form en_ZZ.UTF-8
697
+ guessed_locale.gsub(/UTF-?8$/i, "UTF-8")
698
+ else
699
+ ChefConfig.logger.warn "Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support."
700
+ 'C'
701
+ end
702
+ end
703
+ rescue
704
+ if ChefConfig.windows?
705
+ ChefConfig.logger.debug "Defaulting to locale en_US.UTF-8 on Windows, until it matters that we do something else."
706
+ else
707
+ ChefConfig.logger.debug "No usable locale -a command found, assuming you have en_US.UTF-8 installed."
708
+ end
709
+ 'en_US.UTF-8'
710
+ end
711
+
712
+ default :internal_locale, guess_internal_locale
713
+
714
+ # Force UTF-8 Encoding, for when we fire up in the 'C' locale or other strange locales (e.g.
715
+ # japanese windows encodings). If we do not do this, then knife upload will fail when a cookbook's
716
+ # README.md has UTF-8 characters that do not encode in whatever surrounding encoding we have been
717
+ # passed. Effectively, the Chef Ecosystem is globally UTF-8 by default. Anyone who wants to be
718
+ # able to upload Shift_JIS or ISO-8859-1 files needs to mark *those* files explicitly with
719
+ # magic tags to make ruby correctly identify the encoding being used. Changing this default will
720
+ # break Chef community cookbooks and is very highly discouraged.
721
+ default :ruby_encoding, Encoding::UTF_8
722
+
723
+ # If installed via an omnibus installer, this gives the path to the
724
+ # "embedded" directory which contains all of the software packaged with
725
+ # omnibus. This is used to locate the cacert.pem file on windows.
726
+ def self.embedded_dir
727
+ Pathname.new(_this_file).ascend do |path|
728
+ if path.basename.to_s == "embedded"
729
+ return path.to_s
730
+ end
731
+ end
732
+
733
+ nil
734
+ end
735
+
736
+ # Path to this file in the current install.
737
+ def self._this_file
738
+ File.expand_path(__FILE__)
739
+ end
740
+ end
741
+ end
742
+
743
+
744
+