38 lines
1.4 KiB
Ruby
38 lines
1.4 KiB
Ruby
require 'winrm'
|
|
|
|
module Net
|
|
module MsfWinRM
|
|
# For parsing of output streams (stdout, stderr); subclassed
|
|
# so MSF can manage retry loops itself
|
|
class ReceiveResponseReader < WinRM::WSMV::ReceiveResponseReader
|
|
def send_get_output_message(message)
|
|
# Overridden without retry loop
|
|
@transport.send_request(message)
|
|
end
|
|
|
|
# Reads streams 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
|
|
# @yieldparam [Hash] Hash representation of stream with type and text
|
|
# @yieldparam [REXML::Document] Complete SOAP envelope returned to wsmv_message
|
|
# rubocop:disable Style/OptionalBooleanParameter - want to keep same signature as base class
|
|
def read_response(wsmv_message, wait_for_done_state = false)
|
|
# rubocop:enable Style/OptionalBooleanParameter
|
|
resp_doc = nil
|
|
until command_done?(resp_doc, wait_for_done_state)
|
|
logger.debug('[WinRM] Waiting for output...')
|
|
resp_doc = send_get_output_message(wsmv_message.build)
|
|
logger.debug('[WinRM] Processing output')
|
|
read_streams(resp_doc) do |stream|
|
|
yield stream, resp_doc
|
|
end
|
|
end
|
|
|
|
if command_done?(resp_doc, true)
|
|
raise EOFError, 'Program terminated'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|