train-winrm 0.1.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +12 -9
- data/README.md +59 -5
- data/lib/train-winrm.rb +3 -3
- data/lib/train-winrm/connection.rb +18 -16
- data/lib/train-winrm/transport.rb +40 -40
- data/lib/train-winrm/version.rb +1 -1
- data/train-winrm.gemspec +14 -15
- metadata +3 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8bedb30ef9245e5953c85b86be962be97d177335bdc3ec5714f5eb4a3a83e407
|
4
|
+
data.tar.gz: 4a0beebeea34e8db4b989beac547d67d88cf57b915ae372d6ccf48689c1b74c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07d7e9550cf28e75d4f7c16fc266ccdb7a4a81d16438554fc6a6bb964dddd8a4cac4fea13efeb3551dfea2cab3bf148c86f20af982b7b5caa10ee59aabf382da
|
7
|
+
data.tar.gz: 79ef8219d7655d87cb58706c037dae54e6b67063d2b20b4bce459148c27a9f91d35beb8afb7185b91c4deb8020d492b4947cec302595703341b0ab39ee285352
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
source
|
3
|
+
source "https://rubygems.org"
|
4
4
|
|
5
5
|
# This is a Gemfile, which is used by bundler
|
6
6
|
# to ensure a coherent set of gems is installed.
|
@@ -12,12 +12,15 @@ gemspec
|
|
12
12
|
|
13
13
|
# Remaining group is only used for development.
|
14
14
|
group :development do
|
15
|
-
|
16
|
-
|
17
|
-
gem
|
18
|
-
gem
|
19
|
-
gem
|
20
|
-
gem
|
21
|
-
gem
|
22
|
-
gem
|
15
|
+
# Depend on this here, not in the gemspec - to avoid having to have
|
16
|
+
# client applications induce circular dependencies
|
17
|
+
gem "train-core", "~> 3.0"
|
18
|
+
gem "bundler"
|
19
|
+
gem "byebug"
|
20
|
+
gem "m"
|
21
|
+
gem "minitest"
|
22
|
+
gem "mocha"
|
23
|
+
gem "pry"
|
24
|
+
gem "rake"
|
25
|
+
gem "chefstyle"
|
23
26
|
end
|
data/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# train-winrm - Train Plugin for connecting to Windows via Remote Management
|
2
2
|
|
3
|
+
* **Project State: Active**
|
4
|
+
* **Issues Response SLA: 3 business days**
|
5
|
+
* **Pull Request Response SLA: 3 business days**
|
6
|
+
|
3
7
|
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
8
|
|
5
|
-
|
9
|
+
This plugin relies on the `winrm` and `winrm-fs` gems for implementation.
|
6
10
|
|
7
11
|
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
12
|
|
@@ -10,6 +14,12 @@ Train plugins may be developed without a Chef InSpec installation.
|
|
10
14
|
|
11
15
|
## To Install this as a User
|
12
16
|
|
17
|
+
### ChefDK Installation
|
18
|
+
|
19
|
+
After August 2019, this plugin will be distributed with ChefDK; you do not need to install it separately.
|
20
|
+
|
21
|
+
### Manual Installation using `inspec plugin install`
|
22
|
+
|
13
23
|
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
24
|
|
15
25
|
You will need Chef InSpec v2.3 or later.
|
@@ -20,15 +30,53 @@ Simply run:
|
|
20
30
|
$ inspec plugin install train-winrm
|
21
31
|
```
|
22
32
|
|
23
|
-
You can then run:
|
33
|
+
You can then run, using Chef InSpec as an example:
|
34
|
+
|
35
|
+
```
|
36
|
+
you@home $ inspec some-profile winrm://someuser@somehost --password somepassword
|
37
|
+
```
|
24
38
|
|
39
|
+
From Ruby code, you may use this plugin as follows:
|
25
40
|
```
|
26
|
-
|
41
|
+
require 'train'
|
42
|
+
transport = Train.create(
|
43
|
+
'winrm',
|
44
|
+
host: '1.2.3.4',
|
45
|
+
user: 'Administrator',
|
46
|
+
password: '...',
|
47
|
+
ssl: true,
|
48
|
+
self_signed: true
|
49
|
+
)
|
50
|
+
conn = transport.connection
|
27
51
|
```
|
28
52
|
|
29
53
|
## Target Options for Train-WinRM
|
30
54
|
|
31
|
-
|
55
|
+
### host
|
56
|
+
|
57
|
+
Required `String`. The hostname or IP address used for connection.
|
58
|
+
|
59
|
+
#### port
|
60
|
+
|
61
|
+
Optional `Integer`, default 5985 (plain) or 5896 (SSL). The port number to which the connection should be made.
|
62
|
+
|
63
|
+
### user
|
64
|
+
|
65
|
+
Optional `String`, username used for sign in. Default `Administrator`.
|
66
|
+
|
67
|
+
### password
|
68
|
+
|
69
|
+
Optional `String`, password used for sign in. None sent if not provided.
|
70
|
+
|
71
|
+
### ssl
|
72
|
+
|
73
|
+
Optional `Boolean`. Defaults to `false`. Determines whether to use SSL to encrypt communications.
|
74
|
+
|
75
|
+
Several other options exist. To see these options, run:
|
76
|
+
|
77
|
+
```
|
78
|
+
puts Train.options('winrm')
|
79
|
+
```
|
32
80
|
|
33
81
|
## Reporting Issues
|
34
82
|
|
@@ -46,6 +94,12 @@ If you wish to contribute to this plugin, please use the usual fork-branch-push-
|
|
46
94
|
|
47
95
|
[Plugin Development](https://github.com/inspec/train/blob/master/docs/dev/plugins.md) is documented on the `train` project on GitHub.
|
48
96
|
|
97
|
+
### Unit tests
|
98
|
+
|
99
|
+
Run `bundle exec rake test:unit` to run the unit tests.
|
100
|
+
|
49
101
|
### Testing changes against a Windows Machine
|
50
102
|
|
51
|
-
|
103
|
+
Install Vagrant and VirtualBox. Check the Vagrantfile to verify that it references a Windows 2016 evaluation VagrantBox to which you have access.
|
104
|
+
|
105
|
+
Then, run `bundle exec rake test:integration`. There are sub-tasks you can use to run only the integration tests; to see a list of all tasks, run `rake -aT`.
|
data/lib/train-winrm.rb
CHANGED
@@ -12,9 +12,9 @@ libdir = File.dirname(__FILE__)
|
|
12
12
|
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
13
13
|
|
14
14
|
# It's traditonal to keep your gem version in a separate file, so CI can find it easier.
|
15
|
-
require
|
15
|
+
require "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
|
20
|
-
require
|
19
|
+
require "train-winrm/transport"
|
20
|
+
require "train-winrm/connection"
|
@@ -33,8 +33,8 @@
|
|
33
33
|
# * marshalling to / from JSON
|
34
34
|
# You don't have to worry about most of this.
|
35
35
|
|
36
|
-
require
|
37
|
-
require
|
36
|
+
require "train"
|
37
|
+
require "train/plugins"
|
38
38
|
|
39
39
|
module TrainPlugins
|
40
40
|
module WinRM
|
@@ -54,6 +54,7 @@ module TrainPlugins
|
|
54
54
|
# (see Base::Connection#close)
|
55
55
|
def close
|
56
56
|
return if @session.nil?
|
57
|
+
|
57
58
|
session.close
|
58
59
|
ensure
|
59
60
|
@session = nil
|
@@ -61,7 +62,7 @@ module TrainPlugins
|
|
61
62
|
|
62
63
|
# (see Base::Connection#login_command)
|
63
64
|
def login_command
|
64
|
-
case RbConfig::CONFIG[
|
65
|
+
case RbConfig::CONFIG["host_os"]
|
65
66
|
when /darwin/
|
66
67
|
login_command_for_mac
|
67
68
|
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
@@ -69,9 +70,9 @@ module TrainPlugins
|
|
69
70
|
when /linux/
|
70
71
|
login_command_for_linux
|
71
72
|
else
|
72
|
-
|
73
|
-
|
74
|
-
|
73
|
+
raise ActionFailed,
|
74
|
+
"Remote login not supported in #{self.class} " \
|
75
|
+
"from host OS '#{RbConfig::CONFIG["host_os"]}'."
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
@@ -91,7 +92,7 @@ module TrainPlugins
|
|
91
92
|
delay = 3
|
92
93
|
session(
|
93
94
|
retry_limit: @max_wait_until_ready / delay,
|
94
|
-
retry_delay: delay
|
95
|
+
retry_delay: delay
|
95
96
|
)
|
96
97
|
run_command_via_connection(PING_COMMAND.dup)
|
97
98
|
end
|
@@ -110,8 +111,9 @@ module TrainPlugins
|
|
110
111
|
|
111
112
|
def run_command_via_connection(command, &data_handler)
|
112
113
|
return if command.nil?
|
114
|
+
|
113
115
|
logger.debug("[WinRM] #{self} (#{command})")
|
114
|
-
out =
|
116
|
+
out = ""
|
115
117
|
|
116
118
|
response = session.run(command) do |stdout, _|
|
117
119
|
yield(stdout) if data_handler && stdout
|
@@ -131,7 +133,7 @@ module TrainPlugins
|
|
131
133
|
host = URI.parse(options[:endpoint]).host
|
132
134
|
content = [
|
133
135
|
"full address:s:#{host}:#{@rdp_port}",
|
134
|
-
|
136
|
+
"prompt for credentials:i:1",
|
135
137
|
"username:s:#{options[:user]}",
|
136
138
|
].join("\n")
|
137
139
|
|
@@ -157,10 +159,10 @@ module TrainPlugins
|
|
157
159
|
# @return [LoginCommand] a login command
|
158
160
|
# @api private
|
159
161
|
def login_command_for_linux
|
160
|
-
args = %W
|
161
|
-
args += %W
|
162
|
-
args += %W
|
163
|
-
LoginCommand.new(
|
162
|
+
args = %W{-u #{options[:user]}}
|
163
|
+
args += %W{-p #{options[:pass]}} if options.key?(:pass)
|
164
|
+
args += %W{#{URI.parse(options[:endpoint]).host}:#{@rdp_port}}
|
165
|
+
LoginCommand.new("rdesktop", args)
|
164
166
|
end
|
165
167
|
|
166
168
|
# Builds a `LoginCommand` for use by Mac-based platforms.
|
@@ -168,7 +170,7 @@ module TrainPlugins
|
|
168
170
|
# @return [LoginCommand] a login command
|
169
171
|
# @api private
|
170
172
|
def login_command_for_mac
|
171
|
-
LoginCommand.new(
|
173
|
+
LoginCommand.new("open", rdp_doc(mac: true))
|
172
174
|
end
|
173
175
|
|
174
176
|
# Builds a `LoginCommand` for use by Windows-based platforms.
|
@@ -176,7 +178,7 @@ module TrainPlugins
|
|
176
178
|
# @return [LoginCommand] a login command
|
177
179
|
# @api private
|
178
180
|
def login_command_for_windows
|
179
|
-
LoginCommand.new(
|
181
|
+
LoginCommand.new("mstsc", rdp_doc)
|
180
182
|
end
|
181
183
|
|
182
184
|
# Establishes a remote shell session, or establishes one when invoked
|
@@ -205,7 +207,7 @@ module TrainPlugins
|
|
205
207
|
# @api private
|
206
208
|
def to_s
|
207
209
|
options_to_print = @options.clone
|
208
|
-
options_to_print[:password] =
|
210
|
+
options_to_print[:password] = "<hidden>" if options_to_print.key?(:password)
|
209
211
|
"#{@username}@#{@hostname}<#{options_to_print.inspect}>"
|
210
212
|
end
|
211
213
|
end
|
@@ -21,11 +21,11 @@
|
|
21
21
|
# See the License for the specific language governing permissions and
|
22
22
|
# limitations under the License.
|
23
23
|
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
24
|
+
require "rbconfig"
|
25
|
+
require "uri"
|
26
|
+
require "train"
|
27
|
+
require "train/errors"
|
28
|
+
require "train/plugins"
|
29
29
|
|
30
30
|
# Train Plugins v1 are usually declared under the TrainPlugins namespace.
|
31
31
|
# Each plugin has three components: Transport, Connection, and (optionally) Platform.
|
@@ -44,22 +44,22 @@ module TrainPlugins
|
|
44
44
|
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
45
45
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
46
46
|
class Transport < Train.plugin(1) # rubocop:disable Metrics/ClassLength
|
47
|
-
name
|
47
|
+
name "winrm"
|
48
48
|
|
49
|
-
require
|
49
|
+
require "train-winrm/connection"
|
50
50
|
|
51
51
|
# ref: https://github.com/winrb/winrm#transports
|
52
|
-
SUPPORTED_WINRM_TRANSPORTS = %i
|
52
|
+
SUPPORTED_WINRM_TRANSPORTS = %i{negotiate ssl plaintext kerberos}.freeze
|
53
53
|
|
54
54
|
# common target configuration
|
55
55
|
option :host, required: true
|
56
56
|
option :port
|
57
|
-
option :user, default:
|
57
|
+
option :user, default: "administrator", required: true
|
58
58
|
option :password, nil
|
59
59
|
option :winrm_transport, default: :negotiate
|
60
60
|
option :winrm_disable_sspi, default: false
|
61
61
|
option :winrm_basic_auth_only, default: false
|
62
|
-
option :path, default:
|
62
|
+
option :path, default: "/wsman"
|
63
63
|
option :ssl, default: false
|
64
64
|
option :self_signed, default: false
|
65
65
|
|
@@ -101,21 +101,21 @@ module TrainPlugins
|
|
101
101
|
super(opts)
|
102
102
|
|
103
103
|
# set scheme and port based on ssl activation
|
104
|
-
scheme = opts[:ssl] ?
|
104
|
+
scheme = opts[:ssl] ? "https" : "http"
|
105
105
|
port = opts[:port]
|
106
106
|
port = (opts[:ssl] ? 5986 : 5985) if port.nil?
|
107
107
|
winrm_transport = opts[:winrm_transport].to_sym
|
108
108
|
unless SUPPORTED_WINRM_TRANSPORTS.include?(winrm_transport)
|
109
|
-
|
109
|
+
raise Train::ClientError, "Unsupported transport type: #{winrm_transport.inspect}"
|
110
110
|
end
|
111
111
|
|
112
112
|
# remove leading '/'
|
113
|
-
path = (opts[:path] ||
|
113
|
+
path = (opts[:path] || "").sub(%r{^/+}, "")
|
114
114
|
|
115
115
|
opts[:endpoint] = "#{scheme}://#{opts[:host]}:#{port}/#{path}"
|
116
116
|
end
|
117
117
|
|
118
|
-
WINRM_FS_SPEC_VERSION =
|
118
|
+
WINRM_FS_SPEC_VERSION = "~> 1.0".freeze
|
119
119
|
|
120
120
|
# Builds the hash of options needed by the Connection object on
|
121
121
|
# construction.
|
@@ -125,23 +125,23 @@ module TrainPlugins
|
|
125
125
|
# @api private
|
126
126
|
def connection_options(opts)
|
127
127
|
{
|
128
|
-
logger:
|
129
|
-
transport:
|
130
|
-
disable_sspi:
|
131
|
-
basic_auth_only:
|
132
|
-
hostname:
|
133
|
-
endpoint:
|
134
|
-
user:
|
135
|
-
password:
|
136
|
-
rdp_port:
|
137
|
-
connection_retries:
|
138
|
-
connection_retry_sleep:
|
139
|
-
max_wait_until_ready:
|
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],
|
140
140
|
no_ssl_peer_verification: opts[:self_signed],
|
141
|
-
realm:
|
142
|
-
service:
|
143
|
-
ca_trust_file:
|
144
|
-
ssl_peer_fingerprint:
|
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
145
|
}
|
146
146
|
end
|
147
147
|
|
@@ -164,34 +164,34 @@ module TrainPlugins
|
|
164
164
|
# (see Base#load_needed_dependencies!)
|
165
165
|
def load_needed_dependencies!
|
166
166
|
spec_version = WINRM_FS_SPEC_VERSION.dup
|
167
|
-
logger.debug(
|
167
|
+
logger.debug("winrm-fs requested," \
|
168
168
|
" loading WinRM::FS gem (#{spec_version})")
|
169
|
-
gem
|
170
|
-
first_load = require
|
169
|
+
gem "winrm-fs", spec_version
|
170
|
+
first_load = require "winrm-fs"
|
171
171
|
load_winrm_transport!
|
172
172
|
|
173
173
|
if first_load
|
174
|
-
logger.debug(
|
174
|
+
logger.debug("WinRM::FS library loaded")
|
175
175
|
else
|
176
|
-
logger.debug(
|
176
|
+
logger.debug("WinRM::FS previously loaded")
|
177
177
|
end
|
178
178
|
rescue LoadError => e
|
179
179
|
logger.fatal(
|
180
180
|
"The `winrm-fs' gem is missing and must" \
|
181
|
-
|
181
|
+
" be installed or cannot be properly activated. Run" \
|
182
182
|
" `gem install winrm-fs --version '#{spec_version}'`" \
|
183
|
-
|
184
|
-
" `gem 'winrm-fs', '#{spec_version}'`."
|
183
|
+
" or add the following to your Gemfile if you are using Bundler:" \
|
184
|
+
" `gem 'winrm-fs', '#{spec_version}'`."
|
185
185
|
)
|
186
186
|
raise Train::UserError,
|
187
|
-
|
187
|
+
"Could not load or activate WinRM::FS (#{e.message})"
|
188
188
|
end
|
189
189
|
|
190
190
|
# Load WinRM::Transport code.
|
191
191
|
#
|
192
192
|
# @api private
|
193
193
|
def load_winrm_transport!
|
194
|
-
silence_warnings { require
|
194
|
+
silence_warnings { require "winrm-fs" }
|
195
195
|
end
|
196
196
|
|
197
197
|
# Return the last saved WinRM connection instance.
|
data/lib/train-winrm/version.rb
CHANGED
data/train-winrm.gemspec
CHANGED
@@ -4,22 +4,22 @@
|
|
4
4
|
|
5
5
|
# It is traditional in a gemspec to dynamically load the current version
|
6
6
|
# from a file in the source tree. The next three lines make that happen.
|
7
|
-
lib = File.expand_path(
|
7
|
+
lib = File.expand_path("../lib", __FILE__)
|
8
8
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
9
|
-
require
|
9
|
+
require "train-winrm/version"
|
10
10
|
|
11
11
|
Gem::Specification.new do |spec|
|
12
12
|
# Importantly, all Train plugins must be prefixed with `train-`
|
13
|
-
spec.name =
|
13
|
+
spec.name = "train-winrm"
|
14
14
|
|
15
15
|
# It is polite to namespace your plugin under InspecPlugins::YourPluginInCamelCase
|
16
16
|
spec.version = TrainPlugins::WinRM::VERSION
|
17
|
-
spec.authors = [
|
18
|
-
spec.email = [
|
19
|
-
spec.summary =
|
20
|
-
spec.description =
|
21
|
-
spec.homepage =
|
22
|
-
spec.license =
|
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
23
|
|
24
24
|
# Though complicated-looking, this is pretty standard for a gemspec.
|
25
25
|
# It just filters what will actually be packaged in the gem (leaving
|
@@ -27,9 +27,9 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.files = %w{
|
28
28
|
README.md train-winrm.gemspec Gemfile
|
29
29
|
} + Dir.glob(
|
30
|
-
|
30
|
+
"lib/**/*", File::FNM_DOTMATCH
|
31
31
|
).reject { |f| File.directory?(f) }
|
32
|
-
spec.require_paths = [
|
32
|
+
spec.require_paths = ["lib"]
|
33
33
|
|
34
34
|
# If you rely on any other gems, list them here with any constraints.
|
35
35
|
# This is how `inspec plugin install` is able to manage your dependencies.
|
@@ -38,8 +38,7 @@ Gem::Specification.new do |spec|
|
|
38
38
|
# them in Gemfile, not here.
|
39
39
|
|
40
40
|
# Do not list inspec as a dependency of a train plugin.
|
41
|
-
|
42
|
-
spec.add_dependency
|
43
|
-
spec.add_dependency
|
44
|
-
spec.add_dependency 'winrm-fs', '~> 1.0'
|
41
|
+
# Do not list train or train-core as a dependency of a train plugin.
|
42
|
+
spec.add_dependency "winrm", "~> 2.0"
|
43
|
+
spec.add_dependency "winrm-fs", "~> 1.0"
|
45
44
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: train-winrm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
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-
|
11
|
+
date: 2019-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: train
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: winrm
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,8 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
72
|
- !ruby/object:Gem::Version
|
87
73
|
version: '0'
|
88
74
|
requirements: []
|
89
|
-
|
90
|
-
rubygems_version: 2.6.14.3
|
75
|
+
rubygems_version: 3.0.3
|
91
76
|
signing_key:
|
92
77
|
specification_version: 4
|
93
78
|
summary: Windows WinRM API Transport for Train
|