winrm 2.0.3 → 2.1.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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +10 -10
  3. data/.rubocop.yml +26 -26
  4. data/.travis.yml +11 -11
  5. data/Gemfile +3 -3
  6. data/README.md +260 -233
  7. data/Rakefile +34 -34
  8. data/Vagrantfile +6 -6
  9. data/WinrmAppveyor.psm1 +31 -31
  10. data/appveyor.yml +51 -51
  11. data/changelog.md +104 -101
  12. data/lib/winrm.rb +39 -39
  13. data/lib/winrm/connection.rb +83 -82
  14. data/lib/winrm/connection_opts.rb +91 -91
  15. data/lib/winrm/exceptions.rb +76 -76
  16. data/lib/winrm/http/response_handler.rb +96 -96
  17. data/lib/winrm/http/transport.rb +424 -424
  18. data/lib/winrm/http/transport_factory.rb +68 -68
  19. data/lib/winrm/output.rb +59 -59
  20. data/lib/winrm/psrp/create_pipeline.xml.erb +167 -167
  21. data/lib/winrm/psrp/fragment.rb +70 -70
  22. data/lib/winrm/psrp/init_runspace_pool.xml.erb +224 -224
  23. data/lib/winrm/psrp/message.rb +130 -130
  24. data/lib/winrm/psrp/message_data.rb +42 -42
  25. data/lib/winrm/psrp/message_data/base.rb +49 -49
  26. data/lib/winrm/psrp/message_data/error_record.rb +68 -68
  27. data/lib/winrm/psrp/message_data/pipeline_host_call.rb +32 -32
  28. data/lib/winrm/psrp/message_data/pipeline_output.rb +49 -49
  29. data/lib/winrm/psrp/message_data/pipeline_state.rb +40 -40
  30. data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +32 -32
  31. data/lib/winrm/psrp/message_data/runspacepool_state.rb +39 -39
  32. data/lib/winrm/psrp/message_data/session_capability.rb +36 -36
  33. data/lib/winrm/psrp/message_defragmenter.rb +62 -62
  34. data/lib/winrm/psrp/message_factory.rb +75 -75
  35. data/lib/winrm/psrp/message_fragmenter.rb +60 -60
  36. data/lib/winrm/psrp/powershell_output_decoder.rb +139 -139
  37. data/lib/winrm/psrp/receive_response_reader.rb +97 -97
  38. data/lib/winrm/psrp/session_capability.xml.erb +7 -7
  39. data/lib/winrm/psrp/uuid.rb +40 -40
  40. data/lib/winrm/shells/base.rb +180 -175
  41. data/lib/winrm/shells/cmd.rb +65 -65
  42. data/lib/winrm/shells/power_shell.rb +202 -202
  43. data/lib/winrm/shells/retryable.rb +45 -45
  44. data/lib/winrm/shells/shell_factory.rb +58 -50
  45. data/lib/winrm/version.rb +7 -7
  46. data/lib/winrm/wsmv/base.rb +59 -59
  47. data/lib/winrm/wsmv/cleanup_command.rb +61 -61
  48. data/lib/winrm/wsmv/close_shell.rb +50 -50
  49. data/lib/winrm/wsmv/command.rb +101 -101
  50. data/lib/winrm/wsmv/command_output.rb +76 -76
  51. data/lib/winrm/wsmv/command_output_decoder.rb +55 -55
  52. data/lib/winrm/wsmv/configuration.rb +46 -46
  53. data/lib/winrm/wsmv/create_pipeline.rb +66 -66
  54. data/lib/winrm/wsmv/create_shell.rb +119 -119
  55. data/lib/winrm/wsmv/header.rb +203 -203
  56. data/lib/winrm/wsmv/init_runspace_pool.rb +95 -95
  57. data/lib/winrm/wsmv/iso8601_duration.rb +60 -60
  58. data/lib/winrm/wsmv/keep_alive.rb +68 -68
  59. data/lib/winrm/wsmv/receive_response_reader.rb +126 -126
  60. data/lib/winrm/wsmv/send_data.rb +68 -68
  61. data/lib/winrm/wsmv/soap.rb +51 -51
  62. data/lib/winrm/wsmv/wql_query.rb +79 -79
  63. data/lib/winrm/wsmv/write_stdin.rb +88 -88
  64. data/tests/integration/auth_timeout_spec.rb +18 -18
  65. data/tests/integration/cmd_spec.rb +131 -110
  66. data/tests/integration/config-example.yml +16 -16
  67. data/tests/integration/issue_59_spec.rb +26 -26
  68. data/tests/integration/powershell_spec.rb +165 -165
  69. data/tests/integration/spec_helper.rb +65 -65
  70. data/tests/integration/transport_spec.rb +99 -99
  71. data/tests/integration/wql_spec.rb +16 -16
  72. data/tests/matchers.rb +60 -60
  73. data/tests/spec/configuration_spec.rb +184 -184
  74. data/tests/spec/connection_spec.rb +39 -39
  75. data/tests/spec/exception_spec.rb +50 -50
  76. data/tests/spec/http/transport_factory_spec.rb +68 -68
  77. data/tests/spec/http/transport_spec.rb +44 -44
  78. data/tests/spec/output_spec.rb +127 -127
  79. data/tests/spec/psrp/fragment_spec.rb +62 -62
  80. data/tests/spec/psrp/message_data/base_spec.rb +13 -13
  81. data/tests/spec/psrp/message_data/error_record_spec.rb +41 -41
  82. data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +25 -25
  83. data/tests/spec/psrp/message_data/pipeline_output_spec.rb +32 -32
  84. data/tests/spec/psrp/message_data/pipeline_state_spec.rb +40 -40
  85. data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +25 -25
  86. data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +16 -16
  87. data/tests/spec/psrp/message_data/session_capability_spec.rb +30 -30
  88. data/tests/spec/psrp/message_data_spec.rb +35 -35
  89. data/tests/spec/psrp/message_defragmenter_spec.rb +47 -47
  90. data/tests/spec/psrp/message_fragmenter_spec.rb +105 -105
  91. data/tests/spec/psrp/powershell_output_decoder_spec.rb +100 -100
  92. data/tests/spec/psrp/psrp_message_spec.rb +70 -70
  93. data/tests/spec/psrp/recieve_response_reader_spec.rb +172 -172
  94. data/tests/spec/psrp/uuid_spec.rb +28 -28
  95. data/tests/spec/response_handler_spec.rb +61 -61
  96. data/tests/spec/shells/base_spec.rb +202 -202
  97. data/tests/spec/shells/cmd_spec.rb +75 -75
  98. data/tests/spec/shells/powershell_spec.rb +175 -175
  99. data/tests/spec/spec_helper.rb +47 -47
  100. data/tests/spec/stubs/clixml/error_record.xml.erb +84 -84
  101. data/tests/spec/stubs/clixml/pipeline_state.xml.erb +88 -88
  102. data/tests/spec/stubs/responses/get_command_output_response.xml.erb +13 -13
  103. data/tests/spec/stubs/responses/get_command_output_response_not_done.xml.erb +10 -10
  104. data/tests/spec/stubs/responses/get_powershell_keepalive_response.xml.erb +10 -10
  105. data/tests/spec/stubs/responses/get_powershell_output_response.xml.erb +12 -12
  106. data/tests/spec/stubs/responses/get_powershell_output_response_not_done.xml.erb +9 -9
  107. data/tests/spec/stubs/responses/open_shell_v1.xml +19 -19
  108. data/tests/spec/stubs/responses/open_shell_v2.xml +20 -20
  109. data/tests/spec/stubs/responses/soap_fault_v1.xml +36 -36
  110. data/tests/spec/stubs/responses/soap_fault_v2.xml +42 -42
  111. data/tests/spec/stubs/responses/wmi_error_v2.xml +41 -41
  112. data/tests/spec/wsmv/cleanup_command_spec.rb +22 -22
  113. data/tests/spec/wsmv/close_shell_spec.rb +17 -17
  114. data/tests/spec/wsmv/command_output_decoder_spec.rb +37 -37
  115. data/tests/spec/wsmv/command_output_spec.rb +45 -45
  116. data/tests/spec/wsmv/command_spec.rb +19 -19
  117. data/tests/spec/wsmv/configuration_spec.rb +17 -17
  118. data/tests/spec/wsmv/create_pipeline_spec.rb +31 -31
  119. data/tests/spec/wsmv/create_shell_spec.rb +38 -38
  120. data/tests/spec/wsmv/init_runspace_pool_spec.rb +36 -36
  121. data/tests/spec/wsmv/keep_alive_spec.rb +21 -21
  122. data/tests/spec/wsmv/receive_response_reader_spec.rb +123 -123
  123. data/tests/spec/wsmv/send_data_spec.rb +30 -30
  124. data/tests/spec/wsmv/wql_query_spec.rb +13 -13
  125. data/tests/spec/wsmv/write_stdin_spec.rb +22 -22
  126. data/winrm.gemspec +42 -42
  127. metadata +2 -2
@@ -1,50 +1,50 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
-
19
- module WinRM
20
- module WSMV
21
- # WSMV message to close a remote shell
22
- class CloseShell < Base
23
- def initialize(session_opts, shell_opts)
24
- raise 'shell_opts[:shell_id] is required' unless shell_opts[:shell_id]
25
- @session_opts = session_opts
26
- @shell_id = shell_opts[:shell_id]
27
- @shell_uri = shell_opts[:shell_uri] || RESOURCE_URI_CMD
28
- end
29
-
30
- protected
31
-
32
- def create_header(header)
33
- header << Gyoku.xml(close_header)
34
- end
35
-
36
- def create_body(_body)
37
- # no body
38
- end
39
-
40
- private
41
-
42
- def close_header
43
- merge_headers(shared_headers(@session_opts),
44
- resource_uri_shell(@shell_uri),
45
- action_delete,
46
- selector_shell_id(@shell_id))
47
- end
48
- end
49
- end
50
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+
19
+ module WinRM
20
+ module WSMV
21
+ # WSMV message to close a remote shell
22
+ class CloseShell < Base
23
+ def initialize(session_opts, shell_opts)
24
+ raise 'shell_opts[:shell_id] is required' unless shell_opts[:shell_id]
25
+ @session_opts = session_opts
26
+ @shell_id = shell_opts[:shell_id]
27
+ @shell_uri = shell_opts[:shell_uri] || RESOURCE_URI_CMD
28
+ end
29
+
30
+ protected
31
+
32
+ def create_header(header)
33
+ header << Gyoku.xml(close_header)
34
+ end
35
+
36
+ def create_body(_body)
37
+ # no body
38
+ end
39
+
40
+ private
41
+
42
+ def close_header
43
+ merge_headers(shared_headers(@session_opts),
44
+ resource_uri_shell(@shell_uri),
45
+ action_delete,
46
+ selector_shell_id(@shell_id))
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,101 +1,101 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
-
19
- module WinRM
20
- module WSMV
21
- # WSMV message to execute a command inside a remote shell
22
- class Command < Base
23
- attr_reader :command_id
24
-
25
- def initialize(session_opts, cmd_opts)
26
- @command_id = SecureRandom.uuid.to_s.upcase
27
- validate_opts(session_opts, cmd_opts)
28
- init_ops(session_opts, cmd_opts)
29
- end
30
-
31
- def build
32
- xml = super
33
- issue69_unescape_single_quotes(xml)
34
- end
35
-
36
- protected
37
-
38
- def create_header(header)
39
- header << Gyoku.xml(command_headers)
40
- end
41
-
42
- def create_body(body)
43
- body.tag!("#{NS_WIN_SHELL}:CommandLine", 'CommandId' => @command_id) do |cl|
44
- cl << Gyoku.xml(command_body)
45
- end
46
- end
47
-
48
- private
49
-
50
- def init_ops(session_opts, cmd_opts)
51
- @session_opts = session_opts
52
- @shell_id = cmd_opts[:shell_id]
53
- @command = cmd_opts[:command]
54
- @arguments = cmd_opts[:arguments] || []
55
- @shell_uri = cmd_opts[:shell_uri] || RESOURCE_URI_CMD
56
- @consolemode = cmd_opts.key?(:console_mode_stdin) ? cmd_opts[:console_mode_stdin] : 'TRUE'
57
- @skipcmd = cmd_opts.key?(:skip_cmd_shell) ? cmd_opts[:skip_cmd_shell] : 'FALSE'
58
- end
59
-
60
- def validate_opts(session_opts, cmd_opts)
61
- raise 'session_opts is required' unless session_opts
62
- raise 'cmd_opts[:shell_id] is required' unless cmd_opts[:shell_id]
63
- raise 'cmd_opts[:command] is required' unless cmd_opts[:command]
64
- end
65
-
66
- def issue69_unescape_single_quotes(xml)
67
- escaped_cmd = %r{<#{NS_WIN_SHELL}:Command>(.+)<\/#{NS_WIN_SHELL}:Command>}m.match(xml)[1]
68
- xml[escaped_cmd] = escaped_cmd.gsub(/&#39;/, "'")
69
- xml
70
- end
71
-
72
- def command_body
73
- {
74
- "#{NS_WIN_SHELL}:Command" => "\"#{@command}\"", "#{NS_WIN_SHELL}:Arguments" => @arguments
75
- }
76
- end
77
-
78
- def command_headers
79
- merge_headers(shared_headers(@session_opts),
80
- resource_uri_shell(@shell_uri),
81
- action_command,
82
- command_header_opts,
83
- selector_shell_id(@shell_id))
84
- end
85
-
86
- def command_header_opts
87
- return {} if @shell_uri != RESOURCE_URI_CMD
88
- # this is only needed for the regular Windows shell
89
- {
90
- "#{NS_WSMAN_DMTF}:OptionSet" => {
91
- "#{NS_WSMAN_DMTF}:Option" => [@consolemode, @skipcmd], :attributes! => {
92
- "#{NS_WSMAN_DMTF}:Option" => {
93
- 'Name' => %w(WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL)
94
- }
95
- }
96
- }
97
- }
98
- end
99
- end
100
- end
101
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+
19
+ module WinRM
20
+ module WSMV
21
+ # WSMV message to execute a command inside a remote shell
22
+ class Command < Base
23
+ attr_reader :command_id
24
+
25
+ def initialize(session_opts, cmd_opts)
26
+ @command_id = SecureRandom.uuid.to_s.upcase
27
+ validate_opts(session_opts, cmd_opts)
28
+ init_ops(session_opts, cmd_opts)
29
+ end
30
+
31
+ def build
32
+ xml = super
33
+ issue69_unescape_single_quotes(xml)
34
+ end
35
+
36
+ protected
37
+
38
+ def create_header(header)
39
+ header << Gyoku.xml(command_headers)
40
+ end
41
+
42
+ def create_body(body)
43
+ body.tag!("#{NS_WIN_SHELL}:CommandLine", 'CommandId' => @command_id) do |cl|
44
+ cl << Gyoku.xml(command_body)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def init_ops(session_opts, cmd_opts)
51
+ @session_opts = session_opts
52
+ @shell_id = cmd_opts[:shell_id]
53
+ @command = cmd_opts[:command]
54
+ @arguments = cmd_opts[:arguments] || []
55
+ @shell_uri = cmd_opts[:shell_uri] || RESOURCE_URI_CMD
56
+ @consolemode = cmd_opts.key?(:console_mode_stdin) ? cmd_opts[:console_mode_stdin] : 'TRUE'
57
+ @skipcmd = cmd_opts.key?(:skip_cmd_shell) ? cmd_opts[:skip_cmd_shell] : 'FALSE'
58
+ end
59
+
60
+ def validate_opts(session_opts, cmd_opts)
61
+ raise 'session_opts is required' unless session_opts
62
+ raise 'cmd_opts[:shell_id] is required' unless cmd_opts[:shell_id]
63
+ raise 'cmd_opts[:command] is required' unless cmd_opts[:command]
64
+ end
65
+
66
+ def issue69_unescape_single_quotes(xml)
67
+ escaped_cmd = %r{<#{NS_WIN_SHELL}:Command>(.+)<\/#{NS_WIN_SHELL}:Command>}m.match(xml)[1]
68
+ xml[escaped_cmd] = escaped_cmd.gsub(/&#39;/, "'")
69
+ xml
70
+ end
71
+
72
+ def command_body
73
+ {
74
+ "#{NS_WIN_SHELL}:Command" => "\"#{@command}\"", "#{NS_WIN_SHELL}:Arguments" => @arguments
75
+ }
76
+ end
77
+
78
+ def command_headers
79
+ merge_headers(shared_headers(@session_opts),
80
+ resource_uri_shell(@shell_uri),
81
+ action_command,
82
+ command_header_opts,
83
+ selector_shell_id(@shell_id))
84
+ end
85
+
86
+ def command_header_opts
87
+ return {} if @shell_uri != RESOURCE_URI_CMD
88
+ # this is only needed for the regular Windows shell
89
+ {
90
+ "#{NS_WSMAN_DMTF}:OptionSet" => {
91
+ "#{NS_WSMAN_DMTF}:Option" => [@consolemode, @skipcmd], :attributes! => {
92
+ "#{NS_WSMAN_DMTF}:Option" => {
93
+ 'Name' => %w(WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL)
94
+ }
95
+ }
96
+ }
97
+ }
98
+ end
99
+ end
100
+ end
101
+ end
@@ -1,76 +1,76 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
-
19
- module WinRM
20
- module WSMV
21
- # WSMV message to get output from a remote shell
22
- class CommandOutput < Base
23
- def initialize(session_opts, command_out_opts)
24
- raise 'command_out_opts[:shell_id] is required' unless command_out_opts[:shell_id]
25
- raise 'command_out_opts[:command_id] is required' unless command_out_opts[:command_id]
26
- @session_opts = session_opts
27
- @shell_id = command_out_opts[:shell_id]
28
- @command_id = command_out_opts[:command_id]
29
- @shell_uri = command_out_opts[:shell_uri] || RESOURCE_URI_CMD
30
- @out_streams = command_out_opts[:out_streams] || %w(stdout stderr)
31
- end
32
-
33
- protected
34
-
35
- def create_header(header)
36
- header << Gyoku.xml(output_header)
37
- end
38
-
39
- def create_body(body)
40
- body.tag!("#{NS_WIN_SHELL}:Receive") { |cl| cl << Gyoku.xml(output_body) }
41
- end
42
-
43
- private
44
-
45
- def output_header
46
- merge_headers(shared_headers(@session_opts),
47
- resource_uri_shell(@shell_uri),
48
- action_receive,
49
- header_opts,
50
- selector_shell_id(@shell_id))
51
- end
52
-
53
- def header_opts
54
- {
55
- "#{NS_WSMAN_DMTF}:OptionSet" => {
56
- "#{NS_WSMAN_DMTF}:Option" => 'TRUE', :attributes! => {
57
- "#{NS_WSMAN_DMTF}:Option" => {
58
- 'Name' => 'WSMAN_CMDSHELL_OPTION_KEEPALIVE'
59
- }
60
- }
61
- }
62
- }
63
- end
64
-
65
- def output_body
66
- {
67
- "#{NS_WIN_SHELL}:DesiredStream" => @out_streams.join(' '), :attributes! => {
68
- "#{NS_WIN_SHELL}:DesiredStream" => {
69
- 'CommandId' => @command_id
70
- }
71
- }
72
- }
73
- end
74
- end
75
- end
76
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+
19
+ module WinRM
20
+ module WSMV
21
+ # WSMV message to get output from a remote shell
22
+ class CommandOutput < Base
23
+ def initialize(session_opts, command_out_opts)
24
+ raise 'command_out_opts[:shell_id] is required' unless command_out_opts[:shell_id]
25
+ raise 'command_out_opts[:command_id] is required' unless command_out_opts[:command_id]
26
+ @session_opts = session_opts
27
+ @shell_id = command_out_opts[:shell_id]
28
+ @command_id = command_out_opts[:command_id]
29
+ @shell_uri = command_out_opts[:shell_uri] || RESOURCE_URI_CMD
30
+ @out_streams = command_out_opts[:out_streams] || %w(stdout stderr)
31
+ end
32
+
33
+ protected
34
+
35
+ def create_header(header)
36
+ header << Gyoku.xml(output_header)
37
+ end
38
+
39
+ def create_body(body)
40
+ body.tag!("#{NS_WIN_SHELL}:Receive") { |cl| cl << Gyoku.xml(output_body) }
41
+ end
42
+
43
+ private
44
+
45
+ def output_header
46
+ merge_headers(shared_headers(@session_opts),
47
+ resource_uri_shell(@shell_uri),
48
+ action_receive,
49
+ header_opts,
50
+ selector_shell_id(@shell_id))
51
+ end
52
+
53
+ def header_opts
54
+ {
55
+ "#{NS_WSMAN_DMTF}:OptionSet" => {
56
+ "#{NS_WSMAN_DMTF}:Option" => 'TRUE', :attributes! => {
57
+ "#{NS_WSMAN_DMTF}:Option" => {
58
+ 'Name' => 'WSMAN_CMDSHELL_OPTION_KEEPALIVE'
59
+ }
60
+ }
61
+ }
62
+ }
63
+ end
64
+
65
+ def output_body
66
+ {
67
+ "#{NS_WIN_SHELL}:DesiredStream" => @out_streams.join(' '), :attributes! => {
68
+ "#{NS_WIN_SHELL}:DesiredStream" => {
69
+ 'CommandId' => @command_id
70
+ }
71
+ }
72
+ }
73
+ end
74
+ end
75
+ end
76
+ end