chef-winrm 2.3.11 → 2.3.12
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 +4 -4
- data/lib/chef-winrm/connection.rb +6 -6
- data/lib/chef-winrm/connection_opts.rb +7 -7
- data/lib/chef-winrm/exceptions.rb +1 -1
- data/lib/chef-winrm/http/response_handler.rb +3 -3
- data/lib/chef-winrm/http/transport.rb +47 -47
- data/lib/chef-winrm/http/transport_factory.rb +4 -4
- data/lib/chef-winrm/psrp/fragment.rb +10 -9
- data/lib/chef-winrm/psrp/message.rb +7 -7
- data/lib/chef-winrm/psrp/message_data/base.rb +1 -1
- data/lib/chef-winrm/psrp/message_data/error_record.rb +10 -10
- data/lib/chef-winrm/psrp/message_data/pipeline_output.rb +6 -6
- data/lib/chef-winrm/psrp/message_data/session_capability.rb +3 -3
- data/lib/chef-winrm/psrp/message_data.rb +9 -9
- data/lib/chef-winrm/psrp/message_defragmenter.rb +13 -13
- data/lib/chef-winrm/psrp/message_factory.rb +5 -5
- data/lib/chef-winrm/psrp/message_fragmenter.rb +9 -6
- data/lib/chef-winrm/psrp/powershell_output_decoder.rb +25 -29
- data/lib/chef-winrm/psrp/receive_response_reader.rb +5 -5
- data/lib/chef-winrm/shells/base.rb +17 -16
- data/lib/chef-winrm/shells/cmd.rb +2 -2
- data/lib/chef-winrm/shells/power_shell.rb +18 -18
- data/lib/chef-winrm/shells/retryable.rb +1 -1
- data/lib/chef-winrm/shells/shell_factory.rb +5 -5
- data/lib/chef-winrm/version.rb +1 -1
- data/lib/chef-winrm/wsmv/base.rb +7 -7
- data/lib/chef-winrm/wsmv/cleanup_command.rb +8 -8
- data/lib/chef-winrm/wsmv/close_shell.rb +5 -5
- data/lib/chef-winrm/wsmv/command.rb +15 -15
- data/lib/chef-winrm/wsmv/command_output.rb +15 -15
- data/lib/chef-winrm/wsmv/command_output_decoder.rb +4 -4
- data/lib/chef-winrm/wsmv/configuration.rb +3 -3
- data/lib/chef-winrm/wsmv/create_pipeline.rb +8 -8
- data/lib/chef-winrm/wsmv/create_shell.rb +19 -19
- data/lib/chef-winrm/wsmv/header.rb +56 -56
- data/lib/chef-winrm/wsmv/init_runspace_pool.rb +22 -22
- data/lib/chef-winrm/wsmv/iso8601_duration.rb +2 -2
- data/lib/chef-winrm/wsmv/keep_alive.rb +11 -11
- data/lib/chef-winrm/wsmv/receive_response_reader.rb +9 -9
- data/lib/chef-winrm/wsmv/send_data.rb +5 -5
- data/lib/chef-winrm/wsmv/soap.rb +22 -22
- data/lib/chef-winrm/wsmv/wql_pull.rb +4 -4
- data/lib/chef-winrm/wsmv/wql_query.rb +6 -6
- data/lib/chef-winrm/wsmv/write_stdin.rb +18 -18
- data/lib/chef-winrm.rb +10 -10
- metadata +96 -14
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
15
|
+
require_relative "fragment"
|
16
16
|
|
17
17
|
module WinRM
|
18
18
|
# PowerShell Remoting Protcol module
|
@@ -26,35 +26,35 @@ module WinRM
|
|
26
26
|
def defragment(base64_bytes)
|
27
27
|
fragment = fragment_from(Base64.decode64(base64_bytes))
|
28
28
|
|
29
|
-
@messages[fragment.
|
30
|
-
@messages[fragment.
|
29
|
+
@messages[fragment.psrp_object_id] ||= []
|
30
|
+
@messages[fragment.psrp_object_id].push fragment
|
31
31
|
|
32
32
|
# rubocop:disable Style/GuardClause
|
33
33
|
if fragment.end_fragment
|
34
34
|
blob = []
|
35
|
-
@messages.delete(fragment.
|
36
|
-
|
35
|
+
@messages.delete(fragment.psrp_object_id).each { |frag| blob += frag.blob }
|
36
|
+
message_from(blob.pack("C*"))
|
37
37
|
end
|
38
38
|
# rubocop:enable Style/GuardClause
|
39
39
|
end
|
40
40
|
|
41
41
|
def fragment_from(byte_string)
|
42
42
|
Fragment.new(
|
43
|
-
byte_string[0..7].reverse.unpack(
|
43
|
+
byte_string[0..7].reverse.unpack("Q")[0],
|
44
44
|
byte_string[21..-1].bytes,
|
45
|
-
byte_string[8..15].reverse.unpack(
|
46
|
-
byte_string[16].unpack(
|
47
|
-
byte_string[16].unpack(
|
45
|
+
byte_string[8..15].reverse.unpack("Q")[0],
|
46
|
+
byte_string[16].unpack("C")[0][0] == 1,
|
47
|
+
byte_string[16].unpack("C")[0][1] == 1
|
48
48
|
)
|
49
49
|
end
|
50
50
|
|
51
51
|
def message_from(byte_string)
|
52
52
|
Message.new(
|
53
|
-
|
54
|
-
byte_string[4..7].unpack(
|
53
|
+
"00000000-0000-0000-0000-000000000000",
|
54
|
+
byte_string[4..7].unpack("V")[0],
|
55
55
|
byte_string[40..-1],
|
56
|
-
|
57
|
-
byte_string[0..3].unpack(
|
56
|
+
"00000000-0000-0000-0000-000000000000",
|
57
|
+
byte_string[0..3].unpack("V")[0]
|
58
58
|
)
|
59
59
|
end
|
60
60
|
end
|
@@ -12,8 +12,8 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require_relative
|
15
|
+
require "erubi"
|
16
|
+
require_relative "message"
|
17
17
|
|
18
18
|
module WinRM
|
19
19
|
module PSRP
|
@@ -26,7 +26,7 @@ module WinRM
|
|
26
26
|
Message.new(
|
27
27
|
runspace_pool_id,
|
28
28
|
Message::MESSAGE_TYPES[:session_capability],
|
29
|
-
render(
|
29
|
+
render("session_capability")
|
30
30
|
)
|
31
31
|
end
|
32
32
|
|
@@ -36,7 +36,7 @@ module WinRM
|
|
36
36
|
Message.new(
|
37
37
|
runspace_pool_id,
|
38
38
|
Message::MESSAGE_TYPES[:init_runspacepool],
|
39
|
-
render(
|
39
|
+
render("init_runspace_pool")
|
40
40
|
)
|
41
41
|
end
|
42
42
|
|
@@ -49,7 +49,7 @@ module WinRM
|
|
49
49
|
Message.new(
|
50
50
|
runspace_pool_id,
|
51
51
|
Message::MESSAGE_TYPES[:create_pipeline],
|
52
|
-
render(
|
52
|
+
render("create_pipeline", command: command.encode(xml: :text)),
|
53
53
|
pipeline_id
|
54
54
|
)
|
55
55
|
end
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
15
|
+
require_relative "fragment"
|
16
16
|
|
17
17
|
module WinRM
|
18
18
|
# PowerShell Remoting Protcol module
|
@@ -22,15 +22,14 @@ module WinRM
|
|
22
22
|
DEFAULT_BLOB_LENGTH = 32_768
|
23
23
|
|
24
24
|
def initialize(max_blob_length = DEFAULT_BLOB_LENGTH)
|
25
|
-
@
|
25
|
+
@custom_object_id = 0
|
26
26
|
@max_blob_length = max_blob_length || DEFAULT_BLOB_LENGTH
|
27
27
|
end
|
28
28
|
|
29
|
-
attr_reader :object_id
|
30
29
|
attr_accessor :max_blob_length
|
31
30
|
|
32
31
|
def fragment(message)
|
33
|
-
@
|
32
|
+
@custom_object_id += 1
|
34
33
|
message_bytes = message.bytes
|
35
34
|
bytes_fragmented = 0
|
36
35
|
fragment_id = 0
|
@@ -40,10 +39,10 @@ module WinRM
|
|
40
39
|
last_byte = bytes_fragmented + max_blob_length
|
41
40
|
last_byte = message_bytes.length if last_byte > message_bytes.length
|
42
41
|
fragment = Fragment.new(
|
43
|
-
|
42
|
+
custom_object_id,
|
44
43
|
message.bytes[bytes_fragmented..last_byte - 1],
|
45
44
|
fragment_id,
|
46
|
-
bytes_fragmented
|
45
|
+
bytes_fragmented == 0,
|
47
46
|
last_byte == message_bytes.length
|
48
47
|
)
|
49
48
|
fragment_id += 1
|
@@ -53,6 +52,10 @@ module WinRM
|
|
53
52
|
|
54
53
|
fragment
|
55
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
attr_reader :custom_object_id
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
@@ -12,9 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require_relative
|
17
|
-
require_relative
|
15
|
+
require "base64" unless defined?(Base64)
|
16
|
+
require_relative "message"
|
17
|
+
require_relative "message_data/pipeline_state"
|
18
18
|
|
19
19
|
module WinRM
|
20
20
|
module PSRP
|
@@ -50,42 +50,38 @@ module WinRM
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def decode_host_call(message)
|
53
|
-
text =
|
54
|
-
|
55
|
-
when /WriteLine/, 'WriteErrorLine'
|
53
|
+
text = case message.parsed_data.method_identifier
|
54
|
+
when /WriteLine/, "WriteErrorLine"
|
56
55
|
"#{message.parsed_data.method_parameters[:s]}\r\n"
|
57
|
-
when
|
56
|
+
when "WriteDebugLine"
|
58
57
|
"Debug: #{message.parsed_data.method_parameters[:s]}\r\n"
|
59
|
-
when
|
58
|
+
when "WriteWarningLine"
|
60
59
|
"Warning: #{message.parsed_data.method_parameters[:s]}\r\n"
|
61
|
-
when
|
60
|
+
when "WriteVerboseLine"
|
62
61
|
"Verbose: #{message.parsed_data.method_parameters[:s]}\r\n"
|
63
62
|
when /Write[1-2]/
|
64
63
|
message.parsed_data.method_parameters[:s]
|
65
|
-
|
66
|
-
end
|
64
|
+
end
|
67
65
|
|
68
66
|
hex_decode(text)
|
69
67
|
end
|
70
68
|
|
71
69
|
def decode_error_record(message)
|
72
70
|
parsed = message.parsed_data
|
73
|
-
text =
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
71
|
+
text = if message.type == WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_state]
|
72
|
+
render_exception_as_error_record(parsed.exception_as_error_record)
|
73
|
+
else
|
74
|
+
case parsed.fully_qualified_error_id
|
75
|
+
when "Microsoft.PowerShell.Commands.WriteErrorException"
|
76
|
+
render_write_error_exception(parsed)
|
77
|
+
when "NativeCommandError"
|
78
|
+
render_native_command_error(parsed)
|
79
|
+
when "NativeCommandErrorMessage"
|
80
|
+
parsed.exception[:message]
|
81
|
+
else
|
82
|
+
render_exception(parsed)
|
83
|
+
end
|
84
|
+
end
|
89
85
|
|
90
86
|
hex_decode(text)
|
91
87
|
end
|
@@ -129,11 +125,11 @@ EOH
|
|
129
125
|
return unless text
|
130
126
|
|
131
127
|
text.gsub(/_x(\h\h\h\h)_/) do
|
132
|
-
decoded_text = Regexp.last_match[1].hex.chr.force_encoding(
|
128
|
+
decoded_text = Regexp.last_match[1].hex.chr.force_encoding("utf-8")
|
133
129
|
if decoded_text.respond_to?(:scrub)
|
134
130
|
decoded_text.scrub
|
135
131
|
else
|
136
|
-
decoded_text.encode(
|
132
|
+
decoded_text.encode("utf-16", invalid: :replace, undef: :replace).encode("utf-8")
|
137
133
|
end
|
138
134
|
end
|
139
135
|
end
|
@@ -12,9 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require_relative
|
17
|
-
require_relative
|
15
|
+
require "nori"
|
16
|
+
require_relative "powershell_output_decoder"
|
17
|
+
require_relative "message_defragmenter"
|
18
18
|
|
19
19
|
module WinRM
|
20
20
|
module PSRP
|
@@ -77,7 +77,7 @@ module WinRM
|
|
77
77
|
when WinRM::PSRP::Message::MESSAGE_TYPES[:error_record]
|
78
78
|
type = :stderr
|
79
79
|
when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_host_call]
|
80
|
-
type = :stderr if message.data.include?(
|
80
|
+
type = :stderr if message.data.include?("WriteError")
|
81
81
|
when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_state]
|
82
82
|
type = :stderr if message.parsed_data.pipeline_state == WinRM::PSRP::MessageData::PipelineState::FAILED
|
83
83
|
end
|
@@ -88,7 +88,7 @@ module WinRM
|
|
88
88
|
parsed = message.parsed_data
|
89
89
|
return nil unless parsed.is_a?(MessageData::PipelineHostCall)
|
90
90
|
|
91
|
-
parsed.method_parameters[:i32].to_i if parsed.method_identifier ==
|
91
|
+
parsed.method_parameters[:i32].to_i if parsed.method_identifier == "SetShouldExit"
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
@@ -12,27 +12,27 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
16
|
-
require_relative
|
17
|
-
require_relative
|
18
|
-
require_relative
|
19
|
-
require_relative
|
20
|
-
require_relative
|
21
|
-
require_relative
|
22
|
-
require_relative
|
23
|
-
require_relative
|
15
|
+
require_relative "retryable"
|
16
|
+
require_relative "../http/transport"
|
17
|
+
require_relative "../wsmv/cleanup_command"
|
18
|
+
require_relative "../wsmv/close_shell"
|
19
|
+
require_relative "../wsmv/command"
|
20
|
+
require_relative "../wsmv/command_output"
|
21
|
+
require_relative "../wsmv/receive_response_reader"
|
22
|
+
require_relative "../wsmv/create_shell"
|
23
|
+
require_relative "../wsmv/soap"
|
24
24
|
|
25
25
|
module WinRM
|
26
26
|
module Shells
|
27
27
|
# Base class for remote shell
|
28
28
|
class Base
|
29
|
-
TOO_MANY_COMMANDS =
|
30
|
-
ERROR_OPERATION_ABORTED =
|
31
|
-
SHELL_NOT_FOUND =
|
29
|
+
TOO_MANY_COMMANDS = "2150859174".freeze
|
30
|
+
ERROR_OPERATION_ABORTED = "995".freeze
|
31
|
+
SHELL_NOT_FOUND = "2150858843".freeze
|
32
32
|
|
33
33
|
FAULTS_FOR_RESET = [
|
34
|
-
|
35
|
-
|
34
|
+
"2150858843", # Shell has been closed
|
35
|
+
"2147943418", # Error reading registry key
|
36
36
|
TOO_MANY_COMMANDS, # Maximum commands per user exceeded
|
37
37
|
].freeze
|
38
38
|
|
@@ -121,7 +121,7 @@ module WinRM
|
|
121
121
|
shell_id: shell_id,
|
122
122
|
command_id: command_id,
|
123
123
|
shell_uri: shell_uri,
|
124
|
-
out_streams: out_streams
|
124
|
+
out_streams: out_streams,
|
125
125
|
}
|
126
126
|
WinRM::WSMV::CommandOutput.new(connection_opts, cmd_out_opts)
|
127
127
|
end
|
@@ -146,12 +146,13 @@ module WinRM
|
|
146
146
|
|
147
147
|
def reset_on_error(error)
|
148
148
|
close if error.fault_code == TOO_MANY_COMMANDS
|
149
|
-
logger.debug(
|
149
|
+
logger.debug("[WinRM] opening new shell since the current one was deleted")
|
150
150
|
@shell_id = nil
|
151
151
|
end
|
152
152
|
|
153
153
|
def cleanup_command(command_id)
|
154
154
|
return unless shell_id
|
155
|
+
|
155
156
|
logger.debug("[WinRM] cleaning up command_id: #{command_id} on shell_id #{shell_id}")
|
156
157
|
cleanup_msg = WinRM::WSMV::CleanupCommand.new(
|
157
158
|
connection_opts,
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
15
|
+
require_relative "base"
|
16
16
|
|
17
17
|
module WinRM
|
18
18
|
module Shells
|
@@ -52,7 +52,7 @@ module WinRM
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def out_streams
|
55
|
-
%w
|
55
|
+
%w{stdout stderr}
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -12,15 +12,15 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require_relative
|
17
|
-
require_relative
|
18
|
-
require_relative
|
19
|
-
require_relative
|
20
|
-
require_relative
|
21
|
-
require_relative
|
22
|
-
require_relative
|
23
|
-
require_relative
|
15
|
+
require "securerandom" unless defined?(SecureRandom)
|
16
|
+
require_relative "base"
|
17
|
+
require_relative "../psrp/message_fragmenter"
|
18
|
+
require_relative "../psrp/receive_response_reader"
|
19
|
+
require_relative "../wsmv/configuration"
|
20
|
+
require_relative "../wsmv/create_pipeline"
|
21
|
+
require_relative "../wsmv/send_data"
|
22
|
+
require_relative "../wsmv/init_runspace_pool"
|
23
|
+
require_relative "../wsmv/keep_alive"
|
24
24
|
|
25
25
|
module WinRM
|
26
26
|
module Shells
|
@@ -78,7 +78,7 @@ module WinRM
|
|
78
78
|
# error attempting to query winrm configuration.
|
79
79
|
# we will assin a small default and adjust to a protocol
|
80
80
|
# appropriate max length when that info is available
|
81
|
-
raise unless e.fault_code ==
|
81
|
+
raise unless e.fault_code == "5"
|
82
82
|
|
83
83
|
WinRM::PSRP::MessageFragmenter::DEFAULT_BLOB_LENGTH
|
84
84
|
rescue WinRMSoapFault
|
@@ -125,7 +125,7 @@ module WinRM
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def out_streams
|
128
|
-
%w
|
128
|
+
%w{stdout}
|
129
129
|
end
|
130
130
|
|
131
131
|
private
|
@@ -137,8 +137,8 @@ module WinRM
|
|
137
137
|
def empty_pipeline_envelope
|
138
138
|
WinRM::WSMV::CreatePipeline.new(
|
139
139
|
connection_opts,
|
140
|
-
|
141
|
-
|
140
|
+
"00000000-0000-0000-0000-000000000000",
|
141
|
+
"00000000-0000-0000-0000-000000000000"
|
142
142
|
).build
|
143
143
|
end
|
144
144
|
|
@@ -148,16 +148,16 @@ module WinRM
|
|
148
148
|
msg = config_msg.build
|
149
149
|
resp_doc = transport.send_request(msg)
|
150
150
|
REXML::XPath.first(resp_doc, "//*[local-name() = 'MaxEnvelopeSizekb']").text.to_i
|
151
|
-
|
152
|
-
|
153
|
-
|
151
|
+
rescue REXML::ParseException
|
152
|
+
logger.debug("[WinRM] Endpoint doesn't support config request for MaxEnvelopeSizekb")
|
153
|
+
raise
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
157
|
def open_shell_payload(shell_id)
|
158
158
|
[
|
159
159
|
WinRM::PSRP::MessageFactory.session_capability_message(shell_id),
|
160
|
-
WinRM::PSRP::MessageFactory.init_runspace_pool_message(shell_id)
|
160
|
+
WinRM::PSRP::MessageFactory.init_runspace_pool_message(shell_id),
|
161
161
|
].map do |message|
|
162
162
|
fragmenter.fragment(message).bytes
|
163
163
|
end.flatten
|
@@ -191,7 +191,7 @@ module WinRM
|
|
191
191
|
# which defaults to a 150 MaxEnvelopeSizeKB
|
192
192
|
# later versions default to 500
|
193
193
|
def default_protocol_envelope_size(protocol_version)
|
194
|
-
protocol_version >
|
194
|
+
protocol_version > "2.1" ? 512000 : 153600
|
195
195
|
end
|
196
196
|
|
197
197
|
def fragmenter
|
@@ -12,9 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
16
|
-
require_relative
|
17
|
-
require_relative
|
15
|
+
require_relative "base"
|
16
|
+
require_relative "cmd"
|
17
|
+
require_relative "power_shell"
|
18
18
|
|
19
19
|
module WinRM
|
20
20
|
module Shells
|
@@ -39,7 +39,7 @@ module WinRM
|
|
39
39
|
args = [
|
40
40
|
@connection_opts,
|
41
41
|
@transport,
|
42
|
-
@logger
|
42
|
+
@logger,
|
43
43
|
]
|
44
44
|
# winrm-elevated has an initializer with no shell_opts so don't break it
|
45
45
|
args << shell_opts unless shell_opts.nil? || shell_opts.empty?
|
@@ -47,7 +47,7 @@ module WinRM
|
|
47
47
|
WinRM::Shells.const_get(type).new(*args)
|
48
48
|
else
|
49
49
|
message = "#{type} is not a valid WinRM shell type. " \
|
50
|
-
|
50
|
+
"Expected either :cmd, :powershell or pluggable shell."
|
51
51
|
raise WinRM::InvalidShellError, message
|
52
52
|
end
|
53
53
|
end
|
data/lib/chef-winrm/version.rb
CHANGED
data/lib/chef-winrm/wsmv/base.rb
CHANGED
@@ -12,11 +12,11 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require_relative
|
19
|
-
require_relative
|
15
|
+
require "base64" unless defined?(Base64)
|
16
|
+
require "builder"
|
17
|
+
require "chef-gyoku"
|
18
|
+
require_relative "soap"
|
19
|
+
require_relative "header"
|
20
20
|
|
21
21
|
module WinRM
|
22
22
|
module WSMV
|
@@ -28,7 +28,7 @@ module WinRM
|
|
28
28
|
# Builds the WSMV message XML payload
|
29
29
|
def build
|
30
30
|
builder = Builder::XmlMarkup.new
|
31
|
-
builder.instruct!(:xml, encoding:
|
31
|
+
builder.instruct!(:xml, encoding: "UTF-8")
|
32
32
|
builder.tag! :env, :Envelope, namespaces do |env|
|
33
33
|
env.tag!(:env, :Header) do |env_header|
|
34
34
|
create_header(env_header)
|
@@ -50,7 +50,7 @@ module WinRM
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def encode_bytes(bytes)
|
53
|
-
Base64.strict_encode64(bytes.pack(
|
53
|
+
Base64.strict_encode64(bytes.pack("C*"))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -12,15 +12,15 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
15
|
+
require_relative "base"
|
16
16
|
|
17
17
|
module WinRM
|
18
18
|
module WSMV
|
19
19
|
# WSMV message to execute a command inside a remote shell
|
20
20
|
class CleanupCommand < Base
|
21
21
|
def initialize(session_opts, opts)
|
22
|
-
raise
|
23
|
-
raise
|
22
|
+
raise "opts[:shell_id] is required" unless opts[:shell_id]
|
23
|
+
raise "opts[:command_id] is required" unless opts[:command_id]
|
24
24
|
|
25
25
|
@session_opts = session_opts
|
26
26
|
@shell_id = opts[:shell_id]
|
@@ -35,7 +35,7 @@ module WinRM
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def create_body(body)
|
38
|
-
body.tag!("#{NS_WIN_SHELL}:Signal",
|
38
|
+
body.tag!("#{NS_WIN_SHELL}:Signal", "CommandId" => @command_id) do |cl|
|
39
39
|
cl << Gyoku.xml(cleanup_body)
|
40
40
|
end
|
41
41
|
end
|
@@ -44,15 +44,15 @@ module WinRM
|
|
44
44
|
|
45
45
|
def cleanup_header
|
46
46
|
merge_headers(shared_headers(@session_opts),
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
resource_uri_shell(@shell_uri),
|
48
|
+
action_signal,
|
49
|
+
selector_shell_id(@shell_id))
|
50
50
|
end
|
51
51
|
|
52
52
|
def cleanup_body
|
53
53
|
{
|
54
54
|
"#{NS_WIN_SHELL}:Code" =>
|
55
|
-
|
55
|
+
"http://schemas.microsoft.com/wbem/wsman/1/windows/shell/signal/terminate",
|
56
56
|
}
|
57
57
|
end
|
58
58
|
end
|
@@ -12,14 +12,14 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require_relative
|
15
|
+
require_relative "base"
|
16
16
|
|
17
17
|
module WinRM
|
18
18
|
module WSMV
|
19
19
|
# WSMV message to close a remote shell
|
20
20
|
class CloseShell < Base
|
21
21
|
def initialize(session_opts, shell_opts)
|
22
|
-
raise
|
22
|
+
raise "shell_opts[:shell_id] is required" unless shell_opts[:shell_id]
|
23
23
|
|
24
24
|
@session_opts = session_opts
|
25
25
|
@shell_id = shell_opts[:shell_id]
|
@@ -40,9 +40,9 @@ module WinRM
|
|
40
40
|
|
41
41
|
def close_header
|
42
42
|
merge_headers(shared_headers(@session_opts),
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
resource_uri_shell(@shell_uri),
|
44
|
+
action_delete,
|
45
|
+
selector_shell_id(@shell_id))
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|