class Chef::Util::Powershell::Cmdlet

Attributes

output_format[R]

Public Class Methods

new(node, cmdlet, output_format = nil, output_format_options = {}) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 27
def initialize(node, cmdlet, output_format = nil, output_format_options = {})
  @output_format = output_format
  @node = node

  case output_format
  when nil
    @json_format = false
  when :json
    @json_format = true
  when :text
    @json_format = false
  when :object
    @json_format = true
  else
    raise ArgumentError, "Invalid output format #{output_format} specified"
  end

  @cmdlet = cmdlet
  @output_format_options = output_format_options
end

Public Instance Methods

run(switches = {}, execution_options = {}, *arguments) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 50
def run(switches = {}, execution_options = {}, *arguments)
  streams = { :json => CmdletStream.new("json"),
              :verbose => CmdletStream.new("verbose"),
            }

  arguments_string = arguments.join(" ")

  switches_string = command_switches_string(switches)

  json_depth = 5

  if @json_format && @output_format_options.has_key?(:depth)
    json_depth = @output_format_options[:depth]
  end

  json_command = if @json_format
                   " | convertto-json -compress -depth #{json_depth} > #{streams[:json].path}"
                 else
                   ""
                 end
  redirections = "4> '#{streams[:verbose].path}'"
  command_string = "powershell.exe -executionpolicy bypass -noprofile -noninteractive "\
                   "-command \"trap [Exception] {write-error -exception "\
                   "($_.Exception.Message);exit 1};#{@cmdlet} #{switches_string} "\
                   "#{arguments_string} #{redirections}"\
                   "#{json_command}\";if ( ! $? ) { exit 1 }"

  augmented_options = { :returns => [0], :live_stream => false }.merge(execution_options)
  command = Mixlib::ShellOut.new(command_string, augmented_options)

  status = nil

  with_os_architecture(@node) do
    status = command.run_command
  end

  CmdletResult.new(status, streams, @output_format)
end
run!(switches = {}, execution_options = {}, *arguments) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 89
def run!(switches = {}, execution_options = {}, *arguments)
  result = run(switches, execution_options, arguments)

  if ! result.succeeded?
    raise Chef::Exceptions::PowershellCmdletException, "Powershell Cmdlet failed: #{result.stderr}"
  end

  result
end

Protected Instance Methods

command_switches_string(switches) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 117
def command_switches_string(switches)
  command_switches = switches.map do |switch_name, switch_value|
    if switch_name.class != Symbol
      raise ArgumentError, "Invalid type `#{switch_name} `for PowerShell switch '#{switch_name}'. The switch must be specified as a Symbol'"
    end

    validate_switch_name!(switch_name)

    switch_argument = ""
    switch_present = true

    case switch_value
    when Numeric
      switch_argument = switch_value.to_s
    when Float
      switch_argument = switch_value.to_s
    when FalseClass
      switch_present = false
    when TrueClass
    when String
      switch_argument = escape_string_parameter_value(switch_value)
    else
      raise ArgumentError, "Invalid argument type `#{switch_value.class}` specified for PowerShell switch `:#{switch_name}`. Arguments to PowerShell must be of type `String`, `Numeric`, `Float`, `FalseClass`, or `TrueClass`"
    end

    switch_present ? ["-#{switch_name.to_s.downcase}", switch_argument].join(" ").strip : ""
  end

  command_switches.join(" ")
end
escape_parameter_value(parameter_value) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 109
def escape_parameter_value(parameter_value)
  parameter_value.gsub(/(`|'|"|#)/, '`\1')
end
escape_string_parameter_value(parameter_value) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 113
def escape_string_parameter_value(parameter_value)
  "'#{escape_parameter_value(parameter_value)}'"
end
validate_switch_name!(switch_parameter_name) click to toggle source
# File lib/chef/util/powershell/cmdlet.rb, line 103
def validate_switch_name!(switch_parameter_name)
  if !!(switch_parameter_name =~ /\A[A-Za-z]+[_a-zA-Z0-9]*\Z/) == false
    raise ArgumentError, "`#{switch_parameter_name}` is not a valid PowerShell cmdlet switch parameter name"
  end
end