Class: Aspera::FaspexGW::FxGwServlet

Inherits:
WEBrick::HTTPServlet::AbstractServlet
  • Object
show all
Defined in:
lib/aspera/faspex_gw.rb

Instance Method Summary collapse

Constructor Details

#initialize(server, a_aoc_api_user, a_workspace_id) ⇒ FxGwServlet



14
15
16
17
# File 'lib/aspera/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

Instance Method Details

#do_GET(request, response) ⇒ Object



117
118
119
120
121
122
123
124
125
126
# File 'lib/aspera/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) ⇒ Object

parameters from user to Faspex API call href=""file1"">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
  }
}


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/aspera/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
    =user_lookup.first
    files_pkg_recipients.push({"id"=>['source_id'],"type"=>['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: AoC.node_scope(node_info['access_key'],AoC::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