Class BoxGrinder::SFTPHelper
In: lib/boxgrinder-build/helpers/sftp-helper.rb
lib/boxgrinder-build/helpers/sftp-helper.rb
Parent: Object

Methods

Public Class methods

[Source]

   # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 7
7:     def initialize(options={})
8:       @log = options[:log] || LogHelper.new
9:     end

[Source]

   # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 7
7:     def initialize(options={})
8:       @log = options[:log] || LogHelper.new
9:     end

Public Instance methods

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 11
11:     def connect(host, username, options={})
12:       @log.info "Connecting to #{host}..."
13:       @ssh = Net::SSH.start(host, username, options)
14:     end

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 11
11:     def connect(host, username, options={})
12:       @log.info "Connecting to #{host}..."
13:       @ssh = Net::SSH.start(host, username, options)
14:     end

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 16
16:     def connected?
17:       return true if !@ssh.nil? and !@ssh.closed?
18:       false
19:     end

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 16
16:     def connected?
17:       return true if !@ssh.nil? and !@ssh.closed?
18:       false
19:     end

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 21
21:     def disconnect
22:       @log.info "Disconnecting from host..."
23:       @ssh.close if connected?
24:       @ssh = nil
25:     end

[Source]

    # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 21
21:     def disconnect
22:       @log.info "Disconnecting from host..."
23:       @ssh.close if connected?
24:       @ssh = nil
25:     end

[Source]

     # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 27
 27:     def upload_files(path, default_permissions, overwrite, files = {})
 28:       return if files.size == 0
 29: 
 30:       raise "You're not connected to server" unless connected?
 31: 
 32:       @log.debug "Files to upload:"
 33: 
 34:       files.each do |remote, local|
 35:         @log.debug "#{File.basename(local)} => #{path}/#{remote}"
 36:       end
 37: 
 38:       global_size = 0
 39: 
 40:       files.each_value do |file|
 41:         global_size += File.size(file)
 42:       end
 43: 
 44:       global_size_kb = global_size / 1024
 45:       global_size_mb = global_size_kb / 1024
 46: 
 47:       @log.info "#{files.size} files to upload (#{global_size_mb > 0 ? global_size_mb.to_s + "MB" : global_size_kb > 0 ? global_size_kb.to_s + "kB" : global_size.to_s})"
 48: 
 49:       @ssh.sftp.connect do |sftp|
 50:         begin
 51:           sftp.stat!(path)
 52:         rescue Net::SFTP::StatusException => e
 53:           raise unless e.code == 2
 54:           @ssh.exec!("mkdir -p #{path}")
 55:         end
 56: 
 57:         nb = 0
 58: 
 59:         files.each do |key, local|
 60:           name       = File.basename(local)
 61:           remote     = "#{path}/#{key}"
 62:           size_b     = File.size(local)
 63:           size_kb    = size_b / 1024
 64:           nb_of      = "#{nb += 1}/#{files.size}"
 65: 
 66:           begin
 67:             sftp.stat!(remote)
 68: 
 69:             unless overwrite
 70: 
 71:               local_md5_sum   = `md5sum #{local} | awk '{ print $1 }'`.strip
 72:               remote_md5_sum  = @ssh.exec!("md5sum #{remote} | awk '{ print $1 }'").strip
 73: 
 74:               if (local_md5_sum.eql?(remote_md5_sum))
 75:                 @log.info "#{nb_of} #{name}: files are identical (md5sum: #{local_md5_sum}), skipping..."
 76:                 next
 77:               end
 78:             end
 79: 
 80:           rescue Net::SFTP::StatusException => e
 81:             raise unless e.code == 2
 82:           end
 83: 
 84:           @ssh.exec!("mkdir -p #{File.dirname(remote) }")
 85: 
 86:           pbar = ProgressBar.new("#{nb_of} #{name}", size_b)
 87:           pbar.file_transfer_mode
 88: 
 89:           sftp.upload!(local, remote) do |event, uploader, * args|
 90:             case event
 91:               when :open then
 92:               when :put then
 93:                 pbar.set(args[1])
 94:               when :close then
 95:               when :mkdir then
 96:               when :finish then
 97:                 pbar.finish
 98:             end
 99:           end
100: 
101:           sftp.setstat(remote, :permissions => default_permissions)
102:         end
103:       end
104:     end

[Source]

     # File lib/boxgrinder-build/helpers/sftp-helper.rb, line 27
 27:     def upload_files(path, default_permissions, overwrite, files = {})
 28:       return if files.size == 0
 29: 
 30:       raise "You're not connected to server" unless connected?
 31: 
 32:       @log.debug "Files to upload:"
 33: 
 34:       files.each do |remote, local|
 35:         @log.debug "#{File.basename(local)} => #{path}/#{remote}"
 36:       end
 37: 
 38:       global_size = 0
 39: 
 40:       files.each_value do |file|
 41:         global_size += File.size(file)
 42:       end
 43: 
 44:       global_size_kb = global_size / 1024
 45:       global_size_mb = global_size_kb / 1024
 46: 
 47:       @log.info "#{files.size} files to upload (#{global_size_mb > 0 ? global_size_mb.to_s + "MB" : global_size_kb > 0 ? global_size_kb.to_s + "kB" : global_size.to_s})"
 48: 
 49:       @ssh.sftp.connect do |sftp|
 50:         begin
 51:           sftp.stat!(path)
 52:         rescue Net::SFTP::StatusException => e
 53:           raise unless e.code == 2
 54:           @ssh.exec!("mkdir -p #{path}")
 55:         end
 56: 
 57:         nb = 0
 58: 
 59:         files.each do |key, local|
 60:           name       = File.basename(local)
 61:           remote     = "#{path}/#{key}"
 62:           size_b     = File.size(local)
 63:           size_kb    = size_b / 1024
 64:           nb_of      = "#{nb += 1}/#{files.size}"
 65: 
 66:           begin
 67:             sftp.stat!(remote)
 68: 
 69:             unless overwrite
 70: 
 71:               local_md5_sum   = `md5sum #{local} | awk '{ print $1 }'`.strip
 72:               remote_md5_sum  = @ssh.exec!("md5sum #{remote} | awk '{ print $1 }'").strip
 73: 
 74:               if (local_md5_sum.eql?(remote_md5_sum))
 75:                 @log.info "#{nb_of} #{name}: files are identical (md5sum: #{local_md5_sum}), skipping..."
 76:                 next
 77:               end
 78:             end
 79: 
 80:           rescue Net::SFTP::StatusException => e
 81:             raise unless e.code == 2
 82:           end
 83: 
 84:           @ssh.exec!("mkdir -p #{File.dirname(remote) }")
 85: 
 86:           pbar = ProgressBar.new("#{nb_of} #{name}", size_b)
 87:           pbar.file_transfer_mode
 88: 
 89:           sftp.upload!(local, remote) do |event, uploader, * args|
 90:             case event
 91:               when :open then
 92:               when :put then
 93:                 pbar.set(args[1])
 94:               when :close then
 95:               when :mkdir then
 96:               when :finish then
 97:                 pbar.finish
 98:             end
 99:           end
100: 
101:           sftp.setstat(remote, :permissions => default_permissions)
102:         end
103:       end
104:     end

[Validate]