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