winrm-transport 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa1f2fdc3f82de0bb032b2596593bfa9da97ec6b
4
- data.tar.gz: 4eba1f0bd3c1c43120cec91a3808965074707b09
3
+ metadata.gz: 9ca52f34c3f6b0ff2f00ece7df30f643f1550cad
4
+ data.tar.gz: 6ed1f20e933dc8f8b66e85b7baf8d8b0b2b000c4
5
5
  SHA512:
6
- metadata.gz: ad0da920c78b1437d40405341d92daa43dfb932a0bd92a796105aad4acdca540a53e01e37e9cc546c3f08b164f16a116e2231738ee3cc492fd5ab10897b2e8fd
7
- data.tar.gz: c94c56a6e8574af20e253a1c8058e25cc05b952e98b27373b09a1d1afba8dbf6ed65e0e8daa5ac613434e68011b1156f9401097e6a484262fdb3c5ab40d5ab6d
6
+ metadata.gz: ff8c18ab5f56d00ccc1ba7625de74d7d05c3bd1df2a053454dde0e236e10f808c13443311e77dbe9d31f2da0b7ad743049727925f07724796a4e42450fc24ed4
7
+ data.tar.gz: de9e5d01d7774e9eb3a76d22ddd12bc56eb1907554f4074ff1d88489be2e02c0cd7fdeb6c8b98024a8b469cc66e090244a0675669fd53b685418ce171b994a5a
@@ -1,3 +1,7 @@
1
+ ## 1.0.4 / 2017-01-06
2
+
3
+ * Adds deprecation verbage to gemspec
4
+
1
5
  ## 1.0.2 / 2015-11-10
2
6
 
3
7
  ### Bug fixes
@@ -1,217 +1,217 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Matt Wrock (<matt@mattwrock.com>)
4
- #
5
- # Copyright (C) 2014, Matt Wrock
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require "winrm/transport/logging"
20
-
21
- module WinRM
22
-
23
- module Transport
24
-
25
- # Object which can execute multiple commands and Powershell scripts in
26
- # one shared remote shell session. The maximum number of commands per
27
- # shell is determined by interrogating the remote host when the session
28
- # is opened and the remote shell is automatically recycled before the
29
- # threshold is reached.
30
- #
31
- # @author Matt Wrock <matt@mattwrock.com>
32
- # @author Fletcher Nichol <fnichol@nichol.ca>
33
- class CommandExecutor
34
-
35
- include Logging
36
-
37
- # @return [Integer,nil] the safe maximum number of commands that can
38
- # be executed in one remote shell session, or `nil` if the
39
- # threshold has not yet been determined
40
- attr_reader :max_commands
41
-
42
- # @return [String,nil] the identifier for the current open remote
43
- # shell session, or `nil` if the session is not open
44
- attr_reader :shell
45
-
46
- # Creates a CommandExecutor given a `WinRM::WinRMWebService` object.
47
- #
48
- # @param service [WinRM::WinRMWebService] a winrm web service object
49
- # @param logger [#debug,#info] an optional logger/ui object that
50
- # responds to `#debug` and `#info` (default: `nil`)
51
- # @param closer [ShellCloser] an optional object to automatically
52
- # close the active open remote shell when CommandExecutor garbarge
53
- # collects
54
- def initialize(service, logger = nil, closer = nil)
55
- @service = service
56
- @logger = logger
57
- @closer = closer
58
- @command_count = 0
59
- end
60
-
61
- # Closes the open remote shell session. This method can be called
62
- # multiple times, even if there is no open session.
63
- def close
64
- return if shell.nil?
65
-
66
- service.close_shell(shell)
67
- remove_finalizer
68
- @shell = nil
69
- end
70
-
71
- # Opens a remote shell session for reuse. The maxiumum
72
- # command-per-shell threshold is also determined the first time this
73
- # method is invoked and cached for later invocations.
74
- #
75
- # @return [String] the remote shell session indentifier
76
- def open
77
- close
78
- @shell = service.open_shell
79
- add_finalizer(shell)
80
- @command_count = 0
81
- determine_max_commands unless max_commands
82
- shell
83
- end
84
-
85
- # Runs a CMD command.
86
- #
87
- # @param command [String] the command to run on the remote system
88
- # @param arguments [Array<String>] arguments to the command
89
- # @yield [stdout, stderr] yields more live access the standard
90
- # output and standard error streams as they are returns, if
91
- # streaming behavior is desired
92
- # @return [WinRM::Output] output object with stdout, stderr, and
93
- # exit code
94
- def run_cmd(command, arguments = [], &block)
95
- reset if command_count_exceeded?
96
- ensure_open_shell!
97
-
98
- @command_count += 1
99
- result = nil
100
- service.run_command(shell, command, arguments) do |command_id|
101
- result = service.get_command_output(shell, command_id, &block)
102
- end
103
- result
104
- end
105
-
106
- # Run a Powershell script that resides on the local box.
107
- #
108
- # @param script_file [IO,String] an IO reference for reading the
109
- # Powershell script or the actual file contents
110
- # @yield [stdout, stderr] yields more live access the standard
111
- # output and standard error streams as they are returns, if
112
- # streaming behavior is desired
113
- # @return [WinRM::Output] output object with stdout, stderr, and
114
- # exit code
115
- def run_powershell_script(script_file, &block)
116
- # this code looks overly compact in an attempt to limit local
117
- # variable assignments that may contain large strings and
118
- # consequently bloat the Ruby VM
119
- run_cmd(
120
- "powershell",
121
- [
122
- "-encodedCommand",
123
- ::WinRM::PowershellScript.new(
124
- script_file.is_a?(IO) ? script_file.read : script_file
125
- ).encoded
126
- ],
127
- &block
128
- )
129
- end
130
-
131
- private
132
-
133
- # @return [Integer] the default maximum number of commands which can be
134
- # executed in one remote shell session on "older" versions of Windows
135
- # @api private
136
- LEGACY_LIMIT = 15
137
-
138
- # @return [Integer] the default maximum number of commands which can be
139
- # executed in one remote shell session on "modern" versions of Windows
140
- # @api private
141
- MODERN_LIMIT = 1500
142
-
143
- # @return [String] the PowerShell command used to determine the version
144
- # of Windows
145
- # @api private
146
- PS1_OS_VERSION = "[environment]::OSVersion.Version.tostring()".freeze
147
-
148
- # @return [Integer] the number of executed commands on the remote
149
- # shell session
150
- # @api private
151
- attr_accessor :command_count
152
-
153
- # @return [#debug,#info] the logger
154
- # @api private
155
- attr_reader :logger
156
-
157
- # @return [WinRM::WinRMWebService] a WinRM web service object
158
- # @api private
159
- attr_reader :service
160
-
161
- # Creates a finalizer for this connection which will close the open
162
- # remote shell session when the object is garabage collected or on
163
- # Ruby VM shutdown.
164
- #
165
- # @param shell_id [String] the remote shell identifier
166
- # @api private
167
- def add_finalizer(shell_id)
168
- ObjectSpace.define_finalizer(self, @closer.for(shell_id)) if @closer
169
- end
170
-
171
- # @return [true,false] whether or not the number of exeecuted commands
172
- # have exceeded the maxiumum threshold
173
- # @api private
174
- def command_count_exceeded?
175
- command_count > max_commands.to_i
176
- end
177
-
178
- # Ensures that there is an open remote shell session.
179
- #
180
- # @raise [WinRM::WinRMError] if there is no open shell
181
- # @api private
182
- def ensure_open_shell!
183
- if shell.nil?
184
- raise ::WinRM::WinRMError, "#{self.class}#open must be called " \
185
- "before any run methods are invoked"
186
- end
187
- end
188
-
189
- # Determines the safe maximum number of commands that can be executed
190
- # on a remote shell session by interrogating the remote host.
191
- #
192
- # @api private
193
- def determine_max_commands
194
- os_version = run_powershell_script(PS1_OS_VERSION).stdout.chomp
195
- @max_commands = os_version < "6.2" ? LEGACY_LIMIT : MODERN_LIMIT
196
- @max_commands -= 2 # to be safe
197
- end
198
-
199
- # Removes any finalizers for this connection.
200
- #
201
- # @api private
202
- def remove_finalizer
203
- ObjectSpace.undefine_finalizer(self) if @closer
204
- end
205
-
206
- # Closes the remote shell session and opens a new one.
207
- #
208
- # @api private
209
- def reset
210
- debug {
211
- "Resetting WinRM shell (Max command limit is #{max_commands})"
212
- }
213
- open
214
- end
215
- end
216
- end
217
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Matt Wrock (<matt@mattwrock.com>)
4
+ #
5
+ # Copyright (C) 2014, Matt Wrock
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require "winrm/transport/logging"
20
+
21
+ module WinRM
22
+
23
+ module Transport
24
+
25
+ # Object which can execute multiple commands and Powershell scripts in
26
+ # one shared remote shell session. The maximum number of commands per
27
+ # shell is determined by interrogating the remote host when the session
28
+ # is opened and the remote shell is automatically recycled before the
29
+ # threshold is reached.
30
+ #
31
+ # @author Matt Wrock <matt@mattwrock.com>
32
+ # @author Fletcher Nichol <fnichol@nichol.ca>
33
+ class CommandExecutor
34
+
35
+ include Logging
36
+
37
+ # @return [Integer,nil] the safe maximum number of commands that can
38
+ # be executed in one remote shell session, or `nil` if the
39
+ # threshold has not yet been determined
40
+ attr_reader :max_commands
41
+
42
+ # @return [String,nil] the identifier for the current open remote
43
+ # shell session, or `nil` if the session is not open
44
+ attr_reader :shell
45
+
46
+ # Creates a CommandExecutor given a `WinRM::WinRMWebService` object.
47
+ #
48
+ # @param service [WinRM::WinRMWebService] a winrm web service object
49
+ # @param logger [#debug,#info] an optional logger/ui object that
50
+ # responds to `#debug` and `#info` (default: `nil`)
51
+ # @param closer [ShellCloser] an optional object to automatically
52
+ # close the active open remote shell when CommandExecutor garbarge
53
+ # collects
54
+ def initialize(service, logger = nil, closer = nil)
55
+ @service = service
56
+ @logger = logger
57
+ @closer = closer
58
+ @command_count = 0
59
+ end
60
+
61
+ # Closes the open remote shell session. This method can be called
62
+ # multiple times, even if there is no open session.
63
+ def close
64
+ return if shell.nil?
65
+
66
+ service.close_shell(shell)
67
+ remove_finalizer
68
+ @shell = nil
69
+ end
70
+
71
+ # Opens a remote shell session for reuse. The maxiumum
72
+ # command-per-shell threshold is also determined the first time this
73
+ # method is invoked and cached for later invocations.
74
+ #
75
+ # @return [String] the remote shell session indentifier
76
+ def open
77
+ close
78
+ @shell = service.open_shell
79
+ add_finalizer(shell)
80
+ @command_count = 0
81
+ determine_max_commands unless max_commands
82
+ shell
83
+ end
84
+
85
+ # Runs a CMD command.
86
+ #
87
+ # @param command [String] the command to run on the remote system
88
+ # @param arguments [Array<String>] arguments to the command
89
+ # @yield [stdout, stderr] yields more live access the standard
90
+ # output and standard error streams as they are returns, if
91
+ # streaming behavior is desired
92
+ # @return [WinRM::Output] output object with stdout, stderr, and
93
+ # exit code
94
+ def run_cmd(command, arguments = [], &block)
95
+ reset if command_count_exceeded?
96
+ ensure_open_shell!
97
+
98
+ @command_count += 1
99
+ result = nil
100
+ service.run_command(shell, command, arguments) do |command_id|
101
+ result = service.get_command_output(shell, command_id, &block)
102
+ end
103
+ result
104
+ end
105
+
106
+ # Run a Powershell script that resides on the local box.
107
+ #
108
+ # @param script_file [IO,String] an IO reference for reading the
109
+ # Powershell script or the actual file contents
110
+ # @yield [stdout, stderr] yields more live access the standard
111
+ # output and standard error streams as they are returns, if
112
+ # streaming behavior is desired
113
+ # @return [WinRM::Output] output object with stdout, stderr, and
114
+ # exit code
115
+ def run_powershell_script(script_file, &block)
116
+ # this code looks overly compact in an attempt to limit local
117
+ # variable assignments that may contain large strings and
118
+ # consequently bloat the Ruby VM
119
+ run_cmd(
120
+ "powershell",
121
+ [
122
+ "-encodedCommand",
123
+ ::WinRM::PowershellScript.new(
124
+ script_file.is_a?(IO) ? script_file.read : script_file
125
+ ).encoded
126
+ ],
127
+ &block
128
+ )
129
+ end
130
+
131
+ private
132
+
133
+ # @return [Integer] the default maximum number of commands which can be
134
+ # executed in one remote shell session on "older" versions of Windows
135
+ # @api private
136
+ LEGACY_LIMIT = 15
137
+
138
+ # @return [Integer] the default maximum number of commands which can be
139
+ # executed in one remote shell session on "modern" versions of Windows
140
+ # @api private
141
+ MODERN_LIMIT = 1500
142
+
143
+ # @return [String] the PowerShell command used to determine the version
144
+ # of Windows
145
+ # @api private
146
+ PS1_OS_VERSION = "[environment]::OSVersion.Version.tostring()".freeze
147
+
148
+ # @return [Integer] the number of executed commands on the remote
149
+ # shell session
150
+ # @api private
151
+ attr_accessor :command_count
152
+
153
+ # @return [#debug,#info] the logger
154
+ # @api private
155
+ attr_reader :logger
156
+
157
+ # @return [WinRM::WinRMWebService] a WinRM web service object
158
+ # @api private
159
+ attr_reader :service
160
+
161
+ # Creates a finalizer for this connection which will close the open
162
+ # remote shell session when the object is garabage collected or on
163
+ # Ruby VM shutdown.
164
+ #
165
+ # @param shell_id [String] the remote shell identifier
166
+ # @api private
167
+ def add_finalizer(shell_id)
168
+ ObjectSpace.define_finalizer(self, @closer.for(shell_id)) if @closer
169
+ end
170
+
171
+ # @return [true,false] whether or not the number of exeecuted commands
172
+ # have exceeded the maxiumum threshold
173
+ # @api private
174
+ def command_count_exceeded?
175
+ command_count > max_commands.to_i
176
+ end
177
+
178
+ # Ensures that there is an open remote shell session.
179
+ #
180
+ # @raise [WinRM::WinRMError] if there is no open shell
181
+ # @api private
182
+ def ensure_open_shell!
183
+ if shell.nil?
184
+ raise ::WinRM::WinRMError, "#{self.class}#open must be called " \
185
+ "before any run methods are invoked"
186
+ end
187
+ end
188
+
189
+ # Determines the safe maximum number of commands that can be executed
190
+ # on a remote shell session by interrogating the remote host.
191
+ #
192
+ # @api private
193
+ def determine_max_commands
194
+ os_version = run_powershell_script(PS1_OS_VERSION).stdout.chomp
195
+ @max_commands = os_version < "6.2" ? LEGACY_LIMIT : MODERN_LIMIT
196
+ @max_commands -= 2 # to be safe
197
+ end
198
+
199
+ # Removes any finalizers for this connection.
200
+ #
201
+ # @api private
202
+ def remove_finalizer
203
+ ObjectSpace.undefine_finalizer(self) if @closer
204
+ end
205
+
206
+ # Closes the remote shell session and opens a new one.
207
+ #
208
+ # @api private
209
+ def reset
210
+ debug {
211
+ "Resetting WinRM shell (Max command limit is #{max_commands})"
212
+ }
213
+ open
214
+ end
215
+ end
216
+ end
217
+ end
@@ -20,6 +20,6 @@ module WinRM
20
20
 
21
21
  module Transport
22
22
 
23
- VERSION = "1.0.3"
23
+ VERSION = "1.0.4"
24
24
  end
25
25
  end
@@ -10,7 +10,8 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ["Fletcher Nichol"]
11
11
  spec.email = ["fnichol@nichol.ca"]
12
12
 
13
- spec.summary = "WinRM transport logic for re-using remote shells " \
13
+ spec.summary = "[DEPRECATED] Please use the WinRM gem instead. " \
14
+ "WinRM transport logic for re-using remote shells " \
14
15
  "and uploading files. The original code was extracted " \
15
16
  "from the Test Kitchen project and remains the " \
16
17
  "primary reference use case."
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winrm-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fletcher Nichol
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-10 00:00:00.000000000 Z
11
+ date: 2017-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: winrm
@@ -198,9 +198,9 @@ dependencies:
198
198
  - - '='
199
199
  - !ruby/object:Gem::Version
200
200
  version: 2.6.2
201
- description: WinRM transport logic for re-using remote shells and uploading files.
202
- The original code was extracted from the Test Kitchen project and remains the primary
203
- reference use case.
201
+ description: "[DEPRECATED] Please use the WinRM gem instead. WinRM transport logic
202
+ for re-using remote shells and uploading files. The original code was extracted
203
+ from the Test Kitchen project and remains the primary reference use case."
204
204
  email:
205
205
  - fnichol@nichol.ca
206
206
  executables: []
@@ -248,11 +248,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
248
  version: '0'
249
249
  requirements: []
250
250
  rubyforge_project:
251
- rubygems_version: 2.4.8
251
+ rubygems_version: 2.6.8
252
252
  signing_key:
253
253
  specification_version: 4
254
- summary: WinRM transport logic for re-using remote shells and uploading files. The
255
- original code was extracted from the Test Kitchen project and remains the primary
256
- reference use case.
254
+ summary: "[DEPRECATED] Please use the WinRM gem instead. WinRM transport logic for
255
+ re-using remote shells and uploading files. The original code was extracted from
256
+ the Test Kitchen project and remains the primary reference use case."
257
257
  test_files: []
258
258
  has_rdoc: