lib/vagrant/scp/commands/scp.rb in vagrant-scp-0.4.3 vs lib/vagrant/scp/commands/scp.rb in vagrant-scp-0.5.0
- old
+ new
@@ -1,5 +1,7 @@
+require 'net/scp'
+
module VagrantPlugins
module Scp
module Command
class Scp < Vagrant.plugin(2, :command)
@@ -7,57 +9,66 @@
def self.synopsis
"copies data into a box via SCP"
end
def execute
- # Parse the arguments
- file_1, file_2 = parse_args()
- return if file_2.nil?
- # Extract host info
- # We want to get the name of the vm, from a [host_1]:file_1 [host_2]:file_2 description
- host = [file_1, file_2].map{|file_spec| file_spec.match(/^([^:]*):/)[1] rescue nil}.compact.first
- # The default machine name for Vagrant is 'default'
- host = 'default' if (host.nil? || host == 0 )
+ @file_1, @file_2 = parse_args()
+ return if @file_2.nil?
- # Get the info about the target VM
with_target_vms(host) do |machine|
- ssh_info = machine.ssh_info
- raise Vagrant::Errors::SSHNotReady if ssh_info.nil?
- if file_1.include? ':'
- source_files = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{file_1.split(':').last}"
- target_files = file_2
- else
- source_files = file_1
- target_files = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{file_2.split(':').last}"
- end
+ @ssh_info = machine.ssh_info
+ raise Vagrant::Errors::SSHNotReady if @ssh_info.nil?
- # Run the SCP
- command = [
- "scp",
- '-r',
- '-o StrictHostKeyChecking=no',
- '-o UserKnownHostsFile=/dev/null',
- "-o port=#{ssh_info[:port]}",
- "-i '#{ssh_info[:private_key_path][0]}'",
- source_files,
- target_files
- ].join(' ')
- system(command)
+ Net::SCP.send net_ssh_command,
+ @ssh_info[:host],
+ @ssh_info[:username],
+ source_files,
+ target_files,
+ :recursive => true,
+ :ssh => {:port => @ssh_info[:port], :keys => @ssh_info[:private_key_path]}
end
end
+ private
+
def parse_args
opts = OptionParser.new do |o|
- o.banner = "Usage: vagrant scp <local_path> [vm_name]:<remote_path> \n"
+ o.banner = "Usage: vagrant scp <local_path> [vm_name]:<remote_path> \n"
o.banner += " vagrant scp [vm_name]:<remote_path> <local_path>"
o.separator ""
o.separator "Options:"
o.separator ""
end
argv = parse_options(opts)
return argv if argv and argv.length == 2
@env.ui.info(opts.help, prefix: false) if argv
return nil, nil
+ end
+
+ def host
+ host = [@file_1, @file_2].map{|file_spec| file_spec.match(/^([^:]*):/)[1] rescue nil}.compact.first
+ host = 'default' if (host.nil? || host == 0 )
+ host
+ end
+
+ def net_ssh_command
+ @file_1.include?(':') ? :download! : :upload!
+ end
+
+ def source_files
+ format_file_path(@file_1)
+ end
+
+ def target_files
+ format_file_path(@file_2)
+ end
+
+ def format_file_path(filepath)
+ if @file_1.include?(':')
+ filepath.split(':').last.gsub("~", "/home/#{@ssh_info[:username]}")
+ else
+ filepath
+ end
end
end
end