aspera-cli 4.13.0 → 4.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +81 -7
  4. data/CONTRIBUTING.md +22 -6
  5. data/README.md +2038 -1080
  6. data/bin/ascli +18 -9
  7. data/bin/asession +12 -14
  8. data/examples/dascli +1 -1
  9. data/examples/proxy.pac +1 -1
  10. data/examples/rubyc +24 -0
  11. data/lib/aspera/aoc.rb +219 -159
  12. data/lib/aspera/ascmd.rb +25 -14
  13. data/lib/aspera/cli/basic_auth_plugin.rb +12 -9
  14. data/lib/aspera/cli/error.rb +17 -0
  15. data/lib/aspera/cli/extended_value.rb +47 -12
  16. data/lib/aspera/cli/formatter.rb +260 -179
  17. data/lib/aspera/cli/hints.rb +80 -0
  18. data/lib/aspera/cli/main.rb +104 -156
  19. data/lib/aspera/cli/manager.rb +259 -209
  20. data/lib/aspera/cli/plugin.rb +123 -63
  21. data/lib/aspera/cli/plugins/alee.rb +2 -3
  22. data/lib/aspera/cli/plugins/aoc.rb +341 -261
  23. data/lib/aspera/cli/plugins/ats.rb +22 -21
  24. data/lib/aspera/cli/plugins/bss.rb +5 -5
  25. data/lib/aspera/cli/plugins/config.rb +578 -627
  26. data/lib/aspera/cli/plugins/console.rb +44 -6
  27. data/lib/aspera/cli/plugins/cos.rb +15 -17
  28. data/lib/aspera/cli/plugins/faspex.rb +114 -100
  29. data/lib/aspera/cli/plugins/faspex5.rb +411 -264
  30. data/lib/aspera/cli/plugins/node.rb +354 -259
  31. data/lib/aspera/cli/plugins/orchestrator.rb +61 -29
  32. data/lib/aspera/cli/plugins/preview.rb +82 -90
  33. data/lib/aspera/cli/plugins/server.rb +79 -32
  34. data/lib/aspera/cli/plugins/shares.rb +55 -42
  35. data/lib/aspera/cli/sync_actions.rb +68 -0
  36. data/lib/aspera/cli/transfer_agent.rb +66 -73
  37. data/lib/aspera/cli/transfer_progress.rb +74 -0
  38. data/lib/aspera/cli/version.rb +1 -1
  39. data/lib/aspera/colors.rb +12 -8
  40. data/lib/aspera/command_line_builder.rb +14 -11
  41. data/lib/aspera/cos_node.rb +3 -2
  42. data/lib/aspera/data/6 +0 -0
  43. data/lib/aspera/environment.rb +24 -9
  44. data/lib/aspera/fasp/agent_aspera.rb +126 -0
  45. data/lib/aspera/fasp/agent_base.rb +31 -77
  46. data/lib/aspera/fasp/agent_connect.rb +25 -21
  47. data/lib/aspera/fasp/agent_direct.rb +89 -103
  48. data/lib/aspera/fasp/agent_httpgw.rb +231 -149
  49. data/lib/aspera/fasp/agent_node.rb +41 -34
  50. data/lib/aspera/fasp/agent_trsdk.rb +75 -32
  51. data/lib/aspera/fasp/error_info.rb +4 -2
  52. data/lib/aspera/fasp/faux_file.rb +52 -0
  53. data/lib/aspera/fasp/installation.rb +53 -195
  54. data/lib/aspera/fasp/management.rb +244 -0
  55. data/lib/aspera/fasp/parameters.rb +71 -37
  56. data/lib/aspera/fasp/parameters.yaml +76 -8
  57. data/lib/aspera/fasp/products.rb +162 -0
  58. data/lib/aspera/fasp/resume_policy.rb +3 -3
  59. data/lib/aspera/fasp/transfer_spec.rb +7 -6
  60. data/lib/aspera/fasp/uri.rb +26 -24
  61. data/lib/aspera/faspex_gw.rb +2 -2
  62. data/lib/aspera/faspex_postproc.rb +2 -2
  63. data/lib/aspera/hash_ext.rb +14 -4
  64. data/lib/aspera/json_rpc.rb +49 -0
  65. data/lib/aspera/keychain/macos_security.rb +13 -13
  66. data/lib/aspera/line_logger.rb +23 -0
  67. data/lib/aspera/log.rb +58 -16
  68. data/lib/aspera/node.rb +157 -92
  69. data/lib/aspera/oauth.rb +37 -19
  70. data/lib/aspera/open_application.rb +4 -4
  71. data/lib/aspera/persistency_action_once.rb +1 -1
  72. data/lib/aspera/persistency_folder.rb +2 -2
  73. data/lib/aspera/preview/file_types.rb +4 -2
  74. data/lib/aspera/preview/generator.rb +22 -35
  75. data/lib/aspera/preview/options.rb +2 -0
  76. data/lib/aspera/preview/terminal.rb +73 -16
  77. data/lib/aspera/preview/utils.rb +21 -28
  78. data/lib/aspera/proxy_auto_config.js +2 -2
  79. data/lib/aspera/rest.rb +136 -68
  80. data/lib/aspera/rest_call_error.rb +1 -1
  81. data/lib/aspera/rest_error_analyzer.rb +15 -14
  82. data/lib/aspera/rest_errors_aspera.rb +37 -34
  83. data/lib/aspera/secret_hider.rb +18 -15
  84. data/lib/aspera/ssh.rb +5 -2
  85. data/lib/aspera/sync.rb +127 -119
  86. data/lib/aspera/temp_file_manager.rb +10 -3
  87. data/lib/aspera/web_auth.rb +10 -7
  88. data/lib/aspera/web_server_simple.rb +9 -4
  89. data.tar.gz.sig +0 -0
  90. metadata +34 -17
  91. metadata.gz.sig +0 -0
  92. data/docs/test_env.conf +0 -186
  93. data/lib/aspera/cli/listener/line_dump.rb +0 -19
  94. data/lib/aspera/cli/listener/logger.rb +0 -22
  95. data/lib/aspera/cli/listener/progress.rb +0 -50
  96. data/lib/aspera/cli/listener/progress_multi.rb +0 -84
  97. data/lib/aspera/cli/plugins/sync.rb +0 -44
  98. data/lib/aspera/data/7 +0 -0
  99. data/lib/aspera/fasp/listener.rb +0 -13
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # cspell:ignore trustpolicy
4
+
3
5
  require 'aspera/cli/plugins/node'
4
6
  require 'aspera/ats_api'
5
7
 
@@ -7,25 +9,25 @@ module Aspera
7
9
  module Cli
8
10
  module Plugins
9
11
  # Access Aspera Transfer Service
10
- # https://52.44.83.163/docs/
11
12
  # https://developer.ibm.com/aspera/docs/ats-api-reference/creating-ats-api-keys/
12
13
  class Ats < Aspera::Cli::Plugin
14
+ CLOUD_TABLE = %w[id name].freeze
13
15
  def initialize(env)
14
16
  super(env)
15
- options.add_opt_simple(:ibm_api_key, 'IBM API key, see https://cloud.ibm.com/iam/apikeys')
16
- options.add_opt_simple(:instance, 'ATS instance in ibm cloud')
17
- options.add_opt_simple(:ats_key, 'ATS key identifier (ats_xxx)')
18
- options.add_opt_simple(:ats_secret, 'ATS key secret')
19
- options.add_opt_simple(:params, 'Parameters access key creation (@json:)')
20
- options.add_opt_simple(:cloud, 'Cloud provider')
21
- options.add_opt_simple(:region, 'Cloud region')
17
+ options.declare(:ibm_api_key, 'IBM API key, see https://cloud.ibm.com/iam/apikeys')
18
+ options.declare(:instance, 'ATS instance in ibm cloud')
19
+ options.declare(:ats_key, 'ATS key identifier (ats_xxx)')
20
+ options.declare(:ats_secret, 'ATS key secret')
21
+ options.declare(:params, 'Parameters access key creation (@json:)')
22
+ options.declare(:cloud, 'Cloud provider')
23
+ options.declare(:region, 'Cloud region')
22
24
  options.parse_options!
23
25
  end
24
26
 
25
27
  def server_by_cloud_region
26
28
  # TODO: provide list ?
27
- cloud = options.get_option(:cloud, is_type: :mandatory).upcase
28
- region = options.get_option(:region, is_type: :mandatory)
29
+ cloud = options.get_option(:cloud, mandatory: true).upcase
30
+ region = options.get_option(:region, mandatory: true)
29
31
  return @ats_api_pub.read("servers/#{cloud}/#{region}")[:data]
30
32
  end
31
33
 
@@ -36,8 +38,8 @@ module Aspera
36
38
  base_url: AtsApi.base_url + '/pub/v1',
37
39
  auth: {
38
40
  type: :basic,
39
- username: options.get_option(:ats_key, is_type: :mandatory),
40
- password: options.get_option(:ats_secret, is_type: :mandatory)}
41
+ username: options.get_option(:ats_key, mandatory: true),
42
+ password: options.get_option(:ats_secret, mandatory: true)}
41
43
  })
42
44
  end
43
45
 
@@ -90,7 +92,7 @@ module Aspera
90
92
  res = ats_api_pub_v1.read("access_keys/#{access_key_id}")
91
93
  return {type: :single_object, data: res[:data]}
92
94
  when :modify
93
- params = options.get_option(:value, is_type: :mandatory)
95
+ params = value_create_modify(command: command)
94
96
  params['id'] = access_key_id
95
97
  ats_api_pub_v1.update("access_keys/#{access_key_id}", params)
96
98
  return Main.result_status('modified')
@@ -104,7 +106,7 @@ module Aspera
104
106
  when :node
105
107
  ak_data = ats_api_pub_v1.read("access_keys/#{access_key_id}")[:data]
106
108
  server_data = @ats_api_pub.all_servers.find {|i| i['id'].start_with?(ak_data['transfer_server_id'])}
107
- raise CliError, 'no such server found' if server_data.nil?
109
+ raise Cli::Error, 'no such server found' if server_data.nil?
108
110
  node_url = server_data['transfer_setup_url']
109
111
  api_node = Aspera::Node.new(params: {
110
112
  base_url: node_url,
@@ -114,7 +116,7 @@ module Aspera
114
116
  password: @agents[:config].lookup_secret(url: node_url, username: access_key_id)
115
117
  }})
116
118
  command = options.get_next_command(Node::COMMANDS_GEN4)
117
- return Node.new(@agents.merge(skip_basic_auth_options: true, node_api: api_node)).execute_command_gen4(command, ak_data['root_file_id'])
119
+ return Node.new(@agents, api: api_node).execute_command_gen4(command, ak_data['root_file_id'])
118
120
  when :cluster
119
121
  ats_url = ats_api_pub_v1.params[:base_url]
120
122
  rest_params = {
@@ -134,11 +136,11 @@ module Aspera
134
136
  command = options.get_next_command(%i[clouds list show])
135
137
  case command
136
138
  when :clouds
137
- return {type: :single_object, data: @ats_api_pub.cloud_names, columns: %w[id name]}
139
+ return {type: :object_list, data: @ats_api_pub.cloud_names.map { |k, v| CLOUD_TABLE.zip([k, v]).to_h }}
138
140
  when :list
139
141
  return {type: :object_list, data: @ats_api_pub.all_servers, fields: %w[id cloud region]}
140
142
  when :show
141
- if options.get_option(:cloud) || options.get_option(:region, is_type: :optional)
143
+ if options.get_option(:cloud) || options.get_option(:region)
142
144
  server_data = server_by_cloud_region
143
145
  else
144
146
  server_id = instance_identifier
@@ -161,7 +163,7 @@ module Aspera
161
163
  generic: {
162
164
  grant_type: 'urn:ibm:params:oauth:grant-type:apikey',
163
165
  response_type: 'cloud_iam',
164
- apikey: options.get_option(:ibm_api_key, is_type: :mandatory)
166
+ apikey: options.get_option(:ibm_api_key, mandatory: true)
165
167
  }}})
166
168
  end
167
169
 
@@ -187,8 +189,7 @@ module Aspera
187
189
  Log.log.warn{"more instances remaining: #{instances['remaining']}"} unless instances['remaining'].to_i.eql?(0)
188
190
  return {type: :value_list, data: instances['data'], name: 'instance'}
189
191
  when :create
190
- create_value = options.get_option(:value) || {}
191
- created_key = ats_ibm_api.create('api_keys', create_value)[:data]
192
+ created_key = ats_ibm_api.create('api_keys', value_create_modify(command: command, default: {}))[:data]
192
193
  return {type: :single_object, data: created_key}
193
194
  when :list # list known api keys in ATS (this require an api_key ...)
194
195
  res = ats_ibm_api.read('api_keys', {'offset' => 0, 'max_results' => 1000})
@@ -221,7 +222,7 @@ module Aspera
221
222
  when :api_key # manage credential to access ATS API
222
223
  return execute_action_api_key
223
224
  when :aws_trust_policy
224
- res = ats_api_pub_v1.read('aws/trustpolicy', {region: options.get_option(:region, is_type: :mandatory)})[:data]
225
+ res = ats_api_pub_v1.read('aws/trustpolicy', {region: options.get_option(:region, mandatory: true)})[:data]
225
226
  return {type: :single_object, data: res}
226
227
  else raise 'ERROR'
227
228
  end
@@ -23,7 +23,7 @@ module Aspera
23
23
 
24
24
  def execute_action
25
25
  if @api_bss.nil?
26
- key = options.get_option(:password, is_type: :mandatory)
26
+ key = options.get_option(:password, mandatory: true)
27
27
  @api_bss = Rest.new(
28
28
  base_url: 'https://dashboard.bss.asperasoft.com/platform',
29
29
  headers: {cookie: "_dashboard_key=#{key}"})
@@ -35,8 +35,8 @@ module Aspera
35
35
  object = 'bssSubscriptions'
36
36
  case command
37
37
  when :find
38
- query = options.get_option(:query, is_type: :mandatory) # AOC_ORGANIZATION_QUERY AOC_USER_EMAIL
39
- value = options.get_option(:value, is_type: :mandatory)
38
+ query = options.get_option(:query, mandatory: true) # AOC_ORGANIZATION_QUERY AOC_USER_EMAIL
39
+ value = value_create_modify(command: command)
40
40
  request = {
41
41
  'variables' => {'filter' => {'key' => query, 'value' => value}},
42
42
  'query' => "query($filter: BssSubscriptionFilter!) {#{object}(filter: $filter) { #{all_fields('bssSubscriptions')} } }"
@@ -48,8 +48,8 @@ module Aspera
48
48
  id = instance_identifier
49
49
  request = {
50
50
  'variables' => {'id' => id},
51
- 'query' => "query($id: ID!) {#{object}(id: $id) { #{all_fields('bssSubscriptions')} roleAssignments(uniqueSubjectId: true) { id subjectId } "\
52
- 'instances { id state planId serviceId ssmSubscriptionId entitlement { id } aocOrganization { id subdomainName name status tier urlId trialExpiresAt '\
51
+ 'query' => "query($id: ID!) {#{object}(id: $id) { #{all_fields('bssSubscriptions')} roleAssignments(uniqueSubjectId: true) { id subjectId } " \
52
+ 'instances { id state planId serviceId ssmSubscriptionId entitlement { id } aocOrganization { id subdomainName name status tier urlId trialExpiresAt ' \
53
53
  'users(organizationAdmin: true) { id name email atsAdmin subscriptionAdmin } } } } }'
54
54
  }
55
55
  result = @api_bss.create('graphql', request)[:data]['data'][object].first