class Gaptool::ScpCommand

Public Instance Methods

execute() click to toggle source
# File lib/gaptool_client/commands.rb, line 402
def execute
  if src.start_with?(':')
    # from remote to local
    signal_usage_error('SRC and DEST cannot be both remote') \
      if dest && dest.start_with?(':')
    source = src[1..-1]
    destf = dest ? dest : File.join(Dir.pwd, File.basename(source))
    destd = File.dirname(destf)
    Gaptool::Helpers.error("Cannot write to #{destd}") \
      unless File.writable?(destd)

    pre_hook = proc do |node|
      download! node['source'], "#{node['destf']}.#{node['instance']}"
    end

  else
    # from local to remote
    signal_usage_error('SRC and DEST cannot be both local') \
      if dest && !dest.start_with?(':')
    begin
      source = File.realpath(src)
    rescue => e
      Gaptool::Helpers.error(e)
    end
    destf = dest ? dest[1..-1] : File.basename(src)
    if destf.end_with?('/')
      destd = destf
      destf = File.join(destf, File.basename(src))
    else
      destd = File.dirname(destf)
    end

    pre_hook = proc do |node|
      if test("[ -w #{node['destd']} ]")
        upload! node['source'], node['destf']
      else
        fail "No such directory #{node['destd']}" \
          unless test("[ -d #{node['destd']} ]")
        tmp = File.join('/tmp', File.basename(node['destf']))
        upload! node['source'], tmp
        execute("sudo mv #{tmp} #{node['destf']}")
      end
    end
  end

  params = exclude_hidden? ? {} : { hidden: true }
  nodes = Gaptool::API.query_nodes(params.merge(instance: instance,
                                                role: role,
                                                environment: environment))
  nodes = nodes.map { |x| x.merge('source' => source, 'destd' => destd, 'destf' => destf) }

  res = Gaptool::SSH.exec(
    nodes, [],
    pre_hooks: [pre_hook], serial: serial?,
    continue_on_errors: continue_on_errors?,
    batch_size: batch_size,
    log_level: Logger::INFO
  )
  exit res
end