diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2020-07-21 17:39:32 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2020-07-21 17:39:32 -0700 |
commit | 2227059987a81e87763ecca25f3e63519d659e6e (patch) | |
tree | ea163cb822177520f4e8ea243e88c0a9219de6c0 /lib | |
parent | 6d1ce408e055a4904b9a875c47b0b2a0b21a977c (diff) | |
download | chef-2227059987a81e87763ecca25f3e63519d659e6e.tar.gz |
just code changes, no spec modifications
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/dsl/platform_introspection.rb | 7 | ||||
-rw-r--r-- | lib/chef/mixin/shell_out.rb | 193 | ||||
-rw-r--r-- | lib/chef/mixin/which.rb | 8 | ||||
-rw-r--r-- | lib/chef/platform/service_helpers.rb | 71 | ||||
-rw-r--r-- | lib/chef/provider/service.rb | 4 | ||||
-rw-r--r-- | lib/chef/resource/service.rb | 4 |
6 files changed, 72 insertions, 215 deletions
diff --git a/lib/chef/dsl/platform_introspection.rb b/lib/chef/dsl/platform_introspection.rb index 794f807f23..4cf381c037 100644 --- a/lib/chef/dsl/platform_introspection.rb +++ b/lib/chef/dsl/platform_introspection.rb @@ -258,6 +258,13 @@ class Chef # ^^^^^^ NOTE: PLEASE DO NOT CONTINUE TO ADD THESE KINDS OF PLATFORM_VERSION APIS WITHOUT ^^^^^^^ # ^^^^^^ GOING THROUGH THE DESIGN REVIEW PROCESS AND ADDRESS THE EXISTING CHEF-SUGAR ONES ^^^^^^^ # ^^^^^^ DO "THE HARD RIGHT THING" AND ADDRESS THE BROADER PROBLEM AND FIX IT ALL. ^^^^^^^ + + private + + # dependency injection, see: ChefUtils::Internal + def __transport_connection + Chef.run_context.transport_connection + end end end end diff --git a/lib/chef/mixin/shell_out.rb b/lib/chef/mixin/shell_out.rb index 62916b06de..e136fe09ba 100644 --- a/lib/chef/mixin/shell_out.rb +++ b/lib/chef/mixin/shell_out.rb @@ -15,198 +15,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -require "mixlib/shellout" unless defined?(Mixlib::ShellOut::DEFAULT_READ_TIMEOUT) -require "chef-utils/dsl/path_sanity" unless defined?(ChefUtils::DSL::PathSanity) +require "mixlib/shellout/helper" unless defined?(Mixlib::ShellOut::Helper) +require_relative "../log" +require_relative "../config" +require_relative "../chef_class" class Chef module Mixin module ShellOut + include Mixlib::ShellOut::Helper - # PREFERRED APIS: - # - # all consumers should now call shell_out!/shell_out. - # - # the shell_out_compacted/shell_out_compacted! APIs are private but are intended for use - # in rspec tests, and should ideally always be used to make code refactoring that do not - # change behavior easier: - # - # allow(provider).to receive(:shell_out_compacted!).with("foo", "bar", "baz") - # provider.shell_out!("foo", [ "bar", nil, "baz"]) - # provider.shell_out!(["foo", nil, "bar" ], ["baz"]) - # - # note that shell_out_compacted also includes adding the magical timeout option to force - # people to setup expectations on that value explicitly. it does not include the default_env - # mangling in order to avoid users having to setup an expectation on anything other than - # setting `default_env: false` and allow us to make tweak to the default_env without breaking - # a thousand unit tests. - # - - def shell_out(*args, **options) - options = options.dup - options = Chef::Mixin::ShellOut.maybe_add_timeout(self, options) - if options.empty? - shell_out_compacted(*Chef::Mixin::ShellOut.clean_array(*args)) - else - shell_out_compacted(*Chef::Mixin::ShellOut.clean_array(*args), **options) - end - end - - def shell_out!(*args, **options) - options = options.dup - options = Chef::Mixin::ShellOut.maybe_add_timeout(self, options) - if options.empty? - shell_out_compacted!(*Chef::Mixin::ShellOut.clean_array(*args)) - else - shell_out_compacted!(*Chef::Mixin::ShellOut.clean_array(*args), **options) - end - end - - # helper sugar for resources that support passing timeouts to shell_out - # - # module method to not pollute namespaces, but that means we need self injected as an arg - # @api private - def self.maybe_add_timeout(obj, options) - options = options.dup - # historically resources have not properly declared defaults on their timeouts, so a default default of 900s was enforced here - default_val = 900 - return options if options.key?(:timeout) - - # FIXME: need to nuke descendent tracker out of Chef::Provider so we can just define that class here without requiring the - # world, and then just use symbol lookup - if obj.class.ancestors.map(&:name).include?("Chef::Provider") && obj.respond_to?(:new_resource) && obj.new_resource.respond_to?(:timeout) && !options.key?(:timeout) - options[:timeout] = obj.new_resource.timeout ? obj.new_resource.timeout.to_f : default_val - end - options - end - - # helper function to mangle options when `default_env` is true - # - # @api private - def self.apply_default_env(options) - options = options.dup - default_env = options.delete(:default_env) - default_env = true if default_env.nil? - if default_env - env_key = options.key?(:env) ? :env : :environment - options[env_key] = { - "LC_ALL" => Chef::Config[:internal_locale], - "LANGUAGE" => Chef::Config[:internal_locale], - "LANG" => Chef::Config[:internal_locale], - env_path => ChefUtils::DSL::PathSanity.sanitized_path, - }.update(options[env_key] || {}) - end - options - end - - private - - # this SHOULD be used for setting up expectations in rspec, see banner comment at top. - # - # the private constraint is meant to avoid code calling this directly, rspec expectations are fine. - # - def shell_out_compacted(*args, **options) - options = Chef::Mixin::ShellOut.apply_default_env(options) - if options.empty? - Chef::Mixin::ShellOut.shell_out_command(*args) - else - Chef::Mixin::ShellOut.shell_out_command(*args, **options) - end - end - - # this SHOULD be used for setting up expectations in rspec, see banner comment at top. - # - # the private constraint is meant to avoid code calling this directly, rspec expectations are fine. - # - def shell_out_compacted!(*args, **options) - options = Chef::Mixin::ShellOut.apply_default_env(options) - cmd = if options.empty? - Chef::Mixin::ShellOut.shell_out_command(*args) - else - Chef::Mixin::ShellOut.shell_out_command(*args, **options) - end - cmd.error! - cmd + def __config + Chef::Config end - # Helper for subclasses to reject nil out of an array. It allows - # using the array form of shell_out (which avoids the need to surround arguments with - # quote marks to deal with shells). - # - # Usage: - # shell_out!(*clean_array("useradd", universal_options, useradd_options, new_resource.username)) - # - # universal_options and useradd_options can be nil, empty array, empty string, strings or arrays - # and the result makes sense. - # - # keeping this separate from shell_out!() makes it a bit easier to write expectations against the - # shell_out args and be able to omit nils and such in the tests (and to test that the nils are - # being rejected correctly). - # - # @param args [String] variable number of string arguments - # @return [Array] array of strings with nil and null string rejection - - def self.clean_array(*args) - args.flatten.compact.map(&:to_s) - end - - def self.transport_connection - Chef.run_context.transport_connection - end - - def self.shell_out_command(*args, **options) - if Chef::Config.target_mode? - FakeShellOut.new(args, options, transport_connection.run_command(args.join(" "))) # FIXME: train should accept run_command(*args) - else - cmd = if options.empty? - Mixlib::ShellOut.new(*args) - else - Mixlib::ShellOut.new(*args, **options) - end - cmd.live_stream ||= io_for_live_stream - cmd.run_command - cmd - end - end - - def self.io_for_live_stream - if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.debug? - STDOUT - else - nil - end + def __log + Chef::Log end - def self.env_path - if ChefUtils.windows? - "Path" - else - "PATH" - end - end - - class FakeShellOut - attr_reader :stdout, :stderr, :exitstatus, :status - - def initialize(args, options, result) - @args = args - @options = options - @stdout = result.stdout - @stderr = result.stderr - @exitstatus = result.exit_status - @status = OpenStruct.new(success?: ( exitstatus == 0 )) - end - - def error? - exitstatus != 0 - end - - def error! - raise Mixlib::ShellOut::ShellCommandFailed, "Unexpected exit status of #{exitstatus} running #{@args}" if error? - end + def __transport_connection + Chef.run_context&.transport_connection end end end end - -# Break circular dep -require_relative "../config" diff --git a/lib/chef/mixin/which.rb b/lib/chef/mixin/which.rb index 1c40ffd70b..2e6fd13b68 100644 --- a/lib/chef/mixin/which.rb +++ b/lib/chef/mixin/which.rb @@ -22,6 +22,7 @@ class Chef module Mixin module Which include ChefUtils::DSL::Which + include ChefUtils::DSL::PathSanity private @@ -29,7 +30,12 @@ class Chef # # @api private def __extra_path - ChefUtils::DSL::PathSanity.sane_paths + __sane_paths + end + + # dependency injection, see: ChefUtils::Internal + def __transport_connection + Chef.run_context&.transport_connection end end end diff --git a/lib/chef/platform/service_helpers.rb b/lib/chef/platform/service_helpers.rb index ae1d2bd44b..456e679e03 100644 --- a/lib/chef/platform/service_helpers.rb +++ b/lib/chef/platform/service_helpers.rb @@ -17,38 +17,53 @@ # require_relative "../chef_class" -require "chef-utils" if defined?(ChefUtils::CANARY) +require "chef-utils" unless defined?(ChefUtils::CANARY) class Chef class Platform - # @deprecated, use ChefUtils::DSL::Service instead (via the ChefUtils Universal DSL) - class ServiceHelpers - class << self - def service_resource_providers - providers = [] - - providers << :debian if ChefUtils::DSL::Service.debianrcd? - providers << :invokercd if ChefUtils::DSL::Service.invokercd? - providers << :upstart if ChefUtils::DSL::Service.upstart? - providers << :insserv if ChefUtils::DSL::Service.insserv? - providers << :systemd if ChefUtils.systemd? - providers << :redhat if ChefUtils::DSL::Service.redhatrcd? - - providers - end - - def config_for_service(service_name) - configs = [] - - configs << :initd if ChefUtils::DSL::Service.service_script_exist?(:initd, service_name) - configs << :upstart if ChefUtils::DSL::Service.service_script_exist?(:upstart, service_name) - configs << :xinetd if ChefUtils::DSL::Service.service_script_exist?(:xinetd, service_name) - configs << :systemd if ChefUtils::DSL::Service.service_script_exist?(:systemd, service_name) - configs << :etc_rcd if ChefUtils::DSL::Service.service_script_exist?(:etc_rcd, service_name) - - configs - end + module ServiceHelpers + include ChefUtils::DSL::Service + + def service_resource_providers + providers = [] + + providers << :debian if debianrcd? + providers << :invokercd if invokercd? + providers << :upstart if upstart? + providers << :insserv if insserv? + providers << :systemd if systemd? + providers << :redhat if redhatrcd? + + providers + end + + def config_for_service(service_name) + configs = [] + + configs << :initd if service_script_exist?(:initd, service_name) + configs << :upstart if service_script_exist?(:upstart, service_name) + configs << :xinetd if service_script_exist?(:xinetd, service_name) + configs << :systemd if service_script_exist?(:systemd, service_name) + configs << :etc_rcd if service_script_exist?(:etc_rcd, service_name) + + configs end + + private + + def __config + Chef::Config + end + + def __log + Chef::Log + end + + def __transport_connection + Chef.run_context&.transport_connection + end + + extend self end end end diff --git a/lib/chef/provider/service.rb b/lib/chef/provider/service.rb index 03e878b97d..7a2d2fc86c 100644 --- a/lib/chef/provider/service.rb +++ b/lib/chef/provider/service.rb @@ -23,8 +23,8 @@ require "chef-utils" unless defined?(ChefUtils::CANARY) class Chef class Provider class Service < Chef::Provider - include ChefUtils::DSL::Service - extend ChefUtils::DSL::Service + include Chef::Platform::ServiceHelpers + extend Chef::Platform::ServiceHelpers def supports @supports ||= new_resource.supports.dup diff --git a/lib/chef/resource/service.rb b/lib/chef/resource/service.rb index 08bf6cd5bc..9a6ad20ee8 100644 --- a/lib/chef/resource/service.rb +++ b/lib/chef/resource/service.rb @@ -25,8 +25,8 @@ require_relative "../dist" class Chef class Resource class Service < Chef::Resource - include ChefUtils::DSL::Service - extend ChefUtils::DSL::Service + include Chef::Platform::ServiceHelpers + extend Chef::Platform::ServiceHelpers unified_mode true provides :service, target_mode: true |