chef 12.5.1-universal-mingw32 → 12.6.0-universal-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +6 -1
- data/README.md +6 -4
- data/Rakefile +1 -4
- data/chef-windows.gemspec +21 -0
- data/chef.gemspec +58 -0
- data/lib/chef/api_client/registration.rb +9 -4
- data/lib/chef/application.rb +3 -84
- data/lib/chef/application/apply.rb +9 -2
- data/lib/chef/application/client.rb +8 -3
- data/lib/chef/application/solo.rb +7 -1
- data/lib/chef/application/windows_service.rb +21 -6
- data/lib/chef/application/windows_service_manager.rb +2 -3
- data/lib/chef/audit/runner.rb +1 -0
- data/lib/chef/chef_class.rb +1 -11
- data/lib/chef/chef_fs/chef_fs_data_store.rb +181 -2
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +5 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +11 -7
- data/lib/chef/client.rb +28 -1
- data/lib/chef/cookbook/cookbook_collection.rb +14 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +115 -9
- data/lib/chef/cookbook/remote_file_vendor.rb +1 -1
- data/lib/chef/cookbook_version.rb +6 -2
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/digester.rb +5 -1
- data/lib/chef/dsl/chef_provisioning.rb +57 -0
- data/lib/chef/dsl/cheffish.rb +64 -0
- data/lib/chef/dsl/declare_resource.rb +108 -0
- data/lib/chef/dsl/platform_introspection.rb +3 -3
- data/lib/chef/dsl/recipe.rb +3 -73
- data/lib/chef/dsl/resources.rb +27 -1
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/event_dispatch/dispatcher.rb +5 -0
- data/lib/chef/event_dispatch/events_output_stream.rb +8 -0
- data/lib/chef/exceptions.rb +21 -1
- data/lib/chef/file_access_control/unix.rb +12 -12
- data/lib/chef/file_content_management/deploy/cp.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +4 -4
- data/lib/chef/file_content_management/deploy/mv_windows.rb +1 -1
- data/lib/chef/formatters/base.rb +7 -0
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +2 -2
- data/lib/chef/formatters/indentable_output_stream.rb +5 -0
- data/lib/chef/http.rb +19 -3
- data/lib/chef/http/decompressor.rb +2 -2
- data/lib/chef/json_compat.rb +1 -0
- data/lib/chef/knife.rb +16 -2
- data/lib/chef/knife/bootstrap.rb +55 -10
- data/lib/chef/knife/cookbook_site_install.rb +5 -1
- data/lib/chef/knife/core/bootstrap_context.rb +2 -1
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/ssh.rb +30 -16
- data/lib/chef/knife/ssl_check.rb +4 -2
- data/lib/chef/knife/ssl_fetch.rb +3 -2
- data/lib/chef/knife/status.rb +14 -1
- data/lib/chef/log.rb +14 -0
- data/lib/chef/mixin/get_source_from_package.rb +7 -2
- data/lib/chef/mixin/properties.rb +302 -0
- data/lib/chef/mixin/proxified_socket.rb +38 -0
- data/lib/chef/mixin/subclass_directive.rb +37 -0
- data/lib/chef/node.rb +13 -5
- data/lib/chef/platform/query_helpers.rb +14 -3
- data/lib/chef/platform/service_helpers.rb +20 -38
- data/lib/chef/policy_builder/expand_node_object.rb +3 -0
- data/lib/chef/policy_builder/policyfile.rb +1 -0
- data/lib/chef/property.rb +51 -12
- data/lib/chef/provider.rb +40 -35
- data/lib/chef/provider/deploy.rb +1 -1
- data/lib/chef/provider/dsc_resource.rb +54 -20
- data/lib/chef/provider/execute.rb +25 -4
- data/lib/chef/provider/group.rb +1 -1
- data/lib/chef/provider/lwrp_base.rb +1 -0
- data/lib/chef/provider/package.rb +76 -30
- data/lib/chef/provider/package/dpkg.rb +152 -69
- data/lib/chef/provider/package/openbsd.rb +6 -8
- data/lib/chef/provider/package/solaris.rb +2 -0
- data/lib/chef/provider/package/windows.rb +95 -14
- data/lib/chef/provider/package/windows/exe.rb +129 -0
- data/lib/chef/provider/package/windows/msi.rb +37 -13
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +89 -0
- data/lib/chef/provider/package/yum.rb +13 -3
- data/lib/chef/provider/powershell_script.rb +3 -0
- data/lib/chef/provider/remote_file/cache_control_data.rb +37 -4
- data/lib/chef/provider/remote_file/http.rb +1 -1
- data/lib/chef/provider/script.rb +1 -0
- data/lib/chef/provider/service.rb +13 -10
- data/lib/chef/provider/service/solaris.rb +43 -17
- data/lib/chef/provider/service/upstart.rb +3 -3
- data/lib/chef/provider/user.rb +1 -1
- data/lib/chef/provider/user/dscl.rb +111 -100
- data/lib/chef/provider/user/windows.rb +5 -3
- data/lib/chef/recipe.rb +3 -5
- data/lib/chef/resource.rb +77 -320
- data/lib/chef/resource/action_class.rb +4 -0
- data/lib/chef/resource/dpkg_package.rb +4 -3
- data/lib/chef/resource/dsc_resource.rb +40 -2
- data/lib/chef/resource/execute.rb +9 -1
- data/lib/chef/resource/ksh.rb +32 -0
- data/lib/chef/resource/lwrp_base.rb +6 -10
- data/lib/chef/resource/package.rb +8 -9
- data/lib/chef/resource/registry_key.rb +1 -1
- data/lib/chef/resource/resource_notification.rb +14 -1
- data/lib/chef/resource/script.rb +1 -1
- data/lib/chef/resource/windows_package.rb +1 -1
- data/lib/chef/resource_builder.rb +14 -7
- data/lib/chef/resource_reporter.rb +6 -0
- data/lib/chef/resources.rb +1 -7
- data/lib/chef/rest.rb +1 -1
- data/lib/chef/run_context.rb +45 -2
- data/lib/chef/run_list/run_list_expansion.rb +47 -0
- data/lib/chef/runner.rb +25 -0
- data/lib/chef/search/query.rb +16 -2
- data/lib/chef/util/diff.rb +2 -2
- data/lib/chef/util/powershell/ps_credential.rb +2 -3
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +51 -1
- data/lib/chef/win32/file.rb +5 -0
- data/lib/chef/win32/file/version_info.rb +93 -0
- data/lib/chef/win32/mutex.rb +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.debian.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test2_1.0.orig.tar.gz +0 -0
- data/spec/functional/application_spec.rb +1 -1
- data/spec/functional/audit/runner_spec.rb +4 -0
- data/spec/functional/knife/ssh_spec.rb +5 -5
- data/spec/functional/notifications_spec.rb +74 -4
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/dpkg_package_spec.rb +339 -0
- data/spec/functional/resource/ifconfig_spec.rb +3 -1
- data/spec/functional/resource/mount_spec.rb +5 -2
- data/spec/functional/resource/package_spec.rb +1 -1
- data/spec/functional/resource/user/windows_spec.rb +8 -0
- data/spec/functional/resource/windows_package_spec.rb +177 -0
- data/spec/functional/win32/version_info_spec.rb +50 -0
- data/spec/integration/client/client_spec.rb +80 -0
- data/spec/integration/knife/download_spec.rb +9 -0
- data/spec/integration/knife/upload_spec.rb +28 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +93 -23
- data/spec/integration/recipes/resource_action_spec.rb +211 -116
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +72 -0
- data/spec/integration/solo/solo_spec.rb +34 -0
- data/spec/spec_helper.rb +11 -1
- data/spec/support/platform_helpers.rb +8 -0
- data/spec/support/shared/integration/integration_helper.rb +6 -0
- data/spec/support/shared/unit/execute_resource.rb +5 -0
- data/spec/support/shared/unit/platform_introspector.rb +7 -0
- data/spec/tiny_server.rb +6 -2
- data/spec/unit/api_client/registration_spec.rb +5 -4
- data/spec/unit/application_spec.rb +1 -181
- data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -0
- data/spec/unit/cookbook/metadata_spec.rb +122 -2
- data/spec/unit/http_spec.rb +102 -0
- data/spec/unit/knife/bootstrap_spec.rb +55 -13
- data/spec/unit/knife/core/bootstrap_context_spec.rb +10 -3
- data/spec/unit/knife/ssl_check_spec.rb +7 -3
- data/spec/unit/knife/ssl_fetch_spec.rb +2 -2
- data/spec/unit/knife/status_spec.rb +13 -13
- data/spec/unit/knife_spec.rb +26 -2
- data/spec/unit/lwrp_spec.rb +1 -1
- data/spec/unit/mixin/properties_spec.rb +97 -0
- data/spec/unit/mixin/proxified_socket_spec.rb +94 -0
- data/spec/unit/mixin/subclass_directive_spec.rb +45 -0
- data/spec/unit/node_spec.rb +9 -1
- data/spec/unit/policy_builder/policyfile_spec.rb +2 -0
- data/spec/unit/property/validation_spec.rb +14 -12
- data/spec/unit/property_spec.rb +56 -0
- data/spec/unit/provider/deploy_spec.rb +1 -1
- data/spec/unit/provider/dsc_resource_spec.rb +63 -24
- data/spec/unit/provider/execute_spec.rb +95 -28
- data/spec/unit/provider/package/dpkg_spec.rb +185 -96
- data/spec/unit/provider/package/windows/exe_spec.rb +251 -0
- data/spec/unit/provider/package/windows/msi_spec.rb +94 -10
- data/spec/unit/provider/package/windows_spec.rb +227 -26
- data/spec/unit/provider/package/yum_spec.rb +6 -0
- data/spec/unit/provider/package_spec.rb +495 -366
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +62 -36
- data/spec/unit/provider/script_spec.rb +2 -2
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +110 -39
- data/spec/unit/provider/service/upstart_service_spec.rb +19 -0
- data/spec/unit/provider/user/dscl_spec.rb +14 -0
- data/spec/unit/provider/user/windows_spec.rb +2 -2
- data/spec/unit/provider/user_spec.rb +9 -0
- data/spec/unit/provider_resolver_spec.rb +6 -30
- data/spec/unit/recipe_spec.rb +46 -20
- data/spec/unit/resource/chef_gem_spec.rb +1 -1
- data/spec/unit/resource/dsc_resource_spec.rb +14 -3
- data/spec/unit/resource/ksh_spec.rb +40 -0
- data/spec/unit/resource/registry_key_spec.rb +2 -2
- data/spec/unit/resource/resource_notification_spec.rb +44 -45
- data/spec/unit/resource_reporter_spec.rb +7 -0
- data/spec/unit/resource_spec.rb +268 -253
- data/spec/unit/rest_spec.rb +2 -2
- data/spec/unit/run_list/run_list_expansion_spec.rb +18 -3
- data/spec/unit/search/query_spec.rb +19 -1
- data/spec/unit/util/powershell/ps_credential_spec.rb +8 -1
- data/spec/unit/windows_service_spec.rb +83 -38
- data/tasks/external_tests.rb +19 -9
- data/tasks/rspec.rb +1 -1
- metadata +70 -21
- data/spec/support/pedant/Gemfile +0 -3
- data/spec/support/pedant/pedant_config.rb +0 -129
- data/spec/support/pedant/run_pedant.rb +0 -63
- data/spec/support/pedant/stickywicket.pem +0 -27
- data/spec/unit/provider/package_spec.rbe +0 -0
@@ -142,7 +142,11 @@ class Chef
|
|
142
142
|
def extract_cookbook(upstream_file, version)
|
143
143
|
ui.info("Uncompressing #{@cookbook_name} version #{version}.")
|
144
144
|
# FIXME: Detect if we have the bad tar from git on Windows: https://github.com/opscode/chef/issues/1753
|
145
|
-
|
145
|
+
extract_command="tar zxvf \"#{convert_path upstream_file}\""
|
146
|
+
if Chef::Platform.windows?
|
147
|
+
extract_command << " --force-local"
|
148
|
+
end
|
149
|
+
shell_out!(extract_command, :cwd => @install_path)
|
146
150
|
end
|
147
151
|
|
148
152
|
def clear_existing_files(cookbook_path)
|
@@ -40,7 +40,7 @@ class Chef
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def bootstrap_environment
|
43
|
-
@
|
43
|
+
@config[:environment]
|
44
44
|
end
|
45
45
|
|
46
46
|
def validation_key
|
@@ -129,6 +129,7 @@ CONFIG
|
|
129
129
|
s = "#{client_path} -j /etc/chef/first-boot.json"
|
130
130
|
s << ' -l debug' if @config[:verbosity] and @config[:verbosity] >= 2
|
131
131
|
s << " -E #{bootstrap_environment}" unless bootstrap_environment.nil?
|
132
|
+
s << " --no-color" unless @config[:color]
|
132
133
|
s
|
133
134
|
end
|
134
135
|
|
@@ -125,7 +125,7 @@ ROLES
|
|
125
125
|
summarized << <<-SUMMARY
|
126
126
|
#{key('Recipes:')} #{Array(node[:recipes]).join(', ')}
|
127
127
|
#{key('Platform:')} #{node[:platform]} #{node[:platform_version]}
|
128
|
-
#{key('Tags:')} #{
|
128
|
+
#{key('Tags:')} #{node.tags.join(', ')}
|
129
129
|
SUMMARY
|
130
130
|
if config[:medium_output] || config[:long_output]
|
131
131
|
summarized +=<<-MORE
|
data/lib/chef/knife/ssh.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
+
require 'chef/mixin/shell_out'
|
19
20
|
require 'chef/knife'
|
20
21
|
|
21
22
|
class Chef
|
@@ -29,7 +30,6 @@ class Chef
|
|
29
30
|
require 'readline'
|
30
31
|
require 'chef/exceptions'
|
31
32
|
require 'chef/search/query'
|
32
|
-
require 'chef/mixin/shell_out'
|
33
33
|
require 'chef/mixin/command'
|
34
34
|
require 'chef/util/path_helper'
|
35
35
|
require 'mixlib/shellout'
|
@@ -72,7 +72,7 @@ class Chef
|
|
72
72
|
:description => "The ssh password - will prompt if flag is specified but no password is given",
|
73
73
|
# default to a value that can not be a password (boolean)
|
74
74
|
# so we can effectively test if this parameter was specified
|
75
|
-
# without a
|
75
|
+
# without a value
|
76
76
|
:default => false
|
77
77
|
|
78
78
|
option :ssh_port,
|
@@ -94,8 +94,12 @@ class Chef
|
|
94
94
|
:boolean => true
|
95
95
|
|
96
96
|
option :identity_file,
|
97
|
-
:short => "-i IDENTITY_FILE",
|
98
97
|
:long => "--identity-file IDENTITY_FILE",
|
98
|
+
:description => "The SSH identity file used for authentication. [DEPRECATED] Use --ssh-identity-file instead."
|
99
|
+
|
100
|
+
option :ssh_identity_file,
|
101
|
+
:short => "-i IDENTITY_FILE",
|
102
|
+
:long => "--ssh-identity-file IDENTITY_FILE",
|
99
103
|
:description => "The SSH identity file used for authentication"
|
100
104
|
|
101
105
|
option :host_key_verify,
|
@@ -111,6 +115,12 @@ class Chef
|
|
111
115
|
:boolean => true,
|
112
116
|
:proc => Proc.new { :raise }
|
113
117
|
|
118
|
+
option :tmux_split,
|
119
|
+
:long => "--tmux-split",
|
120
|
+
:description => "Split tmux window.",
|
121
|
+
:boolean => true,
|
122
|
+
:default => false
|
123
|
+
|
114
124
|
def session
|
115
125
|
config[:on_error] ||= :skip
|
116
126
|
ssh_error_handler = Proc.new do |server|
|
@@ -222,8 +232,8 @@ class Chef
|
|
222
232
|
{}.tap do |opts|
|
223
233
|
# Chef::Config[:knife][:ssh_user] is parsed in #configure_user and written to config[:ssh_user]
|
224
234
|
opts[:user] = user || config[:ssh_user] || ssh_config[:user]
|
225
|
-
if config[:
|
226
|
-
opts[:keys] = File.expand_path(config[:
|
235
|
+
if config[:ssh_identity_file]
|
236
|
+
opts[:keys] = File.expand_path(config[:ssh_identity_file])
|
227
237
|
opts[:keys_only] = true
|
228
238
|
elsif config[:ssh_password]
|
229
239
|
opts[:password] = config[:ssh_password]
|
@@ -386,7 +396,7 @@ class Chef
|
|
386
396
|
window = 0
|
387
397
|
session.servers_for.each do |server|
|
388
398
|
tf.print("screen -t \"#{server.host}\" #{window} ssh ")
|
389
|
-
tf.print("-i #{config[:
|
399
|
+
tf.print("-i #{config[:ssh_identity_file]} ") if config[:ssh_identity_file]
|
390
400
|
server.user ? tf.puts("#{server.user}@#{server.host}") : tf.puts(server.host)
|
391
401
|
window += 1
|
392
402
|
end
|
@@ -396,7 +406,7 @@ class Chef
|
|
396
406
|
|
397
407
|
def tmux
|
398
408
|
ssh_dest = lambda do |server|
|
399
|
-
identity = "-i #{config[:
|
409
|
+
identity = "-i #{config[:ssh_identity_file]} " if config[:ssh_identity_file]
|
400
410
|
prefix = server.user ? "#{server.user}@" : ""
|
401
411
|
"'ssh #{identity}#{prefix}#{server.host}'"
|
402
412
|
end
|
@@ -404,7 +414,11 @@ class Chef
|
|
404
414
|
new_window_cmds = lambda do
|
405
415
|
if session.servers_for.size > 1
|
406
416
|
[""] + session.servers_for[1..-1].map do |server|
|
407
|
-
|
417
|
+
if config[:tmux_split]
|
418
|
+
"split-window #{ssh_dest.call(server)}; tmux select-layout tiled"
|
419
|
+
else
|
420
|
+
"new-window -a -n '#{server.host}' #{ssh_dest.call(server)}"
|
421
|
+
end
|
408
422
|
end
|
409
423
|
else
|
410
424
|
[]
|
@@ -459,15 +473,15 @@ class Chef
|
|
459
473
|
end
|
460
474
|
raise Chef::Exceptions::Exec, "no command found for cssh" unless cssh_cmd
|
461
475
|
|
462
|
-
# pass in the consolidated
|
463
|
-
if config[:
|
464
|
-
cssh_cmd << " --ssh_args '-i #{File.expand_path(config[:
|
476
|
+
# pass in the consolidated identity file option to cssh(X)
|
477
|
+
if config[:ssh_identity_file]
|
478
|
+
cssh_cmd << " --ssh_args '-i #{File.expand_path(config[:ssh_identity_file])}'"
|
465
479
|
end
|
466
480
|
|
467
481
|
session.servers_for.each do |server|
|
468
482
|
cssh_cmd << " #{server.user ? "#{server.user}@#{server.host}" : server.host}"
|
469
483
|
end
|
470
|
-
Chef::Log.debug("
|
484
|
+
Chef::Log.debug("Starting cssh session with command: #{cssh_cmd}")
|
471
485
|
exec(cssh_cmd)
|
472
486
|
end
|
473
487
|
|
@@ -506,9 +520,9 @@ class Chef
|
|
506
520
|
end
|
507
521
|
end
|
508
522
|
|
509
|
-
def
|
510
|
-
config[:identity_file]
|
511
|
-
|
523
|
+
def configure_ssh_identity_file
|
524
|
+
# config[:identity_file] is DEPRECATED in favor of :ssh_identity_file
|
525
|
+
config[:ssh_identity_file] = get_stripped_unfrozen_value(config[:ssh_identity_file] || config[:identity_file] || Chef::Config[:knife][:ssh_identity_file])
|
512
526
|
end
|
513
527
|
|
514
528
|
def extract_nested_value(data_structure, path_spec)
|
@@ -522,7 +536,7 @@ class Chef
|
|
522
536
|
|
523
537
|
configure_user
|
524
538
|
configure_password
|
525
|
-
|
539
|
+
configure_ssh_identity_file
|
526
540
|
configure_gateway
|
527
541
|
configure_session
|
528
542
|
|
data/lib/chef/knife/ssl_check.rb
CHANGED
@@ -29,6 +29,8 @@ class Chef
|
|
29
29
|
require 'uri'
|
30
30
|
require 'chef/http/ssl_policies'
|
31
31
|
require 'openssl'
|
32
|
+
require 'chef/mixin/proxified_socket'
|
33
|
+
include Chef::Mixin::ProxifiedSocket
|
32
34
|
end
|
33
35
|
|
34
36
|
banner "knife ssl check [URL] (options)"
|
@@ -75,7 +77,7 @@ class Chef
|
|
75
77
|
|
76
78
|
def verify_peer_socket
|
77
79
|
@verify_peer_socket ||= begin
|
78
|
-
tcp_connection =
|
80
|
+
tcp_connection = proxified_socket(host, port)
|
79
81
|
ssl_client = OpenSSL::SSL::SSLSocket.new(tcp_connection, verify_peer_ssl_context)
|
80
82
|
ssl_client.hostname = host
|
81
83
|
ssl_client
|
@@ -93,7 +95,7 @@ class Chef
|
|
93
95
|
|
94
96
|
def noverify_socket
|
95
97
|
@noverify_socket ||= begin
|
96
|
-
tcp_connection =
|
98
|
+
tcp_connection = proxified_socket(host, port)
|
97
99
|
OpenSSL::SSL::SSLSocket.new(tcp_connection, noverify_peer_ssl_context)
|
98
100
|
end
|
99
101
|
end
|
data/lib/chef/knife/ssl_fetch.rb
CHANGED
@@ -28,6 +28,8 @@ class Chef
|
|
28
28
|
require 'socket'
|
29
29
|
require 'uri'
|
30
30
|
require 'openssl'
|
31
|
+
require 'chef/mixin/proxified_socket'
|
32
|
+
include Chef::Mixin::ProxifiedSocket
|
31
33
|
end
|
32
34
|
|
33
35
|
banner "knife ssl fetch [URL] (options)"
|
@@ -71,7 +73,7 @@ class Chef
|
|
71
73
|
end
|
72
74
|
|
73
75
|
def remote_cert_chain
|
74
|
-
tcp_connection =
|
76
|
+
tcp_connection = proxified_socket(host, port)
|
75
77
|
shady_ssl_connection = OpenSSL::SSL::SSLSocket.new(tcp_connection, noverify_peer_ssl_context)
|
76
78
|
shady_ssl_connection.connect
|
77
79
|
shady_ssl_connection.peer_cert_chain
|
@@ -155,4 +157,3 @@ TRUST_TRUST
|
|
155
157
|
end
|
156
158
|
end
|
157
159
|
end
|
158
|
-
|
data/lib/chef/knife/status.rb
CHANGED
@@ -44,7 +44,11 @@ class Chef
|
|
44
44
|
option :hide_healthy,
|
45
45
|
:short => "-H",
|
46
46
|
:long => "--hide-healthy",
|
47
|
-
:description => "Hide nodes that have run chef in the last hour"
|
47
|
+
:description => "Hide nodes that have run chef in the last hour. [DEPRECATED] Use --hide-by-mins MINS instead"
|
48
|
+
|
49
|
+
option :hide_by_mins,
|
50
|
+
:long => "--hide-by-mins MINS",
|
51
|
+
:description => "Hide nodes that have run chef in the last MINS minutes"
|
48
52
|
|
49
53
|
def append_to_query(term)
|
50
54
|
@query << " AND " unless @query.empty?
|
@@ -68,12 +72,21 @@ class Chef
|
|
68
72
|
append_to_query("chef_environment:#{config[:environment]}") if config[:environment]
|
69
73
|
|
70
74
|
if config[:hide_healthy]
|
75
|
+
ui.warn("-H / --hide-healthy is deprecated. Use --hide-by-mins MINS instead")
|
71
76
|
time = Time.now.to_i
|
72
77
|
# AND NOT is not valid lucene syntax, so don't use append_to_query
|
73
78
|
@query << " " unless @query.empty?
|
74
79
|
@query << "NOT ohai_time:[#{(time - 60*60).to_s} TO #{time.to_s}]"
|
75
80
|
end
|
76
81
|
|
82
|
+
if config[:hide_by_mins]
|
83
|
+
hidemins = config[:hide_by_mins].to_i
|
84
|
+
time = Time.now.to_i
|
85
|
+
# AND NOT is not valid lucene syntax, so don't use append_to_query
|
86
|
+
@query << " " unless @query.empty?
|
87
|
+
@query << "NOT ohai_time:[#{(time - hidemins*60).to_s} TO #{time.to_s}]"
|
88
|
+
end
|
89
|
+
|
77
90
|
@query = @query.empty? ? "*:*" : @query
|
78
91
|
|
79
92
|
all_nodes = []
|
data/lib/chef/log.rb
CHANGED
@@ -37,6 +37,20 @@ class Chef
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
#
|
41
|
+
# Get the location of the caller (from the recipe). Grabs the first caller
|
42
|
+
# that is *not* in the chef gem proper (allowing us to weed out internal
|
43
|
+
# calls and give the user a more useful perspective).
|
44
|
+
#
|
45
|
+
# @return [String] The location of the caller (file:line#) from caller(0..20), or nil if no non-chef caller is found.
|
46
|
+
#
|
47
|
+
def self.caller_location
|
48
|
+
# Pick the first caller that is *not* part of the Chef gem, that's the
|
49
|
+
# thing the user wrote.
|
50
|
+
chef_gem_path = File.expand_path("../..", __FILE__)
|
51
|
+
caller(0..20).select { |c| !c.start_with?(chef_gem_path) }.first
|
52
|
+
end
|
53
|
+
|
40
54
|
def self.deprecation(msg=nil, location=caller(2..2)[0], &block)
|
41
55
|
if msg
|
42
56
|
msg << " at #{Array(location).join("\n")}"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
2
|
-
# Copyright:: Copyright (c) 2008
|
2
|
+
# Copyright:: Copyright (c) 2008-2015 Chef Software, Inc.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -27,6 +27,12 @@
|
|
27
27
|
class Chef
|
28
28
|
module Mixin
|
29
29
|
module GetSourceFromPackage
|
30
|
+
# FIXME: this is some bad code that I wrote a long time ago.
|
31
|
+
# - it does too much in the initializer
|
32
|
+
# - it mutates the new_resource
|
33
|
+
# - it does not support multipackage arrays
|
34
|
+
# this code is deprecated, check out the :use_package_names_for_source
|
35
|
+
# subclass directive instead
|
30
36
|
def initialize(new_resource, run_context)
|
31
37
|
super
|
32
38
|
return if new_resource.package_name.is_a?(Array)
|
@@ -40,4 +46,3 @@ class Chef
|
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
43
|
-
|
@@ -0,0 +1,302 @@
|
|
1
|
+
require 'chef/delayed_evaluator'
|
2
|
+
require 'chef/mixin/params_validate'
|
3
|
+
require 'chef/property'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
module Mixin
|
7
|
+
module Properties
|
8
|
+
module ClassMethods
|
9
|
+
#
|
10
|
+
# The list of properties defined on this resource.
|
11
|
+
#
|
12
|
+
# Everything defined with `property` is in this list.
|
13
|
+
#
|
14
|
+
# @param include_superclass [Boolean] `true` to include properties defined
|
15
|
+
# on superclasses; `false` or `nil` to return the list of properties
|
16
|
+
# directly on this class.
|
17
|
+
#
|
18
|
+
# @return [Hash<Symbol,Property>] The list of property names and types.
|
19
|
+
#
|
20
|
+
def properties(include_superclass=true)
|
21
|
+
if include_superclass
|
22
|
+
result = {}
|
23
|
+
ancestors.reverse_each { |c| result.merge!(c.properties(false)) if c.respond_to?(:properties) }
|
24
|
+
result
|
25
|
+
else
|
26
|
+
@properties ||= {}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Create a property on this resource class.
|
32
|
+
#
|
33
|
+
# If a superclass has this property, or if this property has already been
|
34
|
+
# defined by this resource, this will *override* the previous value.
|
35
|
+
#
|
36
|
+
# @param name [Symbol] The name of the property.
|
37
|
+
# @param type [Object,Array<Object>] The type(s) of this property.
|
38
|
+
# If present, this is prepended to the `is` validation option.
|
39
|
+
# @param options [Hash<Symbol,Object>] Validation options.
|
40
|
+
# @option options [Object,Array] :is An object, or list of
|
41
|
+
# objects, that must match the value using Ruby's `===` operator
|
42
|
+
# (`options[:is].any? { |v| v === value }`).
|
43
|
+
# @option options [Object,Array] :equal_to An object, or list
|
44
|
+
# of objects, that must be equal to the value using Ruby's `==`
|
45
|
+
# operator (`options[:is].any? { |v| v == value }`)
|
46
|
+
# @option options [Regexp,Array<Regexp>] :regex An object, or
|
47
|
+
# list of objects, that must match the value with `regex.match(value)`.
|
48
|
+
# @option options [Class,Array<Class>] :kind_of A class, or
|
49
|
+
# list of classes, that the value must be an instance of.
|
50
|
+
# @option options [Hash<String,Proc>] :callbacks A hash of
|
51
|
+
# messages -> procs, all of which match the value. The proc must
|
52
|
+
# return a truthy or falsey value (true means it matches).
|
53
|
+
# @option options [Symbol,Array<Symbol>] :respond_to A method
|
54
|
+
# name, or list of method names, the value must respond to.
|
55
|
+
# @option options [Symbol,Array<Symbol>] :cannot_be A property,
|
56
|
+
# or a list of properties, that the value cannot have (such as `:nil` or
|
57
|
+
# `:empty`). The method with a questionmark at the end is called on the
|
58
|
+
# value (e.g. `value.empty?`). If the value does not have this method,
|
59
|
+
# it is considered valid (i.e. if you don't respond to `empty?` we
|
60
|
+
# assume you are not empty).
|
61
|
+
# @option options [Proc] :coerce A proc which will be called to
|
62
|
+
# transform the user input to canonical form. The value is passed in,
|
63
|
+
# and the transformed value returned as output. Lazy values will *not*
|
64
|
+
# be passed to this method until after they are evaluated. Called in the
|
65
|
+
# context of the resource (meaning you can access other properties).
|
66
|
+
# @option options [Boolean] :required `true` if this property
|
67
|
+
# must be present; `false` otherwise. This is checked after the resource
|
68
|
+
# is fully initialized.
|
69
|
+
# @option options [Boolean] :name_property `true` if this
|
70
|
+
# property defaults to the same value as `name`. Equivalent to
|
71
|
+
# `default: lazy { name }`, except that #property_is_set? will
|
72
|
+
# return `true` if the property is set *or* if `name` is set.
|
73
|
+
# @option options [Boolean] :name_attribute Same as `name_property`.
|
74
|
+
# @option options [Object] :default The value this property
|
75
|
+
# will return if the user does not set one. If this is `lazy`, it will
|
76
|
+
# be run in the context of the instance (and able to access other
|
77
|
+
# properties).
|
78
|
+
# @option options [Boolean] :desired_state `true` if this property is
|
79
|
+
# part of desired state. Defaults to `true`.
|
80
|
+
# @option options [Boolean] :identity `true` if this property
|
81
|
+
# is part of object identity. Defaults to `false`.
|
82
|
+
#
|
83
|
+
# @example Bare property
|
84
|
+
# property :x
|
85
|
+
#
|
86
|
+
# @example With just a type
|
87
|
+
# property :x, String
|
88
|
+
#
|
89
|
+
# @example With just options
|
90
|
+
# property :x, default: 'hi'
|
91
|
+
#
|
92
|
+
# @example With type and options
|
93
|
+
# property :x, String, default: 'hi'
|
94
|
+
#
|
95
|
+
def property(name, type=NOT_PASSED, **options)
|
96
|
+
name = name.to_sym
|
97
|
+
|
98
|
+
options.each { |k,v| options[k.to_sym] = v if k.is_a?(String) }
|
99
|
+
|
100
|
+
options[:instance_variable_name] = :"@#{name}" if !options.has_key?(:instance_variable_name)
|
101
|
+
options.merge!(name: name, declared_in: self)
|
102
|
+
|
103
|
+
if type == NOT_PASSED
|
104
|
+
# If a type is not passed, the property derives from the
|
105
|
+
# superclass property (if any)
|
106
|
+
if properties.has_key?(name)
|
107
|
+
property = properties[name].derive(**options)
|
108
|
+
else
|
109
|
+
property = property_type(**options)
|
110
|
+
end
|
111
|
+
|
112
|
+
# If a Property is specified, derive a new one from that.
|
113
|
+
elsif type.is_a?(Property) || (type.is_a?(Class) && type <= Property)
|
114
|
+
property = type.derive(**options)
|
115
|
+
|
116
|
+
# If a primitive type was passed, combine it with "is"
|
117
|
+
else
|
118
|
+
if options[:is]
|
119
|
+
options[:is] = ([ type ] + [ options[:is] ]).flatten(1)
|
120
|
+
else
|
121
|
+
options[:is] = type
|
122
|
+
end
|
123
|
+
property = property_type(**options)
|
124
|
+
end
|
125
|
+
|
126
|
+
local_properties = properties(false)
|
127
|
+
local_properties[name] = property
|
128
|
+
|
129
|
+
property.emit_dsl
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Create a reusable property type that can be used in multiple properties
|
134
|
+
# in different resources.
|
135
|
+
#
|
136
|
+
# @param options [Hash<Symbol,Object>] Validation options. see #property for
|
137
|
+
# the list of options.
|
138
|
+
#
|
139
|
+
# @example
|
140
|
+
# property_type(default: 'hi')
|
141
|
+
#
|
142
|
+
def property_type(**options)
|
143
|
+
Property.derive(**options)
|
144
|
+
end
|
145
|
+
|
146
|
+
#
|
147
|
+
# Create a lazy value for assignment to a default value.
|
148
|
+
#
|
149
|
+
# @param block The block to run when the value is retrieved.
|
150
|
+
#
|
151
|
+
# @return [Chef::DelayedEvaluator] The lazy value
|
152
|
+
#
|
153
|
+
def lazy(&block)
|
154
|
+
DelayedEvaluator.new(&block)
|
155
|
+
end
|
156
|
+
|
157
|
+
#
|
158
|
+
# Get or set the list of desired state properties for this resource.
|
159
|
+
#
|
160
|
+
# State properties are properties that describe the desired state
|
161
|
+
# of the system, such as file permissions or ownership.
|
162
|
+
# In general, state properties are properties that could be populated by
|
163
|
+
# examining the state of the system (e.g., File.stat can tell you the
|
164
|
+
# permissions on an existing file). Contrarily, properties that are not
|
165
|
+
# "state properties" usually modify the way Chef itself behaves, for example
|
166
|
+
# by providing additional options for a package manager to use when
|
167
|
+
# installing a package.
|
168
|
+
#
|
169
|
+
# This list is used by the Chef client auditing system to extract
|
170
|
+
# information from resources to describe changes made to the system.
|
171
|
+
#
|
172
|
+
# This method is unnecessary when declaring properties with `property`;
|
173
|
+
# properties are added to state_properties by default, and can be turned off
|
174
|
+
# with `desired_state: false`.
|
175
|
+
#
|
176
|
+
# ```ruby
|
177
|
+
# property :x # part of desired state
|
178
|
+
# property :y, desired_state: false # not part of desired state
|
179
|
+
# ```
|
180
|
+
#
|
181
|
+
# @param names [Array<Symbol>] A list of property names to set as desired
|
182
|
+
# state.
|
183
|
+
#
|
184
|
+
# @return [Array<Property>] All properties in desired state.
|
185
|
+
#
|
186
|
+
def state_properties(*names)
|
187
|
+
if !names.empty?
|
188
|
+
names = names.map { |name| name.to_sym }.uniq
|
189
|
+
|
190
|
+
local_properties = properties(false)
|
191
|
+
# Add new properties to the list.
|
192
|
+
names.each do |name|
|
193
|
+
property = properties[name]
|
194
|
+
if !property
|
195
|
+
self.property name, instance_variable_name: false, desired_state: true
|
196
|
+
elsif !property.desired_state?
|
197
|
+
self.property name, desired_state: true
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# If state_attrs *excludes* something which is currently desired state,
|
202
|
+
# mark it as desired_state: false.
|
203
|
+
local_properties.each do |name,property|
|
204
|
+
if property.desired_state? && !names.include?(name)
|
205
|
+
self.property name, desired_state: false
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
properties.values.select { |property| property.desired_state? }
|
211
|
+
end
|
212
|
+
|
213
|
+
#
|
214
|
+
# Set the identity of this resource to a particular set of properties.
|
215
|
+
#
|
216
|
+
# This drives #identity, which returns data that uniquely refers to a given
|
217
|
+
# resource on the given node (in such a way that it can be correlated
|
218
|
+
# across Chef runs).
|
219
|
+
#
|
220
|
+
# This method is unnecessary when declaring properties with `property`;
|
221
|
+
# properties can be added to identity during declaration with
|
222
|
+
# `identity: true`.
|
223
|
+
#
|
224
|
+
# ```ruby
|
225
|
+
# property :x, identity: true # part of identity
|
226
|
+
# property :y # not part of identity
|
227
|
+
# ```
|
228
|
+
#
|
229
|
+
# If no properties are marked as identity, "name" is considered the identity.
|
230
|
+
#
|
231
|
+
# @param names [Array<Symbol>] A list of property names to set as the identity.
|
232
|
+
#
|
233
|
+
# @return [Array<Property>] All identity properties.
|
234
|
+
#
|
235
|
+
def identity_properties(*names)
|
236
|
+
if !names.empty?
|
237
|
+
names = names.map { |name| name.to_sym }
|
238
|
+
|
239
|
+
# Add or change properties that are not part of the identity.
|
240
|
+
names.each do |name|
|
241
|
+
property = properties[name]
|
242
|
+
if !property
|
243
|
+
self.property name, instance_variable_name: false, identity: true
|
244
|
+
elsif !property.identity?
|
245
|
+
self.property name, identity: true
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
# If identity_properties *excludes* something which is currently part of
|
250
|
+
# the identity, mark it as identity: false.
|
251
|
+
properties.each do |name,property|
|
252
|
+
if property.identity? && !names.include?(name)
|
253
|
+
|
254
|
+
self.property name, identity: false
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
result = properties.values.select { |property| property.identity? }
|
260
|
+
result = [ properties[:name] ] if result.empty?
|
261
|
+
result
|
262
|
+
end
|
263
|
+
|
264
|
+
def included(other)
|
265
|
+
other.extend ClassMethods
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def self.included(other)
|
270
|
+
other.extend ClassMethods
|
271
|
+
end
|
272
|
+
|
273
|
+
include Chef::Mixin::ParamsValidate
|
274
|
+
|
275
|
+
#
|
276
|
+
# Whether this property has been set (or whether it has a default that has
|
277
|
+
# been retrieved).
|
278
|
+
#
|
279
|
+
# @param name [Symbol] The name of the property.
|
280
|
+
# @return [Boolean] `true` if the property has been set.
|
281
|
+
#
|
282
|
+
def property_is_set?(name)
|
283
|
+
property = self.class.properties[name.to_sym]
|
284
|
+
raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
|
285
|
+
property.is_set?(self)
|
286
|
+
end
|
287
|
+
|
288
|
+
#
|
289
|
+
# Clear this property as if it had never been set. It will thereafter return
|
290
|
+
# the default.
|
291
|
+
# been retrieved).
|
292
|
+
#
|
293
|
+
# @param name [Symbol] The name of the property.
|
294
|
+
#
|
295
|
+
def reset_property(name)
|
296
|
+
property = self.class.properties[name.to_sym]
|
297
|
+
raise ArgumentError, "Property #{name} is not defined in class #{self}" if !property
|
298
|
+
property.reset(self)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|