winrm 2.2.3 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +13 -1
  3. data/.travis.yml +10 -11
  4. data/Gemfile +2 -3
  5. data/README.md +1 -1
  6. data/Rakefile +3 -4
  7. data/appveyor.yml +1 -2
  8. data/bin/rwinrm +90 -97
  9. data/changelog.md +5 -0
  10. data/lib/winrm.rb +3 -5
  11. data/lib/winrm/connection.rb +84 -86
  12. data/lib/winrm/connection_opts.rb +90 -91
  13. data/lib/winrm/exceptions.rb +14 -2
  14. data/lib/winrm/http/response_handler.rb +127 -96
  15. data/lib/winrm/http/transport.rb +462 -427
  16. data/lib/winrm/http/transport_factory.rb +1 -5
  17. data/lib/winrm/output.rb +1 -2
  18. data/lib/winrm/psrp/fragment.rb +0 -2
  19. data/lib/winrm/psrp/message.rb +1 -3
  20. data/lib/winrm/psrp/message_data.rb +0 -2
  21. data/lib/winrm/psrp/message_data/base.rb +0 -2
  22. data/lib/winrm/psrp/message_data/error_record.rb +0 -2
  23. data/lib/winrm/psrp/message_data/pipeline_host_call.rb +0 -2
  24. data/lib/winrm/psrp/message_data/pipeline_output.rb +48 -54
  25. data/lib/winrm/psrp/message_data/pipeline_state.rb +0 -2
  26. data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +0 -2
  27. data/lib/winrm/psrp/message_data/runspacepool_state.rb +0 -2
  28. data/lib/winrm/psrp/message_data/session_capability.rb +0 -2
  29. data/lib/winrm/psrp/message_defragmenter.rb +2 -2
  30. data/lib/winrm/psrp/message_factory.rb +2 -3
  31. data/lib/winrm/psrp/message_fragmenter.rb +1 -3
  32. data/lib/winrm/psrp/powershell_output_decoder.rb +0 -2
  33. data/lib/winrm/psrp/receive_response_reader.rb +3 -5
  34. data/lib/winrm/psrp/uuid.rb +1 -2
  35. data/lib/winrm/shells/base.rb +6 -4
  36. data/lib/winrm/shells/cmd.rb +63 -65
  37. data/lib/winrm/shells/power_shell.rb +207 -202
  38. data/lib/winrm/shells/retryable.rb +44 -45
  39. data/lib/winrm/shells/shell_factory.rb +0 -2
  40. data/lib/winrm/version.rb +1 -3
  41. data/lib/winrm/wsmv/base.rb +0 -2
  42. data/lib/winrm/wsmv/cleanup_command.rb +1 -2
  43. data/lib/winrm/wsmv/close_shell.rb +1 -2
  44. data/lib/winrm/wsmv/command.rb +2 -3
  45. data/lib/winrm/wsmv/command_output.rb +2 -3
  46. data/lib/winrm/wsmv/command_output_decoder.rb +1 -2
  47. data/lib/winrm/wsmv/configuration.rb +0 -2
  48. data/lib/winrm/wsmv/create_pipeline.rb +0 -2
  49. data/lib/winrm/wsmv/create_shell.rb +2 -6
  50. data/lib/winrm/wsmv/header.rb +213 -215
  51. data/lib/winrm/wsmv/init_runspace_pool.rb +96 -95
  52. data/lib/winrm/wsmv/iso8601_duration.rb +0 -2
  53. data/lib/winrm/wsmv/keep_alive.rb +0 -2
  54. data/lib/winrm/wsmv/receive_response_reader.rb +128 -126
  55. data/lib/winrm/wsmv/send_data.rb +0 -2
  56. data/lib/winrm/wsmv/soap.rb +0 -2
  57. data/lib/winrm/wsmv/wql_pull.rb +54 -56
  58. data/lib/winrm/wsmv/wql_query.rb +98 -99
  59. data/lib/winrm/wsmv/write_stdin.rb +0 -2
  60. data/tests/integration/auth_timeout_spec.rb +0 -1
  61. data/tests/integration/cmd_spec.rb +2 -3
  62. data/tests/integration/issue_59_spec.rb +0 -1
  63. data/tests/integration/powershell_spec.rb +4 -5
  64. data/tests/integration/spec_helper.rb +3 -6
  65. data/tests/integration/transport_spec.rb +0 -1
  66. data/tests/integration/wql_spec.rb +33 -34
  67. data/tests/matchers.rb +2 -3
  68. data/tests/spec/configuration_spec.rb +0 -1
  69. data/tests/spec/connection_spec.rb +0 -2
  70. data/tests/spec/exception_spec.rb +0 -1
  71. data/tests/spec/http/transport_factory_spec.rb +1 -3
  72. data/tests/spec/http/transport_spec.rb +0 -1
  73. data/tests/spec/output_spec.rb +4 -3
  74. data/tests/spec/psrp/fragment_spec.rb +0 -2
  75. data/tests/spec/psrp/message_data/base_spec.rb +0 -2
  76. data/tests/spec/psrp/message_data/error_record_spec.rb +0 -2
  77. data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +0 -2
  78. data/tests/spec/psrp/message_data/pipeline_output_spec.rb +0 -2
  79. data/tests/spec/psrp/message_data/pipeline_state_spec.rb +0 -2
  80. data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +0 -2
  81. data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +0 -2
  82. data/tests/spec/psrp/message_data/session_capability_spec.rb +0 -2
  83. data/tests/spec/psrp/message_data_spec.rb +0 -2
  84. data/tests/spec/psrp/message_defragmenter_spec.rb +0 -2
  85. data/tests/spec/psrp/message_fragmenter_spec.rb +0 -2
  86. data/tests/spec/psrp/powershell_output_decoder_spec.rb +0 -2
  87. data/tests/spec/psrp/psrp_message_spec.rb +10 -7
  88. data/tests/spec/psrp/recieve_response_reader_spec.rb +0 -2
  89. data/tests/spec/psrp/uuid_spec.rb +2 -2
  90. data/tests/spec/response_handler_spec.rb +69 -61
  91. data/tests/spec/shells/base_spec.rb +7 -5
  92. data/tests/spec/shells/cmd_spec.rb +4 -4
  93. data/tests/spec/shells/powershell_spec.rb +221 -175
  94. data/tests/spec/spec_helper.rb +0 -1
  95. data/tests/spec/stubs/responses/get_omi_command_output_response.xml.erb +23 -0
  96. data/tests/spec/stubs/responses/get_omi_command_output_response_not_done.xml.erb +24 -0
  97. data/tests/spec/stubs/responses/get_omi_config_response.xml +45 -0
  98. data/tests/spec/stubs/responses/get_omi_powershell_keepalive_response.xml.erb +33 -0
  99. data/tests/spec/stubs/responses/open_shell_omi.xml +43 -0
  100. data/tests/spec/stubs/responses/soap_fault_omi.xml +31 -0
  101. data/tests/spec/wsmv/cleanup_command_spec.rb +0 -2
  102. data/tests/spec/wsmv/close_shell_spec.rb +0 -2
  103. data/tests/spec/wsmv/command_output_decoder_spec.rb +0 -2
  104. data/tests/spec/wsmv/command_output_spec.rb +1 -3
  105. data/tests/spec/wsmv/command_spec.rb +0 -2
  106. data/tests/spec/wsmv/configuration_spec.rb +0 -2
  107. data/tests/spec/wsmv/create_pipeline_spec.rb +2 -3
  108. data/tests/spec/wsmv/create_shell_spec.rb +6 -5
  109. data/tests/spec/wsmv/init_runspace_pool_spec.rb +38 -36
  110. data/tests/spec/wsmv/keep_alive_spec.rb +4 -4
  111. data/tests/spec/wsmv/receive_response_reader_spec.rb +124 -123
  112. data/tests/spec/wsmv/send_data_spec.rb +4 -4
  113. data/tests/spec/wsmv/wql_query_spec.rb +11 -13
  114. data/tests/spec/wsmv/write_stdin_spec.rb +0 -2
  115. data/winrm.gemspec +11 -12
  116. metadata +73 -67
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/winrm/version.rb CHANGED
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
-
3
1
  # WinRM module
4
2
  module WinRM
5
3
  # The version of the WinRM library
6
- VERSION = '2.2.3'.freeze
4
+ VERSION = '2.3.0'.freeze
7
5
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +21,7 @@ module WinRM
23
21
  def initialize(session_opts, opts)
24
22
  raise 'opts[:shell_id] is required' unless opts[:shell_id]
25
23
  raise 'opts[:command_id] is required' unless opts[:command_id]
24
+
26
25
  @session_opts = session_opts
27
26
  @shell_id = opts[:shell_id]
28
27
  @command_id = opts[:command_id]
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +20,7 @@ module WinRM
22
20
  class CloseShell < Base
23
21
  def initialize(session_opts, shell_opts)
24
22
  raise 'shell_opts[:shell_id] is required' unless shell_opts[:shell_id]
23
+
25
24
  @session_opts = session_opts
26
25
  @shell_id = shell_opts[:shell_id]
27
26
  @shell_uri = shell_opts[:shell_uri] || RESOURCE_URI_CMD
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -85,12 +83,13 @@ module WinRM
85
83
 
86
84
  def command_header_opts
87
85
  return {} if @shell_uri != RESOURCE_URI_CMD
86
+
88
87
  # this is only needed for the regular Windows shell
89
88
  {
90
89
  "#{NS_WSMAN_DMTF}:OptionSet" => {
91
90
  "#{NS_WSMAN_DMTF}:Option" => [@consolemode, @skipcmd], :attributes! => {
92
91
  "#{NS_WSMAN_DMTF}:Option" => {
93
- 'Name' => %w(WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL)
92
+ 'Name' => %w[WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL]
94
93
  }
95
94
  }
96
95
  }
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,11 +21,12 @@ module WinRM
23
21
  def initialize(session_opts, command_out_opts)
24
22
  raise 'command_out_opts[:shell_id] is required' unless command_out_opts[:shell_id]
25
23
  raise 'command_out_opts[:command_id] is required' unless command_out_opts[:command_id]
24
+
26
25
  @session_opts = session_opts
27
26
  @shell_id = command_out_opts[:shell_id]
28
27
  @command_id = command_out_opts[:command_id]
29
28
  @shell_uri = command_out_opts[:shell_uri] || RESOURCE_URI_CMD
30
- @out_streams = command_out_opts[:out_streams] || %w(stdout stderr)
29
+ @out_streams = command_out_opts[:out_streams] || %w[stdout stderr]
31
30
  end
32
31
 
33
32
  protected
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,6 +37,7 @@ module WinRM
39
37
 
40
38
  def handle_invalid_encoding(decoded_text)
41
39
  return decoded_text if decoded_text.valid_encoding?
40
+
42
41
  if decoded_text.respond_to?(:scrub)
43
42
  decoded_text.scrub
44
43
  else
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -62,9 +60,7 @@ module WinRM
62
60
  "#{NS_WIN_SHELL}:OutputStreams" => @o_stream
63
61
  }
64
62
  body["#{NS_WIN_SHELL}:WorkingDirectory"] = @working_directory if @working_directory
65
- if @idle_timeout
66
- body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout)
67
- end
63
+ body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout) if @idle_timeout
68
64
  body["#{NS_WIN_SHELL}:Environment"] = environment_vars_body if @env_vars
69
65
  body
70
66
  end
@@ -108,7 +104,7 @@ module WinRM
108
104
  "#{NS_WSMAN_DMTF}:OptionSet" => {
109
105
  "#{NS_WSMAN_DMTF}:Option" => [@noprofile, @codepage], :attributes! => {
110
106
  "#{NS_WSMAN_DMTF}:Option" => {
111
- 'Name' => %w(WINRS_NOPROFILE WINRS_CODEPAGE)
107
+ 'Name' => %w[WINRS_NOPROFILE WINRS_CODEPAGE]
112
108
  }
113
109
  }
114
110
  }
@@ -1,215 +1,213 @@
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
- # rubocop:disable Metrics/MethodLength
18
-
19
- require_relative 'soap'
20
- require_relative 'iso8601_duration'
21
-
22
- module WinRM
23
- module WSMV
24
- # SOAP header utility mixin
25
- module Header
26
- # WSMan URI of the regular Windows cmd shell
27
- RESOURCE_URI_CMD = 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd'.freeze
28
-
29
- # WSMan URI for PowerShell
30
- RESOURCE_URI_POWERSHELL = 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'.freeze
31
-
32
- # Merge the various header hashes and make sure we carry all of the attributes
33
- # through instead of overwriting them.
34
- def merge_headers(*headers)
35
- hdr = {}
36
- headers.each do |h|
37
- hdr.merge!(h) do |k, v1, v2|
38
- v1.merge!(v2) if k == :attributes!
39
- end
40
- end
41
- hdr
42
- end
43
-
44
- def shared_headers(session_opts)
45
- {
46
- "#{SOAP::NS_ADDRESSING}:To" => session_opts[:endpoint],
47
- "#{SOAP::NS_ADDRESSING}:ReplyTo" => {
48
- "#{SOAP::NS_ADDRESSING}:Address" =>
49
- 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous',
50
- :attributes! => {
51
- "#{SOAP::NS_ADDRESSING}:Address" => {
52
- 'mustUnderstand' => true
53
- }
54
- }
55
- },
56
- "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => session_opts[:max_envelope_size],
57
- "#{SOAP::NS_ADDRESSING}:MessageID" => "uuid:#{SecureRandom.uuid.to_s.upcase}",
58
- "#{SOAP::NS_WSMAN_MSFT}:SessionId" => "uuid:#{session_opts[:session_id]}",
59
- "#{SOAP::NS_WSMAN_DMTF}:Locale/" => '',
60
- "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => '',
61
- "#{SOAP::NS_WSMAN_DMTF}:OperationTimeout" =>
62
- Iso8601Duration.sec_to_dur(session_opts[:operation_timeout]),
63
- :attributes! => {
64
- "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => { 'mustUnderstand' => true },
65
- "#{SOAP::NS_WSMAN_DMTF}:Locale/" => {
66
- 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
67
- },
68
- "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => {
69
- 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
70
- },
71
- "#{SOAP::NS_WSMAN_MSFT}:SessionId" => { 'mustUnderstand' => false }
72
- }
73
- }
74
- end
75
-
76
- # Helper methods for SOAP Headers
77
-
78
- def resource_uri_shell(shell_uri)
79
- {
80
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => shell_uri, :attributes! => {
81
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
82
- 'mustUnderstand' => true
83
- }
84
- }
85
- }
86
- end
87
-
88
- def resource_uri_cmd
89
- resource_uri_shell(RESOURCE_URI_CMD)
90
- end
91
-
92
- def resource_uri_wmi(namespace = 'root/cimv2/*')
93
- {
94
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" =>
95
- "http://schemas.microsoft.com/wbem/wsman/1/wmi/#{namespace}",
96
- :attributes! => {
97
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
98
- 'mustUnderstand' => true
99
- }
100
- }
101
- }
102
- end
103
-
104
- def action_get
105
- {
106
- "#{SOAP::NS_ADDRESSING}:Action" =>
107
- 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get',
108
- :attributes! => {
109
- "#{SOAP::NS_ADDRESSING}:Action" => {
110
- 'mustUnderstand' => true
111
- }
112
- }
113
- }
114
- end
115
-
116
- def action_delete
117
- {
118
- "#{SOAP::NS_ADDRESSING}:Action" =>
119
- 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete',
120
- :attributes! => {
121
- "#{SOAP::NS_ADDRESSING}:Action" => {
122
- 'mustUnderstand' => true
123
- }
124
- }
125
- }
126
- end
127
-
128
- def action_command
129
- {
130
- "#{SOAP::NS_ADDRESSING}:Action" =>
131
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command',
132
- :attributes! => {
133
- "#{SOAP::NS_ADDRESSING}:Action" => {
134
- 'mustUnderstand' => true
135
- }
136
- }
137
- }
138
- end
139
-
140
- def action_receive
141
- {
142
- "#{SOAP::NS_ADDRESSING}:Action" =>
143
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive',
144
- :attributes! => {
145
- "#{SOAP::NS_ADDRESSING}:Action" => {
146
- 'mustUnderstand' => true
147
- }
148
- }
149
- }
150
- end
151
-
152
- def action_send
153
- {
154
- "#{SOAP::NS_ADDRESSING}:Action" =>
155
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Send',
156
- :attributes! => {
157
- "#{SOAP::NS_ADDRESSING}:Action" => {
158
- 'mustUnderstand' => true
159
- }
160
- }
161
- }
162
- end
163
-
164
- def action_signal
165
- {
166
- "#{SOAP::NS_ADDRESSING}:Action" =>
167
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal',
168
- :attributes! => {
169
- "#{SOAP::NS_ADDRESSING}:Action" => {
170
- 'mustUnderstand' => true
171
- }
172
- }
173
- }
174
- end
175
-
176
- def action_enumerate
177
- {
178
- "#{SOAP::NS_ADDRESSING}:Action" =>
179
- 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate',
180
- :attributes! => {
181
- "#{SOAP::NS_ADDRESSING}:Action" => {
182
- 'mustUnderstand' => true
183
- }
184
- }
185
- }
186
- end
187
-
188
- def action_enumerate_pull
189
- {
190
- "#{SOAP::NS_ADDRESSING}:Action" =>
191
- 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull',
192
- :attributes! => {
193
- "#{SOAP::NS_ADDRESSING}:Action" => {
194
- 'mustUnderstand' => true
195
- }
196
- }
197
- }
198
- end
199
-
200
- def selector_shell_id(shell_id)
201
- {
202
- "#{SOAP::NS_WSMAN_DMTF}:SelectorSet" => {
203
- "#{SOAP::NS_WSMAN_DMTF}:Selector" => shell_id, :attributes! => {
204
- "#{SOAP::NS_WSMAN_DMTF}:Selector" => {
205
- 'Name' => 'ShellId'
206
- }
207
- }
208
- }
209
- }
210
- end
211
- end
212
- end
213
- end
214
-
215
- # rubocop:enable Metrics/MethodLength
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
+ # rubocop:disable Metrics/MethodLength
16
+
17
+ require_relative 'soap'
18
+ require_relative 'iso8601_duration'
19
+
20
+ module WinRM
21
+ module WSMV
22
+ # SOAP header utility mixin
23
+ module Header
24
+ # WSMan URI of the regular Windows cmd shell
25
+ RESOURCE_URI_CMD = 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd'.freeze
26
+
27
+ # WSMan URI for PowerShell
28
+ RESOURCE_URI_POWERSHELL = 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'.freeze
29
+
30
+ # Merge the various header hashes and make sure we carry all of the attributes
31
+ # through instead of overwriting them.
32
+ def merge_headers(*headers)
33
+ hdr = {}
34
+ headers.each do |h|
35
+ hdr.merge!(h) do |k, v1, v2|
36
+ v1.merge!(v2) if k == :attributes!
37
+ end
38
+ end
39
+ hdr
40
+ end
41
+
42
+ def shared_headers(session_opts)
43
+ {
44
+ "#{SOAP::NS_ADDRESSING}:To" => session_opts[:endpoint],
45
+ "#{SOAP::NS_ADDRESSING}:ReplyTo" => {
46
+ "#{SOAP::NS_ADDRESSING}:Address" =>
47
+ 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous',
48
+ :attributes! => {
49
+ "#{SOAP::NS_ADDRESSING}:Address" => {
50
+ 'mustUnderstand' => true
51
+ }
52
+ }
53
+ },
54
+ "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => session_opts[:max_envelope_size],
55
+ "#{SOAP::NS_ADDRESSING}:MessageID" => "uuid:#{SecureRandom.uuid.to_s.upcase}",
56
+ "#{SOAP::NS_WSMAN_MSFT}:SessionId" => "uuid:#{session_opts[:session_id]}",
57
+ "#{SOAP::NS_WSMAN_DMTF}:Locale/" => '',
58
+ "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => '',
59
+ "#{SOAP::NS_WSMAN_DMTF}:OperationTimeout" =>
60
+ Iso8601Duration.sec_to_dur(session_opts[:operation_timeout]),
61
+ :attributes! => {
62
+ "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => { 'mustUnderstand' => true },
63
+ "#{SOAP::NS_WSMAN_DMTF}:Locale/" => {
64
+ 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
65
+ },
66
+ "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => {
67
+ 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
68
+ },
69
+ "#{SOAP::NS_WSMAN_MSFT}:SessionId" => { 'mustUnderstand' => false }
70
+ }
71
+ }
72
+ end
73
+
74
+ # Helper methods for SOAP Headers
75
+
76
+ def resource_uri_shell(shell_uri)
77
+ {
78
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => shell_uri, :attributes! => {
79
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
80
+ 'mustUnderstand' => true
81
+ }
82
+ }
83
+ }
84
+ end
85
+
86
+ def resource_uri_cmd
87
+ resource_uri_shell(RESOURCE_URI_CMD)
88
+ end
89
+
90
+ def resource_uri_wmi(namespace = 'root/cimv2/*')
91
+ {
92
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" =>
93
+ "http://schemas.microsoft.com/wbem/wsman/1/wmi/#{namespace}",
94
+ :attributes! => {
95
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
96
+ 'mustUnderstand' => true
97
+ }
98
+ }
99
+ }
100
+ end
101
+
102
+ def action_get
103
+ {
104
+ "#{SOAP::NS_ADDRESSING}:Action" =>
105
+ 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get',
106
+ :attributes! => {
107
+ "#{SOAP::NS_ADDRESSING}:Action" => {
108
+ 'mustUnderstand' => true
109
+ }
110
+ }
111
+ }
112
+ end
113
+
114
+ def action_delete
115
+ {
116
+ "#{SOAP::NS_ADDRESSING}:Action" =>
117
+ 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete',
118
+ :attributes! => {
119
+ "#{SOAP::NS_ADDRESSING}:Action" => {
120
+ 'mustUnderstand' => true
121
+ }
122
+ }
123
+ }
124
+ end
125
+
126
+ def action_command
127
+ {
128
+ "#{SOAP::NS_ADDRESSING}:Action" =>
129
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command',
130
+ :attributes! => {
131
+ "#{SOAP::NS_ADDRESSING}:Action" => {
132
+ 'mustUnderstand' => true
133
+ }
134
+ }
135
+ }
136
+ end
137
+
138
+ def action_receive
139
+ {
140
+ "#{SOAP::NS_ADDRESSING}:Action" =>
141
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive',
142
+ :attributes! => {
143
+ "#{SOAP::NS_ADDRESSING}:Action" => {
144
+ 'mustUnderstand' => true
145
+ }
146
+ }
147
+ }
148
+ end
149
+
150
+ def action_send
151
+ {
152
+ "#{SOAP::NS_ADDRESSING}:Action" =>
153
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Send',
154
+ :attributes! => {
155
+ "#{SOAP::NS_ADDRESSING}:Action" => {
156
+ 'mustUnderstand' => true
157
+ }
158
+ }
159
+ }
160
+ end
161
+
162
+ def action_signal
163
+ {
164
+ "#{SOAP::NS_ADDRESSING}:Action" =>
165
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal',
166
+ :attributes! => {
167
+ "#{SOAP::NS_ADDRESSING}:Action" => {
168
+ 'mustUnderstand' => true
169
+ }
170
+ }
171
+ }
172
+ end
173
+
174
+ def action_enumerate
175
+ {
176
+ "#{SOAP::NS_ADDRESSING}:Action" =>
177
+ 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate',
178
+ :attributes! => {
179
+ "#{SOAP::NS_ADDRESSING}:Action" => {
180
+ 'mustUnderstand' => true
181
+ }
182
+ }
183
+ }
184
+ end
185
+
186
+ def action_enumerate_pull
187
+ {
188
+ "#{SOAP::NS_ADDRESSING}:Action" =>
189
+ 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull',
190
+ :attributes! => {
191
+ "#{SOAP::NS_ADDRESSING}:Action" => {
192
+ 'mustUnderstand' => true
193
+ }
194
+ }
195
+ }
196
+ end
197
+
198
+ def selector_shell_id(shell_id)
199
+ {
200
+ "#{SOAP::NS_WSMAN_DMTF}:SelectorSet" => {
201
+ "#{SOAP::NS_WSMAN_DMTF}:Selector" => shell_id, :attributes! => {
202
+ "#{SOAP::NS_WSMAN_DMTF}:Selector" => {
203
+ 'Name' => 'ShellId'
204
+ }
205
+ }
206
+ }
207
+ }
208
+ end
209
+ end
210
+ end
211
+ end
212
+
213
+ # rubocop:enable Metrics/MethodLength