chef 16.4.41 → 16.5.64
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 +1 -1
- data/Rakefile +2 -2
- data/bin/knife +1 -1
- data/chef.gemspec +2 -1
- data/lib/chef/application.rb +18 -16
- data/lib/chef/application/apply.rb +12 -7
- data/lib/chef/application/base.rb +26 -23
- data/lib/chef/application/client.rb +10 -4
- data/lib/chef/application/exit_code.rb +13 -4
- data/lib/chef/application/knife.rb +22 -11
- data/lib/chef/application/solo.rb +2 -1
- data/lib/chef/application/windows_service.rb +14 -14
- data/lib/chef/application/windows_service_manager.rb +6 -6
- data/lib/chef/chef_fs/knife.rb +2 -2
- data/lib/chef/chef_fs/parallelizer.rb +0 -1
- data/lib/chef/client.rb +10 -11
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook_site_streaming_uploader.rb +13 -11
- data/lib/chef/cookbook_uploader.rb +1 -1
- data/lib/chef/data_collector.rb +6 -5
- data/lib/chef/data_collector/config_validation.rb +22 -13
- data/lib/chef/data_collector/run_end_message.rb +2 -2
- data/lib/chef/data_collector/run_start_message.rb +1 -1
- data/lib/chef/deprecated.rb +1 -1
- data/lib/chef/deprecation/warnings.rb +2 -2
- data/lib/chef/digester.rb +2 -2
- data/lib/chef/dsl/chef_vault.rb +1 -1
- data/lib/chef/dsl/data_query.rb +2 -2
- data/lib/chef/dsl/platform_introspection.rb +1 -1
- data/lib/chef/encrypted_data_bag_item.rb +3 -4
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +3 -3
- data/lib/chef/environment.rb +2 -2
- data/lib/chef/event_loggers/windows_eventlog.rb +2 -2
- data/lib/chef/exceptions.rb +4 -4
- data/lib/chef/file_access_control/windows.rb +5 -1
- data/lib/chef/formatters/doc.rb +7 -6
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +6 -5
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +3 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +9 -9
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +2 -2
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +3 -3
- data/lib/chef/formatters/minimal.rb +5 -4
- data/lib/chef/http.rb +6 -4
- data/lib/chef/http/auth_credentials.rb +5 -1
- data/lib/chef/http/authenticator.rb +1 -1
- data/lib/chef/http/basic_client.rb +4 -2
- data/lib/chef/http/decompressor.rb +1 -1
- data/lib/chef/http/http_request.rb +7 -5
- data/lib/chef/http/socketless_chef_zero_client.rb +5 -2
- data/lib/chef/http/ssl_policies.rb +1 -1
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/knife.rb +4 -4
- data/lib/chef/knife/bootstrap.rb +16 -14
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +3 -3
- data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +7 -7
- data/lib/chef/knife/client_create.rb +3 -3
- data/lib/chef/knife/config_get.rb +8 -97
- data/lib/chef/knife/config_get_profile.rb +9 -9
- data/lib/chef/knife/config_list.rb +139 -0
- data/lib/chef/knife/config_list_profiles.rb +8 -98
- data/lib/chef/knife/config_show.rb +127 -0
- data/lib/chef/knife/config_use.rb +61 -0
- data/lib/chef/knife/config_use_profile.rb +9 -24
- data/lib/chef/knife/configure.rb +2 -2
- data/lib/chef/knife/core/bootstrap_context.rb +2 -2
- data/lib/chef/knife/core/object_loader.rb +1 -1
- data/lib/chef/knife/core/windows_bootstrap_context.rb +11 -11
- data/lib/chef/knife/exec.rb +2 -2
- data/lib/chef/knife/node_show.rb +2 -2
- data/lib/chef/knife/serve.rb +3 -3
- data/lib/chef/knife/ssh.rb +16 -1
- data/lib/chef/knife/ssl_check.rb +3 -3
- data/lib/chef/knife/status.rb +2 -2
- data/lib/chef/knife/user_create.rb +2 -2
- data/lib/chef/knife/yaml_convert.rb +1 -1
- data/lib/chef/local_mode.rb +2 -2
- data/lib/chef/log/syslog.rb +2 -2
- data/lib/chef/log/winevt.rb +2 -2
- data/lib/chef/mixin/deep_merge.rb +0 -12
- data/lib/chef/mixin/openssl_helper.rb +1 -4
- data/lib/chef/mixin/template.rb +2 -2
- data/lib/chef/mixin/uris.rb +2 -2
- data/lib/chef/mixin/versioned_api.rb +1 -2
- data/lib/chef/monkey_patches/net_http.rb +4 -4
- data/lib/chef/node_map.rb +2 -2
- data/lib/chef/policy_builder/policyfile.rb +2 -2
- data/lib/chef/provider.rb +0 -4
- data/lib/chef/provider/file.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +1 -1
- data/lib/chef/provider/launchd.rb +2 -2
- data/lib/chef/provider/mount/linux.rb +63 -0
- data/lib/chef/provider/package/rubygems.rb +21 -18
- data/lib/chef/provider/package/snap.rb +0 -1
- data/lib/chef/provider/package/windows.rb +2 -2
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +3 -1
- data/lib/chef/provider/package/zypper.rb +1 -1
- data/lib/chef/provider/remote_file/content.rb +3 -0
- data/lib/chef/provider/remote_file/ftp.rb +6 -4
- data/lib/chef/provider/remote_file/sftp.rb +6 -4
- data/lib/chef/provider/route.rb +2 -6
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/template_finder.rb +2 -10
- data/lib/chef/provider/user/dscl.rb +3 -3
- data/lib/chef/provider/user/mac.rb +1 -1
- data/lib/chef/provider/windows_task.rb +1 -2
- data/lib/chef/provider/zypper_repository.rb +2 -2
- data/lib/chef/provider_resolver.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +2 -2
- data/lib/chef/resource.rb +1 -1
- data/lib/chef/resource/apt_repository.rb +1 -1
- data/lib/chef/resource/bff_package.rb +22 -0
- data/lib/chef/resource/breakpoint.rb +57 -2
- data/lib/chef/resource/build_essential.rb +1 -1
- data/lib/chef/resource/cab_package.rb +29 -0
- data/lib/chef/resource/chef_client_cron.rb +32 -25
- data/lib/chef/resource/chef_client_launchd.rb +194 -0
- data/lib/chef/resource/chef_client_scheduled_task.rb +21 -18
- data/lib/chef/resource/chef_client_systemd_timer.rb +24 -17
- data/lib/chef/resource/chef_client_trusted_certificate.rb +101 -0
- data/lib/chef/resource/chef_gem.rb +10 -10
- data/lib/chef/resource/chef_handler.rb +148 -4
- data/lib/chef/resource/chef_sleep.rb +2 -2
- data/lib/chef/resource/chef_vault_secret.rb +1 -1
- data/lib/chef/resource/cookbook_file.rb +2 -2
- data/lib/chef/resource/cron/cron_d.rb +0 -1
- data/lib/chef/resource/dnf_package.rb +2 -2
- data/lib/chef/resource/dsc_resource.rb +0 -1
- data/lib/chef/resource/dsc_script.rb +2 -2
- data/lib/chef/resource/execute.rb +6 -6
- data/lib/chef/resource/file.rb +4 -4
- data/lib/chef/resource/gem_package.rb +5 -5
- data/lib/chef/resource/homebrew_package.rb +3 -3
- data/lib/chef/resource/homebrew_update.rb +5 -5
- data/lib/chef/resource/hostname.rb +2 -2
- data/lib/chef/resource/launchd.rb +2 -1
- data/lib/chef/resource/locale.rb +2 -2
- data/lib/chef/resource/macos_userdefaults.rb +3 -3
- data/lib/chef/resource/notify_group.rb +0 -1
- data/lib/chef/resource/ohai.rb +46 -3
- data/lib/chef/resource/ohai_hint.rb +33 -0
- data/lib/chef/resource/openssl_dhparam.rb +27 -5
- data/lib/chef/resource/openssl_ec_private_key.rb +6 -3
- data/lib/chef/resource/openssl_ec_public_key.rb +2 -2
- data/lib/chef/resource/openssl_rsa_private_key.rb +6 -3
- data/lib/chef/resource/openssl_x509_certificate.rb +14 -14
- data/lib/chef/resource/openssl_x509_crl.rb +19 -10
- data/lib/chef/resource/openssl_x509_request.rb +14 -16
- data/lib/chef/resource/osx_profile.rb +77 -13
- data/lib/chef/resource/plist.rb +1 -1
- data/lib/chef/resource/powershell_package_source.rb +5 -5
- data/lib/chef/resource/reboot.rb +2 -2
- data/lib/chef/resource/remote_file.rb +3 -3
- data/lib/chef/resource/rhsm_register.rb +22 -10
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/scm/subversion.rb +2 -2
- data/lib/chef/resource/service.rb +3 -3
- data/lib/chef/resource/ssh_known_hosts_entry.rb +2 -2
- data/lib/chef/resource/support/cron.d.erb +1 -1
- data/lib/chef/resource/support/cron_access.erb +1 -1
- data/lib/chef/resource/support/sudoer.erb +1 -1
- data/lib/chef/resource/support/ulimit.erb +1 -1
- data/lib/chef/resource/sysctl.rb +1 -5
- data/lib/chef/resource/systemd_unit.rb +2 -2
- data/lib/chef/resource/template.rb +2 -2
- data/lib/chef/resource/windows_ad_join.rb +10 -3
- data/lib/chef/resource/windows_certificate.rb +6 -4
- data/lib/chef/resource/windows_firewall_profile.rb +22 -20
- data/lib/chef/resource/windows_package.rb +28 -5
- data/lib/chef/resource/windows_printer.rb +5 -3
- data/lib/chef/resource/windows_printer_port.rb +6 -4
- data/lib/chef/resource/windows_user_privilege.rb +53 -54
- data/lib/chef/resource/windows_workgroup.rb +3 -3
- data/lib/chef/resource/yum_package.rb +2 -2
- data/lib/chef/resources.rb +3 -1
- data/lib/chef/run_context.rb +2 -2
- data/lib/chef/run_context/cookbook_compiler.rb +1 -1
- data/lib/chef/run_lock.rb +2 -2
- data/lib/chef/search/query.rb +4 -5
- data/lib/chef/shell.rb +31 -26
- data/lib/chef/shell/ext.rb +11 -11
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/train_transport.rb +5 -104
- data/lib/chef/util/diff.rb +3 -3
- data/lib/chef/util/powershell/cmdlet.rb +3 -1
- data/lib/chef/util/powershell/ps_credential.rb +18 -14
- data/lib/chef/util/threaded_job_queue.rb +0 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/crypto.rb +1 -1
- data/lib/chef/win32/registry.rb +1 -2
- data/spec/data/shef-config.rb +1 -1
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +6 -5
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/aixinit_service_spec.rb +1 -1
- data/spec/functional/resource/insserv_spec.rb +1 -1
- data/spec/functional/resource/user/dscl_spec.rb +1 -1
- data/spec/functional/resource/user/mac_user_spec.rb +1 -1
- data/spec/functional/resource/windows_task_spec.rb +13 -13
- data/spec/functional/version_spec.rb +3 -3
- data/spec/integration/client/client_spec.rb +4 -4
- data/spec/integration/client/exit_code_spec.rb +3 -2
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/knife/{config_list_profiles_spec.rb → config_list_spec.rb} +30 -29
- data/spec/integration/knife/{config_get_spec.rb → config_show_spec.rb} +3 -3
- data/spec/integration/knife/{config_use_profile_spec.rb → config_use_spec.rb} +53 -10
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
- data/spec/integration/ohai/ohai_spec.rb +61 -0
- data/spec/integration/recipes/remote_directory.rb +1 -1
- data/spec/integration/solo/solo_spec.rb +5 -5
- data/spec/spec_helper.rb +6 -3
- data/spec/stress/win32/file_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +2 -2
- data/spec/support/matchers/leak.rb +2 -2
- data/spec/support/platform_helpers.rb +16 -34
- data/spec/support/shared/functional/securable_resource.rb +108 -27
- data/spec/support/shared/functional/win32_service.rb +1 -1
- data/spec/support/shared/unit/application_dot_d.rb +5 -3
- data/spec/tiny_server.rb +0 -1
- data/spec/unit/application/client_spec.rb +2 -2
- data/spec/unit/application/exit_code_spec.rb +10 -0
- data/spec/unit/application_spec.rb +4 -6
- data/spec/unit/chef_fs/parallelizer_spec.rb +5 -1
- data/spec/unit/chef_fs/path_util_spec.rb +1 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +2 -2
- data/spec/unit/cookbook_spec.rb +2 -2
- data/spec/unit/data_collector/config_validation_spec.rb +208 -0
- data/spec/unit/data_collector_spec.rb +0 -113
- data/spec/unit/dsl/declare_resource_spec.rb +1 -1
- data/spec/unit/file_access_control_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +6 -6
- data/spec/unit/knife/core/ui_spec.rb +1 -0
- data/spec/unit/knife/ssh_spec.rb +2 -2
- data/spec/unit/lwrp_spec.rb +3 -3
- data/spec/unit/mixin/deep_merge_spec.rb +15 -0
- data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +2 -2
- data/spec/unit/node/immutable_collections_spec.rb +2 -2
- data/spec/unit/provider/mount/linux_spec.rb +97 -0
- data/spec/unit/provider/package/chocolatey_spec.rb +1 -1
- data/spec/unit/provider/package/powershell_spec.rb +1 -1
- data/spec/unit/provider/package/rubygems_spec.rb +4 -1
- data/spec/unit/provider/route_spec.rb +0 -2
- data/spec/unit/recipe_spec.rb +1 -1
- data/spec/unit/resource/chef_client_cron_spec.rb +35 -14
- data/spec/unit/resource/chef_client_launchd_spec.rb +127 -0
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +36 -1
- data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +54 -0
- data/spec/unit/resource/launchd_spec.rb +8 -0
- data/spec/unit/resource/osx_profile_spec.rb +67 -1
- data/spec/unit/resource/rhsm_register_spec.rb +56 -18
- data/spec/unit/resource/windows_uac_spec.rb +1 -1
- data/spec/unit/resource/windows_user_privilege_spec.rb +55 -0
- data/spec/unit/run_lock_spec.rb +5 -1
- data/spec/unit/runner_spec.rb +1 -2
- data/spec/unit/shell/shell_ext_spec.rb +46 -3
- data/spec/unit/shell/shell_session_spec.rb +35 -64
- data/spec/unit/shell_spec.rb +16 -19
- data/spec/unit/train_transport_spec.rb +14 -13
- data/spec/unit/util/selinux_spec.rb +2 -0
- data/tasks/rspec.rb +0 -2
- metadata +41 -17
- data/lib/chef/dist.rb +0 -68
- data/spec/integration/knife/config_get_profile_spec.rb +0 -114
|
@@ -18,110 +18,21 @@
|
|
|
18
18
|
#
|
|
19
19
|
|
|
20
20
|
require_relative "../knife"
|
|
21
|
+
require_relative "./config_show"
|
|
21
22
|
|
|
22
23
|
class Chef
|
|
23
24
|
class Knife
|
|
24
|
-
class ConfigGet <
|
|
25
|
-
banner "knife config get [OPTION...] (options)\nDisplays the value of Chef::Config[OPTION] (or all config values)"
|
|
25
|
+
class ConfigGet < ConfigShow
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
long: "--all",
|
|
30
|
-
description: "Include options that are not set in the configuration.",
|
|
31
|
-
default: false
|
|
27
|
+
# Handle the subclassing (knife doesn't do this :()
|
|
28
|
+
dependency_loaders.concat(superclass.dependency_loaders)
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
long: "--raw",
|
|
36
|
-
description: "Display a each value with no formatting.",
|
|
37
|
-
default: false
|
|
30
|
+
banner "knife config get [OPTION...] (options)\nDisplays the value of Chef::Config[OPTION] (or all config values)"
|
|
31
|
+
category "deprecated"
|
|
38
32
|
|
|
39
33
|
def run
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# Some of this is a bit hacky since it duplicates
|
|
43
|
-
wcl = self.class.config_loader
|
|
44
|
-
if wcl.credentials_found
|
|
45
|
-
loading_from("credentials", ChefConfig::PathHelper.home(".chef", "credentials"))
|
|
46
|
-
end
|
|
47
|
-
if wcl.config_location
|
|
48
|
-
loading_from("configuration", wcl.config_location)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
if Chef::Config[:config_d_dir]
|
|
52
|
-
wcl.find_dot_d(Chef::Config[:config_d_dir]).each do |path|
|
|
53
|
-
loading_from(".d/ configuration", path)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Dump the whole config, including defaults is --all was given.
|
|
59
|
-
config_data = Chef::Config.save(config[:all])
|
|
60
|
-
# Two special cases, these are set during knife startup but we don't usually care about them.
|
|
61
|
-
unless config[:all]
|
|
62
|
-
config_data.delete(:color)
|
|
63
|
-
# Only keep these if true, false is much less important because it's the default.
|
|
64
|
-
config_data.delete(:local_mode) unless config_data[:local_mode]
|
|
65
|
-
config_data.delete(:enforce_default_paths) unless config_data[:enforce_default_paths]
|
|
66
|
-
config_data.delete(:enforce_path_sanity) unless config_data[:enforce_path_sanity]
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Extract the data to show.
|
|
70
|
-
output_data = {}
|
|
71
|
-
if @name_args.empty?
|
|
72
|
-
output_data = config_data
|
|
73
|
-
else
|
|
74
|
-
@name_args.each do |filter|
|
|
75
|
-
if filter =~ %r{^/(.*)/(i?)$}
|
|
76
|
-
# It's a regex.
|
|
77
|
-
filter_re = Regexp.new($1, $2 ? Regexp::IGNORECASE : 0)
|
|
78
|
-
config_data.each do |key, value|
|
|
79
|
-
output_data[key] = value if key.to_s&.match?(filter_re)
|
|
80
|
-
end
|
|
81
|
-
else
|
|
82
|
-
# It's a dotted path string.
|
|
83
|
-
filter_parts = filter.split(/\./)
|
|
84
|
-
extract = lambda do |memo, filter_part|
|
|
85
|
-
memo.is_a?(Hash) ? memo[filter_part.to_sym] : nil
|
|
86
|
-
end
|
|
87
|
-
# Check against both config_data and all of the data, so that even
|
|
88
|
-
# in non-all mode, if you ask for a key that isn't in the non-all
|
|
89
|
-
# data, it will check against the broader set.
|
|
90
|
-
output_data[filter] = filter_parts.inject(config_data, &extract) || filter_parts.inject(Chef::Config.save(true), &extract)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Fix up some values.
|
|
96
|
-
output_data.each do |key, value|
|
|
97
|
-
if value == STDOUT
|
|
98
|
-
output_data[key] = "STDOUT"
|
|
99
|
-
elsif value == STDERR
|
|
100
|
-
output_data[key] = "STDERR"
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Show the data.
|
|
105
|
-
if config[:raw]
|
|
106
|
-
output_data.each_value do |value|
|
|
107
|
-
ui.msg(value)
|
|
108
|
-
end
|
|
109
|
-
else
|
|
110
|
-
ui.output(output_data)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
private
|
|
115
|
-
|
|
116
|
-
# Display a banner about loading from a config file.
|
|
117
|
-
#
|
|
118
|
-
# @api private
|
|
119
|
-
# @param type_of_file [String] Description of the file for the banner.
|
|
120
|
-
# @param path [String] Path of the file.
|
|
121
|
-
# @return [nil]
|
|
122
|
-
def loading_from(type_of_file, path)
|
|
123
|
-
path = Pathname.new(path).realpath
|
|
124
|
-
ui.msg(ui.color("Loading from #{type_of_file} file #{path}", :yellow))
|
|
34
|
+
Chef::Log.warn("knife config get has been deprecated in favor of knife config show. This will be removed in the major release version!")
|
|
35
|
+
super
|
|
125
36
|
end
|
|
126
37
|
end
|
|
127
38
|
end
|
|
@@ -16,22 +16,22 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require_relative "../knife"
|
|
19
|
+
require_relative "./config_use"
|
|
19
20
|
|
|
20
21
|
class Chef
|
|
21
22
|
class Knife
|
|
22
|
-
class ConfigGetProfile <
|
|
23
|
-
banner "knife config get-profile"
|
|
23
|
+
class ConfigGetProfile < ConfigUse
|
|
24
24
|
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
# Handle the subclassing (knife doesn't do this :()
|
|
26
|
+
dependency_loaders.concat(superclass.dependency_loaders)
|
|
27
|
+
|
|
28
|
+
banner "knife config get-profile"
|
|
29
|
+
category "deprecated"
|
|
30
30
|
|
|
31
31
|
def run
|
|
32
|
-
|
|
32
|
+
Chef::Log.warn("knife config get-profiles has been deprecated in favor of knife config use. This will be removed in the major release version!")
|
|
33
|
+
super
|
|
33
34
|
end
|
|
34
|
-
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2018, Noah Kantrowitz
|
|
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
|
+
require_relative "../knife"
|
|
19
|
+
|
|
20
|
+
class Chef
|
|
21
|
+
class Knife
|
|
22
|
+
class ConfigList < Knife
|
|
23
|
+
banner "knife config list (options)"
|
|
24
|
+
|
|
25
|
+
TABLE_HEADER ||= [" Profile", "Client", "Key", "Server"].freeze
|
|
26
|
+
|
|
27
|
+
deps do
|
|
28
|
+
require_relative "../workstation_config_loader"
|
|
29
|
+
require "tty-screen" unless defined?(TTY::Screen)
|
|
30
|
+
require "tty-table" unless defined?(TTY::Table)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
option :ignore_knife_rb,
|
|
34
|
+
short: "-i",
|
|
35
|
+
long: "--ignore-knife-rb",
|
|
36
|
+
description: "Ignore the current config.rb/knife.rb configuration.",
|
|
37
|
+
default: false
|
|
38
|
+
|
|
39
|
+
def configure_chef
|
|
40
|
+
apply_computed_config
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def run
|
|
44
|
+
credentials_data = self.class.config_loader.parse_credentials_file
|
|
45
|
+
if credentials_data.nil? || credentials_data.empty?
|
|
46
|
+
# Should this just show the ambient knife.rb config as "default" instead?
|
|
47
|
+
ui.fatal("No profiles found, #{self.class.config_loader.credentials_file_path} does not exist or is empty")
|
|
48
|
+
exit 1
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
current_profile = self.class.config_loader.credentials_profile(config[:profile])
|
|
52
|
+
profiles = credentials_data.keys.map do |profile|
|
|
53
|
+
if config[:ignore_knife_rb]
|
|
54
|
+
# Don't do any fancy loading nonsense, just the raw data.
|
|
55
|
+
profile_data = credentials_data[profile]
|
|
56
|
+
{
|
|
57
|
+
profile: profile,
|
|
58
|
+
active: profile == current_profile,
|
|
59
|
+
client_name: profile_data["client_name"] || profile_data["node_name"],
|
|
60
|
+
client_key: profile_data["client_key"],
|
|
61
|
+
server_url: profile_data["chef_server_url"],
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
# Fancy loading nonsense so we get what the actual config would be.
|
|
65
|
+
# Note that this modifies the global config, after this, all bets are
|
|
66
|
+
# off as to whats in the config.
|
|
67
|
+
Chef::Config.reset
|
|
68
|
+
wcl = Chef::WorkstationConfigLoader.new(nil, Chef::Log, profile: profile)
|
|
69
|
+
wcl.load
|
|
70
|
+
{
|
|
71
|
+
profile: profile,
|
|
72
|
+
active: profile == current_profile,
|
|
73
|
+
client_name: Chef::Config[:node_name],
|
|
74
|
+
client_key: Chef::Config[:client_key],
|
|
75
|
+
server_url: Chef::Config[:chef_server_url],
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Try to reset the config.
|
|
81
|
+
unless config[:ignore_knife_rb]
|
|
82
|
+
Chef::Config.reset
|
|
83
|
+
apply_computed_config
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if ui.interchange?
|
|
87
|
+
# Machine-readable output.
|
|
88
|
+
ui.output(profiles)
|
|
89
|
+
else
|
|
90
|
+
# Table output.
|
|
91
|
+
ui.output(render_table(profiles))
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def render_table(profiles, padding: 1)
|
|
98
|
+
rows = []
|
|
99
|
+
# Render the data to a 2D array that will be used for the table.
|
|
100
|
+
profiles.each do |profile|
|
|
101
|
+
# Replace the home dir in the client key path with ~.
|
|
102
|
+
profile[:client_key] = profile[:client_key].to_s.gsub(/^#{Regexp.escape(Dir.home)}/, "~") if profile[:client_key]
|
|
103
|
+
profile[:profile] = "#{profile[:active] ? "*" : " "}#{profile[:profile]}"
|
|
104
|
+
rows << profile.values_at(:profile, :client_name, :client_key, :server_url)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
table = TTY::Table.new(header: TABLE_HEADER, rows: rows)
|
|
108
|
+
|
|
109
|
+
# Rotate the table to vertical if the screen width is less than table width.
|
|
110
|
+
if table.width > TTY::Screen.width
|
|
111
|
+
table.orientation = :vertical
|
|
112
|
+
table.rotate
|
|
113
|
+
# Add a new line after each profile record.
|
|
114
|
+
table.render do |renderer|
|
|
115
|
+
renderer.border do
|
|
116
|
+
separator ->(row) { (row + 1) % TABLE_HEADER.size == 0 }
|
|
117
|
+
end
|
|
118
|
+
# Remove the leading space added of the first column.
|
|
119
|
+
renderer.filter = Proc.new do |val, row_index, col_index|
|
|
120
|
+
if col_index == 1 || (row_index) % TABLE_HEADER.size == 0
|
|
121
|
+
val.strip
|
|
122
|
+
else
|
|
123
|
+
val
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
else
|
|
128
|
+
table.render do |renderer|
|
|
129
|
+
renderer.border do
|
|
130
|
+
mid "-"
|
|
131
|
+
end
|
|
132
|
+
renderer.padding = [0, padding, 0, 0] # pad right with 2 characters
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -16,112 +16,22 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require_relative "../knife"
|
|
19
|
+
require_relative "./config_list"
|
|
19
20
|
|
|
20
21
|
class Chef
|
|
21
22
|
class Knife
|
|
22
|
-
class ConfigListProfiles <
|
|
23
|
-
banner "knife config list-profiles (options)"
|
|
24
|
-
|
|
25
|
-
deps do
|
|
26
|
-
require_relative "../workstation_config_loader"
|
|
27
|
-
end
|
|
23
|
+
class ConfigListProfiles < ConfigList
|
|
28
24
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
long: "--ignore-knife-rb",
|
|
32
|
-
description: "Ignore the current config.rb/knife.rb configuration.",
|
|
33
|
-
default: false
|
|
25
|
+
# Handle the subclassing (knife doesn't do this :()
|
|
26
|
+
dependency_loaders.concat(superclass.dependency_loaders)
|
|
34
27
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
end
|
|
28
|
+
banner "knife config list-profiles (options)"
|
|
29
|
+
category "deprecated"
|
|
38
30
|
|
|
39
31
|
def run
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# Should this just show the ambient knife.rb config as "default" instead?
|
|
43
|
-
ui.fatal("No profiles found, #{self.class.config_loader.credentials_file_path} does not exist or is empty")
|
|
44
|
-
exit 1
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
current_profile = self.class.config_loader.credentials_profile(config[:profile])
|
|
48
|
-
profiles = credentials_data.keys.map do |profile|
|
|
49
|
-
if config[:ignore_knife_rb]
|
|
50
|
-
# Don't do any fancy loading nonsense, just the raw data.
|
|
51
|
-
profile_data = credentials_data[profile]
|
|
52
|
-
{
|
|
53
|
-
profile: profile,
|
|
54
|
-
active: profile == current_profile,
|
|
55
|
-
client_name: profile_data["client_name"] || profile_data["node_name"],
|
|
56
|
-
client_key: profile_data["client_key"],
|
|
57
|
-
server_url: profile_data["chef_server_url"],
|
|
58
|
-
}
|
|
59
|
-
else
|
|
60
|
-
# Fancy loading nonsense so we get what the actual config would be.
|
|
61
|
-
# Note that this modifies the global config, after this, all bets are
|
|
62
|
-
# off as to whats in the config.
|
|
63
|
-
Chef::Config.reset
|
|
64
|
-
wcl = Chef::WorkstationConfigLoader.new(nil, Chef::Log, profile: profile)
|
|
65
|
-
wcl.load
|
|
66
|
-
{
|
|
67
|
-
profile: profile,
|
|
68
|
-
active: profile == current_profile,
|
|
69
|
-
client_name: Chef::Config[:node_name],
|
|
70
|
-
client_key: Chef::Config[:client_key],
|
|
71
|
-
server_url: Chef::Config[:chef_server_url],
|
|
72
|
-
}
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Try to reset the config.
|
|
77
|
-
unless config[:ignore_knife_rb]
|
|
78
|
-
Chef::Config.reset
|
|
79
|
-
apply_computed_config
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
if ui.interchange?
|
|
83
|
-
# Machine-readable output.
|
|
84
|
-
ui.output(profiles)
|
|
85
|
-
else
|
|
86
|
-
# Table output.
|
|
87
|
-
ui.output(render_table(profiles))
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
private
|
|
92
|
-
|
|
93
|
-
def render_table(profiles, padding: 2)
|
|
94
|
-
# Replace the home dir in the client key path with ~.
|
|
95
|
-
profiles.each do |profile|
|
|
96
|
-
profile[:client_key] = profile[:client_key].to_s.gsub(/^#{Regexp.escape(Dir.home)}/, "~") if profile[:client_key]
|
|
97
|
-
end
|
|
98
|
-
# Render the data to a 2D array that will be used for the table.
|
|
99
|
-
table_data = [["", "Profile", "Client", "Key", "Server"]] + profiles.map do |profile|
|
|
100
|
-
[profile[:active] ? "*" : ""] + profile.values_at(:profile, :client_name, :client_key, :server_url).map(&:to_s)
|
|
101
|
-
end
|
|
102
|
-
# Compute column widths.
|
|
103
|
-
column_widths = Array.new(table_data.first.length) do |i|
|
|
104
|
-
table_data.map { |row| row[i].length + padding }.max
|
|
105
|
-
end
|
|
106
|
-
# Special case, the first col gets no padding (because indicator) and last
|
|
107
|
-
# get no padding because last.
|
|
108
|
-
column_widths[0] -= padding
|
|
109
|
-
column_widths[-1] -= padding
|
|
110
|
-
# Build the format string for each row.
|
|
111
|
-
format_string = column_widths.map { |w| "%-#{w}.#{w}s" }.join("")
|
|
112
|
-
format_string << "\n"
|
|
113
|
-
# Print the header row and a separator.
|
|
114
|
-
table = ui.color(format_string % table_data.first, :green)
|
|
115
|
-
table << "-" * column_widths.sum
|
|
116
|
-
table << "\n"
|
|
117
|
-
# Print the rest of the table.
|
|
118
|
-
table_data.drop(1).each do |row|
|
|
119
|
-
table << format_string % row
|
|
120
|
-
end
|
|
121
|
-
# Trim the last newline because ui.output adds one.
|
|
122
|
-
table.chomp!
|
|
32
|
+
Chef::Log.warn("knife config list-profiles has been deprecated in favor of knife config list. This will be removed in the major release version!")
|
|
33
|
+
super
|
|
123
34
|
end
|
|
124
|
-
|
|
125
35
|
end
|
|
126
36
|
end
|
|
127
37
|
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Vivek Singh (<vsingh@chef.io>)
|
|
3
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require_relative "../knife"
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
class Knife
|
|
23
|
+
class ConfigShow < Knife
|
|
24
|
+
banner "knife config show [OPTION...] (options)\nDisplays the value of Chef::Config[OPTION] (or all config values)"
|
|
25
|
+
|
|
26
|
+
option :all,
|
|
27
|
+
short: "-a",
|
|
28
|
+
long: "--all",
|
|
29
|
+
description: "Include options that are not set in the configuration.",
|
|
30
|
+
default: false
|
|
31
|
+
|
|
32
|
+
option :raw,
|
|
33
|
+
short: "-r",
|
|
34
|
+
long: "--raw",
|
|
35
|
+
description: "Display a each value with no formatting.",
|
|
36
|
+
default: false
|
|
37
|
+
|
|
38
|
+
def run
|
|
39
|
+
if config[:format] == "summary" && !config[:raw]
|
|
40
|
+
# If using the default, human-readable output, also show which config files are being loaded.
|
|
41
|
+
# Some of this is a bit hacky since it duplicates
|
|
42
|
+
wcl = self.class.config_loader
|
|
43
|
+
if wcl.credentials_found
|
|
44
|
+
loading_from("credentials", ChefConfig::PathHelper.home(".chef", "credentials"))
|
|
45
|
+
end
|
|
46
|
+
if wcl.config_location
|
|
47
|
+
loading_from("configuration", wcl.config_location)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if Chef::Config[:config_d_dir]
|
|
51
|
+
wcl.find_dot_d(Chef::Config[:config_d_dir]).each do |path|
|
|
52
|
+
loading_from(".d/ configuration", path)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Dump the whole config, including defaults is --all was given.
|
|
58
|
+
config_data = Chef::Config.save(config[:all])
|
|
59
|
+
# Two special cases, these are set during knife startup but we don't usually care about them.
|
|
60
|
+
unless config[:all]
|
|
61
|
+
config_data.delete(:color)
|
|
62
|
+
# Only keep these if true, false is much less important because it's the default.
|
|
63
|
+
config_data.delete(:local_mode) unless config_data[:local_mode]
|
|
64
|
+
config_data.delete(:enforce_default_paths) unless config_data[:enforce_default_paths]
|
|
65
|
+
config_data.delete(:enforce_path_sanity) unless config_data[:enforce_path_sanity]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Extract the data to show.
|
|
69
|
+
output_data = {}
|
|
70
|
+
if @name_args.empty?
|
|
71
|
+
output_data = config_data
|
|
72
|
+
else
|
|
73
|
+
@name_args.each do |filter|
|
|
74
|
+
if filter =~ %r{^/(.*)/(i?)$}
|
|
75
|
+
# It's a regex.
|
|
76
|
+
filter_re = Regexp.new($1, $2 ? Regexp::IGNORECASE : 0)
|
|
77
|
+
config_data.each do |key, value|
|
|
78
|
+
output_data[key] = value if key.to_s&.match?(filter_re)
|
|
79
|
+
end
|
|
80
|
+
else
|
|
81
|
+
# It's a dotted path string.
|
|
82
|
+
filter_parts = filter.split(/\./)
|
|
83
|
+
extract = lambda do |memo, filter_part|
|
|
84
|
+
memo.is_a?(Hash) ? memo[filter_part.to_sym] : nil
|
|
85
|
+
end
|
|
86
|
+
# Check against both config_data and all of the data, so that even
|
|
87
|
+
# in non-all mode, if you ask for a key that isn't in the non-all
|
|
88
|
+
# data, it will check against the broader set.
|
|
89
|
+
output_data[filter] = filter_parts.inject(config_data, &extract) || filter_parts.inject(Chef::Config.save(true), &extract)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Fix up some values.
|
|
95
|
+
output_data.each do |key, value|
|
|
96
|
+
if value == STDOUT
|
|
97
|
+
output_data[key] = "STDOUT"
|
|
98
|
+
elsif value == STDERR
|
|
99
|
+
output_data[key] = "STDERR"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Show the data.
|
|
104
|
+
if config[:raw]
|
|
105
|
+
output_data.each_value do |value|
|
|
106
|
+
ui.msg(value)
|
|
107
|
+
end
|
|
108
|
+
else
|
|
109
|
+
ui.output(output_data)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
# Display a banner about loading from a config file.
|
|
116
|
+
#
|
|
117
|
+
# @api private
|
|
118
|
+
# @param type_of_file [String] Description of the file for the banner.
|
|
119
|
+
# @param path [String] Path of the file.
|
|
120
|
+
# @return [nil]
|
|
121
|
+
def loading_from(type_of_file, path)
|
|
122
|
+
path = Pathname.new(path).realpath
|
|
123
|
+
ui.msg(ui.color("Loading from #{type_of_file} file #{path}", :yellow))
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|