class Chef::Provider::WindowsScript

Attributes

script_file_path[RW]

Public Instance Methods

script_extension() click to toggle source
# File lib/chef/provider/windows_script.rb, line 132
def script_extension
  raise Chef::Exceptions::Override, "You must override #{__method__} in #{self}"
end

Protected Instance Methods

basepath() click to toggle source
# File lib/chef/provider/windows_script.rb, line 42
def basepath
  if forced_32bit_override_required?(run_context.node, target_architecture)
    wow64_directory
  else
    run_context.node["kernel"]["os_info"]["system_directory"]
  end
end
command() click to toggle source
# File lib/chef/provider/windows_script.rb, line 68
def command
  "\"#{interpreter}\" #{flags} \"#{script_file_path}\""
end
grant_alternate_user_read_access(file_path) click to toggle source
# File lib/chef/provider/windows_script.rb, line 72
def grant_alternate_user_read_access(file_path)
  # Do nothing if an alternate user isn't specified -- the file
  # will already have the correct permissions for the user as part
  # of the default ACL behavior on Windows.
  return if new_resource.user.nil?

  # Duplicate the script file's existing DACL
  # so we can add an ACE later
  securable_object = Chef::ReservedNames::Win32::Security::SecurableObject.new(file_path)
  aces = securable_object.security_descriptor.dacl.reduce([]) { |result, current| result.push(current) }

  username = new_resource.user

  if new_resource.domain
    username = new_resource.domain + "\\" + new_resource.user
  end

  # Create an ACE that allows the alternate user read access to the script
  # file so it can be read and executed.
  user_sid = Chef::ReservedNames::Win32::Security::SID.from_account(username)
  read_ace = Chef::ReservedNames::Win32::Security::ACE.access_allowed(user_sid, Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE, 0)
  aces.push(read_ace)
  acl = Chef::ReservedNames::Win32::Security::ACL.create(aces)

  # This actually applies the modified DACL to the file
  # Use parentheses to bypass RuboCop / ChefStyle warning
  # about useless setter
  (securable_object.dacl = acl)
end
input() click to toggle source
# File lib/chef/provider/windows_script.rb, line 118
def input
  nil
end
target_architecture() click to toggle source
# File lib/chef/provider/windows_script.rb, line 34
def target_architecture
  @target_architecture ||= if new_resource.architecture.nil?
                             node_windows_architecture(run_context.node)
                           else
                             new_resource.architecture
                           end
end
with_temp_script_file() { || ... } click to toggle source
# File lib/chef/provider/windows_script.rb, line 102
def with_temp_script_file
  Tempfile.open(["chef-script", script_extension]) do |script_file|
    script_file.puts(code)
    script_file.close

    grant_alternate_user_read_access(script_file.path)

    # This needs to be set here so that the call to #command in Execute works.
    self.script_file_path = script_file.path

    yield

    self.script_file_path = nil
  end
end
with_wow64_redirection_disabled() { || ... } click to toggle source
# File lib/chef/provider/windows_script.rb, line 50
def with_wow64_redirection_disabled
  wow64_redirection_state = nil

  if wow64_architecture_override_required?(run_context.node, target_architecture)
    wow64_redirection_state = disable_wow64_file_redirection(run_context.node)
  end

  begin
    yield
  rescue
    raise
  ensure
    unless wow64_redirection_state.nil?
      restore_wow64_file_redirection(run_context.node, wow64_redirection_state)
    end
  end
end