aspera-cli 4.13.0 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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