class Asperalm::FaspexGW::FxGwServlet

Public Class Methods

new(server,a_aoc_api_user,a_workspace_id) click to toggle source
# File lib/asperalm/faspex_gw.rb, line 14
def initialize(server,a_aoc_api_user,a_workspace_id)
  @aoc_api_user=a_aoc_api_user
  @aoc_workspace_id=a_workspace_id
end

Public Instance Methods

do_GET(request, response) click to toggle source
# File lib/asperalm/faspex_gw.rb, line 117
def do_GET (request, response)
  case request.path
  when '/aspera/faspex/send'
    process_faspex_send(request, response)
  else
    response.status=400
    return "ERROR HERE"
    raise "unsupported path: #{request.path}"
  end
end
process_faspex_send(request, response) click to toggle source
parameters from user to Faspex API call

{“delivery”:{“use_encryption_at_rest”:false,“note”:“note”,“sources”:[{“paths”:}],“title”:“my title”,“recipients”:,“send_upload_result”:true}}

{
  "delivery"=>{
  "use_encryption_at_rest"=>false,
  "note"=>"note",
  "sources"=>[{"paths"=>["file1"]}],
  "title"=>"my title",
  "recipients"=>["email1"],
  "send_upload_result"=>true
  }
}
# File lib/asperalm/faspex_gw.rb, line 31
def process_faspex_send(request, response)
  raise "no payload" if request.body.nil?
  faspex_pkg_parameters=JSON.parse(request.body)
  faspex_pkg_delivery=faspex_pkg_parameters['delivery']
  Log.log.debug "faspex pkg create parameters=#{faspex_pkg_parameters}"

  # get recipient ids
  files_pkg_recipients=[]
  faspex_pkg_delivery['recipients'].each do |recipient_email|
    user_lookup=@aoc_api_user.read("contacts",{'current_workspace_id'=>@aoc_workspace_id,'q'=>recipient_email})[:data]
    raise StandardError,"no such unique user: #{recipient_email} / #{user_lookup}" unless !user_lookup.nil? and user_lookup.length == 1
    recipient_user_info=user_lookup.first
    files_pkg_recipients.push({"id"=>recipient_user_info['source_id'],"type"=>recipient_user_info['source_type']})
  end

  #  create a new package with one file
  the_package=@aoc_api_user.create("packages",{
    "file_names"=>faspex_pkg_delivery['sources'][0]['paths'],
    "name"=>faspex_pkg_delivery['title'],
    "note"=>faspex_pkg_delivery['note'],
    "recipients"=>files_pkg_recipients,
    "workspace_id"=>@aoc_workspace_id})[:data]

  #  get node information for the node on which package must be created
  node_info=@aoc_api_user.read("nodes/#{the_package['node_id']}")[:data]

  #  get transfer token (for node)
  node_auth_bearer_token=@aoc_api_user.oauth_token(scope: OnCloud.node_scope(node_info['access_key'],OnCloud::SCOPE_NODE_USER))

  # tell Files what to expect in package: 1 transfer (can also be done after transfer)
  @aoc_api_user.update("packages/#{the_package['id']}",{"sent"=>true,"transfers_expected"=>1})

  if false
    response.status=400
    return "ERROR HERE"
  end
  # TODO: check about xfer_*
  ts_tags={
    "aspera" => {
    "files"      => { "package_id" => the_package['id'], "package_operation" => "upload" },
    "node"       => { "access_key" => node_info['access_key'], "file_id" => the_package['contents_file_id'] },
    "xfer_id"    => SecureRandom.uuid,
    "xfer_retry" => 3600 } }
  # this transfer spec is for transfer to AoC
  faspex_transfer_spec={
    'direction' => 'send',
    'remote_user' => 'xfer',
    'remote_host' => node_info['host'],
    'ssh_port' => 33001,
    'fasp_port' => 33001,
    'tags' => ts_tags,
    'token' => node_auth_bearer_token,
    'paths' => [{'destination' => '/'}],
    'cookie' => 'unused',
    'create_dir' => true,
    'rate_policy' => 'fair',
    'rate_policy_allowed' => 'fixed',
    'min_rate_cap_kbps' => nil,
    'min_rate_kbps' => 0,
    'target_rate_percentage' => nil,
    'lock_target_rate' => nil,
    'fasp_url' => 'unused',
    'lock_min_rate' => true,
    'lock_rate_policy' => true,
    'source_root' => '',
    'content_protection' => nil,
    'target_rate_cap_kbps' => 20000, # TODO
    'target_rate_kbps' => 10000, # TODO
    'cipher' => 'aes-128',
    'cipher_allowed' => nil,
    'http_fallback' => false,
    'http_fallback_port' => nil,
    'https_fallback_port' => nil,
    'destination_root' => '/'
  }
  # but we place it in a Faspex package creation response
  faspex_package_create_result={
    'links' => {'status' => 'unused'},
    'xfer_sessions' => [faspex_transfer_spec]
  }
  Log.log.info("faspex_package_create_result=#{faspex_package_create_result}")
  response.status=200
  response.content_type = "application/json"
  response.body=JSON.generate(faspex_package_create_result)
end