aspera-cli 4.22.0 → 4.24.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 (114) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +405 -364
  4. data/CONTRIBUTING.md +86 -29
  5. data/README.md +1856 -961
  6. data/bin/ascli +2 -1
  7. data/bin/asession +4 -4
  8. data/lib/aspera/agent/base.rb +4 -0
  9. data/lib/aspera/agent/connect.rb +20 -18
  10. data/lib/aspera/agent/desktop.rb +14 -11
  11. data/lib/aspera/agent/direct.rb +39 -31
  12. data/lib/aspera/agent/httpgw.rb +2 -2
  13. data/lib/aspera/agent/node.rb +9 -11
  14. data/lib/aspera/agent/transferd.rb +18 -11
  15. data/lib/aspera/api/aoc.rb +53 -43
  16. data/lib/aspera/api/cos_node.rb +7 -5
  17. data/lib/aspera/api/httpgw.rb +23 -22
  18. data/lib/aspera/api/node.rb +104 -22
  19. data/lib/aspera/ascmd.rb +35 -21
  20. data/lib/aspera/ascp/installation.rb +43 -43
  21. data/lib/aspera/ascp/management.rb +5 -4
  22. data/lib/aspera/assert.rb +55 -24
  23. data/lib/aspera/cli/basic_auth_plugin.rb +8 -7
  24. data/lib/aspera/cli/error.rb +1 -1
  25. data/lib/aspera/cli/extended_value.rb +28 -29
  26. data/lib/aspera/cli/formatter.rb +191 -168
  27. data/lib/aspera/cli/hints.rb +38 -4
  28. data/lib/aspera/cli/main.rb +139 -108
  29. data/lib/aspera/cli/manager.rb +51 -31
  30. data/lib/aspera/cli/plugin.rb +149 -78
  31. data/lib/aspera/cli/plugin_factory.rb +2 -2
  32. data/lib/aspera/cli/plugins/aoc.rb +217 -88
  33. data/lib/aspera/cli/plugins/ats.rb +15 -13
  34. data/lib/aspera/cli/plugins/config.rb +105 -227
  35. data/lib/aspera/cli/plugins/console.rb +49 -18
  36. data/lib/aspera/cli/plugins/cos.rb +4 -4
  37. data/lib/aspera/cli/plugins/faspex.rb +45 -51
  38. data/lib/aspera/cli/plugins/faspex5.rb +162 -163
  39. data/lib/aspera/cli/plugins/faspio.rb +6 -5
  40. data/lib/aspera/cli/plugins/httpgw.rb +2 -2
  41. data/lib/aspera/cli/plugins/node.rb +233 -247
  42. data/lib/aspera/cli/plugins/orchestrator.rb +10 -14
  43. data/lib/aspera/cli/plugins/preview.rb +26 -29
  44. data/lib/aspera/cli/plugins/server.rb +29 -28
  45. data/lib/aspera/cli/plugins/shares.rb +40 -28
  46. data/lib/aspera/cli/sync_actions.rb +101 -80
  47. data/lib/aspera/cli/transfer_agent.rb +55 -58
  48. data/lib/aspera/cli/transfer_progress.rb +29 -20
  49. data/lib/aspera/cli/version.rb +1 -1
  50. data/lib/aspera/cli/wizard.rb +160 -0
  51. data/lib/aspera/colors.rb +13 -8
  52. data/lib/aspera/command_line_builder.rb +28 -22
  53. data/lib/aspera/command_line_converter.rb +31 -0
  54. data/lib/aspera/data_repository.rb +1 -0
  55. data/lib/aspera/environment.rb +144 -100
  56. data/lib/aspera/faspex_gw.rb +1 -1
  57. data/lib/aspera/faspex_postproc.rb +3 -2
  58. data/lib/aspera/hash_ext.rb +1 -1
  59. data/lib/aspera/id_generator.rb +10 -10
  60. data/lib/aspera/keychain/base.rb +18 -0
  61. data/lib/aspera/keychain/encrypted_hash.rb +6 -12
  62. data/lib/aspera/keychain/factory.rb +9 -3
  63. data/lib/aspera/keychain/hashicorp_vault.rb +9 -6
  64. data/lib/aspera/keychain/macos_security.rb +13 -13
  65. data/lib/aspera/log.rb +70 -20
  66. data/lib/aspera/nagios.rb +5 -6
  67. data/lib/aspera/node_simulator.rb +12 -7
  68. data/lib/aspera/oauth/base.rb +6 -2
  69. data/lib/aspera/oauth/factory.rb +25 -18
  70. data/lib/aspera/oauth/jwt.rb +13 -1
  71. data/lib/aspera/oauth/url_json.rb +3 -3
  72. data/lib/aspera/oauth/web.rb +5 -3
  73. data/lib/aspera/persistency_folder.rb +2 -2
  74. data/lib/aspera/preview/file_types.rb +43 -35
  75. data/lib/aspera/preview/generator.rb +26 -13
  76. data/lib/aspera/preview/terminal.rb +10 -7
  77. data/lib/aspera/preview/utils.rb +11 -9
  78. data/lib/aspera/products/connect.rb +2 -1
  79. data/lib/aspera/products/desktop.rb +1 -1
  80. data/lib/aspera/products/other.rb +2 -2
  81. data/lib/aspera/products/transferd.rb +8 -6
  82. data/lib/aspera/proxy_auto_config.rb +1 -1
  83. data/lib/aspera/rest.rb +46 -28
  84. data/lib/aspera/rest_call_error.rb +1 -1
  85. data/lib/aspera/rest_error_analyzer.rb +1 -0
  86. data/lib/aspera/resumer.rb +1 -1
  87. data/lib/aspera/secret_hider.rb +46 -40
  88. data/lib/aspera/ssh.rb +14 -4
  89. data/lib/aspera/sync/args.schema.yaml +102 -0
  90. data/lib/aspera/sync/conf.schema.yaml +701 -0
  91. data/lib/aspera/sync/database.rb +83 -0
  92. data/lib/aspera/{transfer/sync.rb → sync/operations.rb} +145 -68
  93. data/lib/aspera/temp_file_manager.rb +4 -2
  94. data/lib/aspera/timer_limiter.rb +7 -5
  95. data/lib/aspera/transfer/error.rb +1 -1
  96. data/lib/aspera/transfer/error_info.rb +1 -2
  97. data/lib/aspera/transfer/faux_file.rb +11 -10
  98. data/lib/aspera/transfer/parameters.rb +6 -5
  99. data/lib/aspera/transfer/spec.rb +15 -1
  100. data/lib/aspera/transfer/spec.schema.yaml +316 -293
  101. data/lib/aspera/transfer/spec_doc.rb +34 -16
  102. data/lib/aspera/transfer/uri.rb +5 -5
  103. data/lib/aspera/uri_reader.rb +14 -10
  104. data/lib/aspera/web_auth.rb +2 -2
  105. data/lib/aspera/web_server_simple.rb +2 -2
  106. data.tar.gz.sig +0 -0
  107. metadata +15 -15
  108. metadata.gz.sig +0 -0
  109. data/examples/dascli +0 -30
  110. data/examples/get_proto_file.rb +0 -8
  111. data/examples/proxy.pac +0 -60
  112. data/lib/aspera/transfer/convert.rb +0 -29
  113. data/lib/aspera/transfer/sync_instance.schema.yaml +0 -13
  114. data/lib/aspera/transfer/sync_session.schema.yaml +0 -79
@@ -8,6 +8,10 @@ module Aspera
8
8
  module Plugins
9
9
  class Console < Cli::BasicAuthPlugin
10
10
  STANDARD_PATH = '/aspera/console'
11
+ DEFAULT_FILTER_AGE_SECONDS = 24 * 3600
12
+ EXPR_RE = /\A(\S+) (\S+) (.*)\z/
13
+ private_constant :STANDARD_PATH, :DEFAULT_FILTER_AGE_SECONDS, :EXPR_RE
14
+
11
15
  class << self
12
16
  def detect(address_or_url)
13
17
  address_or_url = "https://#{address_or_url}" unless address_or_url.match?(%r{^[a-z]{1,6}://})
@@ -21,7 +25,8 @@ module Aspera
21
25
  test_page = api.call(
22
26
  operation: 'GET',
23
27
  subpath: test_endpoint,
24
- query: {local: true})
28
+ query: {local: true}
29
+ )
25
30
  next unless test_page[:http].body.include?('Aspera Console')
26
31
  version = 'unknown'
27
32
  if (m = test_page[:http].body.match(/\(v([1-9]\..*)\)/))
@@ -37,7 +42,7 @@ module Aspera
37
42
  Log.log.debug{"detect error: #{e}"}
38
43
  end
39
44
  raise error if error
40
- return nil
45
+ return
41
46
  end
42
47
 
43
48
  # @param object [Plugin] An instance of this class
@@ -54,14 +59,22 @@ module Aspera
54
59
  }
55
60
  end
56
61
  end
57
- DEFAULT_FILTER_AGE_SECONDS = 3 * 3600
58
- private_constant :DEFAULT_FILTER_AGE_SECONDS
59
- def initialize(**env)
62
+
63
+ def initialize(**_)
60
64
  super
61
- time_now = Time.now
62
- options.declare(:filter_from, 'Only after date', values: :date, default: Manager.time_to_string(time_now - DEFAULT_FILTER_AGE_SECONDS))
63
- options.declare(:filter_to, 'Only before date', values: :date, default: Manager.time_to_string(time_now))
64
- options.parse_options!
65
+ end
66
+
67
+ def parse_extended_filter(filter, query)
68
+ raise BadArgument, "Invalid filter syntax: #{filter}, shall be (field op val)and(field op val)..." unless filter.start_with?('(') && filter.end_with?(')')
69
+ filter[1..-2].split(')and(').each_with_index do |expr, i|
70
+ m = expr.match(EXPR_RE)
71
+ raise BadArgument, "Invalid expression: #{expr}, shall be: <field> <op> <val>" unless m
72
+ t = m.captures
73
+ i += 1
74
+ query["filter#{i}"] = t[0]
75
+ query["comp#{i}"] = t[1]
76
+ query["val#{i}"] = t[2]
77
+ end
65
78
  end
66
79
 
67
80
  ACTIONS = %i[transfer health].freeze
@@ -89,20 +102,38 @@ module Aspera
89
102
  return Main.result_object_list(api_console.read('smart_transfers'))
90
103
  when :submit
91
104
  smart_id = options.get_next_argument('smart_id')
92
- params = options.get_next_argument('transfer parameters')
105
+ params = options.get_next_argument('transfer parameters', validation: Hash)
93
106
  return Main.result_object_list(api_console.create("smart_transfers/#{smart_id}", params))
94
107
  end
95
108
  when :current
96
- command = options.get_next_command([:list])
109
+ command = options.get_next_command(%i[list show files start pause cancel resume rerun change_rate change_policy move_forwards move_back])
97
110
  case command
98
111
  when :list
99
- return {
100
- type: :object_list,
101
- data: api_console.read('transfers', {
102
- 'from' => options.get_option(:filter_from, mandatory: true),
103
- 'to' => options.get_option(:filter_to, mandatory: true)
104
- }),
105
- fields: %w[id contact name status]}
112
+ # https://developer.ibm.com/apis/catalog/aspera--aspera-console-rest-api/Developer+Guides#transfer-list
113
+ query = query_read_delete(default: {})
114
+ if query['from'].nil? && query['to'].nil?
115
+ time_now = Time.now
116
+ query['from'] = Manager.time_to_string(time_now - DEFAULT_FILTER_AGE_SECONDS)
117
+ query['to'] = Manager.time_to_string(time_now)
118
+ end
119
+ if (filter = query.delete('filter'))
120
+ parse_extended_filter(filter, query)
121
+ end
122
+ return Main.result_object_list(
123
+ api_console.read('transfers', query),
124
+ fields: %w[id contact name status]
125
+ )
126
+ when :show
127
+ transfer_id = instance_identifier(description: 'transfer ID')
128
+ return Main.result_single_object(api_console.read("transfers/#{transfer_id}"))
129
+ when :files
130
+ transfer_id = instance_identifier(description: 'transfer ID')
131
+ query = query_read_delete(default: {})
132
+ query['limit'] ||= 100
133
+ return Main.result_object_list(api_console.read("transfers/#{transfer_id}/files", query))
134
+ when :start, :pause, :cancel, :resume, :rerun, :change_rate, :change_policy, :move_forwards, :move_back
135
+ transfer_id = instance_identifier(description: 'transfer ID')
136
+ return Main.result_single_object(api_console.update("transfers/#{transfer_id}/#{command}", query_read_delete))
106
137
  end
107
138
  end
108
139
  end
@@ -9,7 +9,7 @@ module Aspera
9
9
  module Cli
10
10
  module Plugins
11
11
  class Cos < Cli::Plugin
12
- def initialize(**env)
12
+ def initialize(**_)
13
13
  super
14
14
  options.declare(:bucket, 'Bucket name')
15
15
  options.declare(:endpoint, 'Storage endpoint (URL)')
@@ -36,15 +36,15 @@ module Aspera
36
36
  endpoint: options.get_option(:endpoint)
37
37
  }
38
38
  if service_credentials.nil?
39
- Aspera.assert(!cos_node_params[:endpoint].nil?, exception_class: Cli::BadArgument){'endpoint required when service credentials not provided'}
39
+ Aspera.assert(!cos_node_params[:endpoint].nil?, type: Cli::BadArgument){'endpoint required when service credentials not provided'}
40
40
  cos_node_params[:api_key] = options.get_option(:apikey, mandatory: true)
41
41
  cos_node_params[:instance_id] = options.get_option(:crn, mandatory: true)
42
42
  else
43
- Aspera.assert(cos_node_params[:endpoint].nil?, exception_class: Cli::BadArgument){'endpoint not allowed when service credentials provided'}
43
+ Aspera.assert(cos_node_params[:endpoint].nil?, type: Cli::BadArgument){'endpoint not allowed when service credentials provided'}
44
44
  cos_node_params.merge!(Api::CosNode.parameters_from_svc_credentials(service_credentials, options.get_option(:region, mandatory: true)))
45
45
  end
46
46
  api_node = Api::CosNode.new(**cos_node_params)
47
- node_plugin = Node.new(**init_params, api: api_node)
47
+ node_plugin = Node.new(context: context, api: api_node)
48
48
  command = options.get_next_command(Node::COMMANDS_COS)
49
49
  return node_plugin.execute_action(command)
50
50
  end
@@ -38,7 +38,7 @@ module Aspera
38
38
  PUB_LINK_EXTERNAL_MATCH = 'external_deliveries/'
39
39
  STANDARD_PATH = '/aspera/faspex'
40
40
  HEADER_FASPEX_VERSION = 'X-IBM-Aspera'
41
- private_constant(*%i[KEY_NODE KEY_PATH PACKAGE_MATCH_FIELD ATOM_MAILBOXES ATOM_PARAMS ATOM_EXT_PARAMS PUB_LINK_EXTERNAL_MATCH HEADER_FASPEX_VERSION])
41
+ private_constant :KEY_NODE, :KEY_PATH, :PACKAGE_MATCH_FIELD, :ATOM_MAILBOXES, :ATOM_PARAMS, :ATOM_EXT_PARAMS, :PUB_LINK_EXTERNAL_MATCH, :HEADER_FASPEX_VERSION
42
42
 
43
43
  class << self
44
44
  def detect(address_or_url)
@@ -71,7 +71,7 @@ module Aspera
71
71
  Log.log.debug{"detect error: #{e}"}
72
72
  end
73
73
  raise error if error
74
- return nil
74
+ return
75
75
  end
76
76
 
77
77
  # @param object [Plugin] An instance of this class
@@ -91,7 +91,7 @@ module Aspera
91
91
  # extract elements from faspex public link
92
92
  def get_link_data(public_url)
93
93
  public_uri = URI.parse(public_url)
94
- Aspera.assert(m = public_uri.path.match(%r{^(.*)/(external.*)$}), exception_class: Cli::BadArgument){'Public link does not match Faspex format'}
94
+ Aspera.assert(m = public_uri.path.match(%r{^(.*)/(external.*)$}), type: Cli::BadArgument){'Public link does not match Faspex format'}
95
95
  base = m[1]
96
96
  subpath = m[2]
97
97
  port_add = public_uri.port.eql?(public_uri.default_port) ? '' : ":#{public_uri.port}"
@@ -100,7 +100,7 @@ module Aspera
100
100
  subpath: subpath,
101
101
  query: Rest.query_to_h(public_uri.query)
102
102
  }
103
- Log.log.debug{Log.dump('link data', result)}
103
+ Log.dump(:link_data, result)
104
104
  return result
105
105
  end
106
106
 
@@ -108,7 +108,7 @@ module Aspera
108
108
  def get_fasp_uri_from_entry(entry, raise_no_link: true)
109
109
  unless entry.key?('link')
110
110
  raise Cli::BadArgument, 'package has no link (deleted?)' if raise_no_link
111
- return nil
111
+ return
112
112
  end
113
113
  result = entry['link'].find{ |e| e['rel'].eql?('package')}['href']
114
114
  return result
@@ -122,7 +122,7 @@ module Aspera
122
122
  end
123
123
  end
124
124
 
125
- def initialize(**env)
125
+ def initialize(**_)
126
126
  super
127
127
  @api_v3 = nil
128
128
  @api_v4 = nil
@@ -136,9 +136,7 @@ module Aspera
136
136
  end
137
137
 
138
138
  def api_v3
139
- if @api_v3.nil?
140
- @api_v3 = basic_auth_api
141
- end
139
+ @api_v3 = basic_auth_api if @api_v3.nil?
142
140
  return @api_v3
143
141
  end
144
142
 
@@ -154,7 +152,8 @@ module Aspera
154
152
  auth: {type: :basic, username: options.get_option(:username, mandatory: true), password: options.get_option(:password, mandatory: true)},
155
153
  scope: 'admin',
156
154
  grant_type: 'password'
157
- })
155
+ }
156
+ )
158
157
  end
159
158
  return @api_v4
160
159
  end
@@ -187,9 +186,10 @@ module Aspera
187
186
  operation: 'GET',
188
187
  subpath: "#{mailbox}.atom",
189
188
  headers: {'Accept' => 'application/xml'},
190
- query: mailbox_query)[:http].body
189
+ query: mailbox_query
190
+ )[:http].body
191
191
  box_data = XmlSimple.xml_in(atom_xml, {'ForceArray' => %w[entry field link to]})
192
- Log.log.debug{Log.dump(:box_data, box_data)}
192
+ Log.dump(:box_data, box_data)
193
193
  items = box_data.key?('entry') ? box_data['entry'] : []
194
194
  Log.log.debug{"new items: #{items.count}"}
195
195
  # it is the end if page is empty
@@ -240,9 +240,7 @@ module Aspera
240
240
  delivery_info = package_create_params['delivery']
241
241
  # pub link user
242
242
  link_data = self.class.get_link_data(public_link_url)
243
- if !['external/submissions/new', 'external/dropbox_submissions/new'].include?(link_data[:subpath])
244
- raise Cli::BadArgument, "pub link is #{link_data[:subpath]}, expecting external/submissions/new"
245
- end
243
+ raise Cli::BadArgument, "pub link is #{link_data[:subpath]}, expecting external/submissions/new" if !['external/submissions/new', 'external/dropbox_submissions/new'].include?(link_data[:subpath])
246
244
  create_path = link_data[:subpath].split('/')[0..-2].join('/')
247
245
  package_create_params[:passcode] = link_data[:query]['passcode']
248
246
  delivery_info[:transfer_type] = 'connect'
@@ -267,7 +265,7 @@ module Aspera
267
265
  begin
268
266
  package_creation_data = JSON.parse("[#{package_creation_data}]")
269
267
  rescue JSON::ParserError # => e
270
- raise 'Unexpected response: missing metadata ?'
268
+ raise Aspera::Error, 'Unexpected response: missing metadata ?'
271
269
  end
272
270
  return package_creation_data.first
273
271
  end
@@ -293,14 +291,10 @@ module Aspera
293
291
  delivery_id = instance_identifier
294
292
  return Main.result_single_object(mailbox_filtered_entries(stop_at_id: delivery_id).find{ |p| p[PACKAGE_MATCH_FIELD].eql?(delivery_id)})
295
293
  when :list
296
- return {
297
- type: :object_list,
298
- data: mailbox_filtered_entries,
299
- fields: [PACKAGE_MATCH_FIELD, 'title', 'items']
300
- }
294
+ return Main.result_object_list(mailbox_filtered_entries, fields: [PACKAGE_MATCH_FIELD, 'title', 'items'])
301
295
  when :send
302
296
  delivery_info = options.get_option(:delivery_info, mandatory: true)
303
- Aspera.assert_type(delivery_info, Hash, exception_class: Cli::BadArgument){'delivery_info'}
297
+ Aspera.assert_type(delivery_info, Hash, type: Cli::BadArgument){'delivery_info'}
304
298
  # actual parameter to faspex API
305
299
  package_create_params = {'delivery' => delivery_info}
306
300
  public_link_url = options.get_option(:link)
@@ -310,7 +304,7 @@ module Aspera
310
304
  first_source = delivery_info['sources'].first
311
305
  first_source['paths'].concat(transfer.source_list)
312
306
  source_id = instance_identifier(as_option: :remote_source) do |field, value|
313
- Aspera.assert(field.eql?('name'), exception_class: Cli::BadArgument){'only name as selector, or give id'}
307
+ Aspera.assert(field.eql?('name'), type: Cli::BadArgument){'only name as selector, or give id'}
314
308
  source_list = api_v3.read('source_shares')['items']
315
309
  self.class.get_source_id_by_name(value, source_list)
316
310
  end
@@ -327,7 +321,7 @@ module Aspera
327
321
  else # public link
328
322
  transfer_spec = send_public_link_to_ts(public_link_url, package_create_params)
329
323
  end
330
- # Log.log.debug{Log.dump('transfer_spec',transfer_spec)}
324
+ # Log.dump(:transfer_spec,transfer_spec)
331
325
  return Main.result_transfer(transfer.start(transfer_spec))
332
326
  when :receive
333
327
  link_url = options.get_option(:link)
@@ -346,11 +340,12 @@ module Aspera
346
340
  options.get_option(:url, mandatory: true),
347
341
  options.get_option(:username, mandatory: true),
348
342
  options.get_option(:box, mandatory: true).to_s
349
- ]))
343
+ ])
344
+ )
350
345
  end
351
346
  # get command line parameters
352
347
  delivery_id = instance_identifier
353
- raise 'empty id' if delivery_id.empty?
348
+ Aspera.assert(!delivery_id.empty?){'empty id'}
354
349
  recipient = options.get_option(:recipient)
355
350
  if delivery_id.eql?(SpecialValues::ALL)
356
351
  pkg_id_uri = mailbox_filtered_entries.map{ |i| {id: i[PACKAGE_MATCH_FIELD], uri: self.class.get_fasp_uri_from_entry(i, raise_no_link: false)}}
@@ -378,22 +373,21 @@ module Aspera
378
373
  pkg_id_uri = [{id: 'package', uri: link_url}]
379
374
  else
380
375
  link_data = self.class.get_link_data(link_url)
381
- if !link_data[:subpath].start_with?(PUB_LINK_EXTERNAL_MATCH)
382
- raise Cli::BadArgument, "Pub link is #{link_data[:subpath]}. Expecting #{PUB_LINK_EXTERNAL_MATCH}"
383
- end
376
+ raise Cli::BadArgument, "Pub link is #{link_data[:subpath]}. Expecting #{PUB_LINK_EXTERNAL_MATCH}" if !link_data[:subpath].start_with?(PUB_LINK_EXTERNAL_MATCH)
384
377
  # NOTE: unauthenticated API (authorization is in url params)
385
378
  api_public_link = Rest.new(base_url: link_data[:base_url])
386
379
  package_creation_data = api_public_link.call(
387
380
  operation: 'GET',
388
381
  subpath: link_data[:subpath],
389
382
  headers: {'Accept' => 'application/xml'},
390
- query: {passcode: link_data[:query]['passcode']})
383
+ query: {passcode: link_data[:query]['passcode']}
384
+ )
391
385
  if !package_creation_data[:http].body.start_with?('<?xml ')
392
386
  Environment.instance.open_uri(link_url)
393
387
  raise Cli::Error, 'Unexpected response: package not found ?'
394
388
  end
395
389
  package_entry = XmlSimple.xml_in(package_creation_data[:http].body, {'ForceArray' => false})
396
- Log.log.debug{Log.dump(:package_entry, package_entry)}
390
+ Log.dump(:package_entry, package_entry)
397
391
  transfer_uri = self.class.get_fasp_uri_from_entry(package_entry)
398
392
  pkg_id_uri = [{id: package_entry['id'], uri: transfer_uri}]
399
393
  end
@@ -401,7 +395,7 @@ module Aspera
401
395
  # TODO : remove ids from skip not present in inbox to avoid growing too big
402
396
  # skip_ids_data.select!{|id|pkg_id_uri.select{|p|p[:id].eql?(id)}}
403
397
  pkg_id_uri.reject!{ |i| skip_ids_data.include?(i[:id])}
404
- Log.log.debug{Log.dump(:pkg_id_uri, pkg_id_uri)}
398
+ Log.dump(:pkg_id_uri, pkg_id_uri)
405
399
  return Main.result_status('no new package') if pkg_id_uri.empty?
406
400
  result_transfer = []
407
401
  pkg_id_uri.each do |id_uri|
@@ -442,41 +436,41 @@ module Aspera
442
436
  return Main.result_object_list(source_list)
443
437
  else # :info :node
444
438
  source_id = instance_identifier do |field, value|
445
- Aspera.assert(field.eql?('name'), exception_class: Cli::BadArgument){'only name as selector, or give id'}
439
+ Aspera.assert(field.eql?('name'), type: Cli::BadArgument){'only name as selector, or give id'}
446
440
  self.class.get_source_id_by_name(value, source_list)
447
441
  end.to_i
448
442
  selected_source = source_list.find{ |i| i['id'].eql?(source_id)}
449
- raise 'No such source' if selected_source.nil?
443
+ raise BadArgument, 'No such source' if selected_source.nil?
450
444
  source_name = selected_source['name']
451
445
  source_hash = options.get_option(:storage, mandatory: true)
452
446
  # check value of option
453
- Aspera.assert_type(source_hash, Hash, exception_class: Cli::Error){'storage option'}
447
+ Aspera.assert_type(source_hash, Hash, type: Cli::Error){'storage option'}
454
448
  source_hash.each do |name, storage|
455
- Aspera.assert_type(storage, Hash, exception_class: Cli::Error){"storage '#{name}'"}
449
+ Aspera.assert_type(storage, Hash, type: Cli::Error){"storage '#{name}'"}
456
450
  [KEY_NODE, KEY_PATH].each do |key|
457
- Aspera.assert(storage.key?(key), exception_class: Cli::Error){"storage '#{name}' must have a '#{key}'"}
451
+ Aspera.assert(storage.key?(key), type: Cli::Error){"storage '#{name}' must have a '#{key}'"}
458
452
  end
459
453
  end
460
- if !source_hash.key?(source_name)
461
- raise Cli::Error, "No such storage in config file: \"#{source_name}\" in [#{source_hash.keys.join(', ')}]"
462
- end
454
+ raise Cli::Error, "No such storage in config file: \"#{source_name}\" in [#{source_hash.keys.join(', ')}]" if !source_hash.key?(source_name)
463
455
  source_info = source_hash[source_name]
464
- Log.log.debug{Log.dump(:source_info, source_info)}
456
+ Log.dump(:source_info, source_info)
465
457
  case command_source
466
458
  when :info
467
459
  return Main.result_single_object(source_info)
468
460
  when :node
469
461
  node_config = ExtendedValue.instance.evaluate(source_info[KEY_NODE])
470
462
  Log.log.debug{"node=#{node_config}"}
471
- Aspera.assert_type(node_config, Hash, exception_class: Cli::Error){source_info[KEY_NODE]}
463
+ Aspera.assert_type(node_config, Hash, type: Cli::Error){source_info[KEY_NODE]}
472
464
  api_node = Rest.new(
473
465
  base_url: node_config['url'],
474
466
  auth: {
475
467
  type: :basic,
476
468
  username: node_config['username'],
477
- password: node_config['password']})
469
+ password: node_config['password']
470
+ }
471
+ )
478
472
  command = options.get_next_command(Node::COMMANDS_FASPEX)
479
- return Node.new(**init_params, api: api_node, prefix_path: source_info[KEY_PATH]).execute_action(command)
473
+ return Node.new(context: context, api: api_node, prefix_path: source_info[KEY_PATH]).execute_action(command)
480
474
  end
481
475
  end
482
476
  when :me
@@ -493,21 +487,21 @@ module Aspera
493
487
  command = options.get_next_command(%i[package dropbox dmembership workgroup wmembership user metadata_profile])
494
488
  case command
495
489
  when :dropbox
496
- return entity_action(api_v4, 'admin/dropboxes', display_fields: %w[id e_wg_name e_wg_desc created_at])
490
+ return entity_execute(api: api_v4, entity: 'admin/dropboxes', display_fields: %w[id e_wg_name e_wg_desc created_at])
497
491
  when :dmembership
498
- return entity_action(api_v4, 'dropbox_memberships')
492
+ return entity_execute(api: api_v4, entity: 'dropbox_memberships')
499
493
  when :workgroup
500
- return entity_action(api_v4, 'admin/workgroups', display_fields: %w[id e_wg_name e_wg_desc created_at])
494
+ return entity_execute(api: api_v4, entity: 'admin/workgroups', display_fields: %w[id e_wg_name e_wg_desc created_at])
501
495
  when :wmembership
502
- return entity_action(api_v4, 'workgroup_memberships')
496
+ return entity_execute(api: api_v4, entity: 'workgroup_memberships')
503
497
  when :user
504
- return entity_action(api_v4, 'users', display_fields: %w[id name first_name last_name])
498
+ return entity_execute(api: api_v4, entity: 'users', display_fields: %w[id name first_name last_name])
505
499
  when :metadata_profile
506
- return entity_action(api_v4, 'metadata_profiles')
500
+ return entity_execute(api: api_v4, entity: 'metadata_profiles')
507
501
  when :package
508
502
  pkg_box_type = options.get_next_command([:users])
509
503
  pkg_box_id = instance_identifier
510
- return entity_action(api_v4, "#{pkg_box_type}/#{pkg_box_id}/packages")
504
+ return entity_execute(api: api_v4, entity: "#{pkg_box_type}/#{pkg_box_id}/packages")
511
505
  end
512
506
  when :address_book
513
507
  result = api_v3.read('address-book', {'format' => 'json', 'count' => 100_000})