aspera-cli 4.6.0 → 4.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|