aspera-cli 4.6.0 → 4.7.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
- data/README.md +427 -300
- data/bin/ascli +2 -1
- data/bin/asession +1 -0
- data/docs/test_env.conf +2 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +21 -19
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +15 -15
- data/lib/aspera/aoc.rb +135 -124
- data/lib/aspera/ascmd.rb +85 -75
- data/lib/aspera/ats_api.rb +11 -10
- data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
- data/lib/aspera/cli/extended_value.rb +42 -33
- data/lib/aspera/cli/formater.rb +138 -111
- data/lib/aspera/cli/info.rb +17 -0
- data/lib/aspera/cli/listener/line_dump.rb +3 -2
- data/lib/aspera/cli/listener/logger.rb +2 -1
- data/lib/aspera/cli/listener/progress.rb +16 -18
- data/lib/aspera/cli/listener/progress_multi.rb +13 -16
- data/lib/aspera/cli/main.rb +122 -130
- data/lib/aspera/cli/manager.rb +146 -154
- data/lib/aspera/cli/plugin.rb +38 -34
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +273 -276
- data/lib/aspera/cli/plugins/ats.rb +82 -76
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +350 -306
- data/lib/aspera/cli/plugins/console.rb +23 -19
- data/lib/aspera/cli/plugins/cos.rb +18 -18
- data/lib/aspera/cli/plugins/faspex.rb +180 -159
- data/lib/aspera/cli/plugins/faspex5.rb +64 -54
- data/lib/aspera/cli/plugins/node.rb +147 -140
- data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
- data/lib/aspera/cli/plugins/preview.rb +92 -96
- data/lib/aspera/cli/plugins/server.rb +79 -75
- data/lib/aspera/cli/plugins/shares.rb +23 -24
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +40 -39
- data/lib/aspera/cli/version.rb +2 -1
- data/lib/aspera/colors.rb +35 -27
- data/lib/aspera/command_line_builder.rb +48 -34
- data/lib/aspera/cos_node.rb +29 -21
- data/lib/aspera/data_repository.rb +3 -2
- data/lib/aspera/environment.rb +50 -45
- data/lib/aspera/fasp/agent_base.rb +22 -20
- data/lib/aspera/fasp/agent_connect.rb +13 -11
- data/lib/aspera/fasp/agent_direct.rb +48 -59
- data/lib/aspera/fasp/agent_httpgw.rb +33 -39
- data/lib/aspera/fasp/agent_node.rb +15 -13
- data/lib/aspera/fasp/agent_trsdk.rb +12 -14
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +106 -94
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +83 -92
- data/lib/aspera/fasp/parameters.yaml +305 -249
- data/lib/aspera/fasp/resume_policy.rb +11 -14
- data/lib/aspera/fasp/transfer_spec.rb +26 -0
- data/lib/aspera/fasp/uri.rb +22 -21
- data/lib/aspera/faspex_gw.rb +55 -90
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +17 -16
- data/lib/aspera/keychain/macos_security.rb +6 -10
- data/lib/aspera/log.rb +25 -20
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -22
- data/lib/aspera/oauth.rb +175 -226
- data/lib/aspera/open_application.rb +4 -3
- data/lib/aspera/persistency_action_once.rb +6 -6
- data/lib/aspera/persistency_folder.rb +5 -9
- data/lib/aspera/preview/file_types.rb +6 -5
- data/lib/aspera/preview/generator.rb +25 -24
- data/lib/aspera/preview/options.rb +16 -14
- data/lib/aspera/preview/utils.rb +98 -98
- data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
- data/lib/aspera/proxy_auto_config.rb +111 -20
- data/lib/aspera/rest.rb +115 -113
- data/lib/aspera/rest_call_error.rb +2 -2
- data/lib/aspera/rest_error_analyzer.rb +23 -25
- data/lib/aspera/rest_errors_aspera.rb +15 -14
- data/lib/aspera/ssh.rb +12 -10
- data/lib/aspera/sync.rb +42 -41
- data/lib/aspera/temp_file_manager.rb +18 -14
- data/lib/aspera/timer_limiter.rb +2 -1
- data/lib/aspera/uri_reader.rb +7 -5
- data/lib/aspera/web_auth.rb +79 -76
- metadata +64 -21
- data/docs/Makefile +0 -65
- data/docs/README.erb.md +0 -4424
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- data/lib/aspera/fasp/default.rb +0 -17
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'aspera/cli/basic_auth_plugin'
|
|
2
3
|
require 'aspera/persistency_action_once'
|
|
3
4
|
require 'aspera/id_generator'
|
|
@@ -9,9 +10,9 @@ module Aspera
|
|
|
9
10
|
class Faspex5 < BasicAuthPlugin
|
|
10
11
|
class << self
|
|
11
12
|
def detect(base_url)
|
|
12
|
-
api=Rest.new({:base_url
|
|
13
|
+
api=Rest.new({base_url: base_url})
|
|
13
14
|
result=api.read('api/v5/configuration/ping')
|
|
14
|
-
if result[:http].code.start_with?('2')
|
|
15
|
+
if result[:http].code.start_with?('2') && result[:http].body.strip.empty?
|
|
15
16
|
return {version: '5'}
|
|
16
17
|
end
|
|
17
18
|
return nil
|
|
@@ -19,94 +20,87 @@ module Aspera
|
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
VAL_ALL='ALL'
|
|
22
|
-
|
|
23
|
+
TRANSFER_CONNECT='connect'
|
|
24
|
+
private_constant :VAL_ALL,:TRANSFER_CONNECT
|
|
23
25
|
|
|
24
26
|
def initialize(env)
|
|
25
27
|
super(env)
|
|
26
28
|
options.add_opt_simple(:client_id,'OAuth client identifier')
|
|
27
29
|
options.add_opt_simple(:client_secret,'OAuth client secret')
|
|
28
30
|
options.add_opt_simple(:redirect_uri,'OAuth redirect URI')
|
|
29
|
-
options.add_opt_list(:auth,Oauth.
|
|
31
|
+
options.add_opt_list(:auth,[Oauth::STD_AUTH_TYPES,:boot].flatten,'OAuth type of authentication')
|
|
30
32
|
options.add_opt_simple(:private_key,'Oauth RSA private key PEM value for JWT (prefix file path with @val:@file:)')
|
|
31
33
|
options.set_option(:auth,:jwt)
|
|
32
34
|
options.parse_options!
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def set_api
|
|
36
|
-
|
|
37
|
-
faxpex5_api_v5_url="#{
|
|
38
|
-
faxpex5_api_auth_url="#{
|
|
38
|
+
faxpex5_api_base_url=options.get_option(:url,:mandatory)
|
|
39
|
+
faxpex5_api_v5_url="#{faxpex5_api_base_url}/api/v5"
|
|
40
|
+
@faxpex5_api_auth_url="#{faxpex5_api_base_url}/auth"
|
|
39
41
|
case options.get_option(:auth,:mandatory)
|
|
40
42
|
when :boot
|
|
41
43
|
# the password here is the token copied directly from browser in developer mode
|
|
42
44
|
@api_v5=Rest.new({
|
|
43
|
-
:
|
|
44
|
-
:
|
|
45
|
+
base_url: faxpex5_api_v5_url,
|
|
46
|
+
headers: {'Authorization'=>options.get_option(:password,:mandatory)}
|
|
45
47
|
})
|
|
46
48
|
when :web
|
|
47
49
|
# opens a browser and ask user to auth using web
|
|
48
50
|
@api_v5=Rest.new({
|
|
49
|
-
:
|
|
50
|
-
:
|
|
51
|
-
|
|
52
|
-
:
|
|
53
|
-
:
|
|
54
|
-
:
|
|
55
|
-
:
|
|
56
|
-
:redirect_uri => options.get_option(:redirect_uri,:mandatory),
|
|
51
|
+
base_url: faxpex5_api_v5_url,
|
|
52
|
+
auth: {
|
|
53
|
+
type: :oauth2,
|
|
54
|
+
base_url: @faxpex5_api_auth_url,
|
|
55
|
+
crtype: :web,
|
|
56
|
+
client_id: options.get_option(:client_id,:mandatory),
|
|
57
|
+
web: {redirect_uri: options.get_option(:redirect_uri,:mandatory)}
|
|
57
58
|
}})
|
|
58
59
|
when :jwt
|
|
59
|
-
# currently Faspex 5 beta 4 only supports non-user based apis (e.g. jobs)
|
|
60
60
|
app_client_id=options.get_option(:client_id,:mandatory)
|
|
61
61
|
@api_v5=Rest.new({
|
|
62
|
-
:
|
|
63
|
-
:
|
|
64
|
-
|
|
65
|
-
:
|
|
66
|
-
:
|
|
67
|
-
:
|
|
68
|
-
:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
62
|
+
base_url: faxpex5_api_v5_url,
|
|
63
|
+
auth: {
|
|
64
|
+
type: :oauth2,
|
|
65
|
+
base_url: @faxpex5_api_auth_url,
|
|
66
|
+
crtype: :jwt,
|
|
67
|
+
client_id: app_client_id,
|
|
68
|
+
jwt: {
|
|
69
|
+
payload: {
|
|
70
|
+
iss: app_client_id, # issuer
|
|
71
|
+
aud: app_client_id, # audience TODO: ???
|
|
72
|
+
sub: "user:#{options.get_option(:username,:mandatory)}" # subject also "client:#{app_client_id}" + auth user/pass
|
|
73
|
+
},
|
|
74
|
+
#auth: {type: :basic, options.get_option(:username,:mandatory), options.get_option(:password,:mandatory),
|
|
75
|
+
private_key_obj: OpenSSL::PKey::RSA.new(options.get_option(:private_key,:mandatory)),
|
|
76
|
+
headers: {typ: 'JWT'}
|
|
77
|
+
}
|
|
75
78
|
}})
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
|
|
79
|
-
ACTIONS=[
|
|
82
|
+
ACTIONS=[:package, :admin].freeze
|
|
80
83
|
|
|
81
|
-
#
|
|
82
84
|
def execute_action
|
|
83
85
|
set_api
|
|
84
86
|
command=options.get_next_command(ACTIONS)
|
|
85
87
|
case command
|
|
86
|
-
when :auth_client
|
|
87
|
-
api_auth=Rest.new(@api_v5.params.merge({base_url: "#{@faxpex5_api_base_url}/auth"}))
|
|
88
|
-
return self.entity_action(api_auth,'oauth_clients',nil,:id,nil,true)
|
|
89
|
-
when :node
|
|
90
|
-
return self.entity_action(@api_v5,'nodes',nil,:id,nil,true)
|
|
91
|
-
when :jobs
|
|
92
|
-
# to test JWT
|
|
93
|
-
return self.entity_action(@api_v5,'jobs',nil,:id,nil,true)
|
|
94
88
|
when :package
|
|
95
89
|
command=options.get_next_command([:list,:show,:send,:receive])
|
|
96
90
|
case command
|
|
97
91
|
when :list
|
|
98
92
|
parameters=options.get_option(:value,:optional)
|
|
99
|
-
return {:
|
|
93
|
+
return {type: :object_list, data: @api_v5.read('packages',parameters)[:data]['packages'], fields: %w[id title release_date total_bytes total_files created_time state]}
|
|
100
94
|
when :show
|
|
101
95
|
id=instance_identifier()
|
|
102
|
-
return {:
|
|
96
|
+
return {type: :single_object, data: @api_v5.read("packages/#{id}")[:data]}
|
|
103
97
|
when :send
|
|
104
98
|
parameters=options.get_option(:value,:mandatory)
|
|
105
99
|
raise CliBadArgument,'value must be hash, refer to API' unless parameters.is_a?(Hash)
|
|
106
100
|
package=@api_v5.create('packages',parameters)[:data]
|
|
107
|
-
transfer_spec=@api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type:
|
|
101
|
+
transfer_spec=@api_v5.create("packages/#{package['id']}/transfer_spec/upload",{transfer_type: TRANSFER_CONNECT})[:data]
|
|
108
102
|
transfer_spec.delete('authentication')
|
|
109
|
-
return Main.result_transfer(
|
|
103
|
+
return Main.result_transfer(transfer.start(transfer_spec,{src: :node_gen3}))
|
|
110
104
|
when :receive
|
|
111
105
|
pkg_type='received'
|
|
112
106
|
pack_id=instance_identifier()
|
|
@@ -126,24 +120,40 @@ module Aspera
|
|
|
126
120
|
parameters||={'type'=>'received','subtype'=>'mypackages','limit'=>1000}
|
|
127
121
|
raise CliBadArgument,'value filter must be Hash (API GET)' unless parameters.is_a?(Hash)
|
|
128
122
|
package_ids=@api_v5.read('packages',parameters)[:data]['packages'].map{|p|p['id']}
|
|
129
|
-
package_ids.
|
|
123
|
+
package_ids.reject!{|i|skip_ids_data.include?(i)}
|
|
130
124
|
end
|
|
131
125
|
result_transfer=[]
|
|
132
|
-
package_ids.each do |
|
|
126
|
+
package_ids.each do |pkgid|
|
|
133
127
|
# TODO: allow from sent as well ?
|
|
134
|
-
transfer_spec=@api_v5.create("packages/#{
|
|
128
|
+
transfer_spec=@api_v5.create("packages/#{pkgid}/transfer_spec/download",{transfer_type: TRANSFER_CONNECT, type: pkg_type})[:data]
|
|
135
129
|
transfer_spec.delete('authentication')
|
|
136
|
-
statuses=
|
|
137
|
-
result_transfer.push({'package'=>
|
|
130
|
+
statuses=transfer.start(transfer_spec,{src: :node_gen3})
|
|
131
|
+
result_transfer.push({'package'=>pkgid,Main::STATUS_FIELD=>statuses})
|
|
138
132
|
# skip only if all sessions completed
|
|
139
|
-
skip_ids_data.push(
|
|
133
|
+
skip_ids_data.push(pkgid) if TransferAgent.session_status(statuses).eql?(:success)
|
|
140
134
|
end
|
|
141
135
|
skip_ids_persistency.save unless skip_ids_persistency.nil?
|
|
142
136
|
return Main.result_transfer_multiple(result_transfer)
|
|
137
|
+
end # case package
|
|
138
|
+
when :admin
|
|
139
|
+
case options.get_next_command([:resource])
|
|
140
|
+
when :resource
|
|
141
|
+
res_type=options.get_next_command([:accounts, :contacts, :jobs, :workgroups, :shared_inboxes, :nodes, :oauth_clients, :registrations, :saml_configs])
|
|
142
|
+
res_path=res_type.to_s
|
|
143
|
+
display_fields=
|
|
144
|
+
case res_type
|
|
145
|
+
when :accounts then [:all_but,'user_profile_data_attributes']
|
|
146
|
+
when :oauth_clients then [:all_but,'public_key']
|
|
147
|
+
end
|
|
148
|
+
adm_api=@api_v5
|
|
149
|
+
if res_type.eql?(:oauth_clients)
|
|
150
|
+
adm_api=Rest.new(@api_v5.params.merge({base_url: @faxpex5_api_auth_url}))
|
|
151
|
+
end
|
|
152
|
+
return entity_action(adm_api,res_path,use_subkey: true, display_fields: display_fields)
|
|
143
153
|
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
154
|
+
end # case command
|
|
155
|
+
end # action
|
|
156
|
+
end # Faspex5
|
|
147
157
|
end # Plugins
|
|
148
158
|
end # Cli
|
|
149
159
|
end # Aspera
|