winrm 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.rubocop.yml +13 -1
- data/.travis.yml +10 -11
- data/Gemfile +2 -3
- data/README.md +1 -1
- data/Rakefile +3 -4
- data/appveyor.yml +1 -2
- data/bin/rwinrm +90 -97
- data/changelog.md +5 -0
- data/lib/winrm.rb +3 -5
- data/lib/winrm/connection.rb +84 -86
- data/lib/winrm/connection_opts.rb +90 -91
- data/lib/winrm/exceptions.rb +14 -2
- data/lib/winrm/http/response_handler.rb +127 -96
- data/lib/winrm/http/transport.rb +462 -427
- data/lib/winrm/http/transport_factory.rb +1 -5
- data/lib/winrm/output.rb +1 -2
- data/lib/winrm/psrp/fragment.rb +0 -2
- data/lib/winrm/psrp/message.rb +1 -3
- data/lib/winrm/psrp/message_data.rb +0 -2
- data/lib/winrm/psrp/message_data/base.rb +0 -2
- data/lib/winrm/psrp/message_data/error_record.rb +0 -2
- data/lib/winrm/psrp/message_data/pipeline_host_call.rb +0 -2
- data/lib/winrm/psrp/message_data/pipeline_output.rb +48 -54
- data/lib/winrm/psrp/message_data/pipeline_state.rb +0 -2
- data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +0 -2
- data/lib/winrm/psrp/message_data/runspacepool_state.rb +0 -2
- data/lib/winrm/psrp/message_data/session_capability.rb +0 -2
- data/lib/winrm/psrp/message_defragmenter.rb +2 -2
- data/lib/winrm/psrp/message_factory.rb +2 -3
- data/lib/winrm/psrp/message_fragmenter.rb +1 -3
- data/lib/winrm/psrp/powershell_output_decoder.rb +0 -2
- data/lib/winrm/psrp/receive_response_reader.rb +3 -5
- data/lib/winrm/psrp/uuid.rb +1 -2
- data/lib/winrm/shells/base.rb +6 -4
- data/lib/winrm/shells/cmd.rb +63 -65
- data/lib/winrm/shells/power_shell.rb +207 -202
- data/lib/winrm/shells/retryable.rb +44 -45
- data/lib/winrm/shells/shell_factory.rb +0 -2
- data/lib/winrm/version.rb +1 -3
- data/lib/winrm/wsmv/base.rb +0 -2
- data/lib/winrm/wsmv/cleanup_command.rb +1 -2
- data/lib/winrm/wsmv/close_shell.rb +1 -2
- data/lib/winrm/wsmv/command.rb +2 -3
- data/lib/winrm/wsmv/command_output.rb +2 -3
- data/lib/winrm/wsmv/command_output_decoder.rb +1 -2
- data/lib/winrm/wsmv/configuration.rb +0 -2
- data/lib/winrm/wsmv/create_pipeline.rb +0 -2
- data/lib/winrm/wsmv/create_shell.rb +2 -6
- data/lib/winrm/wsmv/header.rb +213 -215
- data/lib/winrm/wsmv/init_runspace_pool.rb +96 -95
- data/lib/winrm/wsmv/iso8601_duration.rb +0 -2
- data/lib/winrm/wsmv/keep_alive.rb +0 -2
- data/lib/winrm/wsmv/receive_response_reader.rb +128 -126
- data/lib/winrm/wsmv/send_data.rb +0 -2
- data/lib/winrm/wsmv/soap.rb +0 -2
- data/lib/winrm/wsmv/wql_pull.rb +54 -56
- data/lib/winrm/wsmv/wql_query.rb +98 -99
- data/lib/winrm/wsmv/write_stdin.rb +0 -2
- data/tests/integration/auth_timeout_spec.rb +0 -1
- data/tests/integration/cmd_spec.rb +2 -3
- data/tests/integration/issue_59_spec.rb +0 -1
- data/tests/integration/powershell_spec.rb +4 -5
- data/tests/integration/spec_helper.rb +3 -6
- data/tests/integration/transport_spec.rb +0 -1
- data/tests/integration/wql_spec.rb +33 -34
- data/tests/matchers.rb +2 -3
- data/tests/spec/configuration_spec.rb +0 -1
- data/tests/spec/connection_spec.rb +0 -2
- data/tests/spec/exception_spec.rb +0 -1
- data/tests/spec/http/transport_factory_spec.rb +1 -3
- data/tests/spec/http/transport_spec.rb +0 -1
- data/tests/spec/output_spec.rb +4 -3
- data/tests/spec/psrp/fragment_spec.rb +0 -2
- data/tests/spec/psrp/message_data/base_spec.rb +0 -2
- data/tests/spec/psrp/message_data/error_record_spec.rb +0 -2
- data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +0 -2
- data/tests/spec/psrp/message_data/pipeline_output_spec.rb +0 -2
- data/tests/spec/psrp/message_data/pipeline_state_spec.rb +0 -2
- data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +0 -2
- data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +0 -2
- data/tests/spec/psrp/message_data/session_capability_spec.rb +0 -2
- data/tests/spec/psrp/message_data_spec.rb +0 -2
- data/tests/spec/psrp/message_defragmenter_spec.rb +0 -2
- data/tests/spec/psrp/message_fragmenter_spec.rb +0 -2
- data/tests/spec/psrp/powershell_output_decoder_spec.rb +0 -2
- data/tests/spec/psrp/psrp_message_spec.rb +10 -7
- data/tests/spec/psrp/recieve_response_reader_spec.rb +0 -2
- data/tests/spec/psrp/uuid_spec.rb +2 -2
- data/tests/spec/response_handler_spec.rb +69 -61
- data/tests/spec/shells/base_spec.rb +7 -5
- data/tests/spec/shells/cmd_spec.rb +4 -4
- data/tests/spec/shells/powershell_spec.rb +221 -175
- data/tests/spec/spec_helper.rb +0 -1
- data/tests/spec/stubs/responses/get_omi_command_output_response.xml.erb +23 -0
- data/tests/spec/stubs/responses/get_omi_command_output_response_not_done.xml.erb +24 -0
- data/tests/spec/stubs/responses/get_omi_config_response.xml +45 -0
- data/tests/spec/stubs/responses/get_omi_powershell_keepalive_response.xml.erb +33 -0
- data/tests/spec/stubs/responses/open_shell_omi.xml +43 -0
- data/tests/spec/stubs/responses/soap_fault_omi.xml +31 -0
- data/tests/spec/wsmv/cleanup_command_spec.rb +0 -2
- data/tests/spec/wsmv/close_shell_spec.rb +0 -2
- data/tests/spec/wsmv/command_output_decoder_spec.rb +0 -2
- data/tests/spec/wsmv/command_output_spec.rb +1 -3
- data/tests/spec/wsmv/command_spec.rb +0 -2
- data/tests/spec/wsmv/configuration_spec.rb +0 -2
- data/tests/spec/wsmv/create_pipeline_spec.rb +2 -3
- data/tests/spec/wsmv/create_shell_spec.rb +6 -5
- data/tests/spec/wsmv/init_runspace_pool_spec.rb +38 -36
- data/tests/spec/wsmv/keep_alive_spec.rb +4 -4
- data/tests/spec/wsmv/receive_response_reader_spec.rb +124 -123
- data/tests/spec/wsmv/send_data_spec.rb +4 -4
- data/tests/spec/wsmv/wql_query_spec.rb +11 -13
- data/tests/spec/wsmv/write_stdin_spec.rb +0 -2
- data/winrm.gemspec +11 -12
- metadata +73 -67
@@ -1,95 +1,96 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
"#{NS_WIN_SHELL}:
|
47
|
-
|
48
|
-
|
49
|
-
body[
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
:
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
:
|
80
|
-
|
81
|
-
|
82
|
-
'
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
1
|
+
# Copyright 2016 Matt Wrock <matt@mattwrock.com>
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'base'
|
16
|
+
|
17
|
+
module WinRM
|
18
|
+
module WSMV
|
19
|
+
# WSMV message to create a remote shell
|
20
|
+
class InitRunspacePool < Base
|
21
|
+
attr_accessor :shell_id
|
22
|
+
|
23
|
+
def initialize(session_opts, shell_id, payload)
|
24
|
+
@session_opts = session_opts
|
25
|
+
@shell_id = shell_id
|
26
|
+
@payload = payload
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def create_header(header)
|
32
|
+
header << Gyoku.xml(shell_headers)
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_body(body)
|
36
|
+
# OMI server requires a Name for the Shell
|
37
|
+
body.tag!("#{NS_WIN_SHELL}:Shell", 'ShellId' => shell_id, 'Name' => 'Runspace') do |s|
|
38
|
+
s << Gyoku.xml(shell_body)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def shell_body
|
45
|
+
body = {
|
46
|
+
"#{NS_WIN_SHELL}:InputStreams" => 'stdin pr',
|
47
|
+
"#{NS_WIN_SHELL}:OutputStreams" => 'stdout'
|
48
|
+
}
|
49
|
+
body['creationXml'] = encode_bytes(@payload)
|
50
|
+
body[:attributes!] = {
|
51
|
+
'creationXml' => {
|
52
|
+
'xmlns' => 'http://schemas.microsoft.com/powershell'
|
53
|
+
}
|
54
|
+
}
|
55
|
+
body
|
56
|
+
end
|
57
|
+
|
58
|
+
def shell_headers
|
59
|
+
merge_headers(shared_headers(@session_opts),
|
60
|
+
resource_uri_shell(RESOURCE_URI_POWERSHELL),
|
61
|
+
action_create,
|
62
|
+
header_opts)
|
63
|
+
end
|
64
|
+
|
65
|
+
def action_create
|
66
|
+
{
|
67
|
+
"#{NS_ADDRESSING}:Action" => 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Create',
|
68
|
+
:attributes! => {
|
69
|
+
"#{NS_ADDRESSING}:Action" => {
|
70
|
+
'mustUnderstand' => true
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def header_opts
|
77
|
+
{
|
78
|
+
"#{NS_WSMAN_DMTF}:OptionSet" => {
|
79
|
+
"#{NS_WSMAN_DMTF}:Option" => 2.3,
|
80
|
+
:attributes! => {
|
81
|
+
"#{NS_WSMAN_DMTF}:Option" => {
|
82
|
+
'Name' => 'protocolversion',
|
83
|
+
'MustComply' => 'true'
|
84
|
+
}
|
85
|
+
}
|
86
|
+
},
|
87
|
+
:attributes! => {
|
88
|
+
"#{NS_WSMAN_DMTF}:OptionSet" => {
|
89
|
+
'env:mustUnderstand' => 'true'
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -1,126 +1,128 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
require_relative '
|
18
|
-
require_relative '
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
#
|
41
|
-
# @
|
42
|
-
# @
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
#
|
55
|
-
# @
|
56
|
-
# @
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
logger.debug('[WinRM]
|
63
|
-
resp_doc
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
output
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
1
|
+
# Copyright 2016 Shawn Neal <sneal@sneal.net>
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'soap'
|
16
|
+
require_relative 'header'
|
17
|
+
require_relative 'command_output_decoder'
|
18
|
+
require_relative '../output'
|
19
|
+
|
20
|
+
module WinRM
|
21
|
+
module WSMV
|
22
|
+
# Class for reading wsmv Receive_Response messages
|
23
|
+
class ReceiveResponseReader
|
24
|
+
include WinRM::WSMV::SOAP
|
25
|
+
include WinRM::WSMV::Header
|
26
|
+
|
27
|
+
# Creates a new ReceiveResponseReader
|
28
|
+
# @param transport [HttpTransport] The WinRM SOAP transport
|
29
|
+
# @param logger [Logger] The logger to log diagnostic messages to
|
30
|
+
def initialize(transport, logger)
|
31
|
+
@transport = transport
|
32
|
+
@logger = logger
|
33
|
+
@output_decoder = CommandOutputDecoder.new
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :logger
|
37
|
+
|
38
|
+
# Reads streams and returns decoded output
|
39
|
+
# @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint
|
40
|
+
# @yieldparam [string] standard out response text
|
41
|
+
# @yieldparam [string] standard error response text
|
42
|
+
# @yieldreturn [WinRM::Output] The command output
|
43
|
+
def read_output(wsmv_message)
|
44
|
+
with_output do |output|
|
45
|
+
read_response(wsmv_message, true) do |stream, doc|
|
46
|
+
handled_out = handle_stream(stream, output, doc)
|
47
|
+
yield handled_out if handled_out && block_given?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Reads streams sent in one or more receive response messages
|
53
|
+
# @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint
|
54
|
+
# @param wait_for_done_state whether to poll for a CommandState of Done
|
55
|
+
# @yieldparam [Hash] Hash representation of stream with type and text
|
56
|
+
# @yieldparam [REXML::Document] Complete SOAP envelope returned to wsmv_message
|
57
|
+
def read_response(wsmv_message, wait_for_done_state = false)
|
58
|
+
resp_doc = nil
|
59
|
+
until command_done?(resp_doc, wait_for_done_state)
|
60
|
+
logger.debug('[WinRM] Waiting for output...')
|
61
|
+
resp_doc = send_get_output_message(wsmv_message.build)
|
62
|
+
logger.debug('[WinRM] Processing output')
|
63
|
+
read_streams(resp_doc) do |stream|
|
64
|
+
yield stream, resp_doc
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
|
71
|
+
def with_output
|
72
|
+
output = WinRM::Output.new
|
73
|
+
yield output
|
74
|
+
output.exitcode ||= 0
|
75
|
+
output
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def handle_stream(stream, output, resp_doc)
|
81
|
+
decoded_text = @output_decoder.decode(stream[:text])
|
82
|
+
return unless decoded_text
|
83
|
+
|
84
|
+
out = { stream[:type] => decoded_text }
|
85
|
+
output << out
|
86
|
+
if (code = REXML::XPath.first(resp_doc, "//*[local-name() = 'ExitCode']"))
|
87
|
+
output.exitcode = code.text.to_i
|
88
|
+
end
|
89
|
+
[out[:stdout], out[:stderr]]
|
90
|
+
end
|
91
|
+
|
92
|
+
def send_get_output_message(message)
|
93
|
+
@transport.send_request(message)
|
94
|
+
rescue WinRMWSManFault => e
|
95
|
+
# If no output is available before the wsman:OperationTimeout expires,
|
96
|
+
# the server MUST return a WSManFault with the Code attribute equal to
|
97
|
+
# 2150858793. When the client receives this fault, it SHOULD issue
|
98
|
+
# another Receive request.
|
99
|
+
# http://msdn.microsoft.com/en-us/library/cc251676.aspx
|
100
|
+
raise unless e.fault_code == '2150858793'
|
101
|
+
|
102
|
+
logger.debug('[WinRM] retrying receive request after timeout')
|
103
|
+
retry
|
104
|
+
end
|
105
|
+
|
106
|
+
def command_done?(resp_doc, wait_for_done_state)
|
107
|
+
return false unless resp_doc
|
108
|
+
return true unless wait_for_done_state
|
109
|
+
|
110
|
+
REXML::XPath.match(
|
111
|
+
resp_doc,
|
112
|
+
"//*[@State='http://schemas.microsoft.com/wbem/wsman/1/windows/shell/" \
|
113
|
+
"CommandState/Done']"
|
114
|
+
).any?
|
115
|
+
end
|
116
|
+
|
117
|
+
def read_streams(response_document)
|
118
|
+
body_path = "/*[local-name() = 'Envelope']/*[local-name() = 'Body']"
|
119
|
+
path = "#{body_path}/*[local-name() = 'ReceiveResponse']/*[local-name() = 'Stream']"
|
120
|
+
REXML::XPath.match(response_document, path).each do |stream|
|
121
|
+
next if stream.text.nil? || stream.text.empty?
|
122
|
+
|
123
|
+
yield type: stream.attributes['Name'].to_sym, text: stream.text
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|