lib/vos/drivers/ssh.rb in vos-0.1.0 vs lib/vos/drivers/ssh.rb in vos-0.1.1

- old
+ new

@@ -2,146 +2,22 @@ require 'net/sftp' module Vos module Drivers class Ssh < Abstract - module VfsStorage - # - # Attributes - # - def attributes path - - stat = sftp.stat! fix_path(path) - attrs = {} - attrs[:file] = stat.file? - attrs[:dir] = stat.directory? - # stat.symlink? - attrs - rescue Net::SFTP::StatusException - {} - end - - def set_attributes path, attrs - raise 'not supported' - end - - # - # File - # - def read_file path, &block - sftp.file.open fix_path(path), 'r' do |is| - while buff = is.gets - block.call buff - end - end - end - - def write_file path, append, &block - # there's no support for :append in Net::SFTP, so we just mimic it - if append - attrs = attributes(path) - data = if attrs - if attrs[:file] - os = "" - read_file(path){|buff| os << buff} - delete_file path - os - else - raise "can't append to dir!" - end - else - '' - end - write_file path, false do |writer| - writer.call data - block.call writer - end - else - sftp.file.open fix_path(path), 'w' do |os| - writer = -> buff {os.write buff} - block.call writer - end - end - end - - def delete_file remote_file_path - sftp.remove! fix_path(remote_file_path) - end - - # def move_file path - # raise 'not supported' - # end - - - # - # Dir - # - def create_dir path - sftp.mkdir! path - end - - def delete_dir path - exec "rm -r #{path}" - end - - def each path, &block - sftp.dir.foreach path do |stat| - next if stat.name == '.' or stat.name == '..' - if stat.directory? - block.call stat.name, :dir - else - block.call stat.name, :file - end - end - end - - def efficient_dir_copy from, to - from.storage.open_fs do |from_fs| - to.storage.open_fs do |to_fs| - if from_fs.local? - sftp.upload! from.path, fix_path(to.path) - true - elsif to_fs.local? - sftp.download! fix_path(to.path), from.path, :recursive => true - true - else - false - end - end - end - end - - # def move_dir path - # raise 'not supported' - # end - - - # - # Special - # - def tmp &block - tmp_dir = "/tmp/vfs_#{rand(10**3)}" - if block - begin - create_dir tmp_dir - block.call tmp_dir - ensure - delete_dir tmp_dir - end - else - create_dir tmp_dir - tmp_dir - end - end - - def local?; false end - end + DEFAULT_OPTIONS = { + config: true + } def initialize options = {} - super - raise "ssh options not provided!" unless options[:ssh] - raise "invalid ssh options!" unless options[:ssh].is_a?(Hash) + super + raise ":host not provided!" unless options[:host] + @options = DEFAULT_OPTIONS.merge options + + # config_options = Net::SSH.configuration_for(options[:host]) + # options = DEFAULT_OPTIONS.merge(config_options).merge options + # raise ":user not provided (provide explicitly or in .ssh/config)!" unless options[:user] end # # Establishing SSH channel @@ -158,14 +34,15 @@ close end end else unless @ssh - ssh_options = self.options[:ssh].clone - host = options[:host] || raise('host not provided!') - user = ssh_options.delete(:user) || raise('user not provied!') - @ssh = Net::SSH.start(host, user, ssh_options) + opt = self.options.clone + host = opt.delete :host #] || raise('host not provided!') + # user = options.delete(:user) || raise('user not provied!') + + @ssh = Net::SSH.start(host, nil, opt) @sftp = @ssh.sftp.connect end end end @@ -175,17 +52,15 @@ # @sftp.close not needed @ssh, @sftp = nil end end - def to_s; options[:host] end - - + # # Vfs # - include VfsStorage + include SshVfsStorage alias_method :open_fs, :open # # Shell @@ -206,9 +81,14 @@ stdout_and_stderr, stderr, code, signal = hacked_exec! ssh, command, true return code, stdout_and_stderr end + + # + # Micelaneous + # + def to_s; options[:host] end protected attr_accessor :ssh, :sftp def fix_path path \ No newline at end of file