class Sprinkle::Installers::Transfer

File transfer installer

This installer copies files from the local disk to remote servers using SCP. Symbolic links will be followed and the files copied, but the symbolic links themselves will not be preserved. That's just how SCP works.

Example Usage

Installing a nginx.conf onto remote servers

package :nginx_conf do
  transfer 'files/nginx.conf', '/etc/nginx.conf'
end

If you user has access to 'sudo' and theres a file that requires priveledges, you can pass :sudo => true

package :nginx_conf do
  transfer 'files/nginx.conf', '/etc/nginx.conf', :sudo => true
end

By default, transfers are recursive and you can move whole directories via this method. If you wish to disable recursive transfers, you can pass :recursive => false, although it will not be obeyed when using the Vlad actor.

As an alternative to :recursive, you can use the :tarball option. When this is supplied, the source file(s) are first packed in a tar.gz archive, then transferred to a temp dir and finally unpacked at the destination. This is usually much faster when transferring many small files (Such as a typical rails application) You can optionally supply :exclude, which is an array of glob-patterns to not include in the tarball

package :webapp do
  transfer 'app/', '/var/www/' do
    tarball :exclude => %w(.git log/*)
  end
end

Should you need to run commands before or after the file transfer (making directories or changing permissions), you can use the pre/post :install directives and they will be run.

Rendering templates

Rendering templates with transfer has been depreciated. Please see the file installer if you want to use templates.

Public Instance Methods

install_commands() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 108
def install_commands
  Commands::Transfer.new(sourcepath, destination,
    :recursive => options[:recursive])
end
mode(mode) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 99
def mode(mode)
  @mode = mode
  post(:install, "#{sudo_cmd}chmod -R #{@mode} #{@final_destination}")
end
owner(owner) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 94
def owner(owner)
  @owner = owner
  post(:install, "#{sudo_cmd}chown -R #{@owner} #{@final_destination}")
end
render_template(template, context, prefix) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 114
def render_template(template, context, prefix)
  output = @package.template(template, context)
  final_tempfile = Tempfile.new(prefix.to_s)
  final_tempfile.print(output)
  final_tempfile.close
  final_tempfile
end
render_template_file(path, context, prefix) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 122
def render_template_file(path, context, prefix)
  template = source_is_template? ? path : File.read(path)
  tempfile = render_template(template, context, @package.name)
  tempfile
end
setup_rendering() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 132
def setup_rendering
  ActiveSupport::Deprecation.warn("transfer :render is depreciated, please use the `file` installer now.")
  ActiveSupport::Deprecation.warn("transfer :render will be removed from Sprinkle v0.8")
  if @options[:render]
    raise "Incompatible combination of options :render and :tarball" if tarball?
    if @options[:locals]
      context = {}
      @options[:locals].each_pair do |k,v|
        if v.respond_to?(:call)
          context[k] = v.call
        else
          context[k] = v
        end
      end
    else
      context = @binding
    end

    @tempfile = render_template_file(@source, context, @package.name).path
    @sourcepath = @tempfile
    @options[:recursive] = false
  end
end
setup_sudo() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 173
def setup_sudo
  @destination = "/tmp/sprinkle_#{File.basename(@destination)}"
  # make sure we push the move ahead of any other post install tasks
  # a user may have requested
  post(:install).unshift "#{sudo_cmd}mv #{@destination} #{@final_destination}"
end
setup_tarball() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 157
def setup_tarball
  # tar files locally and scp to a temp location
  # then untar after transfer
  tar_options = @exclude.map {|glob| "--exclude \"#{glob}\" " }.join('')
  @tempfile = make_tmpname
  local_command = "cd '#{@source}' ; #{local_tar_bin} -zcf '#{@tempfile}' #{tar_options}."
  logger.debug "    --> Compressing #{@source} locally"
  raise "Unable to tar #{@source}" unless system(local_command)
  @sourcepath = @tempfile
  @destination = "/tmp/#{File.basename(@tempfile)}"
  post(:install).unshift [
    "#{sudo_cmd}tar -zxf '#{@destination}' -C '#{@final_destination}'",
    "#{sudo_cmd}rm '#{@destination}'"
  ]
end
source_is_template?() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 128
def source_is_template?
  @source.split("\n").size > 1
end
tarball(options = {}) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 89
def tarball(options = {})
  @tarball = true
  @exclude = options===true ? [] : options[:exclude]
end
tarball?() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 104
def tarball?
  @tarball
end
transfer(source, destination, options = {}, &block) click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 59
def transfer(source, destination, options = {}, &block)
  options.reverse_merge!(:binding => binding())
  install Transfer.new(self, source, destination, options, &block)
end

Protected Instance Methods

local_tar_bin() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 181
def local_tar_bin
  @local_tar_bin ||= (`uname` =~ /Darwin/ ? "COPYFILE_DISABLE=true /usr/bin/gnutar" : "tar")
end
make_tmpname() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 191
def make_tmpname
  Dir::Tmpname.make_tmpname(['/tmp/sprinkle-', '.tar.gz'], nil)
end
post_process() click to toggle source
# File lib/sprinkle/installers/transfer.rb, line 185
def post_process
  return unless @tempfile
  logger.debug "    --> Deleting local temp file"
  File.delete @tempfile
end