class Envoi::Mam::Agent::TransferClient::Aspera

Constants

ASCP_PATHS
DEFAULT_ASCP_ARGS
DEFAULT_DESTINATION_PATH

Attributes

ascp_path[RW]
default_ascp_args[RW]
default_ascp_path[RW]

Public Instance Methods

after_initialize(args = initial_args) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 33
def after_initialize(args = initial_args)
  @default_ascp_path = args[:default_aspera_ascp_path]
  @default_ascp_path ||= ASCP_PATHS.find { |v| File.exists? v } || ASCP_PATHS.first
  @default_ascp_args = args[:default_ascp_args] || args[:default_aspera_ascp_args] || DEFAULT_ASCP_ARGS
end
ascp_path_exists?() click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 39
def ascp_path_exists?
  File.executable?(@ascp_path)
end
build_ascp_command(config, mode, source_path, target_path) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 103
def build_ascp_command(config, mode, source_path, target_path)
  aspera_host_address = config['host_address'] || config['host']
  aspera_username = config['username']
  aspera_password = config['password']
  aspera_ssh_port = config['ssh_port']

  aspera_url = config['url'] || config['uri']
  if aspera_url
    aspera_uri = URI(aspera_url)
    aspera_host_address ||= aspera_uri.host if aspera_uri
    un, pw = (aspera_uri.userinfo || '').split(':')
    aspera_username ||= un if un
    aspera_password ||= pw if pw
    aspera_ssh_port ||= aspera_uri.port
  end

  aspera_token = config['aspera_transfer_token'] || config['aspera_token'] || config['token'] || config['transfer_token']
  if aspera_username && aspera_password && (aspera_token.nil? || aspera_token.empty?)
    aspera_token = %(Basic #{["#{aspera_username}:#{aspera_password}"]
                                  .pack('m')
                                  .delete("\r\n")})
    aspera_username = 'xfer'
  end
  @ascp_path = config['ascp_path'] || default_ascp_path
  @ascp_path = File.expand_path(@ascp_path)

  aspera_ascp_path = @ascp_path

  tags = config['tags'] || { }
  aspera_tags = tags['aspera'] || { }
  aspera_tags['xfer_id'] ||= SecureRandom.uuid


  ascp_args = config['ascp_args'] || default_ascp_args || agent.default_ascp_args

  # command = %(export ASPERA_SCP_PASS="#{aspera_password}"; "#{aspera_ascp_path}" #{ascp_args} --host="#{aspera_host_address}" --user=#{aspera_username} --mode=#{mode} "#{source_path}" "#{target_path}" )
  command = ''
  command << %(export ASPERA_SCP_PASS="#{aspera_password}"; ) if aspera_password
  command << %("#{aspera_ascp_path}" --mode=#{mode} --host="#{aspera_host_address}" --user="#{aspera_username}")
  command << %( -P #{aspera_ssh_port}) if aspera_ssh_port
  command << %(--tags64 #{Base64.strict_encode64(JSON.generate(tags))}) if tags && !tags.empty?
  if ascp_args && !ascp_args.empty?
    command << (ascp_args.is_a?(Array)) ? ascp_args.join(' ') : ascp_args
  end
  command << %( -W "#{aspera_token}") if aspera_token && !aspera_token.empty?
  command << %( "#{source_path.gsub('"', '\"')}" "#{target_path.gsub('"', '\"')}")
end
build_asperala_transfer_args(config, mode, source_path, target_path) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 43
def build_asperala_transfer_args(config, mode, source_path, target_path)

  aspera_host_address = config['host_address'] || config['host']
  aspera_username = config['username']
  aspera_password = config['password']
  aspera_ssh_port = config['ssh_port']

  aspera_url = config['url'] || config['uri']
  if aspera_url
    aspera_uri = URI(aspera_url)
    aspera_host_address ||= aspera_uri.host if aspera_uri
    un, pw = (aspera_uri.userinfo || '').split(':')
    aspera_username ||= un if un
    aspera_password ||= pw if pw
    aspera_ssh_port = aspera_uri.port
  end

  force_username_password = config.fetch('force_username_password', false)

  aspera_token = config['aspera_transfer_token'] || config['aspera_token'] || config['token'] || config['transfer_token']
  if aspera_username && aspera_password && !force_username_password && (aspera_token.nil? || aspera_token.empty?)
    aspera_token = %(Basic #{["#{aspera_username}:#{aspera_password}"]
                                  .pack('m')
                                  .delete("\r\n")})
    aspera_username = 'xfer'
    aspera_password = nil
  end

  # @ascp_path = config['ascp_path'] || default_ascp_path
  # @ascp_path = File.expand_path(@ascp_path)
  # aspera_ascp_path = @ascp_path

  env_vars = { }
  env_vars['ASPERA_SCP_PASS'] = aspera_password if aspera_password
  # env_vars['ASPERA_SCP_TOKEN'] = aspera_token if aspera_token

  ascp_args = config['ascp_args'] ||
      default_ascp_args ||
      (agent.respond_to?(:default_ascp_args) ? agent.default_ascp_args : '')

  tags = config['tags'] ||= { }
  aspera_tags = tags['aspera'] ||= { }
  aspera_tags['xfer_id'] ||= SecureRandom.uuid

  cmdline_args = [
    '--mode', mode,
    '--host', aspera_host_address,
    '--user', aspera_username,
    '--tags64', Base64.strict_encode64(JSON.generate(tags)),
  ]
  cmdline_args.concat [ '-P', aspera_ssh_port ] if aspera_ssh_port
  cmdline_args.concat ascp_args.is_a?(Array) ? ascp_args : ascp_args.split(' ') if ascp_args && !ascp_args.empty?
  if aspera_token && !aspera_token.empty?
    cmdline_args.concat ['-W', aspera_token, '-i', 'asperaweb_id_dsa.openssh' ]
  end
  cmdline_args.concat [ source_path.gsub('"', '\"'), target_path.gsub('"', '\"') ]

  { env: env_vars, args: cmdline_args, ascp_version: :ascp }
end
download(config, path, destination_path = DEFAULT_DESTINATION_PATH) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 151
def download(config, path, destination_path = DEFAULT_DESTINATION_PATH)
  aspera_base_path = config['base_path'] || ''
  source_path = aspera_base_path.empty? ? path : File.join(aspera_base_path, path)

  mode = 'recv'
  transfer(config, mode, source_path, destination_path)
end
shutdown(graceful = true) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 197
def shutdown(graceful = true)
  if @fasp && @fasp.respond_to?(:shutdown)
    @fasp.shutdown(graceful)
  end
end
transfer(config, mode, source_path, destination_path) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 168
def transfer(config, mode, source_path, destination_path)
  if true
    transfer_using_asperala(config, mode, source_path, destination_path)
  else
    transfer_using_shell_execute(config, mode, source_path, destination_path)
  end
end
transfer_using_asperala(config, mode, source_path, destination_path) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 176
def transfer_using_asperala(config, mode, source_path, destination_path)
  args_out = build_asperala_transfer_args(config, mode, source_path, destination_path)
  @fasp ||= Asperalm::Fasp::Local.instance
  Asperalm::Log.instance.logger = logger
  # Asperalm::Log.instance.level = :debug #logger.level
  @fasp.start_transfer_with_args_env(args_out, {})
  { success: true }
end
transfer_using_shell_execute(config, mode, source_path, destination_path) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 185
def transfer_using_shell_execute(config, mode, source_path, destination_path)
  command = build_ascp_command(config, mode, source_path, destination_path)

  unless ascp_path_exists?
    msg = "ASCP not found. '#{ascp_path}'"
    warn msg
    return { message: msg, success: false }
  end

  agent.shell_execute(command)
end
upload(config, path, destination_path = DEFAULT_DESTINATION_PATH) click to toggle source
# File lib/envoi/mam/agent/transfer_client/aspera.rb, line 159
def upload(config, path, destination_path = DEFAULT_DESTINATION_PATH)
  aspera_base_path = config['base_path'] || ''
  source_path = path
  destination_path = aspera_base_path.empty? ? destination_path : File.join(aspera_base_path, destination_path)

  mode = 'send'
  transfer(config, mode, source_path, destination_path)
end