class ODisk::Copier
Provides upload and download functionality using sftp and ssh on a single connection.
Public Class Methods
new(options={})
click to toggle source
Calls superclass method
# File lib/odisk/copier.rb, line 13 def initialize(options={}) @ftp = nil @ssh = nil super(options) @copy_queue.ask(:ready, self) end
Public Instance Methods
close()
click to toggle source
Calls superclass method
# File lib/odisk/copier.rb, line 27 def close() @ftp.close_channel() unless @ftp.nil? @ftp = nil @ssh.close() unless @ssh.nil? super() end
set_options(options)
click to toggle source
Calls superclass method
# File lib/odisk/copier.rb, line 20 def set_options(options) super(options) @copy_queue = options[:copy_queue] @crypt_queue = options[:crypt_queue] @fixer = options[:fixer] end
Private Instance Methods
assure_dirs_exist(dir)
click to toggle source
# File lib/odisk/copier.rb, line 92 def assure_dirs_exist(dir) ::Opee::Env.info("creating remote dir \"#{dir}\"") unless $dry_run @ssh = Net::SSH.start($remote.host, $remote.user) if @ssh.nil? out = @ssh.exec!(%{mkdir -p "#{dir}"}) raise 'Remote ' + out unless out.nil? || out.strip().empty? end end
download(remote, local, decrypt_path=nil)
click to toggle source
# File lib/odisk/copier.rb, line 60 def download(remote, local, decrypt_path=nil) ::Opee::Env.info("download #{remote} to #{local}") @ftp = Net::SFTP.start($remote.host, $remote.user) if @ftp.nil? begin @ftp.download!(remote, local) if decrypt_path.nil? @fixer.ask(:collect, local, :copier) unless @fixer.nil? ::Opee::Env.warn("Downloaded \"#{local}\"") else @crypt_queue.add_method(:decrypt, local, decrypt_path) end rescue Exception => e ::Opee::Env.error("Download of \"#{local}\" failed: #{e.class}: #{e.message}") #::Opee::Env.rescue(e) end @copy_queue.ask(:ready, self) end
remove_local(path)
click to toggle source
# File lib/odisk/copier.rb, line 78 def remove_local(path) `rm -rf "#{path}"` unless $dry_run ::Opee::Env.warn("Removed local \"#{path}\"") end
remove_remote(path)
click to toggle source
# File lib/odisk/copier.rb, line 83 def remove_remote(path) unless $dry_run @ssh = Net::SSH.start($remote.host, $remote.user) if @ssh.nil? out = @ssh.exec!(%{rm -rf "#{path}" "#{path}.gpg"}) raise out unless out.nil? || out.strip().empty? end ::Opee::Env.warn("Removed remote \"#{path}\"") end
upload(local, remote, delete_after=false)
click to toggle source
# File lib/odisk/copier.rb, line 36 def upload(local, remote, delete_after=false) ::Opee::Env.info("upload \"#{local}\" to \"#{remote}\"#{delete_after ? ' then delete' : ''}") unless $dry_run @ftp = Net::SFTP.start($remote.host, $remote.user) if @ftp.nil? begin @ftp.upload!(local, remote) `rm "#{local}"` if delete_after ::Opee::Env.warn("Uploaded \"#{local}\"") rescue Net::SFTP::StatusException => e if Net::SFTP::Constants::StatusCodes::FX_NO_SUCH_FILE == e.code begin assure_dirs_exist(::File.dirname(remote)) retry rescue Exception => e2 ::Opee::Env.error("Upload of \"#{local}\" failed: #{e2.class}: #{e2.message}") end else ::Opee::Env.error("Upload of \"#{local}\" failed: #{e.class}: (#{e.code}) #{e.description}\n #{e.text}\n #{e.response}") end end end @copy_queue.ask(:ready, self) end