aspera-cli 4.4.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 +2095 -1503
- data/bin/ascli +2 -1
- data/bin/asession +4 -5
- data/docs/test_env.conf +3 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +25 -25
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +17 -17
- data/lib/aspera/aoc.rb +238 -185
- data/lib/aspera/ascmd.rb +93 -83
- 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 +142 -108
- 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 +18 -21
- data/lib/aspera/cli/main.rb +173 -149
- data/lib/aspera/cli/manager.rb +163 -168
- data/lib/aspera/cli/plugin.rb +43 -31
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +405 -370
- data/lib/aspera/cli/plugins/ats.rb +86 -79
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +580 -362
- 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 +201 -158
- data/lib/aspera/cli/plugins/faspex5.rb +80 -57
- data/lib/aspera/cli/plugins/node.rb +183 -166
- data/lib/aspera/cli/plugins/orchestrator.rb +71 -67
- 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 +35 -19
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +76 -113
- 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/{manager.rb → agent_base.rb} +28 -25
- data/lib/aspera/fasp/{connect.rb → agent_connect.rb} +52 -43
- data/lib/aspera/fasp/{local.rb → agent_direct.rb} +58 -72
- data/lib/aspera/fasp/{http_gw.rb → agent_httpgw.rb} +37 -43
- data/lib/aspera/fasp/{node.rb → agent_node.rb} +35 -16
- data/lib/aspera/fasp/agent_trsdk.rb +104 -0
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +152 -124
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +87 -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 -89
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +121 -0
- data/lib/aspera/keychain/macos_security.rb +90 -0
- data/lib/aspera/log.rb +55 -37
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -25
- 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 +154 -135
- 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 +116 -29
- data/docs/Makefile +0 -66
- data/docs/README.erb.md +0 -3973
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/api_detector.rb +0 -60
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- data/lib/aspera/secrets.rb +0 -20
|
@@ -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'
|
|
@@ -7,96 +8,102 @@ module Aspera
|
|
|
7
8
|
module Cli
|
|
8
9
|
module Plugins
|
|
9
10
|
class Faspex5 < BasicAuthPlugin
|
|
11
|
+
class << self
|
|
12
|
+
def detect(base_url)
|
|
13
|
+
api=Rest.new({base_url: base_url})
|
|
14
|
+
result=api.read('api/v5/configuration/ping')
|
|
15
|
+
if result[:http].code.start_with?('2') && result[:http].body.strip.empty?
|
|
16
|
+
return {version: '5'}
|
|
17
|
+
end
|
|
18
|
+
return nil
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
10
22
|
VAL_ALL='ALL'
|
|
23
|
+
TRANSFER_CONNECT='connect'
|
|
24
|
+
private_constant :VAL_ALL,:TRANSFER_CONNECT
|
|
25
|
+
|
|
11
26
|
def initialize(env)
|
|
12
27
|
super(env)
|
|
13
|
-
options.add_opt_simple(:client_id,'
|
|
14
|
-
options.add_opt_simple(:client_secret,'
|
|
15
|
-
options.add_opt_simple(:redirect_uri,'
|
|
16
|
-
options.add_opt_list(:auth,Oauth.
|
|
17
|
-
options.add_opt_simple(:private_key,'RSA private key PEM value for JWT (prefix file path with @val:@file:)')
|
|
28
|
+
options.add_opt_simple(:client_id,'OAuth client identifier')
|
|
29
|
+
options.add_opt_simple(:client_secret,'OAuth client secret')
|
|
30
|
+
options.add_opt_simple(:redirect_uri,'OAuth redirect URI')
|
|
31
|
+
options.add_opt_list(:auth,[Oauth::STD_AUTH_TYPES,:boot].flatten,'OAuth type of authentication')
|
|
32
|
+
options.add_opt_simple(:private_key,'Oauth RSA private key PEM value for JWT (prefix file path with @val:@file:)')
|
|
18
33
|
options.set_option(:auth,:jwt)
|
|
19
34
|
options.parse_options!
|
|
20
35
|
end
|
|
21
36
|
|
|
22
37
|
def set_api
|
|
23
|
-
|
|
24
|
-
faxpex5_api_v5_url="#{
|
|
25
|
-
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"
|
|
26
41
|
case options.get_option(:auth,:mandatory)
|
|
27
42
|
when :boot
|
|
28
43
|
# the password here is the token copied directly from browser in developer mode
|
|
29
44
|
@api_v5=Rest.new({
|
|
30
|
-
:
|
|
31
|
-
:
|
|
45
|
+
base_url: faxpex5_api_v5_url,
|
|
46
|
+
headers: {'Authorization'=>options.get_option(:password,:mandatory)}
|
|
32
47
|
})
|
|
33
48
|
when :web
|
|
34
49
|
# opens a browser and ask user to auth using web
|
|
35
50
|
@api_v5=Rest.new({
|
|
36
|
-
:
|
|
37
|
-
:
|
|
38
|
-
|
|
39
|
-
:
|
|
40
|
-
:
|
|
41
|
-
:
|
|
42
|
-
:
|
|
43
|
-
: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)}
|
|
44
58
|
}})
|
|
45
59
|
when :jwt
|
|
46
|
-
# currently Faspex 5 beta 3 only supports non-user based apis (e.g. jobs)
|
|
47
60
|
app_client_id=options.get_option(:client_id,:mandatory)
|
|
48
61
|
@api_v5=Rest.new({
|
|
49
|
-
:
|
|
50
|
-
:
|
|
51
|
-
|
|
52
|
-
:
|
|
53
|
-
:
|
|
54
|
-
:
|
|
55
|
-
:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
+
}
|
|
62
78
|
}})
|
|
63
79
|
end
|
|
64
80
|
end
|
|
65
81
|
|
|
66
|
-
ACTIONS=[
|
|
82
|
+
ACTIONS=[:package, :admin].freeze
|
|
67
83
|
|
|
68
|
-
#
|
|
69
84
|
def execute_action
|
|
70
85
|
set_api
|
|
71
86
|
command=options.get_next_command(ACTIONS)
|
|
72
87
|
case command
|
|
73
|
-
when :auth_client
|
|
74
|
-
api_auth=Rest.new(@api_v5.params.merge({base_url: "#{@faxpex5_api_base_url}/auth"}))
|
|
75
|
-
return self.entity_action(api_auth,'oauth_clients',nil,:id,nil,true)
|
|
76
|
-
when :node
|
|
77
|
-
return self.entity_action(@api_v5,'nodes',nil,:id,nil,true)
|
|
78
|
-
when :jobs
|
|
79
|
-
# to test JWT
|
|
80
|
-
return self.entity_action(@api_v5,'jobs',nil,:id,nil,true)
|
|
81
88
|
when :package
|
|
82
89
|
command=options.get_next_command([:list,:show,:send,:receive])
|
|
83
90
|
case command
|
|
84
91
|
when :list
|
|
85
92
|
parameters=options.get_option(:value,:optional)
|
|
86
|
-
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]}
|
|
87
94
|
when :show
|
|
88
|
-
id=
|
|
89
|
-
return {:
|
|
95
|
+
id=instance_identifier()
|
|
96
|
+
return {type: :single_object, data: @api_v5.read("packages/#{id}")[:data]}
|
|
90
97
|
when :send
|
|
91
98
|
parameters=options.get_option(:value,:mandatory)
|
|
92
99
|
raise CliBadArgument,'value must be hash, refer to API' unless parameters.is_a?(Hash)
|
|
93
100
|
package=@api_v5.create('packages',parameters)[:data]
|
|
94
|
-
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]
|
|
95
102
|
transfer_spec.delete('authentication')
|
|
96
|
-
return Main.result_transfer(
|
|
103
|
+
return Main.result_transfer(transfer.start(transfer_spec,{src: :node_gen3}))
|
|
97
104
|
when :receive
|
|
98
105
|
pkg_type='received'
|
|
99
|
-
pack_id=
|
|
106
|
+
pack_id=instance_identifier()
|
|
100
107
|
package_ids=[pack_id]
|
|
101
108
|
skip_ids_data=[]
|
|
102
109
|
skip_ids_persistency=nil
|
|
@@ -113,24 +120,40 @@ module Aspera
|
|
|
113
120
|
parameters||={'type'=>'received','subtype'=>'mypackages','limit'=>1000}
|
|
114
121
|
raise CliBadArgument,'value filter must be Hash (API GET)' unless parameters.is_a?(Hash)
|
|
115
122
|
package_ids=@api_v5.read('packages',parameters)[:data]['packages'].map{|p|p['id']}
|
|
116
|
-
package_ids.
|
|
123
|
+
package_ids.reject!{|i|skip_ids_data.include?(i)}
|
|
117
124
|
end
|
|
118
125
|
result_transfer=[]
|
|
119
|
-
package_ids.each do |
|
|
126
|
+
package_ids.each do |pkgid|
|
|
120
127
|
# TODO: allow from sent as well ?
|
|
121
|
-
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]
|
|
122
129
|
transfer_spec.delete('authentication')
|
|
123
|
-
statuses=
|
|
124
|
-
result_transfer.push({'package'=>
|
|
130
|
+
statuses=transfer.start(transfer_spec,{src: :node_gen3})
|
|
131
|
+
result_transfer.push({'package'=>pkgid,Main::STATUS_FIELD=>statuses})
|
|
125
132
|
# skip only if all sessions completed
|
|
126
|
-
skip_ids_data.push(
|
|
133
|
+
skip_ids_data.push(pkgid) if TransferAgent.session_status(statuses).eql?(:success)
|
|
127
134
|
end
|
|
128
135
|
skip_ids_persistency.save unless skip_ids_persistency.nil?
|
|
129
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)
|
|
130
153
|
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
154
|
+
end # case command
|
|
155
|
+
end # action
|
|
156
|
+
end # Faspex5
|
|
134
157
|
end # Plugins
|
|
135
158
|
end # Cli
|
|
136
159
|
end # Aspera
|