chef-winrm-fs 1.3.7 → 1.4.1
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 +4 -4
- data/lib/chef-winrm-fs/core/file_transporter.rb +59 -59
- data/lib/chef-winrm-fs/core/tmp_zip.rb +10 -10
- data/lib/chef-winrm-fs/file_manager.rb +13 -13
- data/lib/chef-winrm-fs/scripts/scripts.rb +1 -1
- data/lib/chef-winrm-fs.rb +5 -5
- metadata +41 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10d727aedcfc19fe388fe16171a26b81500bd54fb4813c4bd56491f7dcab4e6e
|
4
|
+
data.tar.gz: ca50ec0aae1922be507ba7bf4d3100c1370b106ea5bc81a3a94dd190a50becdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12d2e19272de8987b9d61fb6dd23f59f6c3bcab879c484ad64f56706638b4ddd967d09bbc5ab276c0d0fad372c1eaa8d0e96e37bdd4c94312dede98e2dcd3242
|
7
|
+
data.tar.gz: 414a4d89076494e67c57be9ab5ff9ca47e012e05e5f2489a265a26a07b14b4ebf5770bc9d2d70427f14a0fed24e1d3f7d776e7f8acab3c8769f842ff5dbd85aa
|
@@ -17,14 +17,14 @@
|
|
17
17
|
# See the License for the specific language governing permissions and
|
18
18
|
# limitations under the License.
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
20
|
+
require "benchmark" unless defined?(Benchmark)
|
21
|
+
require "csv" unless defined?(CSV)
|
22
|
+
require "digest" unless defined?(Digest)
|
23
|
+
require "securerandom" unless defined?(SecureRandom)
|
24
|
+
require "stringio" unless defined?(StringIO)
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require "chef-winrm/exceptions"
|
27
|
+
require "chef-winrm-fs/core/tmp_zip"
|
28
28
|
|
29
29
|
module WinRM
|
30
30
|
module FS
|
@@ -38,7 +38,7 @@ module WinRM
|
|
38
38
|
# Exception for the case where upload source contains more than one
|
39
39
|
# StringIO object, or a combination of file/directory paths and StringIO object
|
40
40
|
class UploadSourceError < StandardError
|
41
|
-
def initialize(msg =
|
41
|
+
def initialize(msg = "Only a single StringIO object may be uploaded.")
|
42
42
|
super
|
43
43
|
end
|
44
44
|
end
|
@@ -126,7 +126,7 @@ module WinRM
|
|
126
126
|
# @return [String] the Array pack template for Base64 encoding a stream
|
127
127
|
# of data
|
128
128
|
# @api private
|
129
|
-
BASE64_PACK =
|
129
|
+
BASE64_PACK = "m0".freeze
|
130
130
|
|
131
131
|
# @return [String] the directory where temporary upload artifacts are
|
132
132
|
# persisted
|
@@ -148,9 +148,9 @@ module WinRM
|
|
148
148
|
def max_encoded_write
|
149
149
|
@max_encoded_write ||= begin
|
150
150
|
empty_command = WinRM::PSRP::MessageFactory.create_pipeline_message(
|
151
|
-
|
152
|
-
|
153
|
-
stream_command(
|
151
|
+
"00000000-0000-0000-0000-000000000000",
|
152
|
+
"00000000-0000-0000-0000-000000000000",
|
153
|
+
stream_command("")
|
154
154
|
)
|
155
155
|
shell.max_fragment_blob_size - empty_command.bytes.length
|
156
156
|
end
|
@@ -166,7 +166,7 @@ module WinRM
|
|
166
166
|
# @api private
|
167
167
|
def reconcile_destinations!(files)
|
168
168
|
files.each do |_, data|
|
169
|
-
data[
|
169
|
+
data["dst"] = File.join(data["dst"], File.basename(data["src"])) if data["target_is_folder"] == "True"
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
@@ -185,12 +185,12 @@ module WinRM
|
|
185
185
|
zip_sha1 = sha1sum(zip_io.path)
|
186
186
|
|
187
187
|
hash[zip_sha1] = {
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
188
|
+
"src" => dir,
|
189
|
+
"src_zip" => zip_io.path.to_s,
|
190
|
+
"zip_io" => zip_io,
|
191
|
+
"tmpzip" => "#{TEMP_UPLOAD_DIRECTORY}\\tmpzip-#{zip_sha1}.zip",
|
192
|
+
"dst" => "#{remote}\\#{File.basename(dir)}",
|
193
|
+
"size" => File.size(zip_io.path),
|
194
194
|
}
|
195
195
|
end
|
196
196
|
|
@@ -203,9 +203,9 @@ module WinRM
|
|
203
203
|
def add_file_hash!(hash, local, remote)
|
204
204
|
logger.debug "creating hash for file #{remote}"
|
205
205
|
hash[sha1sum(local)] = {
|
206
|
-
|
207
|
-
|
208
|
-
|
206
|
+
"src" => local,
|
207
|
+
"dst" => remote,
|
208
|
+
"size" => local.is_a?(StringIO) ? local.size : File.size(local),
|
209
209
|
}
|
210
210
|
end
|
211
211
|
|
@@ -218,9 +218,9 @@ module WinRM
|
|
218
218
|
# @return [Hash] a report hash, keyed by the local SHA1 digest
|
219
219
|
# @api private
|
220
220
|
def check_files(files)
|
221
|
-
logger.debug
|
221
|
+
logger.debug "Running check_files.ps1"
|
222
222
|
hash_file = check_files_ps_hash(files)
|
223
|
-
script = WinRM::FS::Scripts.render(
|
223
|
+
script = WinRM::FS::Scripts.render("check_files", hash_file: hash_file)
|
224
224
|
parse_response(shell.run(script))
|
225
225
|
end
|
226
226
|
|
@@ -235,10 +235,10 @@ module WinRM
|
|
235
235
|
[
|
236
236
|
sha1,
|
237
237
|
{
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
}
|
238
|
+
"target" => data.fetch("tmpzip", data["dst"]),
|
239
|
+
"src_basename" => data["src"].is_a?(StringIO) ? data["dst"] : File.basename(data["src"]),
|
240
|
+
"dst" => data["dst"],
|
241
|
+
},
|
242
242
|
]
|
243
243
|
end
|
244
244
|
ps_hash(Hash[hash])
|
@@ -250,10 +250,10 @@ module WinRM
|
|
250
250
|
# @param files [Hash] a files hash
|
251
251
|
# @api private
|
252
252
|
def cleanup(files)
|
253
|
-
files.select { |_, data| data.key?(
|
254
|
-
data.fetch(
|
255
|
-
files.fetch(sha1).delete(
|
256
|
-
logger.debug "Cleaned up src_zip #{data[
|
253
|
+
files.select { |_, data| data.key?("zip_io") }.each do |sha1, data|
|
254
|
+
data.fetch("zip_io").unlink
|
255
|
+
files.fetch(sha1).delete("zip_io")
|
256
|
+
logger.debug "Cleaned up src_zip #{data["src_zip"]}"
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
@@ -270,11 +270,11 @@ module WinRM
|
|
270
270
|
extracted_files = extract_files_ps_hash(files)
|
271
271
|
|
272
272
|
if extracted_files == ps_hash({})
|
273
|
-
logger.debug
|
273
|
+
logger.debug "No remote files to extract, skipping"
|
274
274
|
{}
|
275
275
|
else
|
276
|
-
logger.debug
|
277
|
-
script = WinRM::FS::Scripts.render(
|
276
|
+
logger.debug "Running extract_files.ps1"
|
277
|
+
script = WinRM::FS::Scripts.render("extract_files", hash_file: extracted_files)
|
278
278
|
|
279
279
|
parse_response(shell.run(script))
|
280
280
|
end
|
@@ -288,11 +288,11 @@ module WinRM
|
|
288
288
|
# @return [String] the inner contents of a PowerShell Hash Table
|
289
289
|
# @api private
|
290
290
|
def extract_files_ps_hash(files)
|
291
|
-
file_data = files.select { |_, data| data.key?(
|
291
|
+
file_data = files.select { |_, data| data.key?("tmpzip") }
|
292
292
|
|
293
293
|
result = file_data.map do |sha1, data|
|
294
|
-
val = {
|
295
|
-
val[
|
294
|
+
val = { "dst" => data["dst"] }
|
295
|
+
val["tmpzip"] = data["tmpzip"] if data["tmpzip"]
|
296
296
|
|
297
297
|
[sha1, val]
|
298
298
|
end
|
@@ -308,7 +308,7 @@ module WinRM
|
|
308
308
|
total = 0 if total.nil?
|
309
309
|
minutes = (total / 60).to_i
|
310
310
|
seconds = (total - (minutes * 60))
|
311
|
-
format(
|
311
|
+
format("(%dm%.2fs)", minutes, seconds)
|
312
312
|
end
|
313
313
|
|
314
314
|
# Contructs a Hash of files or directories, keyed by the local SHA1
|
@@ -329,7 +329,7 @@ module WinRM
|
|
329
329
|
else
|
330
330
|
local = local.to_s
|
331
331
|
expanded = File.expand_path(local)
|
332
|
-
expanded += local[-1] if local.end_with?(
|
332
|
+
expanded += local[-1] if local.end_with?("/", "\\")
|
333
333
|
if File.file?(expanded)
|
334
334
|
add_file_hash!(hash, expanded, remote)
|
335
335
|
elsif File.directory?(expanded)
|
@@ -387,7 +387,7 @@ module WinRM
|
|
387
387
|
# @return [String] a whitespace padded string of the given length
|
388
388
|
# @api private
|
389
389
|
def pad(depth = 0)
|
390
|
-
|
390
|
+
" " * depth
|
391
391
|
end
|
392
392
|
|
393
393
|
# Parses response of a PowerShell script or CMD command which contains
|
@@ -404,17 +404,17 @@ module WinRM
|
|
404
404
|
if exitcode != 0
|
405
405
|
raise FileTransporterFailed, "[#{self.class}] Upload failed " \
|
406
406
|
"(exitcode: #{exitcode})\n#{stderr}"
|
407
|
-
elsif stderr != '\r\n' && stderr !=
|
407
|
+
elsif stderr != '\r\n' && stderr != ""
|
408
408
|
raise FileTransporterFailed, "[#{self.class}] Upload failed " \
|
409
409
|
"(exitcode: 0), but stderr present\n#{stderr}"
|
410
410
|
end
|
411
411
|
|
412
|
-
logger.debug
|
412
|
+
logger.debug "Parsing CSV Response"
|
413
413
|
logger.debug output.stdout
|
414
414
|
|
415
415
|
array = CSV.parse(output.stdout, headers: true).map(&:to_hash)
|
416
|
-
array.each { |h| h.each { |key, value| h[key] = nil if value ==
|
417
|
-
Hash[array.map { |entry| [entry.fetch(
|
416
|
+
array.each { |h| h.each { |key, value| h[key] = nil if value == "" } }
|
417
|
+
Hash[array.map { |entry| [entry.fetch("src_sha1"), entry] }]
|
418
418
|
end
|
419
419
|
|
420
420
|
# Converts a Ruby hash into a PowerShell hash table, represented in a
|
@@ -429,10 +429,10 @@ module WinRM
|
|
429
429
|
def ps_hash(obj, depth = 0)
|
430
430
|
if obj.is_a?(Hash)
|
431
431
|
obj.map do |k, v|
|
432
|
-
%
|
432
|
+
%{#{pad(depth + 2)}#{ps_hash(k)} = #{ps_hash(v, depth + 2)}}
|
433
433
|
end.join(";\n").insert(0, "@{\n").insert(-1, "\n#{pad(depth)}}")
|
434
434
|
else
|
435
|
-
%
|
435
|
+
%{"#{obj}"}
|
436
436
|
end
|
437
437
|
end
|
438
438
|
|
@@ -456,7 +456,7 @@ module WinRM
|
|
456
456
|
chunk = 1
|
457
457
|
bytes = 0
|
458
458
|
# Do not freeze this string
|
459
|
-
buffer =
|
459
|
+
buffer = ""
|
460
460
|
shell.run(<<-PS
|
461
461
|
$to = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("#{dest}")
|
462
462
|
$parent = Split-Path $to
|
@@ -486,7 +486,7 @@ module WinRM
|
|
486
486
|
chunk += 1
|
487
487
|
yield bytes if block_given?
|
488
488
|
end
|
489
|
-
shell.run(
|
489
|
+
shell.run("$fileStream.Dispose()")
|
490
490
|
buffer = nil # rubocop:disable Lint/UselessAssignment
|
491
491
|
|
492
492
|
[chunk - 1, bytes]
|
@@ -515,7 +515,7 @@ module WinRM
|
|
515
515
|
if src.is_a?(StringIO)
|
516
516
|
chunks, bytes = stream_upload(src, dest, &block)
|
517
517
|
else
|
518
|
-
File.open(src,
|
518
|
+
File.open(src, "rb") do |io|
|
519
519
|
chunks, bytes = stream_upload(io, dest, &block)
|
520
520
|
end
|
521
521
|
end
|
@@ -539,16 +539,16 @@ module WinRM
|
|
539
539
|
def stream_upload_files(files)
|
540
540
|
response = {}
|
541
541
|
files.each do |sha1, data|
|
542
|
-
src = data.fetch(
|
543
|
-
if data[
|
544
|
-
response[sha1] = {
|
545
|
-
chunks, bytes = stream_upload_file(src, data[
|
546
|
-
yield data[
|
542
|
+
src = data.fetch("src_zip", data["src"])
|
543
|
+
if data["chk_dirty"] == "True"
|
544
|
+
response[sha1] = { "dest" => data["tmpzip"] || data["dst"] }
|
545
|
+
chunks, bytes = stream_upload_file(src, data["tmpzip"] || data["dst"]) do |xfered|
|
546
|
+
yield data["src"], xfered
|
547
547
|
end
|
548
|
-
response[sha1][
|
549
|
-
response[sha1][
|
548
|
+
response[sha1]["chunks"] = chunks
|
549
|
+
response[sha1]["xfered"] = bytes
|
550
550
|
else
|
551
|
-
logger.debug "File #{data[
|
551
|
+
logger.debug "File #{data["dst"]} is up to date, skipping"
|
552
552
|
end
|
553
553
|
end
|
554
554
|
response
|
@@ -563,7 +563,7 @@ module WinRM
|
|
563
563
|
# @api private
|
564
564
|
def total_base64_transfer_size(files)
|
565
565
|
size = 0
|
566
|
-
files.values.each { |file| size += file[
|
566
|
+
files.values.each { |file| size += file["size"] if file["chk_dirty"] == "True" }
|
567
567
|
size / 3 * 4
|
568
568
|
end
|
569
569
|
end
|
@@ -17,10 +17,10 @@
|
|
17
17
|
# See the License for the specific language governing permissions and
|
18
18
|
# limitations under the License.
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
20
|
+
require "delegate"
|
21
|
+
require "pathname" unless defined?(Pathname)
|
22
|
+
require "tempfile" unless defined?(Tempfile)
|
23
|
+
require "zip" unless defined?(Zip)
|
24
24
|
|
25
25
|
module WinRM
|
26
26
|
module FS
|
@@ -70,7 +70,7 @@ module WinRM
|
|
70
70
|
def initialize(dir, logger = nil)
|
71
71
|
@logger = logger || Logging.logger[self]
|
72
72
|
@dir = clean_dirname(dir)
|
73
|
-
@zip_io = Tempfile.open([
|
73
|
+
@zip_io = Tempfile.open(["tmpzip-", ".zip"], binmode: true)
|
74
74
|
write_zip
|
75
75
|
@zip_io.close
|
76
76
|
end
|
@@ -113,13 +113,13 @@ module WinRM
|
|
113
113
|
# directory, excluding directories
|
114
114
|
# @api private
|
115
115
|
def entries
|
116
|
-
Pathname.glob(dir.join(
|
116
|
+
Pathname.glob(dir.join("**/.*")).push(*Pathname.glob(dir.join("**/*"))).delete_if(&:directory?).sort
|
117
117
|
end
|
118
118
|
|
119
119
|
# (see Logging.log_subject)
|
120
120
|
# @api private
|
121
121
|
def log_subject
|
122
|
-
@log_subject ||= [self.class.to_s.split(
|
122
|
+
@log_subject ||= [self.class.to_s.split("::").last, path].join("::")
|
123
123
|
end
|
124
124
|
|
125
125
|
# Adds all file entries to the Zip output stream.
|
@@ -134,16 +134,16 @@ module WinRM
|
|
134
134
|
zip_entry(entry_path),
|
135
135
|
nil, nil, ::Zip::Entry::DEFLATED, Zlib::BEST_COMPRESSION
|
136
136
|
)
|
137
|
-
entry.open(
|
137
|
+
entry.open("rb") { |src| IO.copy_stream(src, zos) }
|
138
138
|
end
|
139
|
-
logger.debug
|
139
|
+
logger.debug "=== All files added."
|
140
140
|
end
|
141
141
|
|
142
142
|
# Writes out a temporary Zip file.
|
143
143
|
#
|
144
144
|
# @api private
|
145
145
|
def write_zip
|
146
|
-
logger.debug
|
146
|
+
logger.debug "Populating files"
|
147
147
|
Zip::OutputStream.write_buffer(NoDupIO.new(zip_io)) do |zos|
|
148
148
|
produce_zip_entries(zos)
|
149
149
|
end
|
@@ -15,9 +15,9 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
require
|
19
|
-
require_relative
|
20
|
-
require_relative
|
18
|
+
require "chef-winrm" unless defined?(WinRM::Connection)
|
19
|
+
require_relative "scripts/scripts"
|
20
|
+
require_relative "core/file_transporter"
|
21
21
|
|
22
22
|
module WinRM
|
23
23
|
module FS
|
@@ -34,9 +34,9 @@ module WinRM
|
|
34
34
|
# otherwise ''
|
35
35
|
# @param [String] The remote file path
|
36
36
|
# @parms [String] The digest method
|
37
|
-
def checksum(path, digest =
|
37
|
+
def checksum(path, digest = "SHA1")
|
38
38
|
@logger.debug("checksum with #{digest}: #{path}")
|
39
|
-
script = WinRM::FS::Scripts.render(
|
39
|
+
script = WinRM::FS::Scripts.render("checksum", path: path, digest: digest)
|
40
40
|
ps_run(script).exitcode == 0
|
41
41
|
end
|
42
42
|
|
@@ -45,7 +45,7 @@ module WinRM
|
|
45
45
|
# @return [Boolean] True if successful, otherwise false
|
46
46
|
def create_dir(path)
|
47
47
|
@logger.debug("create_dir: #{path}")
|
48
|
-
script = WinRM::FS::Scripts.render(
|
48
|
+
script = WinRM::FS::Scripts.render("create_dir", path: path)
|
49
49
|
ps_run(script).exitcode == 0
|
50
50
|
end
|
51
51
|
|
@@ -54,7 +54,7 @@ module WinRM
|
|
54
54
|
# @return [Boolean] True if successful, otherwise False
|
55
55
|
def delete(path)
|
56
56
|
@logger.debug("deleting: #{path}")
|
57
|
-
script = WinRM::FS::Scripts.render(
|
57
|
+
script = WinRM::FS::Scripts.render("delete", path: path)
|
58
58
|
ps_run(script).exitcode == 0
|
59
59
|
end
|
60
60
|
|
@@ -70,7 +70,7 @@ module WinRM
|
|
70
70
|
|
71
71
|
return false if output.exitcode >= 1
|
72
72
|
|
73
|
-
File.open(local_path,
|
73
|
+
File.open(local_path, "wb") do |fd|
|
74
74
|
out = _write_file(fd, output)
|
75
75
|
index += out.length
|
76
76
|
until out.empty?
|
@@ -86,12 +86,12 @@ module WinRM
|
|
86
86
|
# rubocop:enable Metrics/MethodLength
|
87
87
|
|
88
88
|
def _output_from_file(remote_path, chunk_size, index)
|
89
|
-
script = WinRM::FS::Scripts.render(
|
89
|
+
script = WinRM::FS::Scripts.render("download", path: remote_path, chunk_size: chunk_size, index: index)
|
90
90
|
ps_run(script)
|
91
91
|
end
|
92
92
|
|
93
93
|
def _write_file(tofd, output)
|
94
|
-
contents = output.stdout.gsub('\n\r',
|
94
|
+
contents = output.stdout.gsub('\n\r', "")
|
95
95
|
out = Base64.decode64(contents)
|
96
96
|
out = out[0, out.length - 1] if out.end_with? "\x00"
|
97
97
|
return out if out.empty?
|
@@ -105,7 +105,7 @@ module WinRM
|
|
105
105
|
# @return [Boolean] True if the file/dir exists, otherwise false.
|
106
106
|
def exists?(path)
|
107
107
|
@logger.debug("exists?: #{path}")
|
108
|
-
script = WinRM::FS::Scripts.render(
|
108
|
+
script = WinRM::FS::Scripts.render("exists", path: path)
|
109
109
|
ps_run(script).exitcode == 0
|
110
110
|
end
|
111
111
|
|
@@ -114,7 +114,7 @@ module WinRM
|
|
114
114
|
# @return [String] Full path to the temp directory
|
115
115
|
def temp_dir
|
116
116
|
@temp_dir ||= begin
|
117
|
-
ps_run(
|
117
|
+
ps_run("$env:TEMP").stdout.chomp.tr("\\", "/")
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
@@ -162,7 +162,7 @@ module WinRM
|
|
162
162
|
local_path = File.join(local_path, File.basename(remote_path.to_s)) if first
|
163
163
|
FileUtils.mkdir_p(local_path) unless File.directory?(local_path)
|
164
164
|
command = "Get-ChildItem #{remote_path} | Select-Object Name"
|
165
|
-
@connection.shell(:powershell) { |e| e.run(command) }.stdout.strip.split(
|
165
|
+
@connection.shell(:powershell) { |e| e.run(command) }.stdout.strip.split("\n").drop(2).each do |file|
|
166
166
|
download(File.join(remote_path.to_s, file.strip), File.join(local_path, file.strip), chunk_size, false)
|
167
167
|
end
|
168
168
|
end
|
data/lib/chef-winrm-fs.rb
CHANGED
@@ -15,11 +15,11 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require_relative
|
22
|
-
require_relative
|
18
|
+
require "chef-winrm" unless defined?(WinRM::Connection)
|
19
|
+
require "logger"
|
20
|
+
require "pathname" unless defined?(Pathname)
|
21
|
+
require_relative "chef-winrm-fs/exceptions"
|
22
|
+
require_relative "chef-winrm-fs/file_manager"
|
23
23
|
|
24
24
|
module WinRM
|
25
25
|
# WinRM File System
|
metadata
CHANGED
@@ -1,30 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-winrm-fs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shawn Neal
|
8
8
|
- Matt Wrock
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-
|
12
|
+
date: 2025-07-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chef-winrm
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 2.
|
20
|
+
version: '2.4'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 2.
|
27
|
+
version: '2.4'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: erubi
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,6 +73,34 @@ dependencies:
|
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '2.0'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: csv
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.3'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.3'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: benchmark
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.4.0
|
97
|
+
type: :runtime
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.4.0
|
76
104
|
- !ruby/object:Gem::Dependency
|
77
105
|
name: pry
|
78
106
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,19 +144,19 @@ dependencies:
|
|
116
144
|
- !ruby/object:Gem::Version
|
117
145
|
version: '3.0'
|
118
146
|
- !ruby/object:Gem::Dependency
|
119
|
-
name:
|
147
|
+
name: cookstyle
|
120
148
|
requirement: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
150
|
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
|
-
version: 1
|
152
|
+
version: '8.1'
|
125
153
|
type: :development
|
126
154
|
prerelease: false
|
127
155
|
version_requirements: !ruby/object:Gem::Requirement
|
128
156
|
requirements:
|
129
157
|
- - "~>"
|
130
158
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1
|
159
|
+
version: '8.1'
|
132
160
|
description: " Ruby library for file system operations via Windows Remote Management\n"
|
133
161
|
email:
|
134
162
|
- sneal@sneal.net
|
@@ -160,7 +188,7 @@ homepage: http://github.com/WinRb/winrm-fs
|
|
160
188
|
licenses:
|
161
189
|
- Apache-2.0
|
162
190
|
metadata: {}
|
163
|
-
post_install_message:
|
191
|
+
post_install_message:
|
164
192
|
rdoc_options:
|
165
193
|
- "-x"
|
166
194
|
- test/
|
@@ -172,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
200
|
requirements:
|
173
201
|
- - ">="
|
174
202
|
- !ruby/object:Gem::Version
|
175
|
-
version: '3.
|
203
|
+
version: '3.1'
|
176
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
205
|
requirements:
|
178
206
|
- - ">="
|
@@ -180,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
208
|
version: '0'
|
181
209
|
requirements: []
|
182
210
|
rubygems_version: 3.3.27
|
183
|
-
signing_key:
|
211
|
+
signing_key:
|
184
212
|
specification_version: 4
|
185
213
|
summary: WinRM File System
|
186
214
|
test_files: []
|