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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +427 -300
  3. data/bin/ascli +2 -1
  4. data/bin/asession +1 -0
  5. data/docs/test_env.conf +2 -0
  6. data/examples/aoc.rb +4 -3
  7. data/examples/faspex4.rb +21 -19
  8. data/examples/proxy.pac +1 -1
  9. data/examples/transfer.rb +15 -15
  10. data/lib/aspera/aoc.rb +135 -124
  11. data/lib/aspera/ascmd.rb +85 -75
  12. data/lib/aspera/ats_api.rb +11 -10
  13. data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
  14. data/lib/aspera/cli/extended_value.rb +42 -33
  15. data/lib/aspera/cli/formater.rb +138 -111
  16. data/lib/aspera/cli/info.rb +17 -0
  17. data/lib/aspera/cli/listener/line_dump.rb +3 -2
  18. data/lib/aspera/cli/listener/logger.rb +2 -1
  19. data/lib/aspera/cli/listener/progress.rb +16 -18
  20. data/lib/aspera/cli/listener/progress_multi.rb +13 -16
  21. data/lib/aspera/cli/main.rb +122 -130
  22. data/lib/aspera/cli/manager.rb +146 -154
  23. data/lib/aspera/cli/plugin.rb +38 -34
  24. data/lib/aspera/cli/plugins/alee.rb +6 -6
  25. data/lib/aspera/cli/plugins/aoc.rb +273 -276
  26. data/lib/aspera/cli/plugins/ats.rb +82 -76
  27. data/lib/aspera/cli/plugins/bss.rb +14 -16
  28. data/lib/aspera/cli/plugins/config.rb +350 -306
  29. data/lib/aspera/cli/plugins/console.rb +23 -19
  30. data/lib/aspera/cli/plugins/cos.rb +18 -18
  31. data/lib/aspera/cli/plugins/faspex.rb +180 -159
  32. data/lib/aspera/cli/plugins/faspex5.rb +64 -54
  33. data/lib/aspera/cli/plugins/node.rb +147 -140
  34. data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
  35. data/lib/aspera/cli/plugins/preview.rb +92 -96
  36. data/lib/aspera/cli/plugins/server.rb +79 -75
  37. data/lib/aspera/cli/plugins/shares.rb +23 -24
  38. data/lib/aspera/cli/plugins/sync.rb +20 -22
  39. data/lib/aspera/cli/transfer_agent.rb +40 -39
  40. data/lib/aspera/cli/version.rb +2 -1
  41. data/lib/aspera/colors.rb +35 -27
  42. data/lib/aspera/command_line_builder.rb +48 -34
  43. data/lib/aspera/cos_node.rb +29 -21
  44. data/lib/aspera/data_repository.rb +3 -2
  45. data/lib/aspera/environment.rb +50 -45
  46. data/lib/aspera/fasp/agent_base.rb +22 -20
  47. data/lib/aspera/fasp/agent_connect.rb +13 -11
  48. data/lib/aspera/fasp/agent_direct.rb +48 -59
  49. data/lib/aspera/fasp/agent_httpgw.rb +33 -39
  50. data/lib/aspera/fasp/agent_node.rb +15 -13
  51. data/lib/aspera/fasp/agent_trsdk.rb +12 -14
  52. data/lib/aspera/fasp/error.rb +2 -1
  53. data/lib/aspera/fasp/error_info.rb +68 -52
  54. data/lib/aspera/fasp/installation.rb +106 -94
  55. data/lib/aspera/fasp/listener.rb +1 -0
  56. data/lib/aspera/fasp/parameters.rb +83 -92
  57. data/lib/aspera/fasp/parameters.yaml +305 -249
  58. data/lib/aspera/fasp/resume_policy.rb +11 -14
  59. data/lib/aspera/fasp/transfer_spec.rb +26 -0
  60. data/lib/aspera/fasp/uri.rb +22 -21
  61. data/lib/aspera/faspex_gw.rb +55 -90
  62. data/lib/aspera/hash_ext.rb +4 -3
  63. data/lib/aspera/id_generator.rb +8 -7
  64. data/lib/aspera/keychain/encrypted_hash.rb +17 -16
  65. data/lib/aspera/keychain/macos_security.rb +6 -10
  66. data/lib/aspera/log.rb +25 -20
  67. data/lib/aspera/nagios.rb +13 -12
  68. data/lib/aspera/node.rb +30 -22
  69. data/lib/aspera/oauth.rb +175 -226
  70. data/lib/aspera/open_application.rb +4 -3
  71. data/lib/aspera/persistency_action_once.rb +6 -6
  72. data/lib/aspera/persistency_folder.rb +5 -9
  73. data/lib/aspera/preview/file_types.rb +6 -5
  74. data/lib/aspera/preview/generator.rb +25 -24
  75. data/lib/aspera/preview/options.rb +16 -14
  76. data/lib/aspera/preview/utils.rb +98 -98
  77. data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
  78. data/lib/aspera/proxy_auto_config.rb +111 -20
  79. data/lib/aspera/rest.rb +115 -113
  80. data/lib/aspera/rest_call_error.rb +2 -2
  81. data/lib/aspera/rest_error_analyzer.rb +23 -25
  82. data/lib/aspera/rest_errors_aspera.rb +15 -14
  83. data/lib/aspera/ssh.rb +12 -10
  84. data/lib/aspera/sync.rb +42 -41
  85. data/lib/aspera/temp_file_manager.rb +18 -14
  86. data/lib/aspera/timer_limiter.rb +2 -1
  87. data/lib/aspera/uri_reader.rb +7 -5
  88. data/lib/aspera/web_auth.rb +79 -76
  89. metadata +64 -21
  90. data/docs/Makefile +0 -65
  91. data/docs/README.erb.md +0 -4424
  92. data/docs/README.md +0 -13
  93. data/docs/diagrams.txt +0 -49
  94. data/docs/doc_tools.rb +0 -58
  95. data/lib/aspera/cli/plugins/shares2.rb +0 -114
  96. data/lib/aspera/fasp/default.rb +0 -17
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/cli/basic_auth_plugin'
2
3
  require 'aspera/nagios'
3
4
  require 'aspera/hash_ext'
4
5
  require 'aspera/id_generator'
5
6
  require 'aspera/node'
7
+ require 'aspera/fasp/transfer_spec'
6
8
  require 'base64'
7
9
  require 'zlib'
8
10
 
@@ -27,30 +29,29 @@ module Aspera
27
29
  super(env)
28
30
  # this is added to some requests , for instance to add tags (COS)
29
31
  @add_request_param = env[:add_request_param] || {}
30
- self.options.add_opt_simple(:validator,"identifier of validator (optional for central)")
31
- self.options.add_opt_simple(:asperabrowserurl,"URL for simple aspera web ui")
32
- self.options.add_opt_simple(:sync_name,"sync name")
33
- self.options.add_opt_list(:token_type,[:aspera,:basic,:hybrid],'Type of token used for transfers')
34
- self.options.set_option(:asperabrowserurl,'https://asperabrowser.mybluemix.net')
35
- self.options.set_option(:token_type,:aspera)
36
- self.options.parse_options!
32
+ options.add_opt_simple(:validator,'identifier of validator (optional for central)')
33
+ options.add_opt_simple(:asperabrowserurl,'URL for simple aspera web ui')
34
+ options.add_opt_simple(:sync_name,'sync name')
35
+ options.add_opt_list(:token_type,[:aspera,:basic,:hybrid],'Type of token used for transfers')
36
+ options.set_option(:asperabrowserurl,'https://asperabrowser.mybluemix.net')
37
+ options.set_option(:token_type,:aspera)
38
+ options.parse_options!
37
39
  return if env[:man_only]
40
+ @api_node=
38
41
  if env.has_key?(:node_api)
39
- @api_node=env[:node_api]
42
+ env[:node_api]
43
+ elsif options.get_option(:password,:mandatory).start_with?('Bearer ')
44
+ # info is provided like node_info of aoc
45
+ Rest.new({
46
+ base_url: options.get_option(:url,:mandatory),
47
+ headers: {
48
+ 'Authorization' => options.get_option(:password,:mandatory),
49
+ 'X-Aspera-AccessKey' => options.get_option(:username,:mandatory)
50
+ }
51
+ })
40
52
  else
41
- if self.options.get_option(:password,:mandatory).start_with?('Bearer ')
42
- # info is provided like node_info of aoc
43
- @api_node=Rest.new({
44
- base_url: self.options.get_option(:url,:mandatory),
45
- headers: {
46
- 'Authorization' => self.options.get_option(:password,:mandatory),
47
- 'X-Aspera-AccessKey' => self.options.get_option(:username,:mandatory),
48
- }
49
- })
50
- else
51
- # this is normal case
52
- @api_node=basic_auth_api
53
- end
53
+ # this is normal case
54
+ basic_auth_api
54
55
  end
55
56
  end
56
57
 
@@ -61,14 +62,13 @@ module Aspera
61
62
  # key/value is defined in main in hash_table
62
63
  def c_textify_bool_list_result(list,name_list)
63
64
  list.each_index do |i|
64
- if name_list.include?(list[i]['key'])
65
- list[i]['value'].each do |item|
66
- list.push({'key'=>item['name'],'value'=>item['value']})
67
- end
68
- list.delete_at(i)
69
- # continue at same index because we delete current one
70
- redo
65
+ next unless name_list.include?(list[i]['key'])
66
+ list[i]['value'].each do |item|
67
+ list.push({'key'=>item['name'],'value'=>item['value']})
71
68
  end
69
+ list.delete_at(i)
70
+ # continue at same index because we delete current one
71
+ redo
72
72
  end
73
73
  end
74
74
 
@@ -78,11 +78,11 @@ module Aspera
78
78
  case result[:type]
79
79
  when :object_list
80
80
  result[:data].each do |item|
81
- item[column].replace(item[column][path_prefix.length..-1]) if item[column].start_with?(path_prefix)
81
+ item[column]=item[column][path_prefix.length..-1] if item[column].start_with?(path_prefix)
82
82
  end
83
83
  when :single_object
84
84
  item=result[:data]
85
- item[column].replace(item[column][path_prefix.length..-1]) if item[column].start_with?(path_prefix)
85
+ item[column]=item[column][path_prefix.length..-1] if item[column].start_with?(path_prefix)
86
86
  end
87
87
  end
88
88
  return result
@@ -95,7 +95,7 @@ module Aspera
95
95
  result=success_msg
96
96
  if p.has_key?('error')
97
97
  Log.log.error("#{p['error']['user_message']} : #{p['path']}")
98
- result="ERROR: "+p['error']['user_message']
98
+ result='ERROR: '+p['error']['user_message']
99
99
  end
100
100
  resres[:data].push({type=>p['path'],'result'=>result})
101
101
  end
@@ -104,16 +104,16 @@ module Aspera
104
104
 
105
105
  # get path arguments from command line, and add prefix
106
106
  def get_next_arg_add_prefix(path_prefix,name,number=:single)
107
- thepath=self.options.get_next_argument(name,number)
107
+ thepath=options.get_next_argument(name,number)
108
108
  return thepath if path_prefix.nil?
109
109
  return File.join(path_prefix,thepath) if thepath.is_a?(String)
110
110
  return thepath.map {|p| File.join(path_prefix,p)} if thepath.is_a?(Array)
111
- raise StandardError,"expect: nil, String or Array"
111
+ raise StandardError,'expect: nil, String or Array'
112
112
  end
113
113
 
114
- SIMPLE_ACTIONS=[:health,:events, :space, :info, :license, :mkdir, :mklink, :mkfile, :rename, :delete, :search ]
114
+ SIMPLE_ACTIONS=[:health,:events, :space, :info, :license, :mkdir, :mklink, :mkfile, :rename, :delete, :search]
115
115
 
116
- COMMON_ACTIONS=[:browse, :upload, :download, :api_details ].concat(SIMPLE_ACTIONS)
116
+ COMMON_ACTIONS=[:browse, :upload, :download, :api_details].concat(SIMPLE_ACTIONS)
117
117
 
118
118
  # common API to node and Shares
119
119
  # prefix_path is used to list remote sources in Faspex
@@ -125,137 +125,146 @@ module Aspera
125
125
  info=@api_node.read('info')[:data]
126
126
  nagios.add_ok('node api','accessible')
127
127
  nagios.check_time_offset(info['current_time'],'node api')
128
- nagios.check_product_version( 'node api','entsrv', info['version'])
129
- rescue => e
128
+ nagios.check_product_version('node api','entsrv', info['version'])
129
+ rescue StandardError => e
130
130
  nagios.add_critical('node api',e.to_s)
131
131
  end
132
132
  begin
133
- @api_node.call({ operation: 'POST', subpath: 'services/soap/Transfer-201210', headers: {'Content-Type'=>'text/xml;charset=UTF-8','SOAPAction'=>'FASPSessionNET-200911#GetSessionInfo'}, text_body_params: SAMPLE_SOAP_CALL})[:http].body
133
+ @api_node.call({ operation: 'POST', subpath: 'services/soap/Transfer-201210',
134
+ headers: {'Content-Type'=>'text/xml;charset=UTF-8','SOAPAction'=>'FASPSessionNET-200911#GetSessionInfo'}, text_body_params: SAMPLE_SOAP_CALL})[:http].body
134
135
  nagios.add_ok('central','accessible by node')
135
- rescue => e
136
+ rescue StandardError => e
136
137
  nagios.add_critical('central',e.to_s)
137
138
  end
138
139
  return nagios.result
139
140
  when :events
140
- events=@api_node.read('events',self.options.get_option(:value,:optional))[:data]
141
+ events=@api_node.read('events',options.get_option(:value,:optional))[:data]
141
142
  return { type: :object_list, data: events}
142
143
  when :info
143
144
  node_info=@api_node.read('info')[:data]
144
145
  return { type: :single_object, data: node_info, textify: lambda { |table_data| c_textify_bool_list_result(table_data,['capabilities','settings'])}}
145
146
  when :license # requires: asnodeadmin -mu <node user> --acl-add=internal --internal
146
147
  node_license=@api_node.read('license')[:data]
147
- if node_license['failure'].is_a?(String) and node_license['failure'].include?('ACL')
148
- Log.log.error("server must have: asnodeadmin -mu <node user> --acl-add=internal --internal")
148
+ if node_license['failure'].is_a?(String) && node_license['failure'].include?('ACL')
149
+ Log.log.error('server must have: asnodeadmin -mu <node user> --acl-add=internal --internal')
149
150
  end
150
151
  return { type: :single_object, data: node_license}
151
152
  when :delete
152
- paths_to_delete = get_next_arg_add_prefix(prefix_path,"file list",:multiple)
153
+ paths_to_delete = get_next_arg_add_prefix(prefix_path,'file list',:multiple)
153
154
  resp=@api_node.create('files/delete',{ paths: paths_to_delete.map{|i| {'path'=>i.start_with?('/') ? i : '/'+i} }})
154
155
  return c_result_translate_rem_prefix(resp,'file','deleted',prefix_path)
155
156
  when :search
156
- search_root = get_next_arg_add_prefix(prefix_path,"search root")
157
+ search_root = get_next_arg_add_prefix(prefix_path,'search root')
157
158
  parameters={'path'=>search_root}
158
- other_options=self.options.get_option(:value,:optional)
159
+ other_options=options.get_option(:value,:optional)
159
160
  parameters.merge!(other_options) unless other_options.nil?
160
161
  resp=@api_node.create('files/search',parameters)
161
162
  result={ type: :object_list, data: resp[:data]['items']}
162
163
  return Main.result_empty if result[:data].empty?
163
- result[:fields]=result[:data].first.keys.select{|i|!['basename','permissions'].include?(i)}
164
+ result[:fields]=result[:data].first.keys.reject{|i|['basename','permissions'].include?(i)}
164
165
  self.format.display_status("Items: #{resp[:data]['item_count']}/#{resp[:data]['total_count']}")
165
166
  self.format.display_status("params: #{resp[:data]['parameters'].keys.map{|k|"#{k}:#{resp[:data]['parameters'][k]}"}.join(',')}")
166
167
  return c_result_remove_prefix_path(result,'path',prefix_path)
167
168
  when :space
168
169
  # TODO: could be a list of path
169
- path_list=get_next_arg_add_prefix(prefix_path,"folder path or ext.val. list")
170
+ path_list=get_next_arg_add_prefix(prefix_path,'folder path or ext.val. list')
170
171
  path_list=[path_list] unless path_list.is_a?(Array)
171
- resp=@api_node.create('space',{ "paths" => path_list.map {|i| { path: i} } } )
172
+ resp=@api_node.create('space',{ 'paths' => path_list.map {|i| { path: i} } })
172
173
  result={ data: resp[:data]['paths'], type: :object_list}
173
174
  #return c_result_translate_rem_prefix(resp,'folder','created',prefix_path)
174
175
  return c_result_remove_prefix_path(result,'path',prefix_path)
175
176
  when :mkdir
176
- path_list=get_next_arg_add_prefix(prefix_path,"folder path or ext.val. list")
177
+ path_list=get_next_arg_add_prefix(prefix_path,'folder path or ext.val. list')
177
178
  path_list=[path_list] unless path_list.is_a?(Array)
178
179
  #TODO: a command for that ?
179
180
  #resp=@api_node.create('space',{ "paths" => path_list.map {|i| { type: :directory, path: i} } } )
180
- resp=@api_node.create('files/create',{ "paths" => [{ type: :directory, path: path_list } ] } )
181
+ resp=@api_node.create('files/create',{ 'paths' => [{ type: :directory, path: path_list }] })
181
182
  return c_result_translate_rem_prefix(resp,'folder','created',prefix_path)
182
183
  when :mklink
183
- target=get_next_arg_add_prefix(prefix_path,"target")
184
- path_list=get_next_arg_add_prefix(prefix_path,"link path")
185
- resp=@api_node.create('files/create',{ "paths" => [{ type: :symbolic_link, path: path_list, target: { path: target} } ] } )
184
+ target=get_next_arg_add_prefix(prefix_path,'target')
185
+ path_list=get_next_arg_add_prefix(prefix_path,'link path')
186
+ resp=@api_node.create('files/create',{ 'paths' => [{ type: :symbolic_link, path: path_list, target: { path: target} }] })
186
187
  return c_result_translate_rem_prefix(resp,'folder','created',prefix_path)
187
188
  when :mkfile
188
- path_list=get_next_arg_add_prefix(prefix_path,"file path")
189
- contents64=Base64.strict_encode64(self.options.get_next_argument("contents"))
190
- resp=@api_node.create('files/create',{ "paths" => [{ type: :file, path: path_list, contents: contents64 } ] } )
189
+ path_list=get_next_arg_add_prefix(prefix_path,'file path')
190
+ contents64=Base64.strict_encode64(options.get_next_argument('contents'))
191
+ resp=@api_node.create('files/create',{ 'paths' => [{ type: :file, path: path_list, contents: contents64 }] })
191
192
  return c_result_translate_rem_prefix(resp,'folder','created',prefix_path)
192
193
  when :rename
193
- path_base=get_next_arg_add_prefix(prefix_path,"path_base")
194
- path_src=get_next_arg_add_prefix(prefix_path,"path_src")
195
- path_dst=get_next_arg_add_prefix(prefix_path,"path_dst")
196
- resp=@api_node.create('files/rename',{ "paths" => [{ "path" => path_base, "source" => path_src, "destination" => path_dst } ] } )
194
+ path_base=get_next_arg_add_prefix(prefix_path,'path_base')
195
+ path_src=get_next_arg_add_prefix(prefix_path,'path_src')
196
+ path_dst=get_next_arg_add_prefix(prefix_path,'path_dst')
197
+ resp=@api_node.create('files/rename',{ 'paths' => [{ 'path' => path_base, 'source' => path_src, 'destination' => path_dst }] })
197
198
  return c_result_translate_rem_prefix(resp,'entry','moved',prefix_path)
198
199
  when :browse
199
- thepath=get_next_arg_add_prefix(prefix_path,"path")
200
+ thepath=get_next_arg_add_prefix(prefix_path,'path')
200
201
  query={ path: thepath}
201
- additional_query=self.options.get_option(:query,:optional)
202
+ additional_query=options.get_option(:query,:optional)
202
203
  query.merge!(additional_query) unless additional_query.nil?
203
204
  send_result=@api_node.create('files/browse', query)[:data]
204
205
  #example: send_result={'items'=>[{'file'=>"filename1","permissions"=>[{'name'=>'read'},{'name'=>'write'}]}]}
205
206
  # if there is no items
206
207
  case send_result['self']['type']
207
208
  when 'directory','container' # directory: node, container: shares
208
- result={ data: send_result['items'] , type: :object_list, textify: lambda { |table_data| c_textify_browse(table_data) } }
209
+ result={ data: send_result['items'], type: :object_list, textify: lambda { |table_data| c_textify_browse(table_data) } }
209
210
  self.format.display_status("Items: #{send_result['item_count']}/#{send_result['total_count']}")
210
211
  else # 'file','symbolic_link'
211
- result={ data: send_result['self'] , type: :single_object}
212
+ result={ data: send_result['self'], type: :single_object}
212
213
  #result={ data: [send_result['self']] , type: :object_list, textify: lambda { |table_data| c_textify_browse(table_data) } }
213
214
  #raise "unknown type: #{send_result['self']['type']}"
214
215
  end
215
216
  return c_result_remove_prefix_path(result,'path',prefix_path)
216
217
  when :upload,:download
217
- token_type=self.options.get_option(:token_type,:optional)
218
+ token_type=options.get_option(:token_type,:optional)
218
219
  # nil if Shares 1.x
219
220
  token_type=:aspera if token_type.nil?
220
221
  case token_type
221
222
  when :aspera,:hybrid
222
- transfer_paths=case command
223
- when :upload;[ { destination: self.transfer.destination_folder('send') } ]
224
- when :download;self.transfer.ts_source_paths
223
+ transfer_paths=
224
+ case command
225
+ when :upload then[{ destination: transfer.destination_folder('send') }]
226
+ when :download then transfer.ts_source_paths
225
227
  end
226
228
  # only one request, so only one answer
227
- transfer_spec=@api_node.create("files/#{command}_setup",{ transfer_requests: [ { transfer_request: {
229
+ transfer_spec=@api_node.create("files/#{command}_setup",{ transfer_requests: [{ transfer_request: {
228
230
  paths: transfer_paths
229
- }.deep_merge(@add_request_param) } ] } )[:data]['transfer_specs'].first['transfer_spec']
231
+ }.deep_merge(@add_request_param) }] })[:data]['transfer_specs'].first['transfer_spec']
230
232
  # delete this part, as the returned value contains only destination, and not sources
231
233
  transfer_spec.delete('paths') if command.eql?(:upload)
232
234
  when :basic
233
- raise "shall have auth" unless @api_node.params[:auth].is_a?(Hash)
234
- raise "shall be basic auth" unless @api_node.params[:auth][:type].eql?(:basic)
235
+ raise 'shall have auth' unless @api_node.params[:auth].is_a?(Hash)
236
+ raise 'shall be basic auth' unless @api_node.params[:auth][:type].eql?(:basic)
237
+ ts_direction=
238
+ case command
239
+ when :upload then Fasp::TransferSpec::DIRECTION_SEND
240
+ when :download then Fasp::TransferSpec::DIRECTION_RECEIVE
241
+ else raise 'Error: need upload or download'
242
+ end
235
243
  transfer_spec={
236
- 'remote_host'=>URI.parse(@api_node.params[:base_url]).host,
237
- 'remote_user'=>Aspera::Fasp::Default::ACCESS_KEY_TRANSFER_USER,
238
- 'ssh_port' =>Aspera::Fasp::Default::SSH_PORT,
239
- 'direction' =>case command;when :upload;'send';when :download;'recv';else raise "Error";end
244
+ 'remote_host' =>URI.parse(@api_node.params[:base_url]).host,
245
+ 'remote_user' =>Aspera::Fasp::TransferSpec::ACCESS_KEY_TRANSFER_USER,
246
+ 'ssh_port' =>Aspera::Fasp::TransferSpec::SSH_PORT,
247
+ 'direction' =>ts_direction,
248
+ 'destination_root'=>transfer.destination_folder(ts_direction)
240
249
  }.deep_merge(@add_request_param)
241
250
  else raise "ERROR: token_type #{tt}"
242
251
  end
243
252
  if [:basic,:hybrid].include?(token_type)
244
253
  Aspera::Node.set_ak_basic_token(transfer_spec,@api_node.params[:auth][:username],@api_node.params[:auth][:password])
245
254
  end
246
- return Main.result_transfer(self.transfer.start(transfer_spec,{ src: :node_gen3}))
255
+ return Main.result_transfer(transfer.start(transfer_spec,{ src: :node_gen3}))
247
256
  when :api_details
248
257
  return { type: :single_object, data: @api_node.params }
249
258
  end
250
259
  end
251
260
 
252
261
  def execute_async
253
- command=self.options.get_next_command([:list,:delete,:files,:show,:counters,:bandwidth])
262
+ command=options.get_next_command([:list,:delete,:files,:show,:counters,:bandwidth])
254
263
  unless command.eql?(:list)
255
- asyncname=self.options.get_option(:sync_name,:optional)
264
+ asyncname=options.get_option(:sync_name,:optional)
256
265
  if asyncname.nil?
257
- asyncid=self.instance_identifier()
258
- if asyncid.eql?('ALL') and [:show,:delete].include?(command)
266
+ asyncid=instance_identifier()
267
+ if asyncid.eql?('ALL') && [:show,:delete].include?(command)
259
268
  asyncids=@api_node.read('async/list')[:data]['sync_ids']
260
269
  else
261
270
  Integer(asyncid) # must be integer
@@ -274,42 +283,39 @@ module Aspera
274
283
  case command
275
284
  when :list
276
285
  resp=@api_node.read('async/list')[:data]['sync_ids']
277
- return { type: :value_list, data: resp, name: 'id' }
286
+ return { type: :value_list, data: resp, name: 'id' }
278
287
  when :show
279
288
  resp=@api_node.create('async/summary',pdata)[:data]['sync_summaries']
280
289
  return Main.result_empty if resp.empty?
281
- if asyncid.eql?('ALL')
282
- return { type: :object_list, data: resp, fields: ['snid','name','local_dir','remote_dir'] }
283
- else
284
- return { type: :single_object, data: resp.first }
285
- end
290
+ return { type: :object_list, data: resp, fields: ['snid','name','local_dir','remote_dir'] } if asyncid.eql?('ALL')
291
+ return { type: :single_object, data: resp.first }
286
292
  when :delete
287
293
  resp=@api_node.create('async/delete',pdata)[:data]
288
- return { type: :single_object, data: resp, name: 'id' }
294
+ return { type: :single_object, data: resp, name: 'id' }
289
295
  when :bandwidth
290
- pdata['seconds']=100 # TODO: as parameter with --value
296
+ pdata['seconds']=100 # TODO: as parameter with --value
291
297
  resp=@api_node.create('async/bandwidth',pdata)[:data]
292
298
  data=resp['bandwidth_data']
293
299
  return Main.result_empty if data.empty?
294
300
  data=data.first[asyncid]['data']
295
- return { type: :object_list, data: data, name: 'id' }
301
+ return { type: :object_list, data: data, name: 'id' }
296
302
  when :files
297
303
  # count int
298
304
  # filename str
299
305
  # skip int
300
306
  # status int
301
- filter=self.options.get_option(:value,:optional)
307
+ filter=options.get_option(:value,:optional)
302
308
  pdata.merge!(filter) unless filter.nil?
303
309
  resp=@api_node.create('async/files',pdata)[:data]
304
310
  data=resp['sync_files']
305
311
  data=data.first[asyncid] unless data.empty?
306
312
  iteration_data=[]
307
313
  skip_ids_persistency=nil
308
- if self.options.get_option(:once_only,:mandatory)
314
+ if options.get_option(:once_only,:mandatory)
309
315
  skip_ids_persistency=PersistencyActionOnce.new(
310
316
  manager: @agents[:persistency],
311
317
  data: iteration_data,
312
- id: IdGenerator.from_list(['sync_files',self.options.get_option(:url,:mandatory),self.options.get_option(:username,:mandatory),asyncid]))
318
+ id: IdGenerator.from_list(['sync_files',options.get_option(:url,:mandatory),options.get_option(:username,:mandatory),asyncid]))
313
319
  unless iteration_data.first.nil?
314
320
  data.select!{|l| l['fnid'].to_i>iteration_data.first}
315
321
  end
@@ -317,57 +323,58 @@ module Aspera
317
323
  end
318
324
  return Main.result_empty if data.empty?
319
325
  skip_ids_persistency.save unless skip_ids_persistency.nil?
320
- return { type: :object_list, data: data, name: 'id' }
326
+ return { type: :object_list, data: data, name: 'id' }
321
327
  when :counters
322
- resp=@api_node.create('async/counters',pdata)[:data]["sync_counters"].first[asyncid].last
328
+ resp=@api_node.create('async/counters',pdata)[:data]['sync_counters'].first[asyncid].last
323
329
  return Main.result_empty if resp.nil?
324
330
  return { type: :single_object, data: resp }
325
331
  end
326
332
  end
327
333
 
328
- ACTIONS=[ :postprocess,:stream, :transfer, :cleanup, :forward, :access_key, :watch_folder, :service, :async, :central, :asperabrowser, :basic_token ].concat(COMMON_ACTIONS)
334
+ ACTIONS=[:postprocess,:stream, :transfer, :cleanup, :forward, :access_key, :watch_folder, :service, :async, :central, :asperabrowser, :basic_token].concat(COMMON_ACTIONS)
329
335
 
330
336
  def execute_action(command=nil,prefix_path=nil)
331
- command||=self.options.get_next_command(ACTIONS)
337
+ command||=options.get_next_command(ACTIONS)
332
338
  case command
333
- when *COMMON_ACTIONS; return execute_simple_common(command,prefix_path)
334
- when :async; return execute_async()
339
+ when *COMMON_ACTIONS then return execute_simple_common(command,prefix_path)
340
+ when :async then return execute_async()
335
341
  when :stream
336
- command=self.options.get_next_command([ :list, :create, :show, :modify, :cancel ])
342
+ command=options.get_next_command([:list, :create, :show, :modify, :cancel])
337
343
  case command
338
344
  when :list
339
- resp=@api_node.read('ops/transfers',self.options.get_option(:value,:optional))
340
- return { type: :object_list, data: resp[:data], fields: ['id','status'] } # TODO: useful?
345
+ resp=@api_node.read('ops/transfers',options.get_option(:value,:optional))
346
+ return { type: :object_list, data: resp[:data], fields: ['id','status'] } # TODO: useful?
341
347
  when :create
342
- resp=@api_node.create('streams',self.options.get_option(:value,:mandatory))
348
+ resp=@api_node.create('streams',options.get_option(:value,:mandatory))
343
349
  return { type: :single_object, data: resp[:data] }
344
350
  when :show
345
- trid=self.options.get_next_argument("transfer id")
351
+ trid=options.get_next_argument('transfer id')
346
352
  resp=@api_node.read('ops/transfers/'+trid)
347
353
  return { type: :other_struct, data: resp[:data] }
348
354
  when :modify
349
- trid=self.options.get_next_argument("transfer id")
350
- resp=@api_node.update('streams/'+trid,self.options.get_option(:value,:mandatory))
355
+ trid=options.get_next_argument('transfer id')
356
+ resp=@api_node.update('streams/'+trid,options.get_option(:value,:mandatory))
351
357
  return { type: :other_struct, data: resp[:data] }
352
358
  when :cancel
353
- trid=self.options.get_next_argument("transfer id")
359
+ trid=options.get_next_argument('transfer id')
354
360
  resp=@api_node.cancel('streams/'+trid)
355
361
  return { type: :other_struct, data: resp[:data] }
356
362
  else
357
- raise "error"
363
+ raise 'error'
358
364
  end
359
365
  when :transfer
360
- command=self.options.get_next_command([ :list, :cancel, :show ])
366
+ command=options.get_next_command([:list, :cancel, :show])
361
367
  res_class_path='ops/transfers'
362
368
  if [:cancel, :show].include?(command)
363
- one_res_id=self.instance_identifier()
369
+ one_res_id=instance_identifier()
364
370
  one_res_path="#{res_class_path}/#{one_res_id}"
365
371
  end
366
372
  case command
367
373
  when :list
368
374
  # could use ? subpath: 'transfers'
369
- resp=@api_node.read(res_class_path,self.options.get_option(:value,:optional))
370
- return { type: :object_list, data: resp[:data], fields: ['id','status','start_spec.direction','start_spec.remote_user','start_spec.remote_host','start_spec.destination_path']}
375
+ resp=@api_node.read(res_class_path,options.get_option(:value,:optional))
376
+ return { type: :object_list, data: resp[:data],
377
+ fields: ['id','status','start_spec.direction','start_spec.remote_user','start_spec.remote_host','start_spec.destination_path']}
371
378
  when :cancel
372
379
  resp=@api_node.cancel(one_res_path)
373
380
  return { type: :other_struct, data: resp[:data] }
@@ -375,34 +382,33 @@ module Aspera
375
382
  resp=@api_node.read(one_res_path)
376
383
  return { type: :other_struct, data: resp[:data] }
377
384
  else
378
- raise "error"
385
+ raise 'error'
379
386
  end
380
387
  when :access_key
381
- return self.entity_action(@api_node,'access_keys',nil,:id,'self')
388
+ return entity_action(@api_node,'access_keys',id_default: 'self')
382
389
  when :service
383
- command=self.options.get_next_command([ :list, :create, :delete])
390
+ command=options.get_next_command([:list, :create, :delete])
384
391
  if [:delete].include?(command)
385
- svcid=self.instance_identifier()
392
+ svcid=instance_identifier()
386
393
  end
387
394
  case command
388
395
  when :list
389
396
  resp=@api_node.read('rund/services')
390
- return { type: :object_list, data: resp[:data]["services"] }
397
+ return { type: :object_list, data: resp[:data]['services'] }
391
398
  when :create
392
399
  # @json:'{"type":"WATCHFOLDERD","run_as":{"user":"user1"}}'
393
- params=self.options.get_next_argument("Run creation data (structure)")
400
+ params=options.get_next_argument('Run creation data (structure)')
394
401
  resp=@api_node.create('rund/services',params)
395
402
  return Main.result_status("#{resp[:data]['id']} created")
396
403
  when :delete
397
- resp=@api_node.delete("rund/services/#{svcid}")
404
+ @api_node.delete("rund/services/#{svcid}")
398
405
  return Main.result_status("#{svcid} deleted")
399
406
  end
400
407
  when :watch_folder
401
408
  res_class_path='v3/watchfolders'
402
- #return entity_action(@api_node,'v3/watchfolders',nil,:id)
403
- command=self.options.get_next_command([ :create, :list, :show, :modify, :delete, :state])
409
+ command=options.get_next_command([:create, :list, :show, :modify, :delete, :state])
404
410
  if [:show,:modify,:delete,:state].include?(command)
405
- one_res_id=self.instance_identifier()
411
+ one_res_id=instance_identifier()
406
412
  one_res_path="#{res_class_path}/#{one_res_id}"
407
413
  end
408
414
  # hum, to avoid: Unable to convert 2016_09_14 configuration
@@ -410,15 +416,15 @@ module Aspera
410
416
  @api_node.params[:headers]['X-aspera-WF-version']='2017_10_23'
411
417
  case command
412
418
  when :create
413
- resp=@api_node.create(res_class_path,self.options.get_option(:value,:mandatory))
419
+ resp=@api_node.create(res_class_path,options.get_option(:value,:mandatory))
414
420
  return Main.result_status("#{resp[:data]['id']} created")
415
421
  when :list
416
- resp=@api_node.read(res_class_path,self.options.get_option(:value,:optional))
422
+ resp=@api_node.read(res_class_path,options.get_option(:value,:optional))
417
423
  return { type: :value_list, data: resp[:data]['ids'], name: 'id' }
418
424
  when :show
419
425
  return { type: :single_object, data: @api_node.read(one_res_path)[:data]}
420
426
  when :modify
421
- @api_node.update(one_res_path,self.options.get_option(:value,:mandatory))
427
+ @api_node.update(one_res_path,options.get_option(:value,:mandatory))
422
428
  return Main.result_status("#{one_res_id} updated")
423
429
  when :delete
424
430
  @api_node.delete(one_res_path)
@@ -427,29 +433,30 @@ module Aspera
427
433
  return { type: :single_object, data: @api_node.read("#{one_res_path}/state")[:data] }
428
434
  end
429
435
  when :central
430
- command=self.options.get_next_command([ :session,:file])
431
- validator_id=self.options.get_option(:validator)
432
- validation={"validator_id"=>validator_id} unless validator_id.nil?
433
- request_data=self.options.get_option(:value,:optional)
436
+ command=options.get_next_command([:session,:file])
437
+ validator_id=options.get_option(:validator)
438
+ validation={'validator_id'=>validator_id} unless validator_id.nil?
439
+ request_data=options.get_option(:value,:optional)
434
440
  request_data||={}
435
441
  case command
436
442
  when :session
437
- command=self.options.get_next_command([ :list])
443
+ command=options.get_next_command([:list])
438
444
  case command
439
445
  when :list
440
- request_data.deep_merge!({"validation"=>validation}) unless validation.nil?
446
+ request_data.deep_merge!({'validation'=>validation}) unless validation.nil?
441
447
  resp=@api_node.create('services/rest/transfers/v1/sessions',request_data)
442
- return { type: :object_list, data: resp[:data]["session_info_result"]["session_info"], fields: ["session_uuid","status","transport","direction","bytes_transferred"]}
448
+ return { type: :object_list, data: resp[:data]['session_info_result']['session_info'],
449
+ fields: ['session_uuid','status','transport','direction','bytes_transferred']}
443
450
  end
444
451
  when :file
445
- command=self.options.get_next_command([ :list, :modify])
452
+ command=options.get_next_command([:list, :modify])
446
453
  case command
447
454
  when :list
448
455
  request_data.deep_merge!({'validation'=>validation}) unless validation.nil?
449
456
  resp=@api_node.create('services/rest/transfers/v1/files',request_data)[:data]
450
457
  resp=JSON.parse(resp) if resp.is_a?(String)
451
458
  Log.dump(:resp,resp)
452
- return { type: :object_list, data: resp['file_transfer_info_result']['file_transfer_info'], fields: ["session_uuid","file_id","status","path"]}
459
+ return { type: :object_list, data: resp['file_transfer_info_result']['file_transfer_info'], fields: ['session_uuid','file_id','status','path']}
453
460
  when :modify
454
461
  request_data.deep_merge!(validation) unless validation.nil?
455
462
  @api_node.update('services/rest/transfers/v1/files',request_data)
@@ -458,18 +465,18 @@ module Aspera
458
465
  end
459
466
  when :asperabrowser
460
467
  browse_params={
461
- 'nodeUser' => self.options.get_option(:username,:mandatory),
462
- 'nodePW' => self.options.get_option(:password,:mandatory),
463
- 'nodeURL' => self.options.get_option(:url,:mandatory)
468
+ 'nodeUser' => options.get_option(:username,:mandatory),
469
+ 'nodePW' => options.get_option(:password,:mandatory),
470
+ 'nodeURL' => options.get_option(:url,:mandatory)
464
471
  }
465
472
  # encode parameters so that it looks good in url
466
473
  encoded_params=Base64.strict_encode64(Zlib::Deflate.deflate(JSON.generate(browse_params))).gsub(/=+$/, '').tr('+/', '-_').reverse
467
- OpenApplication.instance.uri(self.options.get_option(:asperabrowserurl)+'?goto='+encoded_params)
474
+ OpenApplication.instance.uri(options.get_option(:asperabrowserurl)+'?goto='+encoded_params)
468
475
  return Main.result_status('done')
469
476
  when :basic_token
470
- return Main.result_status("Basic "+Base64.strict_encode64("#{self.options.get_option(:username,:mandatory)}:#{self.options.get_option(:password,:mandatory)}"))
477
+ return Main.result_status('Basic '+Base64.strict_encode64("#{options.get_option(:username,:mandatory)}:#{options.get_option(:password,:mandatory)}"))
471
478
  end # case command
472
- raise "ERROR: shall not reach this line"
479
+ raise 'ERROR: shall not reach this line'
473
480
  end # execute_action
474
481
  end # Main
475
482
  end # Plugin