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