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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +405 -364
- data/CONTRIBUTING.md +86 -29
- data/README.md +1856 -961
- data/bin/ascli +2 -1
- data/bin/asession +4 -4
- data/lib/aspera/agent/base.rb +4 -0
- data/lib/aspera/agent/connect.rb +20 -18
- data/lib/aspera/agent/desktop.rb +14 -11
- data/lib/aspera/agent/direct.rb +39 -31
- data/lib/aspera/agent/httpgw.rb +2 -2
- data/lib/aspera/agent/node.rb +9 -11
- data/lib/aspera/agent/transferd.rb +18 -11
- data/lib/aspera/api/aoc.rb +53 -43
- data/lib/aspera/api/cos_node.rb +7 -5
- data/lib/aspera/api/httpgw.rb +23 -22
- data/lib/aspera/api/node.rb +104 -22
- data/lib/aspera/ascmd.rb +35 -21
- data/lib/aspera/ascp/installation.rb +43 -43
- data/lib/aspera/ascp/management.rb +5 -4
- data/lib/aspera/assert.rb +55 -24
- data/lib/aspera/cli/basic_auth_plugin.rb +8 -7
- data/lib/aspera/cli/error.rb +1 -1
- data/lib/aspera/cli/extended_value.rb +28 -29
- data/lib/aspera/cli/formatter.rb +191 -168
- data/lib/aspera/cli/hints.rb +38 -4
- data/lib/aspera/cli/main.rb +139 -108
- data/lib/aspera/cli/manager.rb +51 -31
- data/lib/aspera/cli/plugin.rb +149 -78
- data/lib/aspera/cli/plugin_factory.rb +2 -2
- data/lib/aspera/cli/plugins/aoc.rb +217 -88
- data/lib/aspera/cli/plugins/ats.rb +15 -13
- data/lib/aspera/cli/plugins/config.rb +105 -227
- data/lib/aspera/cli/plugins/console.rb +49 -18
- data/lib/aspera/cli/plugins/cos.rb +4 -4
- data/lib/aspera/cli/plugins/faspex.rb +45 -51
- data/lib/aspera/cli/plugins/faspex5.rb +162 -163
- data/lib/aspera/cli/plugins/faspio.rb +6 -5
- data/lib/aspera/cli/plugins/httpgw.rb +2 -2
- data/lib/aspera/cli/plugins/node.rb +233 -247
- data/lib/aspera/cli/plugins/orchestrator.rb +10 -14
- data/lib/aspera/cli/plugins/preview.rb +26 -29
- data/lib/aspera/cli/plugins/server.rb +29 -28
- data/lib/aspera/cli/plugins/shares.rb +40 -28
- data/lib/aspera/cli/sync_actions.rb +101 -80
- data/lib/aspera/cli/transfer_agent.rb +55 -58
- data/lib/aspera/cli/transfer_progress.rb +29 -20
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cli/wizard.rb +160 -0
- data/lib/aspera/colors.rb +13 -8
- data/lib/aspera/command_line_builder.rb +28 -22
- data/lib/aspera/command_line_converter.rb +31 -0
- data/lib/aspera/data_repository.rb +1 -0
- data/lib/aspera/environment.rb +144 -100
- data/lib/aspera/faspex_gw.rb +1 -1
- data/lib/aspera/faspex_postproc.rb +3 -2
- data/lib/aspera/hash_ext.rb +1 -1
- data/lib/aspera/id_generator.rb +10 -10
- data/lib/aspera/keychain/base.rb +18 -0
- data/lib/aspera/keychain/encrypted_hash.rb +6 -12
- data/lib/aspera/keychain/factory.rb +9 -3
- data/lib/aspera/keychain/hashicorp_vault.rb +9 -6
- data/lib/aspera/keychain/macos_security.rb +13 -13
- data/lib/aspera/log.rb +70 -20
- data/lib/aspera/nagios.rb +5 -6
- data/lib/aspera/node_simulator.rb +12 -7
- data/lib/aspera/oauth/base.rb +6 -2
- data/lib/aspera/oauth/factory.rb +25 -18
- data/lib/aspera/oauth/jwt.rb +13 -1
- data/lib/aspera/oauth/url_json.rb +3 -3
- data/lib/aspera/oauth/web.rb +5 -3
- data/lib/aspera/persistency_folder.rb +2 -2
- data/lib/aspera/preview/file_types.rb +43 -35
- data/lib/aspera/preview/generator.rb +26 -13
- data/lib/aspera/preview/terminal.rb +10 -7
- data/lib/aspera/preview/utils.rb +11 -9
- data/lib/aspera/products/connect.rb +2 -1
- data/lib/aspera/products/desktop.rb +1 -1
- data/lib/aspera/products/other.rb +2 -2
- data/lib/aspera/products/transferd.rb +8 -6
- data/lib/aspera/proxy_auto_config.rb +1 -1
- data/lib/aspera/rest.rb +46 -28
- data/lib/aspera/rest_call_error.rb +1 -1
- data/lib/aspera/rest_error_analyzer.rb +1 -0
- data/lib/aspera/resumer.rb +1 -1
- data/lib/aspera/secret_hider.rb +46 -40
- data/lib/aspera/ssh.rb +14 -4
- data/lib/aspera/sync/args.schema.yaml +102 -0
- data/lib/aspera/sync/conf.schema.yaml +701 -0
- data/lib/aspera/sync/database.rb +83 -0
- data/lib/aspera/{transfer/sync.rb → sync/operations.rb} +145 -68
- data/lib/aspera/temp_file_manager.rb +4 -2
- data/lib/aspera/timer_limiter.rb +7 -5
- data/lib/aspera/transfer/error.rb +1 -1
- data/lib/aspera/transfer/error_info.rb +1 -2
- data/lib/aspera/transfer/faux_file.rb +11 -10
- data/lib/aspera/transfer/parameters.rb +6 -5
- data/lib/aspera/transfer/spec.rb +15 -1
- data/lib/aspera/transfer/spec.schema.yaml +316 -293
- data/lib/aspera/transfer/spec_doc.rb +34 -16
- data/lib/aspera/transfer/uri.rb +5 -5
- data/lib/aspera/uri_reader.rb +14 -10
- data/lib/aspera/web_auth.rb +2 -2
- data/lib/aspera/web_server_simple.rb +2 -2
- data.tar.gz.sig +0 -0
- metadata +15 -15
- metadata.gz.sig +0 -0
- data/examples/dascli +0 -30
- data/examples/get_proto_file.rb +0 -8
- data/examples/proxy.pac +0 -60
- data/lib/aspera/transfer/convert.rb +0 -29
- data/lib/aspera/transfer/sync_instance.schema.yaml +0 -13
- 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
|
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
|
-
|
58
|
-
|
59
|
-
def initialize(**env)
|
62
|
+
|
63
|
+
def initialize(**_)
|
60
64
|
super
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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([
|
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
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
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(**
|
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?,
|
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?,
|
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(
|
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
|
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
|
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.*)$}),
|
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.
|
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
|
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(**
|
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
|
189
|
+
query: mailbox_query
|
190
|
+
)[:http].body
|
191
191
|
box_data = XmlSimple.xml_in(atom_xml, {'ForceArray' => %w[entry field link to]})
|
192
|
-
Log.
|
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,
|
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'),
|
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.
|
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
|
-
|
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.
|
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.
|
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'),
|
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,
|
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,
|
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),
|
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.
|
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,
|
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(
|
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
|
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
|
492
|
+
return entity_execute(api: api_v4, entity: 'dropbox_memberships')
|
499
493
|
when :workgroup
|
500
|
-
return
|
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
|
496
|
+
return entity_execute(api: api_v4, entity: 'workgroup_memberships')
|
503
497
|
when :user
|
504
|
-
return
|
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
|
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
|
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})
|