summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2020-07-21 17:39:32 -0700
committerLamont Granquist <lamont@scriptkiddie.org>2020-07-21 17:39:32 -0700
commit2227059987a81e87763ecca25f3e63519d659e6e (patch)
treeea163cb822177520f4e8ea243e88c0a9219de6c0 /lib
parent6d1ce408e055a4904b9a875c47b0b2a0b21a977c (diff)
downloadchef-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.rb7
-rw-r--r--lib/chef/mixin/shell_out.rb193
-rw-r--r--lib/chef/mixin/which.rb8
-rw-r--r--lib/chef/platform/service_helpers.rb71
-rw-r--r--lib/chef/provider/service.rb4
-rw-r--r--lib/chef/resource/service.rb4
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