vfs 0.0.4 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -2
- data/lib/vfs.rb +18 -0
- data/lib/vfs/entries/dir.rb +272 -0
- data/lib/vfs/entries/entry.rb +127 -0
- data/lib/vfs/entries/file.rb +185 -0
- data/lib/vfs/entries/universal_entry.rb +24 -0
- data/lib/vfs/entry_proxy.rb +38 -0
- data/lib/vfs/error.rb +4 -0
- data/lib/vfs/integration/string.rb +19 -0
- data/lib/vfs/path.rb +125 -0
- data/lib/vfs/storages/hash_fs.rb +194 -0
- data/lib/vfs/storages/local.rb +138 -0
- data/lib/vfs/storages/specification.rb +127 -0
- data/lib/vfs/support.rb +2 -0
- data/readme.md +110 -14
- data/spec/container_spec.rb +31 -0
- data/spec/dir_spec.rb +224 -0
- data/spec/entry_spec.rb +24 -0
- data/spec/file_spec.rb +189 -0
- data/spec/path_spec.rb +121 -0
- data/spec/spec_helper.rb +2 -9
- data/spec/storages/hash_fs_spec.rb +10 -0
- data/spec/storages/local_spec.rb +10 -0
- data/spec/universal_entry_spec.rb +42 -0
- metadata +25 -23
- data/lib/old/ssh.rb +0 -11
- data/lib/rsh.rb +0 -19
- data/lib/rsh/box.rb +0 -182
- data/lib/rsh/box/marks.rb +0 -29
- data/lib/rsh/drivers/abstract.rb +0 -15
- data/lib/rsh/drivers/local.rb +0 -48
- data/lib/rsh/drivers/ssh.rb +0 -147
- data/lib/rsh/gems.rb +0 -2
- data/lib/rsh/support.rb +0 -30
- data/spec/abstract_driver.rb +0 -82
- data/spec/abstract_driver/dir/dir2/file +0 -0
- data/spec/abstract_driver/local_file +0 -1
- data/spec/box_spec.rb +0 -109
- data/spec/box_spec/dir/dir2/file +0 -0
- data/spec/box_spec/local_file +0 -1
- data/spec/config.example.yml +0 -4
- data/spec/config.yml +0 -5
- data/spec/local_driver_spec.rb +0 -9
- data/spec/ssh_driver_spec.rb +0 -15
    
        data/lib/old/ssh.rb
    DELETED
    
    
    
        data/lib/rsh.rb
    DELETED
    
    | @@ -1,19 +0,0 @@ | |
| 1 | 
            -
            raise 'ruby 1.9.2 or higher required!' if RUBY_VERSION < '1.9.2'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'rsh/gems'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'open3'
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            require 'net/ssh'
         | 
| 8 | 
            -
            require 'net/sftp'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            %w(
         | 
| 11 | 
            -
              support
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              drivers/abstract
         | 
| 14 | 
            -
              drivers/local
         | 
| 15 | 
            -
              drivers/ssh
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              box/marks
         | 
| 18 | 
            -
              box
         | 
| 19 | 
            -
            ).each{|f| require "rsh/#{f}"}
         | 
    
        data/lib/rsh/box.rb
    DELETED
    
    | @@ -1,182 +0,0 @@ | |
| 1 | 
            -
            module Rsh
         | 
| 2 | 
            -
              class Box
         | 
| 3 | 
            -
                include Marks
         | 
| 4 | 
            -
                
         | 
| 5 | 
            -
                attr_accessor :options
         | 
| 6 | 
            -
                
         | 
| 7 | 
            -
                def initialize options = {}
         | 
| 8 | 
            -
                  @options = options
         | 
| 9 | 
            -
                  options[:host] ||= 'localhost'
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
                
         | 
| 12 | 
            -
                def driver
         | 
| 13 | 
            -
                  unless @driver
         | 
| 14 | 
            -
                    klass = options[:host] == 'localhost' ? Drivers::Local : Drivers::Ssh
         | 
| 15 | 
            -
                    @driver = klass.new options
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
                  @driver
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
                
         | 
| 20 | 
            -
                def local_driver
         | 
| 21 | 
            -
                  @local_driver ||= Drivers::Local.new
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
                
         | 
| 24 | 
            -
                def bulk &b
         | 
| 25 | 
            -
                  driver.bulk &b
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
                
         | 
| 28 | 
            -
                def upload_file from_local_path, to_remote_path, options = {}
         | 
| 29 | 
            -
                  bulk do
         | 
| 30 | 
            -
                    raise "file '#{from_local_path}' not exists!" unless local_driver.file_exist? from_local_path
         | 
| 31 | 
            -
                    if driver.file_exist?(to_remote_path)
         | 
| 32 | 
            -
                      if options[:override]
         | 
| 33 | 
            -
                        driver.remove_file to_remote_path
         | 
| 34 | 
            -
                      else
         | 
| 35 | 
            -
                        raise "file '#{to_remote_path}' already exists!"
         | 
| 36 | 
            -
                      end
         | 
| 37 | 
            -
                    end        
         | 
| 38 | 
            -
                    driver.upload_file from_local_path, to_remote_path
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                end
         | 
| 41 | 
            -
                
         | 
| 42 | 
            -
                def download_file from_remote_path, to_local_path, options = {}
         | 
| 43 | 
            -
                  bulk do
         | 
| 44 | 
            -
                    raise "file #{from_remote_path} not exists!" unless driver.file_exist?(from_remote_path)
         | 
| 45 | 
            -
                    if local_driver.file_exist? to_local_path
         | 
| 46 | 
            -
                      if options[:override]
         | 
| 47 | 
            -
                        local_driver.remove_file to_local_path
         | 
| 48 | 
            -
                      else
         | 
| 49 | 
            -
                        raise "file #{to_local_path} already exists!" 
         | 
| 50 | 
            -
                      end
         | 
| 51 | 
            -
                    end
         | 
| 52 | 
            -
                    driver.download_file from_remote_path, to_local_path
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
                
         | 
| 56 | 
            -
                def remove_file remote_file_path, options = {}
         | 
| 57 | 
            -
                  bulk do
         | 
| 58 | 
            -
                    if driver.file_exist? remote_file_path
         | 
| 59 | 
            -
                      driver.remove_file remote_file_path
         | 
| 60 | 
            -
                    else
         | 
| 61 | 
            -
                      raise "file #{remote_file_path} not exists!" unless options[:silent]
         | 
| 62 | 
            -
                    end        
         | 
| 63 | 
            -
                  end
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
                
         | 
| 66 | 
            -
                def exist? remote_path
         | 
| 67 | 
            -
                  driver.exist? remote_path
         | 
| 68 | 
            -
                end
         | 
| 69 | 
            -
                
         | 
| 70 | 
            -
                def file_exist? remote_file_path
         | 
| 71 | 
            -
                  driver.file_exist? remote_file_path
         | 
| 72 | 
            -
                end
         | 
| 73 | 
            -
                
         | 
| 74 | 
            -
                def remove_directory remote_directory_path, options = {}
         | 
| 75 | 
            -
                  bulk do
         | 
| 76 | 
            -
                    if driver.directory_exist? remote_directory_path
         | 
| 77 | 
            -
                      driver.remove_directory remote_directory_path
         | 
| 78 | 
            -
                    else
         | 
| 79 | 
            -
                      raise "directory #{remote_directory_path} not exists!" unless options[:silent]
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
                  end
         | 
| 82 | 
            -
                end
         | 
| 83 | 
            -
                
         | 
| 84 | 
            -
                def create_directory remote_path, options = {}
         | 
| 85 | 
            -
                  bulk do
         | 
| 86 | 
            -
                    if driver.directory_exist?(remote_path)
         | 
| 87 | 
            -
                      if options[:override]
         | 
| 88 | 
            -
                        driver.remove_directory remote_path
         | 
| 89 | 
            -
                        driver.create_directory remote_path
         | 
| 90 | 
            -
                      elsif options[:silent]
         | 
| 91 | 
            -
                        # do nothing
         | 
| 92 | 
            -
                      else
         | 
| 93 | 
            -
                        raise "directory '#{remote_path}' already exists!"
         | 
| 94 | 
            -
                      end
         | 
| 95 | 
            -
                    else
         | 
| 96 | 
            -
                      driver.create_directory remote_path
         | 
| 97 | 
            -
                    end        
         | 
| 98 | 
            -
                  end
         | 
| 99 | 
            -
                end
         | 
| 100 | 
            -
                
         | 
| 101 | 
            -
                def directory_exist? remote_path
         | 
| 102 | 
            -
                  driver.directory_exist? remote_path
         | 
| 103 | 
            -
                end
         | 
| 104 | 
            -
                
         | 
| 105 | 
            -
                def upload_directory from_local_path, to_remote_path, options = {}
         | 
| 106 | 
            -
                  bulk do
         | 
| 107 | 
            -
                    raise "directory '#{from_local_path}' not exists!" unless local_driver.directory_exist? from_local_path
         | 
| 108 | 
            -
                    if driver.directory_exist?(to_remote_path)
         | 
| 109 | 
            -
                      if options[:override]
         | 
| 110 | 
            -
                        driver.remove_directory to_remote_path
         | 
| 111 | 
            -
                      else
         | 
| 112 | 
            -
                        raise "directory '#{to_remote_path}' already exists!"
         | 
| 113 | 
            -
                      end
         | 
| 114 | 
            -
                    end        
         | 
| 115 | 
            -
                    driver.upload_directory from_local_path, to_remote_path
         | 
| 116 | 
            -
                  end
         | 
| 117 | 
            -
                end
         | 
| 118 | 
            -
                
         | 
| 119 | 
            -
                def download_directory from_remote_path, to_local_path, options = {}
         | 
| 120 | 
            -
                  bulk do
         | 
| 121 | 
            -
                    raise "directory #{from_remote_path} not exists!" unless driver.directory_exist?(from_remote_path)
         | 
| 122 | 
            -
                    if local_driver.directory_exist? to_local_path
         | 
| 123 | 
            -
                      if options[:override]
         | 
| 124 | 
            -
                        local_driver.remove_directory to_local_path
         | 
| 125 | 
            -
                      else
         | 
| 126 | 
            -
                        raise "directory #{to_local_path} already exists!" 
         | 
| 127 | 
            -
                      end
         | 
| 128 | 
            -
                    end
         | 
| 129 | 
            -
                    driver.download_directory from_remote_path, to_local_path
         | 
| 130 | 
            -
                  end
         | 
| 131 | 
            -
                end
         | 
| 132 | 
            -
                
         | 
| 133 | 
            -
                def with_tmp_dir &block
         | 
| 134 | 
            -
                  bulk do
         | 
| 135 | 
            -
                    tmp_dir = driver.generate_tmp_dir_name
         | 
| 136 | 
            -
                    begin   
         | 
| 137 | 
            -
                      remove_directory tmp_dir if directory_exist? tmp_dir
         | 
| 138 | 
            -
                      create_directory tmp_dir
         | 
| 139 | 
            -
                      block.call
         | 
| 140 | 
            -
                    ensure
         | 
| 141 | 
            -
                      remove_directory tmp_dir if directory_exist? tmp_dir
         | 
| 142 | 
            -
                    end
         | 
| 143 | 
            -
                  end
         | 
| 144 | 
            -
                end
         | 
| 145 | 
            -
                
         | 
| 146 | 
            -
                def bash cmd, options = {}
         | 
| 147 | 
            -
                  ignore_stderr = options.delete :ignore_stderr
         | 
| 148 | 
            -
                  raise "invalid options :#{options.keys.join(', :')}" unless options.empty?
         | 
| 149 | 
            -
                  
         | 
| 150 | 
            -
                  code, stdout, stderr = exec cmd
         | 
| 151 | 
            -
                  unless code == 0
         | 
| 152 | 
            -
                    puts stdout
         | 
| 153 | 
            -
                    puts stderr
         | 
| 154 | 
            -
                    raise "can't execute '#{cmd}'!" 
         | 
| 155 | 
            -
                  end
         | 
| 156 | 
            -
                  unless stderr.empty? or ignore_stderr
         | 
| 157 | 
            -
                    puts stderr
         | 
| 158 | 
            -
                    raise "stderr not empty for '#{cmd}'!"
         | 
| 159 | 
            -
                  end
         | 
| 160 | 
            -
                  stdout + stderr
         | 
| 161 | 
            -
                end
         | 
| 162 | 
            -
                
         | 
| 163 | 
            -
                def exec cmd
         | 
| 164 | 
            -
                  driver.exec cmd
         | 
| 165 | 
            -
                end
         | 
| 166 | 
            -
                
         | 
| 167 | 
            -
                def home path = nil
         | 
| 168 | 
            -
                  @home ||= bash('cd ~; pwd').gsub("\n", '')    
         | 
| 169 | 
            -
                  "#{@home}#{path}"
         | 
| 170 | 
            -
                end    
         | 
| 171 | 
            -
                
         | 
| 172 | 
            -
                def inspect
         | 
| 173 | 
            -
                  "<Box: #{options[:host]}>"
         | 
| 174 | 
            -
                end
         | 
| 175 | 
            -
                alias_method :to_s, :inspect
         | 
| 176 | 
            -
             | 
| 177 | 
            -
                protected
         | 
| 178 | 
            -
                  def method_missing m, *a, &b
         | 
| 179 | 
            -
                    driver.send m, *a, &b
         | 
| 180 | 
            -
                  end
         | 
| 181 | 
            -
              end
         | 
| 182 | 
            -
            end
         | 
    
        data/lib/rsh/box/marks.rb
    DELETED
    
    | @@ -1,29 +0,0 @@ | |
| 1 | 
            -
            module Rsh
         | 
| 2 | 
            -
              module Marks
         | 
| 3 | 
            -
                def mark key
         | 
| 4 | 
            -
                  ensure_mark_requrements!
         | 
| 5 | 
            -
                  bash "touch #{marks_dir}/#{key}"
         | 
| 6 | 
            -
                end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                def has_mark? key
         | 
| 9 | 
            -
                  ensure_mark_requrements!
         | 
| 10 | 
            -
                  file_exist? "#{marks_dir}/#{key}"
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
                
         | 
| 13 | 
            -
                def clear_marks
         | 
| 14 | 
            -
                  bash "rm -r #{marks_dir}"
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
                
         | 
| 17 | 
            -
                protected
         | 
| 18 | 
            -
                  def marks_dir
         | 
| 19 | 
            -
                    home "/.marks"
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def ensure_mark_requrements!
         | 
| 23 | 
            -
                    unless @ensure_mark_requrements
         | 
| 24 | 
            -
                      create_directory marks_dir unless directory_exist? marks_dir
         | 
| 25 | 
            -
                      @ensure_mark_requrements = true
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
            end
         | 
    
        data/lib/rsh/drivers/abstract.rb
    DELETED
    
    
    
        data/lib/rsh/drivers/local.rb
    DELETED
    
    | @@ -1,48 +0,0 @@ | |
| 1 | 
            -
            module Rsh
         | 
| 2 | 
            -
              module Drivers
         | 
| 3 | 
            -
                class Local < Abstract    
         | 
| 4 | 
            -
                  def upload_file from_local_path, to_remote_path
         | 
| 5 | 
            -
                    FileUtils.copy from_local_path, to_remote_path
         | 
| 6 | 
            -
                  end
         | 
| 7 | 
            -
                
         | 
| 8 | 
            -
                  def download_file from_remote_path, to_local_path
         | 
| 9 | 
            -
                    FileUtils.copy from_remote_path, to_local_path
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
                
         | 
| 12 | 
            -
                  def exist? remote_file_path
         | 
| 13 | 
            -
                    File.exist? remote_file_path
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
                
         | 
| 16 | 
            -
                  alias_method :directory_exist?, :exist?
         | 
| 17 | 
            -
                  alias_method :file_exist?, :exist?
         | 
| 18 | 
            -
                
         | 
| 19 | 
            -
                  def remove_file remote_file_path
         | 
| 20 | 
            -
                    File.delete remote_file_path
         | 
| 21 | 
            -
                  end    
         | 
| 22 | 
            -
                
         | 
| 23 | 
            -
                  def create_directory path
         | 
| 24 | 
            -
                    Dir.mkdir path
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
                
         | 
| 27 | 
            -
                  def remove_directory path
         | 
| 28 | 
            -
                    FileUtils.rm_r path
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                  
         | 
| 31 | 
            -
                  def upload_directory from_local_path, to_remote_path
         | 
| 32 | 
            -
                    FileUtils.cp_r from_local_path, to_remote_path
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
                  
         | 
| 35 | 
            -
                  def download_directory from_remote_path, to_local_path
         | 
| 36 | 
            -
                    FileUtils.cp_r from_remote_path, to_local_path
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                
         | 
| 39 | 
            -
                  def exec command        
         | 
| 40 | 
            -
                    code, stdout, stderr = Open3.popen3 command do |stdin, stdout, stderr, waitth|  
         | 
| 41 | 
            -
                      [waitth.value.to_i, stdout.read, stderr.read]
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
                  
         | 
| 44 | 
            -
                    return code, stdout, stderr
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                end
         | 
| 47 | 
            -
              end
         | 
| 48 | 
            -
            end
         | 
    
        data/lib/rsh/drivers/ssh.rb
    DELETED
    
    | @@ -1,147 +0,0 @@ | |
| 1 | 
            -
            module Rsh
         | 
| 2 | 
            -
              module Drivers
         | 
| 3 | 
            -
                class Ssh < Abstract
         | 
| 4 | 
            -
                  def initialize options = {}
         | 
| 5 | 
            -
                    super
         | 
| 6 | 
            -
                    raise "ssh options not provided!" unless options[:ssh]
         | 
| 7 | 
            -
                    raise "invalid ssh options!" unless options[:ssh].is_a?(Hash)
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
                
         | 
| 10 | 
            -
                  def upload_file from_local_path, to_remote_path
         | 
| 11 | 
            -
                    sftp.upload! from_local_path, fix_path(to_remote_path)
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  def download_file from_remote_path, to_local_path
         | 
| 15 | 
            -
                    File.open to_local_path, "w" do |out|
         | 
| 16 | 
            -
                      sftp.download! fix_path(from_remote_path), out #, :recursive => true          
         | 
| 17 | 
            -
                    end
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def exist? remote_file_path
         | 
| 21 | 
            -
                    begin
         | 
| 22 | 
            -
                      fattrs = sftp.stat! fix_path(remote_file_path)
         | 
| 23 | 
            -
                      fattrs.directory? or fattrs.file? or fattrs.symlink?
         | 
| 24 | 
            -
                    rescue Net::SFTP::StatusException
         | 
| 25 | 
            -
                      false
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
                  alias_method :directory_exist?, :exist?
         | 
| 29 | 
            -
                  alias_method :file_exist?, :exist?
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def remove_file remote_file_path
         | 
| 32 | 
            -
                    sftp.remove! fix_path(remote_file_path)
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  def exec command
         | 
| 36 | 
            -
                    remote do |ssh, sftp|
         | 
| 37 | 
            -
                      # somehow net-ssh doesn't executes ~/.profile, so we need to execute it manually
         | 
| 38 | 
            -
                      # command = ". ~/.profile && #{command}"
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                      stdout, stderr, code, signal = hacked_exec! ssh, command
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                      return code, stdout, stderr
         | 
| 43 | 
            -
                    end
         | 
| 44 | 
            -
                  end    
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                  def open      
         | 
| 47 | 
            -
                    ssh_options = self.options[:ssh].clone
         | 
| 48 | 
            -
                    host = options[:host] || raise('host not provided!')
         | 
| 49 | 
            -
                    user = ssh_options.delete(:user) || raise('user not provied!')
         | 
| 50 | 
            -
                    @ssh = Net::SSH.start(host, user, ssh_options)
         | 
| 51 | 
            -
                    @sftp = @ssh.sftp.connect
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
                
         | 
| 54 | 
            -
                  def close
         | 
| 55 | 
            -
                    @ssh.close
         | 
| 56 | 
            -
                    # @sftp.close not needed
         | 
| 57 | 
            -
                    @ssh, @sftp = nil
         | 
| 58 | 
            -
                  end
         | 
| 59 | 
            -
                    
         | 
| 60 | 
            -
                  def create_directory path
         | 
| 61 | 
            -
                    remote do |ssh, sftp|          
         | 
| 62 | 
            -
                      sftp.mkdir! path
         | 
| 63 | 
            -
                      # exec "mkdir #{path}"
         | 
| 64 | 
            -
                    end        
         | 
| 65 | 
            -
                  end
         | 
| 66 | 
            -
                
         | 
| 67 | 
            -
                  def remove_directory path
         | 
| 68 | 
            -
                    exec "rm -r #{path}"
         | 
| 69 | 
            -
                  end
         | 
| 70 | 
            -
                  
         | 
| 71 | 
            -
                  def upload_directory from_local_path, to_remote_path
         | 
| 72 | 
            -
                    remote do |ssh, sftp|
         | 
| 73 | 
            -
                      sftp.upload! from_local_path, fix_path(to_remote_path)
         | 
| 74 | 
            -
                    end
         | 
| 75 | 
            -
                  end
         | 
| 76 | 
            -
                  
         | 
| 77 | 
            -
                  def download_directory from_remote_path, to_local_path
         | 
| 78 | 
            -
                    remote do |ssh, sftp|
         | 
| 79 | 
            -
                      sftp.download! fix_path(from_remote_path), to_local_path, :recursive => true
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
                  end
         | 
| 82 | 
            -
                
         | 
| 83 | 
            -
                  protected
         | 
| 84 | 
            -
                    def fix_path path
         | 
| 85 | 
            -
                      path.sub(/^\~/, home)
         | 
| 86 | 
            -
                    end
         | 
| 87 | 
            -
                    
         | 
| 88 | 
            -
                    def home
         | 
| 89 | 
            -
                      unless @home
         | 
| 90 | 
            -
                        command = 'cd ~; pwd'
         | 
| 91 | 
            -
                        code, stdout, stderr = exec command
         | 
| 92 | 
            -
                        raise "can't execute '#{command}'!" unless code == 0
         | 
| 93 | 
            -
                        @home = stdout.gsub("\n", '')    
         | 
| 94 | 
            -
                      end
         | 
| 95 | 
            -
                      @home
         | 
| 96 | 
            -
                    end
         | 
| 97 | 
            -
                  
         | 
| 98 | 
            -
                    # taken from here http://stackoverflow.com/questions/3386233/how-to-get-exit-status-with-rubys-netssh-library/3386375#3386375
         | 
| 99 | 
            -
                    def hacked_exec!(ssh, command, &block)
         | 
| 100 | 
            -
                      stdout_data = ""
         | 
| 101 | 
            -
                      stderr_data = ""
         | 
| 102 | 
            -
                      exit_code = nil
         | 
| 103 | 
            -
                      exit_signal = nil
         | 
| 104 | 
            -
                    
         | 
| 105 | 
            -
                      channel = ssh.open_channel do |channel|
         | 
| 106 | 
            -
                        channel.exec(command) do |ch, success|
         | 
| 107 | 
            -
                          raise "could not execute command: #{command.inspect}" unless success
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                          channel.on_data{|ch2, data| stdout_data << data}
         | 
| 110 | 
            -
                          channel.on_extended_data{|ch2, type, data| stderr_data << data}
         | 
| 111 | 
            -
                          channel.on_request("exit-status"){|ch,data| exit_code = data.read_long}
         | 
| 112 | 
            -
                          channel.on_request("exit-signal"){|ch, data| exit_signal = data.read_long}
         | 
| 113 | 
            -
                        end          
         | 
| 114 | 
            -
                      end  
         | 
| 115 | 
            -
                    
         | 
| 116 | 
            -
                      channel.wait      
         | 
| 117 | 
            -
                    
         | 
| 118 | 
            -
                      [stdout_data, stderr_data, exit_code, exit_signal]
         | 
| 119 | 
            -
                    end
         | 
| 120 | 
            -
                
         | 
| 121 | 
            -
                    def remote(&block)
         | 
| 122 | 
            -
                      if @ssh
         | 
| 123 | 
            -
                        block.call @ssh, @sftp
         | 
| 124 | 
            -
                      else            
         | 
| 125 | 
            -
                        # Rails.logger.info "Connecting to remote Hadoop #{options[:user]}@#{options[:host]}"          
         | 
| 126 | 
            -
                        begin
         | 
| 127 | 
            -
                          open
         | 
| 128 | 
            -
                          block.call @ssh, @sftp
         | 
| 129 | 
            -
                        ensure
         | 
| 130 | 
            -
                          close
         | 
| 131 | 
            -
                        end
         | 
| 132 | 
            -
                                          
         | 
| 133 | 
            -
                        # Net::SSH.start options[:host], options[:user], :config => true do |ssh|
         | 
| 134 | 
            -
                        #   ssh.sftp.connect do |sftp|
         | 
| 135 | 
            -
                        #     begin
         | 
| 136 | 
            -
                        #       @ssh, @sftp = ssh, sftp
         | 
| 137 | 
            -
                        #       block.call @ssh, @sftp
         | 
| 138 | 
            -
                        #     ensure
         | 
| 139 | 
            -
                        #       @ssh, @sftp = nil
         | 
| 140 | 
            -
                        #     end
         | 
| 141 | 
            -
                        #   end
         | 
| 142 | 
            -
                        # end
         | 
| 143 | 
            -
                      end
         | 
| 144 | 
            -
                    end
         | 
| 145 | 
            -
                end
         | 
| 146 | 
            -
              end
         | 
| 147 | 
            -
            end
         |