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