class Chef::Resource::Execute

Attributes

is_guard_interpreter[RW]

The ResourceGuardInterpreter wraps a resource's guards in another resource. That inner resource needs to behave differently during (for example) why_run mode, so we flag it here. For why_run mode we still want to execute the guard resource even if we are not executing the wrapping resource. Only execute resources (and subclasses) can be guard interpreters.

Public Class Methods

guard_inherited_attributes(*inherited_attributes) click to toggle source
# File lib/chef/resource/execute.rb, line 109
def self.guard_inherited_attributes(*inherited_attributes)
  # Similar to patterns elsewhere, return attributes from this
  # class and superclasses as a form of inheritance
  ancestor_attributes = []

  if superclass.respond_to?(:guard_inherited_attributes)
    ancestor_attributes = superclass.guard_inherited_attributes
  end

  ancestor_attributes.concat(@class_inherited_attributes ? @class_inherited_attributes : []).uniq
end
new(name, run_context = nil) click to toggle source
Calls superclass method Chef::Resource::new
# File lib/chef/resource/execute.rb, line 42
def initialize(name, run_context = nil)
  super
  @command = name
  @backup = 5
  @default_guard_interpreter = :execute
  @is_guard_interpreter = false
end
set_guard_inherited_attributes(*inherited_attributes) click to toggle source
# File lib/chef/resource/execute.rb, line 105
def self.set_guard_inherited_attributes(*inherited_attributes)
  @class_inherited_attributes = inherited_attributes
end

Public Instance Methods

after_created() click to toggle source

post resource creation validation

@return [void]

# File lib/chef/resource/execute.rb, line 124
def after_created
  validate_identity_platform(user, password, domain, elevated)
  identity = qualify_user(user, password, domain)
  domain(identity[:domain])
  user(identity[:user])
end
qualify_user(specified_user, password = nil, specified_domain = nil) click to toggle source
# File lib/chef/resource/execute.rb, line 151
def qualify_user(specified_user, password = nil, specified_domain = nil)
  domain = specified_domain
  user = specified_user

  if specified_user.nil? && ! specified_domain.nil?
    raise ArgumentError, "The domain `#{specified_domain}` was specified, but no user name was given"
  end

  # if domain is provided in both username and domain
  if specified_user && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain
    raise ArgumentError, "The domain is provided twice. Username: `#{specified_user}`, Domain: `#{specified_domain}`. Please specify domain only once."
  end

  if ! specified_user.nil? && specified_domain.nil?
    # Splitting username of format: Domain\Username
    domain_and_user = user.split('\\')

    if domain_and_user.length == 2
      domain = domain_and_user[0]
      user = domain_and_user[1]
    elsif domain_and_user.length == 1
      # Splitting username of format: Username@Domain
      domain_and_user = user.split("@")
      if domain_and_user.length == 2
        domain = domain_and_user[1]
        user = domain_and_user[0]
      elsif domain_and_user.length != 1
        raise ArgumentError, "The specified user name `#{user}` is not a syntactically valid user name"
      end
    end
  end

  if ( password || domain ) && user.nil?
    raise ArgumentError, "A value for `password` or `domain` was specified without specification of a value for `user`"
  end

  { domain: domain, user: user }
end
validate_identity_platform(specified_user, password = nil, specified_domain = nil, elevated = false) click to toggle source
# File lib/chef/resource/execute.rb, line 131
def validate_identity_platform(specified_user, password = nil, specified_domain = nil, elevated = false)
  if node[:platform_family] == "windows"
    if specified_user && password.nil?
      raise ArgumentError, "A value for `password` must be specified when a value for `user` is specified on the Windows platform"
    end

    if elevated && !specified_user && !password
      raise ArgumentError, "`elevated` option should be passed only with `username` and `password`."
    end
  else
    if password || specified_domain
      raise Exceptions::UnsupportedPlatform, "Values for `domain` and `password` are only supported on the Windows platform"
    end

    if elevated
      raise Exceptions::UnsupportedPlatform, "Value for `elevated` is only supported on the Windows platform"
    end
  end
end