train-winrm 0.1.0 → 0.2.11

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
- SHA1:
3
- metadata.gz: 12bed665790e51bd23cbe569c27f6a93c0300e8c
4
- data.tar.gz: 599a6d141eb447d549ca3b511c15929401dea19d
2
+ SHA256:
3
+ metadata.gz: e0ec8bfbda71e6a294ed4ca66e9e86ca9fe26c52f766b26a14a42435119d9d3e
4
+ data.tar.gz: cfaeaa2c5294859943d47691d0b43754fec79c6ab34a33c6fd9b9a8662cb3740
5
5
  SHA512:
6
- metadata.gz: b12889e4dc8845c34c911e3856213eee6a8993d1d1e93488bd838a0ff0421722cba9256641b3c23bda1a7df9982e5c0ed3fdd805ee787f161edf57e34129f5a6
7
- data.tar.gz: 82873a1ed8096c63b6c56f8a8acf0981168429af31fcb63f421af272664d8822142f7fab0e7627d6aa413f1639201c84c8e91b076f1cd7cd551c88d0d38cef37
6
+ metadata.gz: 55e4978c8bcbc83858317ddcd4eaa467eaa37a19219b0e4e4a8f8875021bebbcccc68eabb3197634277dc66a23feb3f53024008ec9409141988ec7552686e193
7
+ data.tar.gz: a677486b1dcfb590028654948bc9ec9684d718586116caa7f5086028f5feccf747cb6da470ea1e6240ae50eaf31b12a137a01a6cc6e26209631538d6ca49afe6
data/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -11,10 +11,10 @@
11
11
  libdir = File.dirname(__FILE__)
12
12
  $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
13
13
 
14
- # It's traditonal to keep your gem version in a separate file, so CI can find it easier.
15
- require 'train-winrm/version'
14
+ # It's traditional to keep your gem version in a separate file, so CI can find it easier.
15
+ require_relative "train-winrm/version"
16
16
 
17
17
  # A train plugin has three components: Transport, Connection, and (optionally) Platform.
18
18
  # Transport acts as the glue.
19
- require 'train-winrm/transport'
20
- require 'train-winrm/connection'
19
+ require_relative "train-winrm/transport"
20
+ require_relative "train-winrm/connection"
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  #
4
2
  # Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
5
3
  # Author:: Matt Wrock (<matt@mattwrock.com>)
@@ -33,8 +31,10 @@
33
31
  # * marshalling to / from JSON
34
32
  # You don't have to worry about most of this.
35
33
 
36
- require 'train'
37
- require 'train/plugins'
34
+ require "train"
35
+ require "train/plugins"
36
+ # This module may need to directly require WinRM to reference its exception classes
37
+ require "winrm" unless defined?(WinRM)
38
38
 
39
39
  module TrainPlugins
40
40
  module WinRM
@@ -49,11 +49,13 @@ module TrainPlugins
49
49
  @connection_retry_sleep = @options.delete(:connection_retry_sleep)
50
50
  @max_wait_until_ready = @options.delete(:max_wait_until_ready)
51
51
  @operation_timeout = @options.delete(:operation_timeout)
52
+ @shell_type = @options.delete(:winrm_shell_type)
52
53
  end
53
54
 
54
55
  # (see Base::Connection#close)
55
56
  def close
56
57
  return if @session.nil?
58
+
57
59
  session.close
58
60
  ensure
59
61
  @session = nil
@@ -61,7 +63,7 @@ module TrainPlugins
61
63
 
62
64
  # (see Base::Connection#login_command)
63
65
  def login_command
64
- case RbConfig::CONFIG['host_os']
66
+ case RbConfig::CONFIG["host_os"]
65
67
  when /darwin/
66
68
  login_command_for_mac
67
69
  when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
@@ -69,9 +71,9 @@ module TrainPlugins
69
71
  when /linux/
70
72
  login_command_for_linux
71
73
  else
72
- fail ActionFailed,
73
- "Remote login not supported in #{self.class} " \
74
- "from host OS '#{RbConfig::CONFIG['host_os']}'."
74
+ raise ActionFailed,
75
+ "Remote login not supported in #{self.class} " \
76
+ "from host OS '#{RbConfig::CONFIG["host_os"]}'."
75
77
  end
76
78
  end
77
79
 
@@ -91,7 +93,7 @@ module TrainPlugins
91
93
  delay = 3
92
94
  session(
93
95
  retry_limit: @max_wait_until_ready / delay,
94
- retry_delay: delay,
96
+ retry_delay: delay
95
97
  )
96
98
  run_command_via_connection(PING_COMMAND.dup)
97
99
  end
@@ -108,14 +110,47 @@ module TrainPlugins
108
110
  Train::File::Remote::Windows.new(self, path)
109
111
  end
110
112
 
111
- def run_command_via_connection(command, &data_handler)
113
+ def run_command_via_connection(command, opts = {}, &data_handler)
112
114
  return if command.nil?
115
+
113
116
  logger.debug("[WinRM] #{self} (#{command})")
114
- out = ''
117
+ out = ""
118
+ response = nil
119
+ timeout = opts[:timeout]&.to_i
120
+
121
+ # Run the command in a thread, to support timing out the command
122
+ thr = Thread.new do
123
+ # Surface any exceptions in this thread back to this method
124
+ Thread.current.report_on_exception = false
125
+ Thread.current.abort_on_exception = true
126
+ begin
127
+ response = session.run(command) do |stdout, _|
128
+ yield(stdout) if data_handler && stdout
129
+ out << stdout if stdout
130
+ end
131
+ rescue ::WinRM::WinRMHTTPTransportError => e
132
+ # If this command hits timeout, there is also a potential race in the HTTP transport
133
+ # where decryption is attempted on an empty message.
134
+ raise e unless timeout && e.to_s == "Could not decrypt NTLM message. ()."
135
+ rescue RuntimeError => e
136
+ # Ref: https://github.com/WinRb/WinRM/issues/315
137
+ # If this command hits timeout, calling close with the command currently running causes
138
+ # a RuntimeError error in WinRM's cleanup code. This specific error can be ignored.
139
+ # The command will be terminated and further commands can be sent on the connection.
140
+ raise e unless timeout && e.to_s == "opts[:shell_id] is required"
141
+ end
142
+ end
115
143
 
116
- response = session.run(command) do |stdout, _|
117
- yield(stdout) if data_handler && stdout
118
- out << stdout if stdout
144
+ if timeout
145
+ res = thr.join(timeout)
146
+ unless res
147
+ msg = "PowerShell command '(#{command})' reached timeout (#{timeout}s)"
148
+ logger.info("[WinRM] #{msg}")
149
+ close
150
+ raise Train::CommandTimeoutReached.new msg
151
+ end
152
+ else
153
+ thr.join
119
154
  end
120
155
 
121
156
  CommandResult.new(out, response.stderr, response.exitcode)
@@ -131,7 +166,7 @@ module TrainPlugins
131
166
  host = URI.parse(options[:endpoint]).host
132
167
  content = [
133
168
  "full address:s:#{host}:#{@rdp_port}",
134
- 'prompt for credentials:i:1',
169
+ "prompt for credentials:i:1",
135
170
  "username:s:#{options[:user]}",
136
171
  ].join("\n")
137
172
 
@@ -146,7 +181,7 @@ module TrainPlugins
146
181
  @file_manager ||= begin
147
182
  # Ensure @service is available:
148
183
  wait_until_ready
149
- WinRM::FS::FileManager.new(@service)
184
+ ::WinRM::FS::FileManager.new(@service)
150
185
  end
151
186
  end
152
187
 
@@ -157,10 +192,10 @@ module TrainPlugins
157
192
  # @return [LoginCommand] a login command
158
193
  # @api private
159
194
  def login_command_for_linux
160
- args = %W(-u #{options[:user]})
161
- args += %W(-p #{options[:pass]}) if options.key?(:pass)
162
- args += %W(#{URI.parse(options[:endpoint]).host}:#{@rdp_port})
163
- LoginCommand.new('rdesktop', args)
195
+ args = %W{-u #{options[:user]}}
196
+ args += %W{-p #{options[:pass]}} if options.key?(:pass)
197
+ args += %W{#{URI.parse(options[:endpoint]).host}:#{@rdp_port}}
198
+ LoginCommand.new("rdesktop", args)
164
199
  end
165
200
 
166
201
  # Builds a `LoginCommand` for use by Mac-based platforms.
@@ -168,7 +203,7 @@ module TrainPlugins
168
203
  # @return [LoginCommand] a login command
169
204
  # @api private
170
205
  def login_command_for_mac
171
- LoginCommand.new('open', rdp_doc(mac: true))
206
+ LoginCommand.new("open", rdp_doc(mac: true))
172
207
  end
173
208
 
174
209
  # Builds a `LoginCommand` for use by Windows-based platforms.
@@ -176,7 +211,7 @@ module TrainPlugins
176
211
  # @return [LoginCommand] a login command
177
212
  # @api private
178
213
  def login_command_for_windows
179
- LoginCommand.new('mstsc', rdp_doc)
214
+ LoginCommand.new("mstsc", rdp_doc)
180
215
  end
181
216
 
182
217
  # Establishes a remote shell session, or establishes one when invoked
@@ -195,7 +230,7 @@ module TrainPlugins
195
230
  opts[:operation_timeout] = @operation_timeout unless @operation_timeout.nil?
196
231
  @service = ::WinRM::Connection.new(options.merge(opts))
197
232
  @service.logger = logger
198
- @service.shell(:powershell)
233
+ @service.shell(@shell_type)
199
234
  end
200
235
  end
201
236
 
@@ -205,7 +240,7 @@ module TrainPlugins
205
240
  # @api private
206
241
  def to_s
207
242
  options_to_print = @options.clone
208
- options_to_print[:password] = '<hidden>' if options_to_print.key?(:password)
243
+ options_to_print[:password] = "<hidden>" if options_to_print.key?(:password)
209
244
  "#{@username}@#{@hostname}<#{options_to_print.inspect}>"
210
245
  end
211
246
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  #
4
2
  # Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
5
3
  # Author:: Matt Wrock (<matt@mattwrock.com>)
@@ -21,11 +19,9 @@
21
19
  # See the License for the specific language governing permissions and
22
20
  # limitations under the License.
23
21
 
24
- require 'rbconfig'
25
- require 'uri'
26
- require 'train'
27
- require 'train/errors'
28
- require 'train/plugins'
22
+ require "train"
23
+ require "train/errors"
24
+ require "train/plugins"
29
25
 
30
26
  # Train Plugins v1 are usually declared under the TrainPlugins namespace.
31
27
  # Each plugin has three components: Transport, Connection, and (optionally) Platform.
@@ -44,22 +40,23 @@ module TrainPlugins
44
40
  # @author Salim Afiune <salim@afiunemaya.com.mx>
45
41
  # @author Fletcher Nichol <fnichol@nichol.ca>
46
42
  class Transport < Train.plugin(1) # rubocop:disable Metrics/ClassLength
47
- name 'winrm'
43
+ name "winrm"
48
44
 
49
- require 'train-winrm/connection'
45
+ require_relative "connection"
50
46
 
51
47
  # ref: https://github.com/winrb/winrm#transports
52
- SUPPORTED_WINRM_TRANSPORTS = %i(negotiate ssl plaintext kerberos).freeze
48
+ SUPPORTED_WINRM_TRANSPORTS = %i{negotiate ssl plaintext kerberos}.freeze
49
+ SUPPORTED_WINRM_SHELL_TYPES = %i{powershell elevated cmd}.freeze
53
50
 
54
51
  # common target configuration
55
52
  option :host, required: true
56
53
  option :port
57
- option :user, default: 'administrator', required: true
54
+ option :user, default: "administrator", required: true
58
55
  option :password, nil
59
56
  option :winrm_transport, default: :negotiate
60
57
  option :winrm_disable_sspi, default: false
61
58
  option :winrm_basic_auth_only, default: false
62
- option :path, default: '/wsman'
59
+ option :path, default: "/wsman"
63
60
  option :ssl, default: false
64
61
  option :self_signed, default: false
65
62
 
@@ -76,6 +73,7 @@ module TrainPlugins
76
73
  # from the winrm endpoint. Does not mean that the command has
77
74
  # completed in this time, only that the server has ack'd the request.
78
75
  option :operation_timeout, default: nil
76
+ option :winrm_shell_type , default: "powershell"
79
77
 
80
78
  def initialize(opts)
81
79
  super(opts)
@@ -101,21 +99,27 @@ module TrainPlugins
101
99
  super(opts)
102
100
 
103
101
  # set scheme and port based on ssl activation
104
- scheme = opts[:ssl] ? 'https' : 'http'
102
+ scheme = opts[:ssl] ? "https" : "http"
105
103
  port = opts[:port]
106
104
  port = (opts[:ssl] ? 5986 : 5985) if port.nil?
107
105
  winrm_transport = opts[:winrm_transport].to_sym
108
106
  unless SUPPORTED_WINRM_TRANSPORTS.include?(winrm_transport)
109
- fail Train::ClientError, "Unsupported transport type: #{winrm_transport.inspect}"
107
+ raise Train::ClientError, "Unsupported transport type: #{winrm_transport.inspect}"
108
+ end
109
+
110
+ winrm_shell_type = opts[:winrm_shell_type].to_sym
111
+ unless SUPPORTED_WINRM_SHELL_TYPES.include?(winrm_shell_type)
112
+ raise Train::ClientError, "Unsupported winrm shell type: #{winrm_shell_type.inspect}"
110
113
  end
111
114
 
112
115
  # remove leading '/'
113
- path = (opts[:path] || '').sub(%r{^/+}, '')
116
+ path = (opts[:path] || "").sub(%r{^/+}, "")
114
117
 
115
118
  opts[:endpoint] = "#{scheme}://#{opts[:host]}:#{port}/#{path}"
116
119
  end
117
120
 
118
- WINRM_FS_SPEC_VERSION = '~> 1.0'.freeze
121
+ WINRM_FS_SPEC_VERSION = "~> 1.0".freeze
122
+ WINRM_ELEVATED_SPEC_VERSION = "~> 1.2.2".freeze
119
123
 
120
124
  # Builds the hash of options needed by the Connection object on
121
125
  # construction.
@@ -125,30 +129,31 @@ module TrainPlugins
125
129
  # @api private
126
130
  def connection_options(opts)
127
131
  {
128
- logger: logger,
129
- transport: opts[:winrm_transport].to_sym,
130
- disable_sspi: opts[:winrm_disable_sspi],
131
- basic_auth_only: opts[:winrm_basic_auth_only],
132
- hostname: opts[:host],
133
- endpoint: opts[:endpoint],
134
- user: opts[:user],
135
- password: opts[:password],
136
- rdp_port: opts[:rdp_port],
137
- connection_retries: opts[:connection_retries],
138
- connection_retry_sleep: opts[:connection_retry_sleep],
139
- max_wait_until_ready: opts[:max_wait_until_ready],
132
+ logger: logger,
133
+ transport: opts[:winrm_transport].to_sym,
134
+ disable_sspi: opts[:winrm_disable_sspi],
135
+ basic_auth_only: opts[:winrm_basic_auth_only],
136
+ hostname: opts[:host],
137
+ endpoint: opts[:endpoint],
138
+ user: opts[:user],
139
+ password: opts[:password],
140
+ rdp_port: opts[:rdp_port],
141
+ connection_retries: opts[:connection_retries],
142
+ connection_retry_sleep: opts[:connection_retry_sleep],
143
+ max_wait_until_ready: opts[:max_wait_until_ready],
140
144
  no_ssl_peer_verification: opts[:self_signed],
141
- realm: opts[:kerberos_realm],
142
- service: opts[:kerberos_service],
143
- ca_trust_file: opts[:ca_trust_file],
144
- ssl_peer_fingerprint: opts[:ssl_peer_fingerprint],
145
+ realm: opts[:kerberos_realm],
146
+ service: opts[:kerberos_service],
147
+ ca_trust_file: opts[:ca_trust_file],
148
+ ssl_peer_fingerprint: opts[:ssl_peer_fingerprint],
149
+ winrm_shell_type: opts[:winrm_shell_type],
145
150
  }
146
151
  end
147
152
 
148
153
  # Creates a new WinRM Connection instance and save it for potential
149
154
  # future reuse.
150
155
  #
151
- # @param options [Hash] conneciton options
156
+ # @param options [Hash] connection options
152
157
  # @return [WinRM::Connection] a WinRM Connection instance
153
158
  # @api private
154
159
  def create_new_connection(options, &block)
@@ -164,34 +169,43 @@ module TrainPlugins
164
169
  # (see Base#load_needed_dependencies!)
165
170
  def load_needed_dependencies!
166
171
  spec_version = WINRM_FS_SPEC_VERSION.dup
167
- logger.debug('winrm-fs requested,' \
172
+ logger.debug("winrm-fs requested," \
168
173
  " loading WinRM::FS gem (#{spec_version})")
169
- gem 'winrm-fs', spec_version
170
- first_load = require 'winrm-fs'
171
- load_winrm_transport!
174
+ load_dependency("winrm-fs", spec_version)
175
+
176
+ spec_version = WINRM_ELEVATED_SPEC_VERSION.dup
177
+ logger.debug("winrm-elevated requested," \
178
+ " loading WinRM-elevated gem (#{spec_version})")
179
+ load_dependency("winrm-elevated", spec_version)
180
+ end
181
+
182
+ def load_dependency(gem_name, spec_version)
183
+ gem gem_name, spec_version
184
+ first_load = require gem_name
185
+ load_winrm_transport!(gem_name)
172
186
 
173
187
  if first_load
174
- logger.debug('WinRM::FS library loaded')
188
+ logger.debug("#{gem_name} library loaded")
175
189
  else
176
- logger.debug('WinRM::FS previously loaded')
190
+ logger.debug("#{gem_name} previously loaded")
177
191
  end
178
192
  rescue LoadError => e
179
193
  logger.fatal(
180
- "The `winrm-fs' gem is missing and must" \
181
- ' be installed or cannot be properly activated. Run' \
182
- " `gem install winrm-fs --version '#{spec_version}'`" \
183
- ' or add the following to your Gemfile if you are using Bundler:' \
184
- " `gem 'winrm-fs', '#{spec_version}'`.",
194
+ "The `#{gem_name}' gem is missing and must" \
195
+ " be installed or cannot be properly activated. Run" \
196
+ " `gem install #{gem_name} --version '#{spec_version}'`" \
197
+ " or add the following to your Gemfile if you are using Bundler:" \
198
+ " `gem '#{gem_name}', '#{spec_version}'`."
185
199
  )
186
200
  raise Train::UserError,
187
- "Could not load or activate WinRM::FS (#{e.message})"
201
+ "Could not load or activate #{gem_name} (#{e.message})"
188
202
  end
189
203
 
190
204
  # Load WinRM::Transport code.
191
205
  #
192
206
  # @api private
193
- def load_winrm_transport!
194
- silence_warnings { require 'winrm-fs' }
207
+ def load_winrm_transport!(gem_name)
208
+ silence_warnings { require gem_name }
195
209
  end
196
210
 
197
211
  # Return the last saved WinRM connection instance.
@@ -5,6 +5,6 @@
5
5
 
6
6
  module TrainPlugins
7
7
  module WinRM
8
- VERSION = '0.1.0'.freeze
8
+ VERSION = "0.2.11".freeze
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: train-winrm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef InSpec Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-09 00:00:00.000000000 Z
11
+ date: 2020-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: train
14
+ name: winrm
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: winrm
28
+ name: winrm-elevated
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: 1.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: 1.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: winrm-fs
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -60,13 +60,11 @@ executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
- - Gemfile
64
- - README.md
63
+ - LICENSE
65
64
  - lib/train-winrm.rb
66
65
  - lib/train-winrm/connection.rb
67
66
  - lib/train-winrm/transport.rb
68
67
  - lib/train-winrm/version.rb
69
- - train-winrm.gemspec
70
68
  homepage: https://github.com/inspec/train-winrm
71
69
  licenses:
72
70
  - Apache-2.0
@@ -86,8 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
84
  - !ruby/object:Gem::Version
87
85
  version: '0'
88
86
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.6.14.3
87
+ rubygems_version: 3.0.3
91
88
  signing_key:
92
89
  specification_version: 4
93
90
  summary: Windows WinRM API Transport for Train
data/Gemfile DELETED
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
-
3
- source 'https://rubygems.org'
4
-
5
- # This is a Gemfile, which is used by bundler
6
- # to ensure a coherent set of gems is installed.
7
- # This file lists dependencies needed when outside
8
- # of a gem (the gemspec lists deps for gem deployment)
9
-
10
- # Bundler should refer to the gemspec for any dependencies.
11
- gemspec
12
-
13
- # Remaining group is only used for development.
14
- group :development do
15
- gem 'bundler'
16
- gem 'byebug'
17
- gem 'm'
18
- gem 'minitest'
19
- gem 'mocha'
20
- gem 'pry'
21
- gem 'rake'
22
- gem 'rubocop', '= 0.49.1' # Need to keep in sync with main InSpec project, so config files will work
23
- end
data/README.md DELETED
@@ -1,51 +0,0 @@
1
- # train-winrm - Train Plugin for connecting to Windows via Remote Management
2
-
3
- This plugin allows applications that rely on Train to communicate with the WinRM API. For example, you could use this to audit Windows Server 2016 machines.
4
-
5
- TODO - details about underlying library
6
-
7
- Train itself has no CLI, nor a sophisticated test harness. Chef InSpec does have such facilities, so installing Train plugins will require a Chef InSpec installation. You do not need to use or understand Chef InSpec.
8
-
9
- Train plugins may be developed without a Chef InSpec installation.
10
-
11
- ## To Install this as a User
12
-
13
- Train plugins are distributed as gems. You may choose to manage the gem yourself, but if you are an Chef InSpec user, Chef InSpec can handle it for you.
14
-
15
- You will need Chef InSpec v2.3 or later.
16
-
17
- Simply run:
18
-
19
- ```
20
- $ inspec plugin install train-winrm
21
- ```
22
-
23
- You can then run:
24
-
25
- ```
26
- TODO - example
27
- ```
28
-
29
- ## Target Options for Train-WinRM
30
-
31
- TODO
32
-
33
- ## Reporting Issues
34
-
35
- Bugs, typos, limitations, and frustrations are welcome to be reported through the [GitHub issues page for the train-winrm project](https://github.com/inspec/train-winrm/issues).
36
-
37
- You may also ask questions in the #inspec channel of the Chef Community Slack team. However, for an issue to get traction, please report it as a github issue.
38
-
39
- ## Development on this Plugin
40
-
41
- ### Development Process
42
-
43
- If you wish to contribute to this plugin, please use the usual fork-branch-push-PR cycle. All functional changes need new tests, and bugfixes are expected to include a new test that demonstrates the bug.
44
-
45
- ### Reference Information
46
-
47
- [Plugin Development](https://github.com/inspec/train/blob/master/docs/dev/plugins.md) is documented on the `train` project on GitHub.
48
-
49
- ### Testing changes against a Windows Machine
50
-
51
- TODO
@@ -1,45 +0,0 @@
1
- # As plugins are usually packaged and distributed as a RubyGem,
2
- # we have to provide a .gemspec file, which controls the gembuild
3
- # and publish process. This is a fairly generic gemspec.
4
-
5
- # It is traditional in a gemspec to dynamically load the current version
6
- # from a file in the source tree. The next three lines make that happen.
7
- lib = File.expand_path('../lib', __FILE__)
8
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
9
- require 'train-winrm/version'
10
-
11
- Gem::Specification.new do |spec|
12
- # Importantly, all Train plugins must be prefixed with `train-`
13
- spec.name = 'train-winrm'
14
-
15
- # It is polite to namespace your plugin under InspecPlugins::YourPluginInCamelCase
16
- spec.version = TrainPlugins::WinRM::VERSION
17
- spec.authors = ['Chef InSpec Team']
18
- spec.email = ['inspec@chef.io']
19
- spec.summary = 'Windows WinRM API Transport for Train'
20
- spec.description = 'Allows applictaions using Train to speak to Windows using Remote Management; handles authentication, cacheing, and SDK dependency management.'
21
- spec.homepage = 'https://github.com/inspec/train-winrm'
22
- spec.license = 'Apache-2.0'
23
-
24
- # Though complicated-looking, this is pretty standard for a gemspec.
25
- # It just filters what will actually be packaged in the gem (leaving
26
- # out tests, etc)
27
- spec.files = %w{
28
- README.md train-winrm.gemspec Gemfile
29
- } + Dir.glob(
30
- 'lib/**/*', File::FNM_DOTMATCH
31
- ).reject { |f| File.directory?(f) }
32
- spec.require_paths = ['lib']
33
-
34
- # If you rely on any other gems, list them here with any constraints.
35
- # This is how `inspec plugin install` is able to manage your dependencies.
36
-
37
- # If you only need certain gems during development or testing, list
38
- # them in Gemfile, not here.
39
-
40
- # Do not list inspec as a dependency of a train plugin.
41
-
42
- spec.add_dependency 'train', '~> 2.0'
43
- spec.add_dependency 'winrm', '~> 2.0'
44
- spec.add_dependency 'winrm-fs', '~> 1.0'
45
- end