diff options
Diffstat (limited to 'lib/chef/util/powershell/cmdlet.rb')
-rw-r--r-- | lib/chef/util/powershell/cmdlet.rb | 228 |
1 files changed, 114 insertions, 114 deletions
diff --git a/lib/chef/util/powershell/cmdlet.rb b/lib/chef/util/powershell/cmdlet.rb index d9b53f6c7c..6ab380c071 100644 --- a/lib/chef/util/powershell/cmdlet.rb +++ b/lib/chef/util/powershell/cmdlet.rb @@ -21,150 +21,150 @@ require "chef/mixin/windows_architecture_helper" require "chef/util/powershell/cmdlet_result" class Chef -class Util -class Powershell - class Cmdlet - 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 - - attr_reader :output_format + class Util + class Powershell + class Cmdlet + 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 - def run(switches={}, execution_options={}, *arguments) - streams = { :json => CmdletStream.new("json"), - :verbose => CmdletStream.new("verbose"), - } + @cmdlet = cmdlet + @output_format_options = output_format_options + end - arguments_string = arguments.join(" ") + attr_reader :output_format - switches_string = command_switches_string(switches) + def run(switches = {}, execution_options = {}, *arguments) + streams = { :json => CmdletStream.new("json"), + :verbose => CmdletStream.new("verbose"), + } - json_depth = 5 + arguments_string = arguments.join(" ") - if @json_format && @output_format_options.has_key?(:depth) - json_depth = @output_format_options[:depth] - end + switches_string = command_switches_string(switches) - json_command = @json_format ? " | convertto-json -compress -depth #{json_depth} "\ - "> #{streams[:json].path}" : "" - 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 }" + json_depth = 5 - augmented_options = {:returns => [0], :live_stream => false}.merge(execution_options) - command = Mixlib::ShellOut.new(command_string, augmented_options) + if @json_format && @output_format_options.has_key?(:depth) + json_depth = @output_format_options[:depth] + end - status = nil + json_command = @json_format ? " | convertto-json -compress -depth #{json_depth} "\ + "> #{streams[:json].path}" : "" + 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 }" - with_os_architecture(@node) do - status = command.run_command - end + augmented_options = { :returns => [0], :live_stream => false }.merge(execution_options) + command = Mixlib::ShellOut.new(command_string, augmented_options) - CmdletResult.new(status, streams, @output_format) - end + status = nil - def run!(switches={}, execution_options={}, *arguments) - result = run(switches, execution_options, arguments) + with_os_architecture(@node) do + status = command.run_command + end - if ! result.succeeded? - raise Chef::Exceptions::PowershellCmdletException, "Powershell Cmdlet failed: #{result.stderr}" - end + CmdletResult.new(status, streams, @output_format) + end - result - end + def run!(switches = {}, execution_options = {}, *arguments) + result = run(switches, execution_options, arguments) - protected + if ! result.succeeded? + raise Chef::Exceptions::PowershellCmdletException, "Powershell Cmdlet failed: #{result.stderr}" + end - include Chef::Mixin::WindowsArchitectureHelper + result + end - 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 + protected - def escape_parameter_value(parameter_value) - parameter_value.gsub(/(`|'|"|#)/,'`\1') - end + include Chef::Mixin::WindowsArchitectureHelper - def escape_string_parameter_value(parameter_value) - "'#{escape_parameter_value(parameter_value)}'" - end + 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 - 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'" + def escape_parameter_value(parameter_value) + parameter_value.gsub(/(`|'|"|#)/, '`\1') 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`" + def escape_string_parameter_value(parameter_value) + "'#{escape_parameter_value(parameter_value)}'" end - switch_present ? ["-#{switch_name.to_s.downcase}", switch_argument].join(" ").strip : "" - end + 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 + command_switches.join(" ") + end - class CmdletStream - def initialize(name) - @filename = Dir::Tmpname.create(name) {} - ObjectSpace.define_finalizer(self, self.class.destroy(@filename)) - end + class CmdletStream + def initialize(name) + @filename = Dir::Tmpname.create(name) {} + ObjectSpace.define_finalizer(self, self.class.destroy(@filename)) + end - def path - @filename - end + def path + @filename + end - def read - if File.exist? @filename - File.open(@filename, "rb:bom|UTF-16LE") do |f| - f.read.encode("UTF-8") + def read + if File.exist? @filename + File.open(@filename, "rb:bom|UTF-16LE") do |f| + f.read.encode("UTF-8") + end + end end - end - end - def self.destroy(name) - proc { File.delete(name) if File.exists? name } + def self.destroy(name) + proc { File.delete(name) if File.exists? name } + end + end end end end end -end -end |