| Class | BoxGrinder::SFTPPlugin |
| In: |
lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb
lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb |
| Parent: | BasePlugin |
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 35
35: def after_init
36: register_deliverable(:package => "#{@appliance_config.name}-#{@appliance_config.version}.#{@appliance_config.release}-#{@appliance_config.os.name}-#{@appliance_config.os.version}-#{@appliance_config.hardware.arch}-#{current_platform}.tgz")
37: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 35
35: def after_init
36: register_deliverable(:package => "#{@appliance_config.name}-#{@appliance_config.version}.#{@appliance_config.release}-#{@appliance_config.os.name}-#{@appliance_config.os.version}-#{@appliance_config.hardware.arch}-#{current_platform}.tgz")
37: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 57
57: def connect
58: @log.info "Connecting to #{@plugin_config['host']}..."
59: @ssh = Net::SSH.start(@plugin_config['host'], @plugin_config['username'], {:password => @plugin_config['password']})
60: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 57
57: def connect
58: @log.info "Connecting to #{@plugin_config['host']}..."
59: @ssh = Net::SSH.start(@plugin_config['host'], @plugin_config['username'], {:password => @plugin_config['password']})
60: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 62
62: def connected?
63: return true if !@ssh.nil? and !@ssh.closed?
64: false
65: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 62
62: def connected?
63: return true if !@ssh.nil? and !@ssh.closed?
64: false
65: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 67
67: def disconnect
68: @log.info "Disconnecting from #{@plugin_config['host']}..."
69: @ssh.close if connected?
70: @ssh = nil
71: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 67
67: def disconnect
68: @log.info "Disconnecting from #{@plugin_config['host']}..."
69: @ssh.close if connected?
70: @ssh = nil
71: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 39
39: def execute
40: PackageHelper.new(@config, @appliance_config, :log => @log, :exec_helper => @exec_helper).package( File.dirname(@previous_deliverables[:disk]), @deliverables[:package] )
41:
42: @log.info "Uploading #{@appliance_config.name} appliance via SSH..."
43:
44: begin
45: #TODO move to a block
46: connect
47: upload_files(@plugin_config['path'], File.basename(@deliverables[:package]) => @deliverables[:package])
48: disconnect
49:
50: @log.info "Appliance #{@appliance_config.name} uploaded."
51: rescue => e
52: @log.error e
53: @log.error "An error occurred while uploading files."
54: end
55: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 39
39: def execute
40: PackageHelper.new(@config, @appliance_config, :log => @log, :exec_helper => @exec_helper).package( File.dirname(@previous_deliverables[:disk]), @deliverables[:package] )
41:
42: @log.info "Uploading #{@appliance_config.name} appliance via SSH..."
43:
44: begin
45: #TODO move to a block
46: connect
47: upload_files(@plugin_config['path'], File.basename(@deliverables[:package]) => @deliverables[:package])
48: disconnect
49:
50: @log.info "Appliance #{@appliance_config.name} uploaded."
51: rescue => e
52: @log.error e
53: @log.error "An error occurred while uploading files."
54: end
55: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 73
73: def upload_files(path, files = {})
74: return if files.size == 0
75:
76: raise "You're not connected to server" unless connected?
77:
78: @log.debug "Files to upload:"
79:
80: files.each do |remote, local|
81: @log.debug "#{File.basename(local)} => #{path}/#{remote}"
82: end
83:
84: global_size = 0
85:
86: files.each_value do |file|
87: global_size += File.size(file)
88: end
89:
90: global_size_kb = global_size / 1024
91: global_size_mb = global_size_kb / 1024
92:
93: @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})"
94:
95: @ssh.sftp.connect do |sftp|
96: begin
97: sftp.stat!(path)
98: rescue Net::SFTP::StatusException => e
99: raise unless e.code == 2
100: @ssh.exec!("mkdir -p #{path}")
101: end
102:
103: nb = 0
104:
105: files.each do |key, local|
106: name = File.basename(local)
107: remote = "#{path}/#{key}"
108: size_b = File.size(local)
109: size_kb = size_b / 1024
110: nb_of = "#{nb += 1}/#{files.size}"
111:
112: begin
113: sftp.stat!(remote)
114:
115: unless @plugin_config['overwrite']
116:
117: local_md5_sum = `md5sum #{local} | awk '{ print $1 }'`.strip
118: remote_md5_sum = @ssh.exec!("md5sum #{remote} | awk '{ print $1 }'").strip
119:
120: if (local_md5_sum.eql?(remote_md5_sum))
121: @log.info "#{nb_of} #{name}: files are identical (md5sum: #{local_md5_sum}), skipping..."
122: next
123: end
124: end
125:
126: rescue Net::SFTP::StatusException => e
127: raise unless e.code == 2
128: end
129:
130: @ssh.exec!("mkdir -p #{File.dirname(remote) }")
131:
132: pbar = ProgressBar.new("#{nb_of} #{name}", size_b)
133: pbar.file_transfer_mode
134:
135: sftp.upload!(local, remote) do |event, uploader, * args|
136: case event
137: when :open then
138: when :put then
139: pbar.set(args[1])
140: when :close then
141: when :mkdir then
142: when :finish then
143: pbar.finish
144: end
145: end
146:
147: sftp.setstat(remote, :permissions => @plugin_config['default_permissions'])
148: end
149: end
150: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 73
73: def upload_files(path, files = {})
74: return if files.size == 0
75:
76: raise "You're not connected to server" unless connected?
77:
78: @log.debug "Files to upload:"
79:
80: files.each do |remote, local|
81: @log.debug "#{File.basename(local)} => #{path}/#{remote}"
82: end
83:
84: global_size = 0
85:
86: files.each_value do |file|
87: global_size += File.size(file)
88: end
89:
90: global_size_kb = global_size / 1024
91: global_size_mb = global_size_kb / 1024
92:
93: @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})"
94:
95: @ssh.sftp.connect do |sftp|
96: begin
97: sftp.stat!(path)
98: rescue Net::SFTP::StatusException => e
99: raise unless e.code == 2
100: @ssh.exec!("mkdir -p #{path}")
101: end
102:
103: nb = 0
104:
105: files.each do |key, local|
106: name = File.basename(local)
107: remote = "#{path}/#{key}"
108: size_b = File.size(local)
109: size_kb = size_b / 1024
110: nb_of = "#{nb += 1}/#{files.size}"
111:
112: begin
113: sftp.stat!(remote)
114:
115: unless @plugin_config['overwrite']
116:
117: local_md5_sum = `md5sum #{local} | awk '{ print $1 }'`.strip
118: remote_md5_sum = @ssh.exec!("md5sum #{remote} | awk '{ print $1 }'").strip
119:
120: if (local_md5_sum.eql?(remote_md5_sum))
121: @log.info "#{nb_of} #{name}: files are identical (md5sum: #{local_md5_sum}), skipping..."
122: next
123: end
124: end
125:
126: rescue Net::SFTP::StatusException => e
127: raise unless e.code == 2
128: end
129:
130: @ssh.exec!("mkdir -p #{File.dirname(remote) }")
131:
132: pbar = ProgressBar.new("#{nb_of} #{name}", size_b)
133: pbar.file_transfer_mode
134:
135: sftp.upload!(local, remote) do |event, uploader, * args|
136: case event
137: when :open then
138: when :put then
139: pbar.set(args[1])
140: when :close then
141: when :mkdir then
142: when :finish then
143: pbar.finish
144: end
145: end
146:
147: sftp.setstat(remote, :permissions => @plugin_config['default_permissions'])
148: end
149: end
150: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 28
28: def validate
29: set_default_config_value('overwrite', false)
30: set_default_config_value('default_permissions', 0644)
31:
32: validate_plugin_config(['path', 'username', 'host'], 'http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#SFTP_Delivery_Plugin')
33: end
# File lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb, line 28
28: def validate
29: set_default_config_value('overwrite', false)
30: set_default_config_value('default_permissions', 0644)
31:
32: validate_plugin_config(['path', 'username', 'host'], 'http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#SFTP_Delivery_Plugin')
33: end