Skip to content
This repository was archived by the owner on Oct 21, 2022. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions lib/kitchen/transport/sftp.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

require 'benchmark'
require 'digest/sha1'
require 'fileutils'
require 'json'

require 'kitchen/transport/ssh'
Expand Down Expand Up @@ -94,6 +95,50 @@ def upload(locals, remote)
end
end

# (see Base::Connection#download)
def download(remotes, local)
# ensure the parent dir of the local target exists
FileUtils.mkdir_p(File.dirname(local))

Array(remotes).each do |remote|
entries = if remote.include? '*'
logger.debug("Interpreting remote '#{remote}' as glob, finding matching files...")
found_pattern = false
path = []
pattern = []
'/path/dir/*.json'.split('/').each do |comp|
found_pattern = true if comp.include? '*'
if found_pattern
pattern << comp
else
path << comp
end
end
sftp_session.dir.glob(path.join('/'), pattern.join('/'))
else
Array(remote)
end

entries.each do |entry|
begin
logger.debug("Attempting to download '#{remote}' as file")
sftp_session.download!(entry, local)
rescue Net::SFTP::Error
begin
logger.debug("Attempting to download '#{remote}' as directory")
sftp_session.download!(entry, local, recursive: true)
rescue Net::SFTP::Error
logger.warn(
"SFTP download failed for file or directory '#{remote}', perhaps it does not exist?"
)
end
end
end
end
rescue Net::SSH::Exception => ex
raise SshFailed, "SCP download failed (#{ex.message})"
end

private

def sftp_upload!(local, remote, recursive: true, purge: true)
Expand Down