lib/vagrant-vcloud/action/sync_folders.rb in vagrant-vcloud-0.1.2 vs lib/vagrant-vcloud/action/sync_folders.rb in vagrant-vcloud-0.2.0

- old
+ new

@@ -1,116 +1,150 @@ # The MIT License (MIT) # Copyright (c) 2013 Mitchell Hashimoto -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -# of the Software, and to permit persons to whom the Software is furnished to do -# so, subject to the following conditions: +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. -require "log4r" -require "vagrant/util/subprocess" -require "vagrant/util/scoped_hash_override" -require "vagrant/util/which" +require 'vagrant/util/subprocess' +require 'vagrant/util/scoped_hash_override' +require 'vagrant/util/which' module VagrantPlugins module VCloud module Action + # This class syncs Vagrant folders using RSYNC, this code has been ported + # from vagrant-aws (https://github.com/mitchellh/vagrant-aws) class SyncFolders include Vagrant::Util::ScopedHashOverride def initialize(app, env) @app = app - @logger = Log4r::Logger.new("vagrant_vcloud::action::sync_folders") + @logger = Log4r::Logger.new('vagrant_vcloud::action::sync_folders') end def call(env) @app.call(env) - ### COMPLETELY REDO USING UNISON!!!! - ssh_info = env[:machine].ssh_info + unless Vagrant::Util::Which.which('rsync') + env[:ui].warn( + I18n.t( + 'vagrant_vcloud.sync.rsync_not_found_warning', + :side => 'host' + ) + ) + return + end + + if env[:machine].communicate.execute('which rsync', + :error_check => false) != 0 + env[:ui].warn( + I18n.t( + 'vagrant_vcloud.sync.rsync_not_found_warning', + :side => 'guest' + ) + ) + return + end + env[:machine].config.vm.synced_folders.each do |id, data| - data = scoped_hash_override(data, :vcloud) + data = scoped_hash_override(data, :vCloud) # Ignore disabled shared folders next if data[:disabled] - unless Vagrant::Util::Which.which('rsync') - env[:ui].warn(I18n.t('vagrant_vcloud.rsync_not_found_warning')) - break - end - hostpath = File.expand_path(data[:hostpath], env[:root_path]) guestpath = data[:guestpath] # Make sure there is a trailing slash on the host path to # avoid creating an additional directory with rsync hostpath = "#{hostpath}/" if hostpath !~ /\/$/ # on windows rsync.exe requires cygdrive-style paths if Vagrant::Util::Platform.windows? - hostpath = hostpath.gsub(/^(\w):/) { "/cygdrive/#{$1}" } + hostpath = hostpath.gsub(/^(\w):/) { "/cygdrive/\1" } end - env[:ui].info(I18n.t("vagrant_vcloud.rsync_folder", - :hostpath => hostpath, - :guestpath => guestpath)) + env[:ui].info( + I18n.t( + 'vagrant_vcloud.sync.rsync_folder', + :hostpath => hostpath, + :guestpath => guestpath + ) + ) # Create the host path if it doesn't exist and option flag is set if data[:create] begin - FileUtils::mkdir_p(hostpath) + FileUtils.mkdir_p(hostpath) rescue => err raise Errors::MkdirError, - :hostpath => hostpath, - :err => err + :hostpath => hostpath, + :err => err end end # Create the guest path env[:machine].communicate.sudo("mkdir -p '#{guestpath}'") env[:machine].communicate.sudo( - "chown #{ssh_info[:username]} '#{guestpath}'") - - # Since Vagrant 1.4 the private key path may be an array - ssh_key_paths = ssh_info[:private_key_path].is_a?(Array) ? ssh_info[:private_key_path] : [ ssh_info[:private_key_path] ] - ssh_keys = ssh_key_paths.map {|p| "-i '#{p}'"}.join(" ") + "chown -R #{ssh_info[:username]} '#{guestpath}'" + ) + # collect rsync excludes specified :rsync_excludes=>['path1',...] + # in synced_folder options + excludes = [ + '.vagrant/', + 'Vagrantfile', + *Array(data[:rsync_excludes]) + ].uniq + # Rsync over to the guest path using the SSH info command = [ - "rsync", "--verbose", "--archive", "-z", - "--exclude", ".vagrant/", "--exclude", "Vagrantfile", - "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no #{ssh_keys}", - hostpath, - "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"] + 'rsync', '--verbose', '--archive', '-z', + *excludes.map { |e|['--exclude', e] }.flatten, + '-e', "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no " + + "#{ssh_key_options(ssh_info)}", hostpath, + "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}" + ] # we need to fix permissions when using rsync.exe on windows, see - # http://stackoverflow.com/questions/5798807/rsync-permission-denied-created-directories-have-no-permissions + # http://stackoverflow.com/questions/5798807/rsync-permission- + # denied-created-directories-have-no-permissions if Vagrant::Util::Platform.windows? - command.insert(1, "--chmod", "ugo=rwX") + command.insert(1, '--chmod', 'ugo=rwX') end r = Vagrant::Util::Subprocess.execute(*command) if r.exit_code != 0 - raise Errors::RsyncError, - :guestpath => guestpath, - :hostpath => hostpath, - :stderr => r.stderr + fail Errors::RsyncError, + :guestpath => guestpath, + :hostpath => hostpath, + :stderr => r.stderr end end + end + + private + + def ssh_key_options(ssh_info) + # Ensure that `private_key_path` is an Array (for Vagrant < 1.4) + Array(ssh_info[:private_key_path]).map { |path| "-i '#{path}' " }.join end end end end end