lib/drbqs/utility/transfer/transfer_client.rb in drbqs-0.0.15 vs lib/drbqs/utility/transfer/transfer_client.rb in drbqs-0.0.16

- old
+ new

@@ -1,90 +1,89 @@ -require 'net/sftp' +require 'drbqs/utility/transfer/transfer_client_connect.rb' module DRbQS + class Transfer + class Client + attr_reader :directory, :local, :sftp - class TransferClient - - class ClientBase - def initialize(directory) - @directory = File.expand_path(directory) + def initialize(server_directory, same_host, host, user) + unless Pathname.new(server_directory).absolute? + raise ArgumentError, "Directory of server must be absolute." + end + @directory = server_directory + @same_host = same_host + @local = DRbQS::Transfer::Client::Local.new(@directory) + if host && user + @sftp = DRbQS::Transfer::Client::SFTP.new(user, host, @directory) + else + @sftp = nil + end end - def upload_name(path) - File.join(@directory, File.basename(path)) - end - private :upload_name - end - - # Transfer files to directory on DRbQS server over sftp. - # Note that after we transfer files we delete the original files. - class SFTP < DRbQS::TransferClient::ClientBase - attr_reader :user, :host, :directory - - def initialize(user, host, directory) - super(directory) - @user = user - @host = host - end - - # Transfer and delete +files+. def transfer(files) - Net::SFTP.start(@host, @user) do |sftp| - files.each do |path| - sftp.upload(path, upload_name(path)) - FileUtils.rm_r(path) + transfered = false + if @same_host + begin + @local.transfer(files) + transfered = true + rescue end end - rescue => err - raise err.class, "user=#{@user}, host=#{@host}, directory=#{@directory}; #{err.to_s}", err.backtrace + if !transfered + unless @sftp + raise "Can not transfer files." + end + @sftp.transfer(files) + end end - end - class Local < DRbQS::TransferClient::ClientBase - def transfer(files) - files.each do |path| - FileUtils.mv(path, upload_name(path)) + def download(files, readonly = nil) + download_files = nil + if @same_host + begin + if readonly + download_files = files + else + download_files = @local.download(files) + end + rescue + end end + if !download_files + unless @sftp + raise "SFTP is not prepared." + end + download_files = @sftp.download(files) + end + download_files end - end - attr_reader :directory, :local, :sftp + class << self + @transfer = nil - def initialize(dir) - @directory = File.expand_path(dir) - @local = DRbQS::TransferClient::Local.new(@directory) - @sftp = nil - end + def get + @transfer + end - def make_directory - FileUtils.mkdir_p(@directory) - end + def set(transfer) + @transfer = transfer + end - def set_sftp(user, host) - @sftp = DRbQS::TransferClient::SFTP.new(user, host, @directory) - end - - def information - info = "directory: #{@directory}" - info << ", sftp: #{@sftp.user}@#{@sftp.host}" if @sftp - info - end - - def transfer(files, on_same_host = nil) - transfered = false - if on_same_host - begin - @local.transfer(files) - transfered = true - rescue + def transfer_to_server + if files = DRbQS::Transfer.dequeue_all + if @transfer + begin + @transfer.transfer(files) + rescue Exception => err + err_new = err.class.new("#{err.to_s} (#{err.class}); Can not send file: #{files.join(", ")}") + err_new.set_backtrace(err.backtrace) + raise err_new + end + else + raise "Server does not set transfer settings. Can not send file: #{files.join(", ")}" + end + end end end - if !transfered - unless @sftp - raise "Can not transfer files." - end - @sftp.transfer(files) - end end end - end