vos 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/vos/box/marks.rb +31 -0
- data/lib/vos/box/shell.rb +87 -0
- data/lib/vos/box/vfs.rb +43 -0
- data/lib/vos/box.rb +45 -0
- data/lib/{rsh → vos}/drivers/abstract.rb +1 -5
- data/lib/vos/drivers/local.rb +38 -0
- data/lib/vos/drivers/specification.rb +15 -0
- data/lib/vos/drivers/ssh.rb +256 -0
- data/lib/vos/gems.rb +6 -0
- data/lib/vos/helpers/ubuntu.rb +40 -0
- data/lib/{rsh → vos}/support.rb +3 -1
- data/lib/{rsh.rb → vos.rb} +7 -5
- data/readme.md +115 -14
- data/spec/box_spec.rb +37 -90
- data/spec/drivers/local_spec.rb +10 -0
- data/spec/drivers/spec_helper.rb +5 -0
- data/spec/drivers/ssh_spec.rb +15 -0
- data/spec/spec_helper.rb +2 -1
- metadata +33 -21
- data/lib/rsh/box/marks.rb +0 -29
- data/lib/rsh/box.rb +0 -182
- data/lib/rsh/drivers/local.rb +0 -48
- data/lib/rsh/drivers/ssh.rb +0 -147
- data/lib/rsh/gems.rb +0 -2
- data/spec/abstract_driver/dir/dir2/file +0 -0
- data/spec/abstract_driver/local_file +0 -1
- data/spec/abstract_driver.rb +0 -82
- data/spec/box_spec/dir/dir2/file +0 -0
- data/spec/box_spec/local_file +0 -1
- data/spec/local_driver_spec.rb +0 -9
- data/spec/ssh_driver_spec.rb +0 -15
    
        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
         | 
    
        data/lib/rsh/gems.rb
    DELETED
    
    
| 
            File without changes
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            some content
         | 
    
        data/spec/abstract_driver.rb
    DELETED
    
    | @@ -1,82 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            shared_examples_for 'abstract driver' do
         | 
| 4 | 
            -
              dir = "#{File.dirname __FILE__}/abstract_driver"
         | 
| 5 | 
            -
              with_tmp_spec_dir dir, before: :each
         | 
| 6 | 
            -
              
         | 
| 7 | 
            -
              describe "io" do
         | 
| 8 | 
            -
                before :each do
         | 
| 9 | 
            -
                  @local_dir = spec_dir      
         | 
| 10 | 
            -
                  @remote_dir = @driver.generate_tmp_dir_name    
         | 
| 11 | 
            -
                  
         | 
| 12 | 
            -
                  @driver.remove_directory @remote_dir if @driver.directory_exist? @remote_dir
         | 
| 13 | 
            -
                  @driver.create_directory @remote_dir
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                after :each do
         | 
| 17 | 
            -
                  @driver.remove_directory @remote_dir if @driver.directory_exist? @remote_dir
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
              
         | 
| 20 | 
            -
                describe "files" do  
         | 
| 21 | 
            -
                  before :each do
         | 
| 22 | 
            -
                    @local_file = "#{@local_dir}/local_file"
         | 
| 23 | 
            -
                    @check_file = "#{@local_dir}/check_file"
         | 
| 24 | 
            -
                    @remote_file = "#{@remote_dir}/remote_file"
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
                        
         | 
| 27 | 
            -
                  it "file_exist?" do
         | 
| 28 | 
            -
                    @driver.file_exist?(@remote_file).should be_false
         | 
| 29 | 
            -
                    @driver.upload_file(@local_file, @remote_file)
         | 
| 30 | 
            -
                    @driver.file_exist?(@remote_file).should be_true
         | 
| 31 | 
            -
                  end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  it "upload & download file" do
         | 
| 34 | 
            -
                    @driver.upload_file(@local_file, @remote_file)
         | 
| 35 | 
            -
                    @driver.file_exist?(@remote_file).should be_true
         | 
| 36 | 
            -
                  
         | 
| 37 | 
            -
                    @driver.download_file(@remote_file, @check_file)
         | 
| 38 | 
            -
                    File.read(@local_file).should == File.read(@check_file)
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                
         | 
| 41 | 
            -
                  it "remove_file" do
         | 
| 42 | 
            -
                    @driver.upload_file(@local_file, @remote_file)
         | 
| 43 | 
            -
                    @driver.file_exist?(@remote_file).should be_true
         | 
| 44 | 
            -
                    @driver.remove_file(@remote_file)
         | 
| 45 | 
            -
                    @driver.file_exist?(@remote_file).should be_false
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
                end
         | 
| 48 | 
            -
                
         | 
| 49 | 
            -
                describe 'directories' do
         | 
| 50 | 
            -
                  before :each do
         | 
| 51 | 
            -
                    @from_local, @remote_path, @to_local = "#{@local_dir}/dir", "#{@remote_dir}/upload", "#{@local_dir}/download"
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
                  
         | 
| 54 | 
            -
                  it "directory_exist?, create_directory, remove_directory" do
         | 
| 55 | 
            -
                    dir = "#{@remote_dir}/some_dir"
         | 
| 56 | 
            -
                    @driver.directory_exist?(dir).should be_false
         | 
| 57 | 
            -
                    @driver.create_directory(dir)
         | 
| 58 | 
            -
                    @driver.directory_exist?(dir).should be_true
         | 
| 59 | 
            -
                    @driver.remove_directory(dir)
         | 
| 60 | 
            -
                    @driver.directory_exist?(dir).should be_false
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
                
         | 
| 63 | 
            -
                  it "upload_directory & download_directory" do
         | 
| 64 | 
            -
                    upload_path_check = "#{@remote_path}/dir2/file"
         | 
| 65 | 
            -
                    @driver.file_exist?(upload_path_check).should be_false
         | 
| 66 | 
            -
                    @driver.upload_directory(@from_local, @remote_path)
         | 
| 67 | 
            -
                    @driver.file_exist?(upload_path_check).should be_true
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                    download_path_check = "#{@to_local}/dir2/file"
         | 
| 70 | 
            -
                    File.exist?(download_path_check).should be_false
         | 
| 71 | 
            -
                    @driver.download_directory(@remote_path, @to_local)
         | 
| 72 | 
            -
                    File.exist?(download_path_check).should be_true
         | 
| 73 | 
            -
                  end
         | 
| 74 | 
            -
                end  
         | 
| 75 | 
            -
              end
         | 
| 76 | 
            -
              
         | 
| 77 | 
            -
              describe "shell" do
         | 
| 78 | 
            -
                it 'exec' do
         | 
| 79 | 
            -
                  @driver.exec("echo 'ok'").should == [0, "ok\n", ""]
         | 
| 80 | 
            -
                end  
         | 
| 81 | 
            -
              end
         | 
| 82 | 
            -
            end
         | 
    
        data/spec/box_spec/dir/dir2/file
    DELETED
    
    | 
            File without changes
         | 
    
        data/spec/box_spec/local_file
    DELETED
    
    | @@ -1 +0,0 @@ | |
| 1 | 
            -
            some content
         | 
    
        data/spec/local_driver_spec.rb
    DELETED
    
    
    
        data/spec/ssh_driver_spec.rb
    DELETED
    
    | @@ -1,15 +0,0 @@ | |
| 1 | 
            -
            require 'abstract_driver'
         | 
| 2 | 
            -
            require 'yaml'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            describe Rsh::Drivers::Ssh do
         | 
| 5 | 
            -
              it_should_behave_like "abstract driver"    
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              before :each do
         | 
| 8 | 
            -
                @driver = Rsh::Drivers::Ssh.new config[:remote_driver]
         | 
| 9 | 
            -
                @driver.open
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
              
         | 
| 12 | 
            -
              after :each do
         | 
| 13 | 
            -
                @driver.close
         | 
| 14 | 
            -
              end  
         | 
| 15 | 
            -
            end
         |