aspera-cli 4.5.0 → 4.8.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 +1 -0
- data/README.md +1894 -1574
- data/bin/ascli +21 -1
- data/bin/asession +38 -34
- data/docs/test_env.conf +14 -3
- data/examples/aoc.rb +17 -15
- data/examples/dascli +26 -0
- data/examples/faspex4.rb +42 -35
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +38 -37
- data/lib/aspera/aoc.rb +245 -205
- data/lib/aspera/ascmd.rb +111 -90
- data/lib/aspera/ats_api.rb +16 -14
- data/lib/aspera/cli/basic_auth_plugin.rb +19 -18
- data/lib/aspera/cli/extended_value.rb +50 -39
- data/lib/aspera/cli/formater.rb +161 -135
- data/lib/aspera/cli/info.rb +18 -0
- data/lib/aspera/cli/listener/line_dump.rb +4 -2
- data/lib/aspera/cli/listener/logger.rb +3 -1
- data/lib/aspera/cli/listener/progress.rb +20 -21
- data/lib/aspera/cli/listener/progress_multi.rb +29 -31
- data/lib/aspera/cli/main.rb +194 -183
- data/lib/aspera/cli/manager.rb +213 -206
- data/lib/aspera/cli/plugin.rb +71 -49
- data/lib/aspera/cli/plugins/alee.rb +8 -7
- data/lib/aspera/cli/plugins/aoc.rb +675 -558
- data/lib/aspera/cli/plugins/ats.rb +116 -109
- data/lib/aspera/cli/plugins/bss.rb +35 -34
- data/lib/aspera/cli/plugins/config.rb +722 -542
- data/lib/aspera/cli/plugins/console.rb +28 -22
- data/lib/aspera/cli/plugins/cos.rb +28 -37
- data/lib/aspera/cli/plugins/faspex.rb +281 -227
- data/lib/aspera/cli/plugins/faspex5.rb +129 -84
- data/lib/aspera/cli/plugins/node.rb +426 -232
- data/lib/aspera/cli/plugins/orchestrator.rb +106 -98
- data/lib/aspera/cli/plugins/preview.rb +196 -191
- data/lib/aspera/cli/plugins/server.rb +131 -126
- data/lib/aspera/cli/plugins/shares.rb +49 -36
- data/lib/aspera/cli/plugins/sync.rb +27 -28
- data/lib/aspera/cli/transfer_agent.rb +84 -79
- data/lib/aspera/cli/version.rb +3 -1
- data/lib/aspera/colors.rb +37 -28
- data/lib/aspera/command_line_builder.rb +84 -63
- data/lib/aspera/cos_node.rb +68 -34
- data/lib/aspera/data_repository.rb +4 -2
- data/lib/aspera/environment.rb +61 -46
- data/lib/aspera/fasp/agent_base.rb +36 -31
- data/lib/aspera/fasp/agent_connect.rb +44 -37
- data/lib/aspera/fasp/agent_direct.rb +101 -104
- data/lib/aspera/fasp/agent_httpgw.rb +91 -90
- data/lib/aspera/fasp/agent_node.rb +36 -33
- data/lib/aspera/fasp/agent_trsdk.rb +28 -31
- data/lib/aspera/fasp/error.rb +3 -1
- data/lib/aspera/fasp/error_info.rb +81 -54
- data/lib/aspera/fasp/installation.rb +171 -151
- data/lib/aspera/fasp/listener.rb +2 -0
- data/lib/aspera/fasp/parameters.rb +105 -111
- data/lib/aspera/fasp/parameters.yaml +305 -249
- data/lib/aspera/fasp/resume_policy.rb +20 -20
- data/lib/aspera/fasp/transfer_spec.rb +27 -0
- data/lib/aspera/fasp/uri.rb +31 -29
- data/lib/aspera/faspex_gw.rb +95 -118
- data/lib/aspera/hash_ext.rb +12 -13
- data/lib/aspera/id_generator.rb +11 -9
- data/lib/aspera/keychain/encrypted_hash.rb +73 -57
- data/lib/aspera/keychain/macos_security.rb +27 -29
- data/lib/aspera/log.rb +40 -39
- data/lib/aspera/nagios.rb +24 -22
- data/lib/aspera/node.rb +38 -30
- data/lib/aspera/oauth.rb +217 -248
- data/lib/aspera/open_application.rb +9 -7
- data/lib/aspera/persistency_action_once.rb +15 -14
- data/lib/aspera/persistency_folder.rb +15 -18
- data/lib/aspera/preview/file_types.rb +266 -270
- data/lib/aspera/preview/generator.rb +94 -92
- data/lib/aspera/preview/image_error.png +0 -0
- data/lib/aspera/preview/options.rb +20 -17
- data/lib/aspera/preview/utils.rb +99 -102
- data/lib/aspera/preview/video_error.png +0 -0
- data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
- data/lib/aspera/proxy_auto_config.rb +114 -21
- data/lib/aspera/rest.rb +144 -142
- data/lib/aspera/rest_call_error.rb +3 -2
- data/lib/aspera/rest_error_analyzer.rb +31 -31
- data/lib/aspera/rest_errors_aspera.rb +18 -16
- data/lib/aspera/secret_hider.rb +68 -0
- data/lib/aspera/ssh.rb +20 -16
- data/lib/aspera/sync.rb +57 -54
- data/lib/aspera/temp_file_manager.rb +20 -14
- data/lib/aspera/timer_limiter.rb +10 -8
- data/lib/aspera/uri_reader.rb +14 -15
- data/lib/aspera/web_auth.rb +85 -80
- data.tar.gz.sig +0 -0
- metadata +169 -40
- metadata.gz.sig +2 -0
- data/bin/dascli +0 -13
- data/docs/Makefile +0 -63
- data/docs/README.erb.md +0 -4221
- 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,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'aspera/cli/plugins/node'
|
2
4
|
require 'xmlsimple'
|
3
5
|
|
@@ -7,159 +9,165 @@ module Aspera
|
|
7
9
|
class Orchestrator < BasicAuthPlugin
|
8
10
|
def initialize(env)
|
9
11
|
super(env)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
options.add_opt_simple(:params,'parameters hash table, use @json:{"param":"value"}')
|
13
|
+
options.add_opt_simple(:result,"specify result value as: 'work step:parameter'")
|
14
|
+
options.add_opt_boolean(:synchronous,'work step:parameter expected as result')
|
15
|
+
options.add_opt_list(:ret_style,%i[header arg ext],'how return type is requested in api')
|
16
|
+
options.add_opt_list(:auth_style,%i[arg_pass head_basic apikey],'authentication type')
|
17
|
+
options.set_option(:params,{})
|
18
|
+
options.set_option(:synchronous,:no)
|
19
|
+
options.set_option(:ret_style,:arg)
|
20
|
+
options.set_option(:auth_style,:head_basic)
|
21
|
+
options.parse_options!
|
20
22
|
end
|
21
23
|
|
22
|
-
ACTIONS=[
|
24
|
+
ACTIONS = %i[health info workflow plugins processes].freeze
|
23
25
|
|
24
26
|
# for JSON format: add extension ".json" or add url parameter: format=json or Accept: application/json
|
25
27
|
# id can be: a parameter id=x, or at the end of url /id, for workflows: work_order[workflow_id]=wf_id
|
26
|
-
def call_API_orig(endpoint,id=nil,url_params={:
|
27
|
-
# calls are GET
|
28
|
-
call_args={:
|
29
|
-
# specify id if necessary
|
30
|
-
call_args[:subpath]=call_args[:subpath]+'/'+id unless id.nil?
|
31
|
-
unless url_params.nil?
|
32
|
-
if url_params.has_key?(:format)
|
33
|
-
call_args[:headers]={'Accept'=>'application/'+url_params[:format].to_s}
|
34
|
-
end
|
35
|
-
call_args[:headers]={'Accept'=>accept} unless accept.nil?
|
36
|
-
# add params if necessary
|
37
|
-
call_args[:url_params]=url_params
|
38
|
-
end
|
39
|
-
return @api_orch.call(call_args)
|
40
|
-
end
|
28
|
+
# def call_API_orig(endpoint,id=nil,url_params={format: :json},accept=nil)
|
29
|
+
# # calls are GET
|
30
|
+
# call_args={operation: 'GET',subpath: endpoint}
|
31
|
+
# # specify id if necessary
|
32
|
+
# call_args[:subpath]=call_args[:subpath]+'/'+id unless id.nil?
|
33
|
+
# unless url_params.nil?
|
34
|
+
# if url_params.has_key?(:format)
|
35
|
+
# call_args[:headers]={'Accept'=>'application/'+url_params[:format].to_s}
|
36
|
+
# end
|
37
|
+
# call_args[:headers]={'Accept'=>accept} unless accept.nil?
|
38
|
+
# # add params if necessary
|
39
|
+
# call_args[:url_params]=url_params
|
40
|
+
# end
|
41
|
+
# return @api_orch.call(call_args)
|
42
|
+
# end
|
41
43
|
|
42
|
-
def
|
43
|
-
opt[:prefix]='api' unless opt.has_key?(:prefix)
|
44
|
+
def call_ao(endpoint,opt={})
|
45
|
+
opt[:prefix] = 'api' unless opt.has_key?(:prefix)
|
44
46
|
# calls are GET
|
45
|
-
call_args={:
|
47
|
+
call_args = {operation: 'GET',subpath: endpoint}
|
46
48
|
# specify prefix if necessary
|
47
|
-
call_args[:subpath]="#{opt[:prefix]}/#{call_args[:subpath]}" unless opt[:prefix].nil?
|
49
|
+
call_args[:subpath] = "#{opt[:prefix]}/#{call_args[:subpath]}" unless opt[:prefix].nil?
|
48
50
|
# specify id if necessary
|
49
|
-
call_args[:subpath]="#{call_args[:subpath]}/#{opt[:id]}" if opt.has_key?(:id)
|
50
|
-
call_type=
|
51
|
-
call_type=opt[:ret_style] if opt.has_key?(:ret_style)
|
52
|
-
format='json'
|
53
|
-
format=opt[:format] if opt.has_key?(:format)
|
54
|
-
call_args[:url_params]=opt[:args] unless opt[:args].nil?
|
51
|
+
call_args[:subpath] = "#{call_args[:subpath]}/#{opt[:id]}" if opt.has_key?(:id)
|
52
|
+
call_type = options.get_option(:ret_style,is_type: :mandatory)
|
53
|
+
call_type = opt[:ret_style] if opt.has_key?(:ret_style)
|
54
|
+
format = 'json'
|
55
|
+
format = opt[:format] if opt.has_key?(:format)
|
56
|
+
call_args[:url_params] = opt[:args] unless opt[:args].nil?
|
55
57
|
unless format.nil?
|
56
58
|
case call_type
|
57
59
|
when :header
|
58
|
-
call_args[:headers]={'Accept'=>'application/'+format}
|
60
|
+
call_args[:headers] = {'Accept' => 'application/' + format}
|
59
61
|
when :arg
|
60
|
-
call_args[:url_params]||={}
|
61
|
-
call_args[:url_params][:format]=format
|
62
|
+
call_args[:url_params] ||= {}
|
63
|
+
call_args[:url_params][:format] = format
|
62
64
|
when :ext
|
63
|
-
call_args[:subpath]="#{call_args[:subpath]}.#{format}"
|
64
|
-
else raise
|
65
|
+
call_args[:subpath] = "#{call_args[:subpath]}.#{format}"
|
66
|
+
else raise 'unexpected'
|
65
67
|
end
|
66
68
|
end
|
67
|
-
result
|
68
|
-
result[:data]=XmlSimple.xml_in(result[:http].body, opt[:xml_opt]||{
|
69
|
+
result = @api_orch.call(call_args)
|
70
|
+
result[:data] = XmlSimple.xml_in(result[:http].body, opt[:xml_opt] || {'ForceArray' => true}) if format.eql?('xml')
|
71
|
+
Log.dump(:data,result[:data])
|
69
72
|
return result
|
70
73
|
end
|
71
74
|
|
72
75
|
def execute_action
|
73
|
-
rest_params={:
|
74
|
-
case
|
76
|
+
rest_params = {base_url: options.get_option(:url,is_type: :mandatory)}
|
77
|
+
case options.get_option(:auth_style,is_type: :mandatory)
|
75
78
|
when :arg_pass
|
76
|
-
rest_params[:auth]={
|
77
|
-
:
|
78
|
-
:
|
79
|
-
|
80
|
-
|
79
|
+
rest_params[:auth] = {
|
80
|
+
type: :url,
|
81
|
+
url_creds: {
|
82
|
+
'login' => options.get_option(:username,is_type: :mandatory),
|
83
|
+
'password' => options.get_option(:password,is_type: :mandatory) }}
|
81
84
|
when :head_basic
|
82
|
-
rest_params[:auth]={
|
83
|
-
|
84
|
-
:
|
85
|
-
:
|
85
|
+
rest_params[:auth] = {
|
86
|
+
type: :basic,
|
87
|
+
username: options.get_option(:username,is_type: :mandatory),
|
88
|
+
password: options.get_option(:password,is_type: :mandatory) }
|
86
89
|
when :apikey
|
87
|
-
raise
|
90
|
+
raise 'Not implemented'
|
88
91
|
end
|
89
92
|
|
90
|
-
@api_orch=Rest.new(rest_params)
|
93
|
+
@api_orch = Rest.new(rest_params)
|
91
94
|
|
92
|
-
command1=
|
95
|
+
command1 = options.get_next_command(ACTIONS)
|
93
96
|
case command1
|
97
|
+
when :health
|
98
|
+
nagios = Nagios.new
|
99
|
+
begin
|
100
|
+
info = call_ao('remote_node_ping',format: 'xml', xml_opt: {'ForceArray' => false})[:data]
|
101
|
+
nagios.add_ok('api','accessible')
|
102
|
+
nagios.check_product_version('api','orchestrator', info['orchestrator-version'])
|
103
|
+
rescue StandardError => e
|
104
|
+
nagios.add_critical('node api',e.to_s)
|
105
|
+
end
|
106
|
+
return nagios.result
|
94
107
|
when :info
|
95
|
-
result=
|
96
|
-
return {:
|
97
|
-
# result=call_API('workflows',prefix: nil,format: nil)
|
98
|
-
# version='unknown'
|
99
|
-
# if m=result[:http].body.match(/\(Orchestrator v([1-9]+\.[\.0-9a-f\-]+)\)/)
|
100
|
-
# version=m[1]
|
101
|
-
# end
|
102
|
-
# return {:type=>:single_object,:data=>{'version'=>version}}
|
108
|
+
result = call_ao('remote_node_ping',format: 'xml', xml_opt: {'ForceArray' => false})[:data]
|
109
|
+
return {type: :single_object,data: result}
|
103
110
|
when :processes
|
104
111
|
# TODO: Jira ? API has only XML format
|
105
|
-
result=
|
106
|
-
return {:
|
112
|
+
result = call_ao('processes_status',format: 'xml')[:data]
|
113
|
+
return {type: :object_list,data: result['process']}
|
107
114
|
when :plugins
|
108
115
|
# TODO: Jira ? only json format on url
|
109
|
-
result=
|
110
|
-
return {:
|
116
|
+
result = call_ao('plugin_version')[:data]
|
117
|
+
return {type: :object_list,data: result['Plugin']}
|
111
118
|
when :workflow
|
112
|
-
command=
|
119
|
+
command = options.get_next_command(%i[list status inputs details start export])
|
113
120
|
unless [:list].include?(command)
|
114
|
-
wf_id=
|
121
|
+
wf_id = instance_identifier
|
115
122
|
end
|
116
123
|
case command
|
117
124
|
when :status
|
118
|
-
options={}
|
119
|
-
options[:id]=wf_id unless wf_id.eql?('ALL')
|
120
|
-
result=
|
121
|
-
return {:
|
125
|
+
options = {}
|
126
|
+
options[:id] = wf_id unless wf_id.eql?('ALL')
|
127
|
+
result = call_ao('workflows_status',options)[:data]
|
128
|
+
return {type: :object_list,data: result['workflows']['workflow']}
|
122
129
|
when :list
|
123
|
-
result=
|
124
|
-
return {:
|
130
|
+
result = call_ao('workflows_list',id: 0)[:data]
|
131
|
+
return {type: :object_list,data: result['workflows']['workflow'],
|
132
|
+
fields: %w[id portable_id name published_status published_revision_id latest_revision_id last_modification]}
|
125
133
|
when :details
|
126
|
-
result=
|
127
|
-
return {:
|
134
|
+
result = call_ao('workflow_details',id: wf_id)[:data]
|
135
|
+
return {type: :object_list,data: result['workflows']['workflow']['statuses']}
|
128
136
|
when :inputs
|
129
|
-
result=
|
130
|
-
return {:
|
137
|
+
result = call_ao('workflow_inputs_spec',id: wf_id)[:data]
|
138
|
+
return {type: :single_object,data: result['workflow_inputs_spec']}
|
131
139
|
when :export
|
132
|
-
result=
|
133
|
-
return {:
|
140
|
+
result = call_ao('export_workflow',id: wf_id,format: nil)[:http]
|
141
|
+
return {type: :text,data: result.body}
|
134
142
|
when :start
|
135
|
-
result={
|
136
|
-
:
|
137
|
-
:
|
143
|
+
result = {
|
144
|
+
type: :single_object,
|
145
|
+
data: nil
|
138
146
|
}
|
139
|
-
call_params={:
|
140
|
-
override_accept=nil
|
147
|
+
call_params = {format: :json}
|
148
|
+
override_accept = nil
|
141
149
|
# set external parameters if any
|
142
|
-
self.options.get_option(:params
|
150
|
+
self.options.get_option(:params,is_type: :mandatory).each do |name,value|
|
143
151
|
call_params["external_parameters[#{name}]"] = value
|
144
152
|
end
|
145
153
|
# synchronous call ?
|
146
|
-
call_params['synchronous']=true if self.options.get_option(:synchronous
|
154
|
+
call_params['synchronous'] = true if self.options.get_option(:synchronous,is_type: :mandatory)
|
147
155
|
# expected result for synchro call ?
|
148
|
-
expected=self.options.get_option(:result
|
156
|
+
expected = self.options.get_option(:result)
|
149
157
|
unless expected.nil?
|
150
158
|
result[:type] = :status
|
151
|
-
fields=expected.split(
|
159
|
+
fields = expected.split(':')
|
152
160
|
raise "Expects: work_step:result_name format, but got #{expected}" if fields.length != 2
|
153
|
-
call_params['explicit_output_step']=fields[0]
|
154
|
-
call_params['explicit_output_variable']=fields[1]
|
161
|
+
call_params['explicit_output_step'] = fields[0]
|
162
|
+
call_params['explicit_output_variable'] = fields[1]
|
155
163
|
# implicitely, call is synchronous
|
156
|
-
call_params['synchronous']=true
|
164
|
+
call_params['synchronous'] = true
|
157
165
|
end
|
158
166
|
if call_params['synchronous']
|
159
|
-
result[:type]
|
160
|
-
override_accept='text/plain'
|
167
|
+
result[:type] = :text
|
168
|
+
override_accept = 'text/plain'
|
161
169
|
end
|
162
|
-
result[:data]=
|
170
|
+
result[:data] = call_ao('initiate',id: wf_id,args: call_params,accept: override_accept)[:data]
|
163
171
|
return result
|
164
172
|
end # wf command
|
165
173
|
else raise "ERROR, unknown command: [#{command}]"
|