winrm 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -1
- data/VERSION +1 -1
- data/bin/rwinrm +1 -1
- data/changelog.md +5 -0
- data/lib/winrm/winrm_service.rb +40 -31
- data/spec/cmd_spec.rb +10 -0
- data/spec/config-example.yml +9 -2
- data/spec/matchers.rb +1 -1
- metadata +43 -15
- checksums.yaml +0 -7
data/README.md
CHANGED
@@ -132,7 +132,8 @@ To run the integration tests you will need a Windows box with the WinRM service
|
|
132
132
|
|
133
133
|
1. Create a Windows VM with WinRM configured (see above).
|
134
134
|
2. Copy the config-example.yml to config.yml - edit this file with your WinRM connection details.
|
135
|
-
3.
|
135
|
+
3. Ensure that the box you are running the test against has a default shell profile (check ~\Documents\WindowsPowerShell). If any of your shell profiles generate stdout or stderr output, the test validators may get thrown off.
|
136
|
+
4. Run `bundle exec rake integration`
|
136
137
|
|
137
138
|
## WinRM Author
|
138
139
|
* Twitter: [@zentourist](https://twitter.com/zentourist)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.1
|
data/bin/rwinrm
CHANGED
@@ -32,7 +32,7 @@ def parse_options
|
|
32
32
|
options = {}
|
33
33
|
fail 'Missing required options' unless ARGV.length == 1
|
34
34
|
|
35
|
-
m = /^(?<user
|
35
|
+
m = /^(?<user>[a-z0-9\.\!\$ _-]+)@{1}(?<host>[a-z0-9\.]+)(?<port>:[0-9]+)?/i.match(ARGV[0])
|
36
36
|
fail "#{ARGV[0]} is an invalid host" unless m
|
37
37
|
options[:user] = m[:user]
|
38
38
|
options[:endpoint] = "http://#{m[:host]}#{m[:port] || ':5985'}/wsman"
|
data/changelog.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# WinRM Gem Changelog
|
2
2
|
|
3
|
+
# 1.3.1
|
4
|
+
- Fixed issue 129, long running commands could cause a stackoverflow exception
|
5
|
+
- Fixed use of sub! in run_command results in spurious capture/replacement of \& sequences
|
6
|
+
- Fixed issue 124 rwinrm won't take '.' characters in username
|
7
|
+
|
3
8
|
# 1.3.0
|
4
9
|
- Fixed multiple issues with WinRMHTTPTransportError incorrectly being raised
|
5
10
|
- Refactored and added more unit and integration tests
|
data/lib/winrm/winrm_service.rb
CHANGED
@@ -164,7 +164,7 @@ module WinRM
|
|
164
164
|
# Grab the command element and unescape any single quotes - issue 69
|
165
165
|
xml = builder.target!
|
166
166
|
escaped_cmd = /<#{NS_WIN_SHELL}:Command>(.+)<\/#{NS_WIN_SHELL}:Command>/m.match(xml)[1]
|
167
|
-
xml
|
167
|
+
xml[escaped_cmd] = escaped_cmd.gsub(/'/, "'")
|
168
168
|
|
169
169
|
resp_doc = send_message(xml)
|
170
170
|
command_id = REXML::XPath.first(resp_doc, "//#{NS_WIN_SHELL}:CommandId").text
|
@@ -222,41 +222,35 @@ module WinRM
|
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
225
|
-
resp_doc =
|
225
|
+
resp_doc = nil
|
226
|
+
request_msg = builder.target!
|
227
|
+
done_elems = []
|
226
228
|
output = Output.new
|
227
|
-
REXML::XPath.match(resp_doc, "//#{NS_WIN_SHELL}:Stream").each do |n|
|
228
|
-
next if n.text.nil? || n.text.empty?
|
229
|
-
stream = { n.attributes['Name'].to_sym => Base64.decode64(n.text) }
|
230
|
-
output[:data] << stream
|
231
|
-
yield stream[:stdout], stream[:stderr] if block_given?
|
232
|
-
end
|
233
229
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
# </rsp:CommandState>
|
243
|
-
#if ((resp/"//*[@State='http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandState/Done']").empty?)
|
244
|
-
done_elems = REXML::XPath.match(resp_doc, "//*[@State='http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandState/Done']")
|
245
|
-
if done_elems.empty?
|
246
|
-
output.merge!(get_command_output(shell_id, command_id, &block)) do |key, old_data, new_data|
|
247
|
-
old_data += new_data
|
230
|
+
while done_elems.empty?
|
231
|
+
resp_doc = send_get_output_message(request_msg)
|
232
|
+
|
233
|
+
REXML::XPath.match(resp_doc, "//#{NS_WIN_SHELL}:Stream").each do |n|
|
234
|
+
next if n.text.nil? || n.text.empty?
|
235
|
+
stream = { n.attributes['Name'].to_sym => Base64.decode64(n.text) }
|
236
|
+
output[:data] << stream
|
237
|
+
yield stream[:stdout], stream[:stderr] if block_given?
|
248
238
|
end
|
249
|
-
|
250
|
-
output
|
239
|
+
|
240
|
+
# We may need to get additional output if the stream has not finished.
|
241
|
+
# The CommandState will change from Running to Done like so:
|
242
|
+
# @example
|
243
|
+
# from...
|
244
|
+
# <rsp:CommandState CommandId="..." State="http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandState/Running"/>
|
245
|
+
# to...
|
246
|
+
# <rsp:CommandState CommandId="..." State="http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandState/Done">
|
247
|
+
# <rsp:ExitCode>0</rsp:ExitCode>
|
248
|
+
# </rsp:CommandState>
|
249
|
+
done_elems = REXML::XPath.match(resp_doc, "//*[@State='http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandState/Done']")
|
251
250
|
end
|
251
|
+
|
252
|
+
output[:exitcode] = REXML::XPath.first(resp_doc, "//#{NS_WIN_SHELL}:ExitCode").text.to_i
|
252
253
|
output
|
253
|
-
rescue WinRMWSManFault => e
|
254
|
-
# If no output is available before the wsman:OperationTimeout expires,
|
255
|
-
# the server MUST return a WSManFault with the Code attribute equal to
|
256
|
-
# 2150858793. When the client receives this fault, it SHOULD issue
|
257
|
-
# another Receive request.
|
258
|
-
# http://msdn.microsoft.com/en-us/library/cc251676.aspx
|
259
|
-
retry if e.fault_code == '2150858793'
|
260
254
|
end
|
261
255
|
|
262
256
|
# Clean-up after a command.
|
@@ -417,6 +411,21 @@ module WinRM
|
|
417
411
|
hdr
|
418
412
|
end
|
419
413
|
|
414
|
+
def send_get_output_message(message)
|
415
|
+
send_message(message)
|
416
|
+
rescue WinRMWSManFault => e
|
417
|
+
# If no output is available before the wsman:OperationTimeout expires,
|
418
|
+
# the server MUST return a WSManFault with the Code attribute equal to
|
419
|
+
# 2150858793. When the client receives this fault, it SHOULD issue
|
420
|
+
# another Receive request.
|
421
|
+
# http://msdn.microsoft.com/en-us/library/cc251676.aspx
|
422
|
+
if e.fault_code == '2150858793'
|
423
|
+
retry
|
424
|
+
else
|
425
|
+
raise
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
420
429
|
def send_message(message)
|
421
430
|
@xfer.send_request(message)
|
422
431
|
end
|
data/spec/cmd_spec.rb
CHANGED
@@ -25,6 +25,16 @@ describe 'winrm client cmd', integration: true do
|
|
25
25
|
it { should have_no_stderr }
|
26
26
|
end
|
27
27
|
|
28
|
+
describe 'echo "string with trailing \\" using double quotes' do
|
29
|
+
# This is a regression test for #131. " is converted to " when serializing
|
30
|
+
# the command to SOAP/XML. Any naive substitution performed on such a serialized
|
31
|
+
# string can result in any \& sequence being interpreted as a back-substitution.
|
32
|
+
subject(:output) { @winrm.cmd('echo "string with trailing \\"') }
|
33
|
+
it { should have_exit_code 0 }
|
34
|
+
it { should have_stdout_match(/string with trailing \\/) }
|
35
|
+
it { should have_no_stderr }
|
36
|
+
end
|
37
|
+
|
28
38
|
describe 'capturing output from stdout and stderr' do
|
29
39
|
subject(:output) do
|
30
40
|
# Note: Multiple lines doesn't work:
|
data/spec/config-example.yml
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
+
# Copy this file to config.yml and edit the settings below.
|
2
|
+
# This should work out of the box for vagrant provisioned boxes.
|
3
|
+
|
1
4
|
## Kerberos
|
2
|
-
#auth_type:
|
5
|
+
#auth_type: kerberos
|
3
6
|
#endpoint: "http://<yourserver>:5985/wsman"
|
4
7
|
#options:
|
5
8
|
# realm: "your.realm"
|
6
9
|
|
7
10
|
## Plain Text
|
8
11
|
auth_type: plaintext
|
12
|
+
# If you are running this in a vagrant provisioned box using NAT,
|
13
|
+
# this will be the forwarded WinRM HTTP port to your VM.
|
14
|
+
# If you are running this on the VM, the default HTTP port is 5985.
|
15
|
+
# See README.md#Troubleshooting.
|
9
16
|
endpoint: "http://localhost:55985/wsman"
|
10
17
|
options:
|
11
18
|
user: vagrant
|
12
|
-
pass: vagrant
|
19
|
+
pass: vagrant
|
data/spec/matchers.rb
CHANGED
@@ -66,7 +66,7 @@ end
|
|
66
66
|
RSpec::Matchers.define :be_a_uid do
|
67
67
|
match do |actual|
|
68
68
|
# WinRM1.1 returns uuid's prefixed with 'uuid:' where as later versions do not
|
69
|
-
|
69
|
+
actual && actual.to_s.match(/^(uuid:)*\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/)
|
70
70
|
end
|
71
71
|
failure_message do |actual|
|
72
72
|
"expected a uid, but got '#{actual}'"
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winrm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Dan Wanek
|
@@ -9,11 +10,12 @@ authors:
|
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2015-01
|
13
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: gssapi
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
17
19
|
requirements:
|
18
20
|
- - ~>
|
19
21
|
- !ruby/object:Gem::Version
|
@@ -21,6 +23,7 @@ dependencies:
|
|
21
23
|
type: :runtime
|
22
24
|
prerelease: false
|
23
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
24
27
|
requirements:
|
25
28
|
- - ~>
|
26
29
|
- !ruby/object:Gem::Version
|
@@ -28,26 +31,29 @@ dependencies:
|
|
28
31
|
- !ruby/object:Gem::Dependency
|
29
32
|
name: httpclient
|
30
33
|
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
31
35
|
requirements:
|
32
36
|
- - ~>
|
33
37
|
- !ruby/object:Gem::Version
|
34
38
|
version: '2.2'
|
35
|
-
- - '>='
|
39
|
+
- - ! '>='
|
36
40
|
- !ruby/object:Gem::Version
|
37
41
|
version: 2.2.0.2
|
38
42
|
type: :runtime
|
39
43
|
prerelease: false
|
40
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
41
46
|
requirements:
|
42
47
|
- - ~>
|
43
48
|
- !ruby/object:Gem::Version
|
44
49
|
version: '2.2'
|
45
|
-
- - '>='
|
50
|
+
- - ! '>='
|
46
51
|
- !ruby/object:Gem::Version
|
47
52
|
version: 2.2.0.2
|
48
53
|
- !ruby/object:Gem::Dependency
|
49
54
|
name: rubyntlm
|
50
55
|
requirement: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
51
57
|
requirements:
|
52
58
|
- - ~>
|
53
59
|
- !ruby/object:Gem::Version
|
@@ -55,6 +61,7 @@ dependencies:
|
|
55
61
|
type: :runtime
|
56
62
|
prerelease: false
|
57
63
|
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
58
65
|
requirements:
|
59
66
|
- - ~>
|
60
67
|
- !ruby/object:Gem::Version
|
@@ -62,6 +69,7 @@ dependencies:
|
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: uuidtools
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
65
73
|
requirements:
|
66
74
|
- - ~>
|
67
75
|
- !ruby/object:Gem::Version
|
@@ -69,6 +77,7 @@ dependencies:
|
|
69
77
|
type: :runtime
|
70
78
|
prerelease: false
|
71
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
72
81
|
requirements:
|
73
82
|
- - ~>
|
74
83
|
- !ruby/object:Gem::Version
|
@@ -76,26 +85,29 @@ dependencies:
|
|
76
85
|
- !ruby/object:Gem::Dependency
|
77
86
|
name: logging
|
78
87
|
requirement: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
79
89
|
requirements:
|
80
90
|
- - ~>
|
81
91
|
- !ruby/object:Gem::Version
|
82
92
|
version: '1.6'
|
83
|
-
- - '>='
|
93
|
+
- - ! '>='
|
84
94
|
- !ruby/object:Gem::Version
|
85
95
|
version: 1.6.1
|
86
96
|
type: :runtime
|
87
97
|
prerelease: false
|
88
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
89
100
|
requirements:
|
90
101
|
- - ~>
|
91
102
|
- !ruby/object:Gem::Version
|
92
103
|
version: '1.6'
|
93
|
-
- - '>='
|
104
|
+
- - ! '>='
|
94
105
|
- !ruby/object:Gem::Version
|
95
106
|
version: 1.6.1
|
96
107
|
- !ruby/object:Gem::Dependency
|
97
108
|
name: nori
|
98
109
|
requirement: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
99
111
|
requirements:
|
100
112
|
- - ~>
|
101
113
|
- !ruby/object:Gem::Version
|
@@ -103,6 +115,7 @@ dependencies:
|
|
103
115
|
type: :runtime
|
104
116
|
prerelease: false
|
105
117
|
version_requirements: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
106
119
|
requirements:
|
107
120
|
- - ~>
|
108
121
|
- !ruby/object:Gem::Version
|
@@ -110,6 +123,7 @@ dependencies:
|
|
110
123
|
- !ruby/object:Gem::Dependency
|
111
124
|
name: gyoku
|
112
125
|
requirement: !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
113
127
|
requirements:
|
114
128
|
- - ~>
|
115
129
|
- !ruby/object:Gem::Version
|
@@ -117,6 +131,7 @@ dependencies:
|
|
117
131
|
type: :runtime
|
118
132
|
prerelease: false
|
119
133
|
version_requirements: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
120
135
|
requirements:
|
121
136
|
- - ~>
|
122
137
|
- !ruby/object:Gem::Version
|
@@ -124,20 +139,23 @@ dependencies:
|
|
124
139
|
- !ruby/object:Gem::Dependency
|
125
140
|
name: builder
|
126
141
|
requirement: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
127
143
|
requirements:
|
128
|
-
- - '>='
|
144
|
+
- - ! '>='
|
129
145
|
- !ruby/object:Gem::Version
|
130
146
|
version: 2.1.2
|
131
147
|
type: :runtime
|
132
148
|
prerelease: false
|
133
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
134
151
|
requirements:
|
135
|
-
- - '>='
|
152
|
+
- - ! '>='
|
136
153
|
- !ruby/object:Gem::Version
|
137
154
|
version: 2.1.2
|
138
155
|
- !ruby/object:Gem::Dependency
|
139
156
|
name: rspec
|
140
157
|
requirement: !ruby/object:Gem::Requirement
|
158
|
+
none: false
|
141
159
|
requirements:
|
142
160
|
- - ~>
|
143
161
|
- !ruby/object:Gem::Version
|
@@ -145,6 +163,7 @@ dependencies:
|
|
145
163
|
type: :development
|
146
164
|
prerelease: false
|
147
165
|
version_requirements: !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
148
167
|
requirements:
|
149
168
|
- - ~>
|
150
169
|
- !ruby/object:Gem::Version
|
@@ -152,6 +171,7 @@ dependencies:
|
|
152
171
|
- !ruby/object:Gem::Dependency
|
153
172
|
name: rake
|
154
173
|
requirement: !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
155
175
|
requirements:
|
156
176
|
- - ~>
|
157
177
|
- !ruby/object:Gem::Version
|
@@ -159,6 +179,7 @@ dependencies:
|
|
159
179
|
type: :development
|
160
180
|
prerelease: false
|
161
181
|
version_requirements: !ruby/object:Gem::Requirement
|
182
|
+
none: false
|
162
183
|
requirements:
|
163
184
|
- - ~>
|
164
185
|
- !ruby/object:Gem::Version
|
@@ -166,6 +187,7 @@ dependencies:
|
|
166
187
|
- !ruby/object:Gem::Dependency
|
167
188
|
name: rubocop
|
168
189
|
requirement: !ruby/object:Gem::Requirement
|
190
|
+
none: false
|
169
191
|
requirements:
|
170
192
|
- - ~>
|
171
193
|
- !ruby/object:Gem::Version
|
@@ -173,12 +195,14 @@ dependencies:
|
|
173
195
|
type: :development
|
174
196
|
prerelease: false
|
175
197
|
version_requirements: !ruby/object:Gem::Requirement
|
198
|
+
none: false
|
176
199
|
requirements:
|
177
200
|
- - ~>
|
178
201
|
- !ruby/object:Gem::Version
|
179
202
|
version: 0.28.0
|
180
|
-
description:
|
181
|
-
|
203
|
+
description: ! ' Ruby library for Windows Remote Management
|
204
|
+
|
205
|
+
'
|
182
206
|
email:
|
183
207
|
- dan.wanek@gmail.com
|
184
208
|
- paul@themortonsonline.com
|
@@ -232,7 +256,6 @@ files:
|
|
232
256
|
- winrm.gemspec
|
233
257
|
homepage: http://github.com/WinRb/WinRM
|
234
258
|
licenses: []
|
235
|
-
metadata: {}
|
236
259
|
post_install_message:
|
237
260
|
rdoc_options:
|
238
261
|
- -x
|
@@ -242,19 +265,24 @@ rdoc_options:
|
|
242
265
|
require_paths:
|
243
266
|
- lib
|
244
267
|
required_ruby_version: !ruby/object:Gem::Requirement
|
268
|
+
none: false
|
245
269
|
requirements:
|
246
|
-
- - '>='
|
270
|
+
- - ! '>='
|
247
271
|
- !ruby/object:Gem::Version
|
248
272
|
version: 1.9.0
|
249
273
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
274
|
+
none: false
|
250
275
|
requirements:
|
251
|
-
- - '>='
|
276
|
+
- - ! '>='
|
252
277
|
- !ruby/object:Gem::Version
|
253
278
|
version: '0'
|
279
|
+
segments:
|
280
|
+
- 0
|
281
|
+
hash: -1450055644460961921
|
254
282
|
requirements: []
|
255
283
|
rubyforge_project:
|
256
|
-
rubygems_version:
|
284
|
+
rubygems_version: 1.8.23.2
|
257
285
|
signing_key:
|
258
|
-
specification_version:
|
286
|
+
specification_version: 3
|
259
287
|
summary: Ruby library for Windows Remote Management
|
260
288
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: f3608a4fcc34f3bcad9cee57c3fada4a67a4ccb0
|
4
|
-
data.tar.gz: 89f128800437d974194dedafb9ef3d56300c33e5
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: b041e877f6b11c9b11acff78c714da8d2bb6e3cd80f87a8788deb62177edb8f2e1483e9f9aa7d36966fd8cccc2d57c0f69c601498f782b96535b397ec22486c3
|
7
|
-
data.tar.gz: e10dd4724ec11e483fa652ba49cf93a41f8999256ef3b5564235856b46b340dd120d7602b9da63901b356f986deecf6f54edbe0a81a8cd39ea2703b3abbcb661
|