winrm 1.8.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +10 -11
  3. data/.rubocop.yml +26 -22
  4. data/.travis.yml +11 -12
  5. data/Gemfile +3 -9
  6. data/LICENSE +202 -202
  7. data/README.md +232 -215
  8. data/Rakefile +34 -36
  9. data/Vagrantfile +6 -9
  10. data/WinrmAppveyor.psm1 +31 -31
  11. data/appveyor.yml +51 -51
  12. data/bin/rwinrm +97 -97
  13. data/changelog.md +86 -86
  14. data/lib/winrm.rb +39 -42
  15. data/lib/winrm/connection.rb +82 -0
  16. data/lib/winrm/connection_opts.rb +87 -0
  17. data/lib/winrm/{exceptions/exceptions.rb → exceptions.rb} +76 -57
  18. data/lib/winrm/http/response_handler.rb +96 -82
  19. data/lib/winrm/http/transport.rb +424 -435
  20. data/lib/winrm/http/transport_factory.rb +68 -0
  21. data/lib/winrm/output.rb +59 -43
  22. data/lib/winrm/psrp/create_pipeline.xml.erb +167 -0
  23. data/lib/winrm/psrp/fragment.rb +70 -0
  24. data/lib/winrm/psrp/init_runspace_pool.xml.erb +224 -0
  25. data/lib/winrm/psrp/message.rb +130 -0
  26. data/lib/winrm/psrp/message_data.rb +41 -0
  27. data/lib/winrm/psrp/message_data/base.rb +49 -0
  28. data/lib/winrm/psrp/message_data/error_record.rb +68 -0
  29. data/lib/winrm/psrp/message_data/pipeline_host_call.rb +32 -0
  30. data/lib/winrm/psrp/message_data/pipeline_output.rb +49 -0
  31. data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +32 -0
  32. data/lib/winrm/psrp/message_data/runspacepool_state.rb +39 -0
  33. data/lib/winrm/psrp/message_data/session_capability.rb +36 -0
  34. data/lib/winrm/psrp/message_defragmenter.rb +62 -0
  35. data/lib/winrm/psrp/message_factory.rb +75 -0
  36. data/lib/winrm/psrp/message_fragmenter.rb +60 -0
  37. data/lib/winrm/psrp/powershell_output_decoder.rb +120 -0
  38. data/lib/winrm/psrp/receive_response_reader.rb +93 -0
  39. data/lib/winrm/psrp/session_capability.xml.erb +7 -0
  40. data/lib/winrm/psrp/uuid.rb +40 -0
  41. data/lib/winrm/shells/base.rb +175 -0
  42. data/lib/winrm/shells/cmd.rb +65 -0
  43. data/lib/winrm/shells/power_shell.rb +201 -0
  44. data/lib/winrm/shells/retryable.rb +45 -0
  45. data/lib/winrm/shells/shell_factory.rb +50 -0
  46. data/lib/winrm/version.rb +7 -7
  47. data/lib/winrm/wsmv/base.rb +59 -0
  48. data/lib/winrm/wsmv/cleanup_command.rb +61 -0
  49. data/lib/winrm/wsmv/close_shell.rb +50 -0
  50. data/lib/winrm/wsmv/command.rb +101 -0
  51. data/lib/winrm/wsmv/command_output.rb +76 -0
  52. data/lib/winrm/wsmv/command_output_decoder.rb +55 -0
  53. data/lib/winrm/wsmv/configuration.rb +46 -0
  54. data/lib/winrm/wsmv/create_pipeline.rb +66 -0
  55. data/lib/winrm/wsmv/create_shell.rb +119 -0
  56. data/lib/winrm/wsmv/header.rb +203 -0
  57. data/lib/winrm/wsmv/init_runspace_pool.rb +95 -0
  58. data/lib/winrm/wsmv/iso8601_duration.rb +60 -0
  59. data/lib/winrm/wsmv/keep_alive.rb +68 -0
  60. data/lib/winrm/wsmv/receive_response_reader.rb +128 -0
  61. data/lib/winrm/wsmv/send_data.rb +68 -0
  62. data/lib/winrm/wsmv/soap.rb +51 -0
  63. data/lib/winrm/wsmv/wql_query.rb +79 -0
  64. data/lib/winrm/wsmv/write_stdin.rb +88 -0
  65. data/preamble +17 -17
  66. data/{spec → tests/integration}/auth_timeout_spec.rb +18 -16
  67. data/{spec → tests/integration}/cmd_spec.rb +104 -102
  68. data/{spec → tests/integration}/config-example.yml +16 -19
  69. data/{spec → tests/integration}/issue_59_spec.rb +26 -23
  70. data/tests/integration/powershell_spec.rb +154 -0
  71. data/{spec → tests/integration}/spec_helper.rb +65 -73
  72. data/{spec → tests/integration}/transport_spec.rb +99 -139
  73. data/{spec → tests/integration}/wql_spec.rb +16 -14
  74. data/{spec → tests}/matchers.rb +60 -74
  75. data/tests/spec/configuration_spec.rb +93 -0
  76. data/tests/spec/connection_spec.rb +39 -0
  77. data/{spec → tests/spec}/exception_spec.rb +50 -50
  78. data/tests/spec/http/transport_factory_spec.rb +68 -0
  79. data/tests/spec/http/transport_spec.rb +44 -0
  80. data/{spec → tests/spec}/output_spec.rb +127 -110
  81. data/tests/spec/psrp/fragment_spec.rb +62 -0
  82. data/tests/spec/psrp/message_data/base_spec.rb +13 -0
  83. data/tests/spec/psrp/message_data/error_record_spec.rb +41 -0
  84. data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +25 -0
  85. data/tests/spec/psrp/message_data/pipeline_output_spec.rb +32 -0
  86. data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +25 -0
  87. data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +16 -0
  88. data/tests/spec/psrp/message_data/session_capability_spec.rb +30 -0
  89. data/tests/spec/psrp/message_data_spec.rb +35 -0
  90. data/tests/spec/psrp/message_defragmenter_spec.rb +47 -0
  91. data/tests/spec/psrp/message_fragmenter_spec.rb +105 -0
  92. data/tests/spec/psrp/powershell_output_decoder_spec.rb +84 -0
  93. data/tests/spec/psrp/psrp_message_spec.rb +70 -0
  94. data/tests/spec/psrp/recieve_response_reader_spec.rb +154 -0
  95. data/tests/spec/psrp/uuid_spec.rb +28 -0
  96. data/{spec → tests/spec}/response_handler_spec.rb +61 -61
  97. data/tests/spec/shells/base_spec.rb +202 -0
  98. data/tests/spec/shells/cmd_spec.rb +75 -0
  99. data/tests/spec/shells/powershell_spec.rb +175 -0
  100. data/tests/spec/spec_helper.rb +47 -0
  101. data/tests/spec/stubs/clixml/error_record.xml.erb +84 -0
  102. data/{spec → 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 -0
  104. data/tests/spec/stubs/responses/get_powershell_keepalive_response.xml.erb +10 -0
  105. data/tests/spec/stubs/responses/get_powershell_output_response.xml.erb +12 -0
  106. data/tests/spec/stubs/responses/get_powershell_output_response_not_done.xml.erb +9 -0
  107. data/{spec → tests/spec}/stubs/responses/open_shell_v1.xml +19 -19
  108. data/{spec → tests/spec}/stubs/responses/open_shell_v2.xml +20 -20
  109. data/{spec → tests/spec}/stubs/responses/soap_fault_v1.xml +36 -36
  110. data/{spec → tests/spec}/stubs/responses/soap_fault_v2.xml +42 -42
  111. data/{spec → tests/spec}/stubs/responses/wmi_error_v2.xml +41 -41
  112. data/tests/spec/wsmv/cleanup_command_spec.rb +22 -0
  113. data/tests/spec/wsmv/close_shell_spec.rb +17 -0
  114. data/{spec → tests/spec/wsmv}/command_output_decoder_spec.rb +37 -37
  115. data/tests/spec/wsmv/command_output_spec.rb +45 -0
  116. data/tests/spec/wsmv/command_spec.rb +19 -0
  117. data/tests/spec/wsmv/configuration_spec.rb +17 -0
  118. data/tests/spec/wsmv/create_pipeline_spec.rb +31 -0
  119. data/tests/spec/wsmv/create_shell_spec.rb +38 -0
  120. data/tests/spec/wsmv/init_runspace_pool_spec.rb +36 -0
  121. data/tests/spec/wsmv/keep_alive_spec.rb +21 -0
  122. data/tests/spec/wsmv/receive_response_reader_spec.rb +123 -0
  123. data/tests/spec/wsmv/send_data_spec.rb +30 -0
  124. data/tests/spec/wsmv/wql_query_spec.rb +13 -0
  125. data/tests/spec/wsmv/write_stdin_spec.rb +22 -0
  126. data/winrm.gemspec +42 -40
  127. metadata +140 -38
  128. data/.rspec +0 -3
  129. data/lib/winrm/command_executor.rb +0 -243
  130. data/lib/winrm/command_output_decoder.rb +0 -53
  131. data/lib/winrm/helpers/iso8601_duration.rb +0 -58
  132. data/lib/winrm/helpers/powershell_script.rb +0 -42
  133. data/lib/winrm/soap_provider.rb +0 -39
  134. data/lib/winrm/winrm_service.rb +0 -550
  135. data/spec/command_executor_spec.rb +0 -475
  136. data/spec/issue_184_spec.rb +0 -67
  137. data/spec/powershell_spec.rb +0 -97
  138. data/spec/winrm_options_spec.rb +0 -76
  139. data/spec/winrm_primitives_spec.rb +0 -51
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'winrm/wsmv/send_data'
4
+
5
+ describe WinRM::WSMV::SendData do
6
+ context 'default session options' do
7
+ let(:shell_id) { 'D5A2622B-B842-4EB8-8A78-0225C8A993DF' }
8
+ let(:command_id) { 'D5A2622B-B842-4EB8-8A78-0225C8A993DF' }
9
+ let(:fragment) { WinRM::PSRP::Fragment.new(1, [1, 2, 3]) }
10
+ let(:pipeline) { Base64.strict_encode64(fragment.bytes.pack('C*')) }
11
+
12
+ subject do
13
+ described_class.new(
14
+ default_connection_opts,
15
+ shell_id,
16
+ command_id,
17
+ fragment
18
+ )
19
+ end
20
+ let(:xml) { subject.build }
21
+ it 'creates a well formed message' do
22
+ expect(xml).to include('<w:OperationTimeout>PT60S</w:OperationTimeout>')
23
+ expect(xml).to include(
24
+ '<w:SelectorSet><w:Selector Name="ShellId">' \
25
+ "#{shell_id}</w:Selector></w:SelectorSet>")
26
+ expect(xml).to include(
27
+ "<rsp:Stream Name=\"stdin\" CommandId=\"#{command_id}\">#{pipeline}</rsp:Stream>")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'winrm/wsmv/wql_query'
4
+
5
+ describe WinRM::WSMV::WqlQuery do
6
+ context 'default session options' do
7
+ subject { described_class.new(default_connection_opts, 'SELECT * FROM Win32') }
8
+ let(:xml) { subject.build }
9
+ it 'creates a well formed message' do
10
+ expect(xml).to include('<w:OperationTimeout>PT60S</w:OperationTimeout>')
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'base64'
4
+ require 'winrm/wsmv/write_stdin'
5
+
6
+ describe WinRM::WSMV::WriteStdin do
7
+ context 'default session options' do
8
+ stdin_opts = {
9
+ shell_id: 'D5A2622B-B842-4EB8-8A78-0225C8A993DF',
10
+ command_id: 'A2A2622B-B842-4EB8-8A78-0225C8A993DF',
11
+ stdin: 'dir'
12
+ }
13
+ subject { described_class.new(default_connection_opts, stdin_opts) }
14
+ let(:xml) { subject.build }
15
+ it 'creates a well formed message' do
16
+ b64_stdin = Base64.encode64(stdin_opts[:stdin])
17
+ expect(xml).to include('<w:OperationTimeout>PT60S</w:OperationTimeout>')
18
+ expect(xml).to include('<rsp:Stream Name="stdin" ' \
19
+ "CommandId=\"A2A2622B-B842-4EB8-8A78-0225C8A993DF\">#{b64_stdin}</rsp:Stream>")
20
+ end
21
+ end
22
+ end
@@ -1,40 +1,42 @@
1
- # encoding: UTF-8
2
- require 'date'
3
- require File.expand_path('../lib/winrm/version', __FILE__)
4
-
5
- Gem::Specification.new do |s|
6
- s.platform = Gem::Platform::RUBY
7
- s.name = 'winrm'
8
- s.version = WinRM::VERSION
9
- s.date = Date.today.to_s
10
-
11
- s.author = ['Dan Wanek', 'Paul Morton']
12
- s.email = ['dan.wanek@gmail.com', 'paul@themortonsonline.com']
13
- s.homepage = 'https://github.com/WinRb/WinRM'
14
-
15
- s.summary = 'Ruby library for Windows Remote Management'
16
- s.description = <<-EOF
17
- Ruby library for Windows Remote Management
18
- EOF
19
- s.license = 'Apache-2.0'
20
-
21
- s.files = `git ls-files`.split(/\n/)
22
- s.require_path = 'lib'
23
- s.rdoc_options = %w(-x test/ -x examples/)
24
- s.extra_rdoc_files = %w(README.md LICENSE)
25
-
26
- s.bindir = 'bin'
27
- s.executables = ['rwinrm']
28
- s.required_ruby_version = '>= 1.9.0'
29
- s.add_runtime_dependency 'gssapi', '~> 1.2'
30
- s.add_runtime_dependency 'httpclient', '~> 2.2', '>= 2.2.0.2'
31
- s.add_runtime_dependency 'rubyntlm', '~> 0.6.0'
32
- s.add_runtime_dependency 'logging', ['>= 1.6.1', '< 3.0']
33
- s.add_runtime_dependency 'nori', '~> 2.0'
34
- s.add_runtime_dependency 'gyoku', '~> 1.0'
35
- s.add_runtime_dependency 'builder', '>= 2.1.2'
36
- s.add_development_dependency 'rspec', '~> 3.2'
37
- s.add_development_dependency 'rake', '~> 10.3'
38
- s.add_development_dependency 'rubocop', '~> 0.28'
39
- s.add_development_dependency 'pry'
40
- end
1
+ # encoding: UTF-8
2
+ require 'date'
3
+ require File.expand_path('../lib/winrm/version', __FILE__)
4
+
5
+ Gem::Specification.new do |s|
6
+ s.platform = Gem::Platform::RUBY
7
+ s.name = 'winrm'
8
+ s.version = WinRM::VERSION
9
+ s.date = Date.today.to_s
10
+
11
+ s.author = ['Dan Wanek', 'Paul Morton']
12
+ s.email = ['dan.wanek@gmail.com', 'paul@themortonsonline.com']
13
+ s.homepage = 'https://github.com/WinRb/WinRM'
14
+
15
+ s.summary = 'Ruby library for Windows Remote Management'
16
+ s.description = <<-EOF
17
+ Ruby library for Windows Remote Management
18
+ EOF
19
+ s.license = 'Apache-2.0'
20
+
21
+ s.files = `git ls-files`.split(/\n/)
22
+ s.require_path = 'lib'
23
+ s.rdoc_options = %w(-x test/ -x examples/)
24
+ s.extra_rdoc_files = %w(README.md LICENSE)
25
+
26
+ s.bindir = 'bin'
27
+ s.executables = ['rwinrm']
28
+ s.required_ruby_version = '>= 1.9.0'
29
+ s.add_runtime_dependency 'gssapi', '~> 1.2'
30
+ s.add_runtime_dependency 'httpclient', '~> 2.2', '>= 2.2.0.2'
31
+ s.add_runtime_dependency 'rubyntlm', '~> 0.6.0'
32
+ s.add_runtime_dependency 'logging', ['>= 1.6.1', '< 3.0']
33
+ s.add_runtime_dependency 'nori', '~> 2.0'
34
+ s.add_runtime_dependency 'gyoku', '~> 1.0'
35
+ s.add_runtime_dependency 'builder', '>= 2.1.2'
36
+ s.add_runtime_dependency 'erubis', '~> 2.7'
37
+ s.add_development_dependency 'rspec', '~> 3.2'
38
+ s.add_development_dependency 'rake', '~> 10.3'
39
+ s.add_development_dependency 'rubocop', '~> 0.39.0'
40
+ s.add_development_dependency 'pry'
41
+ s.add_development_dependency 'rb-readline'
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winrm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Wanek
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-05-06 00:00:00.000000000 Z
12
+ date: 2016-08-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gssapi
@@ -121,6 +121,20 @@ dependencies:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: 2.1.2
124
+ - !ruby/object:Gem::Dependency
125
+ name: erubis
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '2.7'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.7'
124
138
  - !ruby/object:Gem::Dependency
125
139
  name: rspec
126
140
  requirement: !ruby/object:Gem::Requirement
@@ -155,14 +169,14 @@ dependencies:
155
169
  requirements:
156
170
  - - "~>"
157
171
  - !ruby/object:Gem::Version
158
- version: '0.28'
172
+ version: 0.39.0
159
173
  type: :development
160
174
  prerelease: false
161
175
  version_requirements: !ruby/object:Gem::Requirement
162
176
  requirements:
163
177
  - - "~>"
164
178
  - !ruby/object:Gem::Version
165
- version: '0.28'
179
+ version: 0.39.0
166
180
  - !ruby/object:Gem::Dependency
167
181
  name: pry
168
182
  requirement: !ruby/object:Gem::Requirement
@@ -177,8 +191,21 @@ dependencies:
177
191
  - - ">="
178
192
  - !ruby/object:Gem::Version
179
193
  version: '0'
180
- description: |2
181
- Ruby library for Windows Remote Management
194
+ - !ruby/object:Gem::Dependency
195
+ name: rb-readline
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ description: " Ruby library for Windows Remote Management\n"
182
209
  email:
183
210
  - dan.wanek@gmail.com
184
211
  - paul@themortonsonline.com
@@ -190,7 +217,6 @@ extra_rdoc_files:
190
217
  - LICENSE
191
218
  files:
192
219
  - ".gitignore"
193
- - ".rspec"
194
220
  - ".rubocop.yml"
195
221
  - ".travis.yml"
196
222
  - Gemfile
@@ -203,41 +229,117 @@ files:
203
229
  - bin/rwinrm
204
230
  - changelog.md
205
231
  - lib/winrm.rb
206
- - lib/winrm/command_executor.rb
207
- - lib/winrm/command_output_decoder.rb
208
- - lib/winrm/exceptions/exceptions.rb
209
- - lib/winrm/helpers/iso8601_duration.rb
210
- - lib/winrm/helpers/powershell_script.rb
232
+ - lib/winrm/connection.rb
233
+ - lib/winrm/connection_opts.rb
234
+ - lib/winrm/exceptions.rb
211
235
  - lib/winrm/http/response_handler.rb
212
236
  - lib/winrm/http/transport.rb
237
+ - lib/winrm/http/transport_factory.rb
213
238
  - lib/winrm/output.rb
214
- - lib/winrm/soap_provider.rb
239
+ - lib/winrm/psrp/create_pipeline.xml.erb
240
+ - lib/winrm/psrp/fragment.rb
241
+ - lib/winrm/psrp/init_runspace_pool.xml.erb
242
+ - lib/winrm/psrp/message.rb
243
+ - lib/winrm/psrp/message_data.rb
244
+ - lib/winrm/psrp/message_data/base.rb
245
+ - lib/winrm/psrp/message_data/error_record.rb
246
+ - lib/winrm/psrp/message_data/pipeline_host_call.rb
247
+ - lib/winrm/psrp/message_data/pipeline_output.rb
248
+ - lib/winrm/psrp/message_data/runspacepool_host_call.rb
249
+ - lib/winrm/psrp/message_data/runspacepool_state.rb
250
+ - lib/winrm/psrp/message_data/session_capability.rb
251
+ - lib/winrm/psrp/message_defragmenter.rb
252
+ - lib/winrm/psrp/message_factory.rb
253
+ - lib/winrm/psrp/message_fragmenter.rb
254
+ - lib/winrm/psrp/powershell_output_decoder.rb
255
+ - lib/winrm/psrp/receive_response_reader.rb
256
+ - lib/winrm/psrp/session_capability.xml.erb
257
+ - lib/winrm/psrp/uuid.rb
258
+ - lib/winrm/shells/base.rb
259
+ - lib/winrm/shells/cmd.rb
260
+ - lib/winrm/shells/power_shell.rb
261
+ - lib/winrm/shells/retryable.rb
262
+ - lib/winrm/shells/shell_factory.rb
215
263
  - lib/winrm/version.rb
216
- - lib/winrm/winrm_service.rb
264
+ - lib/winrm/wsmv/base.rb
265
+ - lib/winrm/wsmv/cleanup_command.rb
266
+ - lib/winrm/wsmv/close_shell.rb
267
+ - lib/winrm/wsmv/command.rb
268
+ - lib/winrm/wsmv/command_output.rb
269
+ - lib/winrm/wsmv/command_output_decoder.rb
270
+ - lib/winrm/wsmv/configuration.rb
271
+ - lib/winrm/wsmv/create_pipeline.rb
272
+ - lib/winrm/wsmv/create_shell.rb
273
+ - lib/winrm/wsmv/header.rb
274
+ - lib/winrm/wsmv/init_runspace_pool.rb
275
+ - lib/winrm/wsmv/iso8601_duration.rb
276
+ - lib/winrm/wsmv/keep_alive.rb
277
+ - lib/winrm/wsmv/receive_response_reader.rb
278
+ - lib/winrm/wsmv/send_data.rb
279
+ - lib/winrm/wsmv/soap.rb
280
+ - lib/winrm/wsmv/wql_query.rb
281
+ - lib/winrm/wsmv/write_stdin.rb
217
282
  - preamble
218
- - spec/auth_timeout_spec.rb
219
- - spec/cmd_spec.rb
220
- - spec/command_executor_spec.rb
221
- - spec/command_output_decoder_spec.rb
222
- - spec/config-example.yml
223
- - spec/exception_spec.rb
224
- - spec/issue_184_spec.rb
225
- - spec/issue_59_spec.rb
226
- - spec/matchers.rb
227
- - spec/output_spec.rb
228
- - spec/powershell_spec.rb
229
- - spec/response_handler_spec.rb
230
- - spec/spec_helper.rb
231
- - spec/stubs/responses/get_command_output_response.xml.erb
232
- - spec/stubs/responses/open_shell_v1.xml
233
- - spec/stubs/responses/open_shell_v2.xml
234
- - spec/stubs/responses/soap_fault_v1.xml
235
- - spec/stubs/responses/soap_fault_v2.xml
236
- - spec/stubs/responses/wmi_error_v2.xml
237
- - spec/transport_spec.rb
238
- - spec/winrm_options_spec.rb
239
- - spec/winrm_primitives_spec.rb
240
- - spec/wql_spec.rb
283
+ - tests/integration/auth_timeout_spec.rb
284
+ - tests/integration/cmd_spec.rb
285
+ - tests/integration/config-example.yml
286
+ - tests/integration/issue_59_spec.rb
287
+ - tests/integration/powershell_spec.rb
288
+ - tests/integration/spec_helper.rb
289
+ - tests/integration/transport_spec.rb
290
+ - tests/integration/wql_spec.rb
291
+ - tests/matchers.rb
292
+ - tests/spec/configuration_spec.rb
293
+ - tests/spec/connection_spec.rb
294
+ - tests/spec/exception_spec.rb
295
+ - tests/spec/http/transport_factory_spec.rb
296
+ - tests/spec/http/transport_spec.rb
297
+ - tests/spec/output_spec.rb
298
+ - tests/spec/psrp/fragment_spec.rb
299
+ - tests/spec/psrp/message_data/base_spec.rb
300
+ - tests/spec/psrp/message_data/error_record_spec.rb
301
+ - tests/spec/psrp/message_data/pipeline_host_call_spec.rb
302
+ - tests/spec/psrp/message_data/pipeline_output_spec.rb
303
+ - tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb
304
+ - tests/spec/psrp/message_data/runspacepool_state_spec.rb
305
+ - tests/spec/psrp/message_data/session_capability_spec.rb
306
+ - tests/spec/psrp/message_data_spec.rb
307
+ - tests/spec/psrp/message_defragmenter_spec.rb
308
+ - tests/spec/psrp/message_fragmenter_spec.rb
309
+ - tests/spec/psrp/powershell_output_decoder_spec.rb
310
+ - tests/spec/psrp/psrp_message_spec.rb
311
+ - tests/spec/psrp/recieve_response_reader_spec.rb
312
+ - tests/spec/psrp/uuid_spec.rb
313
+ - tests/spec/response_handler_spec.rb
314
+ - tests/spec/shells/base_spec.rb
315
+ - tests/spec/shells/cmd_spec.rb
316
+ - tests/spec/shells/powershell_spec.rb
317
+ - tests/spec/spec_helper.rb
318
+ - tests/spec/stubs/clixml/error_record.xml.erb
319
+ - tests/spec/stubs/responses/get_command_output_response.xml.erb
320
+ - tests/spec/stubs/responses/get_command_output_response_not_done.xml.erb
321
+ - tests/spec/stubs/responses/get_powershell_keepalive_response.xml.erb
322
+ - tests/spec/stubs/responses/get_powershell_output_response.xml.erb
323
+ - tests/spec/stubs/responses/get_powershell_output_response_not_done.xml.erb
324
+ - tests/spec/stubs/responses/open_shell_v1.xml
325
+ - tests/spec/stubs/responses/open_shell_v2.xml
326
+ - tests/spec/stubs/responses/soap_fault_v1.xml
327
+ - tests/spec/stubs/responses/soap_fault_v2.xml
328
+ - tests/spec/stubs/responses/wmi_error_v2.xml
329
+ - tests/spec/wsmv/cleanup_command_spec.rb
330
+ - tests/spec/wsmv/close_shell_spec.rb
331
+ - tests/spec/wsmv/command_output_decoder_spec.rb
332
+ - tests/spec/wsmv/command_output_spec.rb
333
+ - tests/spec/wsmv/command_spec.rb
334
+ - tests/spec/wsmv/configuration_spec.rb
335
+ - tests/spec/wsmv/create_pipeline_spec.rb
336
+ - tests/spec/wsmv/create_shell_spec.rb
337
+ - tests/spec/wsmv/init_runspace_pool_spec.rb
338
+ - tests/spec/wsmv/keep_alive_spec.rb
339
+ - tests/spec/wsmv/receive_response_reader_spec.rb
340
+ - tests/spec/wsmv/send_data_spec.rb
341
+ - tests/spec/wsmv/wql_query_spec.rb
342
+ - tests/spec/wsmv/write_stdin_spec.rb
241
343
  - winrm.gemspec
242
344
  homepage: https://github.com/WinRb/WinRM
243
345
  licenses:
@@ -263,7 +365,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
365
  version: '0'
264
366
  requirements: []
265
367
  rubyforge_project:
266
- rubygems_version: 2.6.3
368
+ rubygems_version: 2.6.6
267
369
  signing_key:
268
370
  specification_version: 4
269
371
  summary: Ruby library for Windows Remote Management
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --format nested
3
- --require spec_helper
@@ -1,243 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2015 Shawn Neal <sneal@sneal.net>
4
- # Copyright 2015 Matt Wrock <matt@mattwrock.com>
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- module WinRM
19
- # Object which can execute multiple commands and Powershell scripts in
20
- # one shared remote shell session. The maximum number of commands per
21
- # shell is determined by interrogating the remote host when the session
22
- # is opened and the remote shell is automatically recycled before the
23
- # threshold is reached.
24
- #
25
- # @author Shawn Neal <sneal@sneal.net>
26
- # @author Matt Wrock <matt@mattwrock.com>
27
- # @author Fletcher Nichol <fnichol@nichol.ca>
28
- class CommandExecutor
29
- # Closes an open remote shell session left open
30
- # after a command executor is garbage collecyted.
31
- #
32
- # @param shell_id [String] the remote shell identifier
33
- # @param service [WinRM::WinRMWebService] a winrm web service object
34
- def self.finalize(shell_id, service)
35
- proc { service.close_shell(shell_id) }
36
- end
37
-
38
- # @return [WinRM::WinRMWebService] a WinRM web service object
39
- attr_reader :service
40
-
41
- # @return [String,nil] the identifier for the current open remote
42
- # shell session, or `nil` if the session is not open
43
- attr_reader :shell
44
-
45
- # Creates a CommandExecutor given a `WinRM::WinRMWebService` object.
46
- #
47
- # @param service [WinRM::WinRMWebService] a winrm web service object
48
- # responds to `#debug` and `#info` (default: `nil`)
49
- def initialize(service)
50
- @service = service
51
- @command_count = 0
52
- end
53
-
54
- # Closes the open remote shell session. This method can be called
55
- # multiple times, even if there is no open session.
56
- def close
57
- return if shell.nil?
58
-
59
- service.close_shell(shell)
60
- remove_finalizer
61
- @shell = nil
62
- end
63
-
64
- # Opens a remote shell session for reuse. The maxiumum
65
- # command-per-shell threshold is also determined the first time this
66
- # method is invoked and cached for later invocations.
67
- #
68
- # @return [String] the remote shell session indentifier
69
- def open
70
- close
71
- retryable(service.retry_limit, service.retry_delay) do
72
- @shell = service.open_shell(codepage: code_page)
73
- end
74
- add_finalizer(shell)
75
- @command_count = 0
76
- shell
77
- end
78
-
79
- # Runs a CMD command.
80
- #
81
- # @param command [String] the command to run on the remote system
82
- # @param arguments [Array<String>] arguments to the command
83
- # @yield [stdout, stderr] yields more live access the standard
84
- # output and standard error streams as they are returns, if
85
- # streaming behavior is desired
86
- # @return [WinRM::Output] output object with stdout, stderr, and
87
- # exit code
88
- def run_cmd(command, arguments = [], &block)
89
- tries ||= 2
90
-
91
- reset if command_count > max_commands
92
- ensure_open_shell!
93
-
94
- @command_count += 1
95
- result = nil
96
- service.run_command(shell, command, arguments) do |command_id|
97
- result = service.get_command_output(shell, command_id, &block)
98
- end
99
- result
100
- rescue WinRMWSManFault => e
101
- # Fault code 2150858843 may be raised if the shell id that the command is sent on
102
- # has been closed. One might see this on a target windows machine that has just
103
- # been provisioned and restarted the winrm service at the end of its provisioning
104
- # routine. If this hapens, we should give the command one more try.
105
-
106
- # Fault code 2147943418 may be raised if the shell is installing an msi and for
107
- # some reason it tries to read a registry key that has been deleted. This sometimes
108
- # happens for 2008r2 when installing the Chef omnibus msi.
109
- if %w(2150858843 2147943418).include?(e.fault_code) && (tries -= 1) > 0
110
- service.logger.debug('[WinRM] opening new shell since the current one failed')
111
- @shell = nil
112
- open
113
- retry
114
- else
115
- raise
116
- end
117
- end
118
-
119
- # Run a Powershell script that resides on the local box.
120
- #
121
- # @param script_file [IO,String] an IO reference for reading the
122
- # Powershell script or the actual file contents
123
- # @yield [stdout, stderr] yields more live access the standard
124
- # output and standard error streams as they are returns, if
125
- # streaming behavior is desired
126
- # @return [WinRM::Output] output object with stdout, stderr, and
127
- # exit code
128
- def run_powershell_script(script_file, &block)
129
- # this code looks overly compact in an attempt to limit local
130
- # variable assignments that may contain large strings and
131
- # consequently bloat the Ruby VM
132
- run_cmd(
133
- 'powershell',
134
- [
135
- '-encodedCommand',
136
- ::WinRM::PowershellScript.new(
137
- script_file.is_a?(IO) ? script_file.read : script_file
138
- ).encoded
139
- ],
140
- &block
141
- )
142
- end
143
-
144
- # Code page appropriate to os version. utf-8 (65001) is buggy pre win7/2k8r2
145
- # So send MS-DOS (437) for earlier versions
146
- #
147
- # @return [Integer] code page in use
148
- def code_page
149
- @code_page ||= os_version < Gem::Version.new('6.1') ? 437 : 65_001
150
- end
151
-
152
- # @return [Integer] the safe maximum number of commands that can
153
- # be executed in one remote shell session
154
- def max_commands
155
- @max_commands ||= (os_version < Gem::Version.new('6.2') ? 15 : 1500) - 2
156
- end
157
-
158
- private
159
-
160
- # @return [Integer] the number of executed commands on the remote
161
- # shell session
162
- # @api private
163
- attr_accessor :command_count
164
-
165
- # Creates a finalizer for this connection which will close the open
166
- # remote shell session when the object is garabage collected or on
167
- # Ruby VM shutdown.
168
- #
169
- # @param shell_id [String] the remote shell identifier
170
- # @api private
171
- def add_finalizer(shell_id)
172
- ObjectSpace.define_finalizer(self, self.class.finalize(shell_id, service))
173
- end
174
-
175
- # Ensures that there is an open remote shell session.
176
- #
177
- # @raise [WinRM::WinRMError] if there is no open shell
178
- # @api private
179
- def ensure_open_shell!
180
- fail ::WinRM::WinRMError, "#{self.class}#open must be called " \
181
- 'before any run methods are invoked' if shell.nil?
182
- end
183
-
184
- # Fetches the OS build bersion of the remote endpoint
185
- #
186
- # @api private
187
- def os_version
188
- @os_version ||= begin
189
- version = nil
190
- wql = service.run_wql('select version from Win32_OperatingSystem')
191
- if wql[:xml_fragment]
192
- version = wql[:xml_fragment].first[:version] if wql[:xml_fragment].first[:version]
193
- end
194
- fail ::WinRM::WinRMError, 'Unable to determine endpoint os version' if version.nil?
195
- Gem::Version.new(version)
196
- end
197
- end
198
-
199
- # Removes any finalizers for this connection.
200
- #
201
- # @api private
202
- def remove_finalizer
203
- ObjectSpace.undefine_finalizer(self)
204
- end
205
-
206
- # Closes the remote shell session and opens a new one.
207
- #
208
- # @api private
209
- def reset
210
- service.logger.debug("Resetting WinRM shell (Max command limit is #{max_commands})")
211
- open
212
- end
213
-
214
- # Yields to a block and reties the block if certain rescuable
215
- # exceptions are raised.
216
- #
217
- # @param retries [Integer] the number of times to retry before failing
218
- # @option delay [Float] the number of seconds to wait until
219
- # attempting a retry
220
- # @api private
221
- def retryable(retries, delay)
222
- yield
223
- rescue *RESCUE_EXCEPTIONS_ON_ESTABLISH.call => e
224
- if (retries -= 1) > 0
225
- service.logger.info("[WinRM] connection failed. retrying in #{delay} seconds: #{e.inspect}")
226
- sleep(delay)
227
- retry
228
- else
229
- service.logger.warn("[WinRM] connection failed, terminating (#{e.inspect})")
230
- raise
231
- end
232
- end
233
-
234
- RESCUE_EXCEPTIONS_ON_ESTABLISH = lambda do
235
- [
236
- Errno::EACCES, Errno::EADDRINUSE, Errno::ECONNREFUSED, Errno::ETIMEDOUT,
237
- Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH,
238
- ::WinRM::WinRMHTTPTransportError, ::WinRM::WinRMAuthorizationError,
239
- HTTPClient::KeepAliveDisconnected, HTTPClient::ConnectTimeoutError
240
- ].freeze
241
- end
242
- end
243
- end