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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/README.md +1894 -1574
  4. data/bin/ascli +21 -1
  5. data/bin/asession +38 -34
  6. data/docs/test_env.conf +14 -3
  7. data/examples/aoc.rb +17 -15
  8. data/examples/dascli +26 -0
  9. data/examples/faspex4.rb +42 -35
  10. data/examples/proxy.pac +1 -1
  11. data/examples/transfer.rb +38 -37
  12. data/lib/aspera/aoc.rb +245 -205
  13. data/lib/aspera/ascmd.rb +111 -90
  14. data/lib/aspera/ats_api.rb +16 -14
  15. data/lib/aspera/cli/basic_auth_plugin.rb +19 -18
  16. data/lib/aspera/cli/extended_value.rb +50 -39
  17. data/lib/aspera/cli/formater.rb +161 -135
  18. data/lib/aspera/cli/info.rb +18 -0
  19. data/lib/aspera/cli/listener/line_dump.rb +4 -2
  20. data/lib/aspera/cli/listener/logger.rb +3 -1
  21. data/lib/aspera/cli/listener/progress.rb +20 -21
  22. data/lib/aspera/cli/listener/progress_multi.rb +29 -31
  23. data/lib/aspera/cli/main.rb +194 -183
  24. data/lib/aspera/cli/manager.rb +213 -206
  25. data/lib/aspera/cli/plugin.rb +71 -49
  26. data/lib/aspera/cli/plugins/alee.rb +8 -7
  27. data/lib/aspera/cli/plugins/aoc.rb +675 -558
  28. data/lib/aspera/cli/plugins/ats.rb +116 -109
  29. data/lib/aspera/cli/plugins/bss.rb +35 -34
  30. data/lib/aspera/cli/plugins/config.rb +722 -542
  31. data/lib/aspera/cli/plugins/console.rb +28 -22
  32. data/lib/aspera/cli/plugins/cos.rb +28 -37
  33. data/lib/aspera/cli/plugins/faspex.rb +281 -227
  34. data/lib/aspera/cli/plugins/faspex5.rb +129 -84
  35. data/lib/aspera/cli/plugins/node.rb +426 -232
  36. data/lib/aspera/cli/plugins/orchestrator.rb +106 -98
  37. data/lib/aspera/cli/plugins/preview.rb +196 -191
  38. data/lib/aspera/cli/plugins/server.rb +131 -126
  39. data/lib/aspera/cli/plugins/shares.rb +49 -36
  40. data/lib/aspera/cli/plugins/sync.rb +27 -28
  41. data/lib/aspera/cli/transfer_agent.rb +84 -79
  42. data/lib/aspera/cli/version.rb +3 -1
  43. data/lib/aspera/colors.rb +37 -28
  44. data/lib/aspera/command_line_builder.rb +84 -63
  45. data/lib/aspera/cos_node.rb +68 -34
  46. data/lib/aspera/data_repository.rb +4 -2
  47. data/lib/aspera/environment.rb +61 -46
  48. data/lib/aspera/fasp/agent_base.rb +36 -31
  49. data/lib/aspera/fasp/agent_connect.rb +44 -37
  50. data/lib/aspera/fasp/agent_direct.rb +101 -104
  51. data/lib/aspera/fasp/agent_httpgw.rb +91 -90
  52. data/lib/aspera/fasp/agent_node.rb +36 -33
  53. data/lib/aspera/fasp/agent_trsdk.rb +28 -31
  54. data/lib/aspera/fasp/error.rb +3 -1
  55. data/lib/aspera/fasp/error_info.rb +81 -54
  56. data/lib/aspera/fasp/installation.rb +171 -151
  57. data/lib/aspera/fasp/listener.rb +2 -0
  58. data/lib/aspera/fasp/parameters.rb +105 -111
  59. data/lib/aspera/fasp/parameters.yaml +305 -249
  60. data/lib/aspera/fasp/resume_policy.rb +20 -20
  61. data/lib/aspera/fasp/transfer_spec.rb +27 -0
  62. data/lib/aspera/fasp/uri.rb +31 -29
  63. data/lib/aspera/faspex_gw.rb +95 -118
  64. data/lib/aspera/hash_ext.rb +12 -13
  65. data/lib/aspera/id_generator.rb +11 -9
  66. data/lib/aspera/keychain/encrypted_hash.rb +73 -57
  67. data/lib/aspera/keychain/macos_security.rb +27 -29
  68. data/lib/aspera/log.rb +40 -39
  69. data/lib/aspera/nagios.rb +24 -22
  70. data/lib/aspera/node.rb +38 -30
  71. data/lib/aspera/oauth.rb +217 -248
  72. data/lib/aspera/open_application.rb +9 -7
  73. data/lib/aspera/persistency_action_once.rb +15 -14
  74. data/lib/aspera/persistency_folder.rb +15 -18
  75. data/lib/aspera/preview/file_types.rb +266 -270
  76. data/lib/aspera/preview/generator.rb +94 -92
  77. data/lib/aspera/preview/image_error.png +0 -0
  78. data/lib/aspera/preview/options.rb +20 -17
  79. data/lib/aspera/preview/utils.rb +99 -102
  80. data/lib/aspera/preview/video_error.png +0 -0
  81. data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
  82. data/lib/aspera/proxy_auto_config.rb +114 -21
  83. data/lib/aspera/rest.rb +144 -142
  84. data/lib/aspera/rest_call_error.rb +3 -2
  85. data/lib/aspera/rest_error_analyzer.rb +31 -31
  86. data/lib/aspera/rest_errors_aspera.rb +18 -16
  87. data/lib/aspera/secret_hider.rb +68 -0
  88. data/lib/aspera/ssh.rb +20 -16
  89. data/lib/aspera/sync.rb +57 -54
  90. data/lib/aspera/temp_file_manager.rb +20 -14
  91. data/lib/aspera/timer_limiter.rb +10 -8
  92. data/lib/aspera/uri_reader.rb +14 -15
  93. data/lib/aspera/web_auth.rb +85 -80
  94. data.tar.gz.sig +0 -0
  95. metadata +169 -40
  96. metadata.gz.sig +2 -0
  97. data/bin/dascli +0 -13
  98. data/docs/Makefile +0 -63
  99. data/docs/README.erb.md +0 -4221
  100. data/docs/README.md +0 -13
  101. data/docs/diagrams.txt +0 -49
  102. data/docs/doc_tools.rb +0 -58
  103. data/lib/aspera/cli/plugins/shares2.rb +0 -114
  104. 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
- self.options.add_opt_simple(:params,"parameters hash table, use @json:{\"param\":\"value\"}")
11
- self.options.add_opt_simple(:result,"specify result value as: 'work step:parameter'")
12
- self.options.add_opt_boolean(:synchronous,"work step:parameter expected as result")
13
- self.options.add_opt_list(:ret_style,[:header,:arg,:ext],'how return type is requested in api')
14
- self.options.add_opt_list(:auth_style,[:arg_pass,:head_basic,:apikey],'authentication type')
15
- self.options.set_option(:params,{})
16
- self.options.set_option(:synchronous,:no)
17
- self.options.set_option(:ret_style,:arg)
18
- self.options.set_option(:auth_style,:head_basic)
19
- self.options.parse_options!
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=[:info, :workflow, :plugins, :processes]
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={:format=>:json},accept=nil)
27
- # calls are GET
28
- call_args={:operation=>'GET',:subpath=>endpoint}
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 call_API(endpoint,opt={})
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={:operation=>'GET',:subpath=>endpoint}
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=self.options.get_option(:ret_style,:mandatory)
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 "unexpected"
65
+ call_args[:subpath] = "#{call_args[:subpath]}.#{format}"
66
+ else raise 'unexpected'
65
67
  end
66
68
  end
67
- result=@api_orch.call(call_args)
68
- result[:data]=XmlSimple.xml_in(result[:http].body, opt[:xml_opt]||{"ForceArray" => true}) if format.eql?('xml')
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={:base_url => self.options.get_option(:url,:mandatory)}
74
- case self.options.get_option(:auth_style,:mandatory)
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
- :type => :url,
78
- :url_creds => {
79
- 'login' =>self.options.get_option(:username,:mandatory),
80
- 'password' =>self.options.get_option(:password,:mandatory) }}
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
- :type => :basic,
84
- :username =>self.options.get_option(:username,:mandatory),
85
- :password =>self.options.get_option(:password,:mandatory) }
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 "Not implemented"
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=self.options.get_next_command(ACTIONS)
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=call_API('remote_node_ping',format: 'xml', xml_opt: {"ForceArray" => false})
96
- return {:type=>:single_object,:data=>result[:data]}
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=call_API('processes_status',format: 'xml')
106
- return {:type=>:object_list,:data=>result[:data]['process']}
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=call_API('plugin_version')[:data]
110
- return {:type=>:object_list,:data=>result['Plugin']}
116
+ result = call_ao('plugin_version')[:data]
117
+ return {type: :object_list,data: result['Plugin']}
111
118
  when :workflow
112
- command=self.options.get_next_command([:list, :status, :inputs, :details, :start, :export])
119
+ command = options.get_next_command(%i[list status inputs details start export])
113
120
  unless [:list].include?(command)
114
- wf_id=self.instance_identifier()
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=call_API('workflows_status',options)[:data]
121
- return {:type=>:object_list,:data=>result['workflows']['workflow']}
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=call_API('workflows_list',id: 0)[:data]
124
- return {:type=>:object_list,:data=>result['workflows']['workflow'],:fields=>["id","portable_id","name","published_status","published_revision_id","latest_revision_id","last_modification"]}
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=call_API('workflow_details',id: wf_id)[:data]
127
- return {:type=>:object_list,:data=>result['workflows']['workflow']['statuses']}
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=call_API('workflow_inputs_spec',id: wf_id)[:data]
130
- return {:type=>:single_object,:data=>result['workflow_inputs_spec']}
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=call_API('export_workflow',id: wf_id,format: nil)[:http]
133
- return {:type=>:text,:data=>result.body}
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
- :type=>:single_object,
137
- :data=>nil
143
+ result = {
144
+ type: :single_object,
145
+ data: nil
138
146
  }
139
- call_params={:format=>:json}
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,:mandatory).each do |name,value|
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,:mandatory)
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,:optional)
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]=:text
160
- override_accept='text/plain'
167
+ result[:type] = :text
168
+ override_accept = 'text/plain'
161
169
  end
162
- result[:data]=call_API('initiate',id: wf_id,args: call_params,accept: override_accept)[: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}]"