class WinRM::PSRP::ReceiveResponseReader
Class for reading powershell responses in Receive_Response messages
Public Class Methods
Creates a new ReceiveResponseReader @param transport [HttpTransport] The WinRM SOAP transport @param logger [Logger] The logger to log diagnostic messages to
# File lib/winrm/psrp/receive_response_reader.rb, line 26 def initialize(transport, logger) super @output_decoder = PowershellOutputDecoder.new end
Public Instance Methods
Reads PSRP messages sent in one or more receive response messages @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint @param wait_for_done_state whether to poll for a CommandState of Done @yield [Message] PSRP Message in response @yieldreturn [Array<Message>] All messages in response
# File lib/winrm/psrp/receive_response_reader.rb, line 36 def read_message(wsmv_message, wait_for_done_state = false) messages = [] defragmenter = MessageDefragmenter.new read_response(wsmv_message, wait_for_done_state) do |stream| message = defragmenter.defragment(stream[:text]) next unless message if block_given? yield message else messages.push(message) end end messages unless block_given? end
Reads streams and returns decoded output @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint @yieldparam [string] standard out response text @yieldparam [string] standard error response text @yieldreturn [WinRM::Output] The command output
# File lib/winrm/psrp/receive_response_reader.rb, line 57 def read_output(wsmv_message) with_output do |output| read_message(wsmv_message, true) do |message| exit_code = find_exit_code(message) output.exitcode = exit_code if exit_code decoded_text = @output_decoder.decode(message) next unless decoded_text out = { stream_type(message) => decoded_text } output << out yield [out[:stdout], out[:stderr]] if block_given? end end end
Private Instance Methods
# File lib/winrm/psrp/receive_response_reader.rb, line 87 def find_exit_code(message) parsed = message.parsed_data return nil unless parsed.is_a?(MessageData::PipelineHostCall) parsed.method_parameters[:i32].to_i if parsed.method_identifier == 'SetShouldExit' end
# File lib/winrm/psrp/receive_response_reader.rb, line 74 def stream_type(message) type = :stdout case message.type when WinRM::PSRP::Message::MESSAGE_TYPES[:error_record] type = :stderr when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_host_call] type = :stderr if message.data.include?('WriteError') when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_state] type = :stderr if message.parsed_data.pipeline_state == WinRM::PSRP::MessageData::PipelineState::FAILED end type end