aspera-cli 4.6.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.
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ require 'English'
1
3
  require 'singleton'
2
4
  require 'aspera/log'
3
5
  require 'aspera/environment'
@@ -6,6 +8,7 @@ require 'xmlsimple'
6
8
  require 'zlib'
7
9
  require 'base64'
8
10
  require 'fileutils'
11
+ require 'openssl'
9
12
 
10
13
  module Aspera
11
14
  module Fasp
@@ -18,6 +21,7 @@ module Aspera
18
21
  # Installation.instance.ascp_path=""
19
22
  class Installation
20
23
  include Singleton
24
+ # known product names
21
25
  PRODUCT_CONNECT='Aspera Connect'
22
26
  PRODUCT_CLI_V1='Aspera CLI'
23
27
  PRODUCT_DRIVE='Aspera Drive'
@@ -25,23 +29,48 @@ module Aspera
25
29
  # protobuf generated files from sdk
26
30
  EXT_RUBY_PROTOBUF='_pb.rb'
27
31
  RB_SDK_FOLDER='lib'
28
- MAX_REDIRECT_SDK=2
29
- private_constant :MAX_REDIRECT_SDK
32
+ ONE_YEAR_SECONDS=365 * 24 * 60 * 60
33
+ DEFAULT_ASPERA_CONF=<<~END_OF_CONFIG_FILE
34
+ <?xml version='1.0' encoding='UTF-8'?>
35
+ <CONF version="2">
36
+ <default>
37
+ <file_system>
38
+ <resume_suffix>.aspera-ckpt</resume_suffix>
39
+ <partial_file_suffix>.partial</partial_file_suffix>
40
+ </file_system>
41
+ </default>
42
+ </CONF>
43
+ END_OF_CONFIG_FILE
44
+ private_constant :PRODUCT_CONNECT,:PRODUCT_CLI_V1,:PRODUCT_DRIVE,:PRODUCT_ENTSRV,:EXT_RUBY_PROTOBUF,:RB_SDK_FOLDER,:ONE_YEAR_SECONDS,:DEFAULT_ASPERA_CONF
30
45
  # set ascp executable path
31
46
  def ascp_path=(v)
32
47
  @path_to_ascp=v
33
48
  end
34
49
 
50
+ def ascp_path
51
+ path(:ascp)
52
+ end
53
+
35
54
  def sdk_ruby_folder
36
- ruby_pb_folder=File.join(folder_path,RB_SDK_FOLDER)
55
+ ruby_pb_folder=File.join(sdk_folder,RB_SDK_FOLDER)
37
56
  FileUtils.mkdir_p(ruby_pb_folder) unless Dir.exist?(ruby_pb_folder)
38
57
  return ruby_pb_folder
39
58
  end
40
59
 
41
60
  # location of SDK files
42
- def folder=(v)
43
- @sdk_folder=v
44
- folder_path
61
+ def sdk_folder=(v)
62
+ @sdk_dir=v
63
+ sdk_folder
64
+ end
65
+
66
+ # backward compatibility in sample program
67
+ alias folder= sdk_folder=
68
+
69
+ # @return the path to folder where SDK is installed
70
+ def sdk_folder
71
+ raise 'SDK path was ot initialized' if @sdk_dir.nil?
72
+ FileUtils.mkdir_p(@sdk_dir) unless Dir.exist?(@sdk_dir)
73
+ @sdk_dir
45
74
  end
46
75
 
47
76
  # find ascp in named product (use value : FIRST_FOUND='FIRST' to just use first one)
@@ -64,9 +93,9 @@ module Aspera
64
93
  scan_locations=product_locations.clone
65
94
  # add SDK as first search path
66
95
  scan_locations.unshift({
67
- :expected =>'SDK',
68
- :app_root =>folder_path,
69
- :sub_bin =>''
96
+ expected: 'SDK',
97
+ app_root: sdk_folder,
98
+ sub_bin: ''
70
99
  })
71
100
  # search installed products: with ascp
72
101
  @found_products=scan_locations.select! do |item|
@@ -107,45 +136,36 @@ module Aspera
107
136
  when :transferd
108
137
  file=transferd_filepath
109
138
  when :ssh_bypass_key_dsa
110
- file=File.join(folder_path,'aspera_bypass_dsa.pem')
139
+ file=File.join(sdk_folder,'aspera_bypass_dsa.pem')
111
140
  File.write(file,get_key('dsa',1)) unless File.exist?(file)
112
141
  File.chmod(0400,file)
113
142
  when :ssh_bypass_key_rsa
114
- file=File.join(folder_path,'aspera_bypass_rsa.pem')
143
+ file=File.join(sdk_folder,'aspera_bypass_rsa.pem')
115
144
  File.write(file,get_key('rsa',2)) unless File.exist?(file)
116
145
  File.chmod(0400,file)
117
146
  when :aspera_license
118
- file=File.join(folder_path,'aspera-license')
119
- File.write(file,Base64.strict_encode64("#{Zlib::Inflate.inflate(DataRepository.instance.get_bin(6))}==SIGNATURE==\n#{Base64.strict_encode64(DataRepository.instance.get_bin(7))}")) unless File.exist?(file)
147
+ file=File.join(sdk_folder,'aspera-license')
148
+ File.write(file,Base64.strict_encode64("#{Zlib::Inflate.inflate(DataRepository.instance.data(6))}==SIGNATURE==\n#{Base64.strict_encode64(DataRepository.instance.data(7))}")) unless File.exist?(file)
120
149
  File.chmod(0400,file)
121
150
  when :aspera_conf
122
- file=File.join(folder_path,'aspera.conf')
123
- File.write(file,%Q{<?xml version='1.0' encoding='UTF-8'?>
124
- <CONF version="2">
125
- <default>
126
- <file_system>
127
- <resume_suffix>.aspera-ckpt</resume_suffix>
128
- <partial_file_suffix>.partial</partial_file_suffix>
129
- </file_system>
130
- </default>
131
- </CONF>
132
- }) unless File.exist?(file)
151
+ file=File.join(sdk_folder,'aspera.conf')
152
+ File.write(file,DEFAULT_ASPERA_CONF) unless File.exist?(file)
133
153
  File.chmod(0400,file)
134
154
  when :fallback_cert,:fallback_key
135
- file_key=File.join(folder_path,'aspera_fallback_key.pem')
136
- file_cert=File.join(folder_path,'aspera_fallback_cert.pem')
137
- if !File.exist?(file_key) or !File.exist?(file_cert)
155
+ file_key=File.join(sdk_folder,'aspera_fallback_key.pem')
156
+ file_cert=File.join(sdk_folder,'aspera_fallback_cert.pem')
157
+ if !File.exist?(file_key) || !File.exist?(file_cert)
138
158
  require 'openssl'
139
159
  # create new self signed certificate for http fallback
140
160
  private_key = OpenSSL::PKey::RSA.new(1024)
141
161
  cert = OpenSSL::X509::Certificate.new
142
- cert.subject = cert.issuer = OpenSSL::X509::Name.parse("/C=US/ST=California/L=Emeryville/O=Aspera Inc./OU=Corporate/CN=Aspera Inc./emailAddress=info@asperasoft.com")
162
+ cert.subject = cert.issuer = OpenSSL::X509::Name.parse('/C=US/ST=California/L=Emeryville/O=Aspera Inc./OU=Corporate/CN=Aspera Inc./emailAddress=info@asperasoft.com')
143
163
  cert.not_before = Time.now
144
- cert.not_after = Time.now + 365 * 24 * 60 * 60
164
+ cert.not_after = Time.now + ONE_YEAR_SECONDS
145
165
  cert.public_key = private_key.public_key
146
166
  cert.serial = 0x0
147
167
  cert.version = 2
148
- cert.sign(private_key, OpenSSL::Digest::SHA1.new)
168
+ cert.sign(private_key, OpenSSL::Digest.new('SHA1'))
149
169
  File.write(file_key,private_key.to_pem)
150
170
  File.write(file_cert,cert.to_pem)
151
171
  File.chmod(0400,file_key)
@@ -167,7 +187,7 @@ module Aspera
167
187
  uri_file=File.join(folder,"http#{ext}.uri")
168
188
  Log.log.debug("checking connect port file: #{uri_file}")
169
189
  if File.exist?(uri_file)
170
- return File.open(uri_file){|f|f.gets}.strip
190
+ return File.open(uri_file, &:gets).strip
171
191
  end
172
192
  end
173
193
  raise "no connect uri file found in #{folder}"
@@ -181,7 +201,7 @@ module Aspera
181
201
 
182
202
  # default bypass key phrase
183
203
  def bypass_pass
184
- return "%08x-%04x-%04x-%04x-%04x%08x" % DataRepository.instance.get_bin(3).unpack("NnnnnN")
204
+ return format('%08x-%04x-%04x-%04x-%04x%08x',*DataRepository.instance.data(3).unpack('NnnnnN'))
185
205
  end
186
206
 
187
207
  def bypass_keys
@@ -195,13 +215,13 @@ module Aspera
195
215
 
196
216
  # Check that specified path is ascp and get version
197
217
  def get_exe_version(exe_path,vers_arg)
198
- raise "ERROR: nil arg" if exe_path.nil?
218
+ raise 'ERROR: nil arg' if exe_path.nil?
199
219
  return nil unless File.exist?(exe_path)
200
220
  exe_version=nil
201
- cmd_out=%x{"#{exe_path}" #{vers_arg}}
202
- raise "An error occured when testing #{ascp_filename}: #{cmd_out}" unless $? == 0
221
+ cmd_out=%x("#{exe_path}" #{vers_arg})
222
+ raise "An error occured when testing #{ascp_filename}: #{cmd_out}" unless $CHILD_STATUS == 0
203
223
  # get version from ascp, only after full extract, as windows requires DLLs (SSL/TLS/etc...)
204
- m=cmd_out.match(/ version ([0-9\.]+)/)
224
+ m=cmd_out.match(/ version ([0-9.]+)/)
205
225
  exe_version=m[1] unless m.nil?
206
226
  return exe_version
207
227
  end
@@ -220,9 +240,9 @@ module Aspera
220
240
  Aspera::Rest.new(base_url: sdk_url, redirect_max: 3).call(operation: 'GET',save_to_file: sdk_zip_path)
221
241
  end
222
242
  # rename old install
223
- if ! Dir.empty?(folder_path)
224
- Log.log.warn("Previous install exists, renaming folder.")
225
- File.rename(folder_path,"#{folder_path}.#{Time.now.strftime("%Y%m%d%H%M%S")}")
243
+ if !Dir.empty?(sdk_folder)
244
+ Log.log.warn('Previous install exists, renaming folder.')
245
+ File.rename(sdk_folder,"#{sdk_folder}.#{Time.now.strftime('%Y%m%d%H%M%S')}")
226
246
  # TODO: delete old archives ?
227
247
  end
228
248
  # SDK is organized by architecture
@@ -234,31 +254,30 @@ module Aspera
234
254
  next if entry.name.end_with?('/')
235
255
  dest_folder=nil
236
256
  # binaries
237
- dest_folder=folder_path if entry.name.include?(arch_filter)
257
+ dest_folder=sdk_folder if entry.name.include?(arch_filter)
238
258
  # ruby adapters
239
259
  dest_folder=sdk_ruby_folder if entry.name.end_with?(EXT_RUBY_PROTOBUF)
240
- if !dest_folder.nil?
241
- File.open(File.join(dest_folder,File.basename(entry.name)), 'wb') do |output_stream|
242
- IO.copy_stream(entry.get_input_stream, output_stream)
243
- end
260
+ next if dest_folder.nil?
261
+ File.open(File.join(dest_folder,File.basename(entry.name)), 'wb') do |output_stream|
262
+ IO.copy_stream(entry.get_input_stream, output_stream)
244
263
  end
245
264
  end
246
265
  end
247
266
  File.unlink(sdk_zip_path) rescue nil # Windows may give error
248
267
  # ensure license file are generated so that ascp invokation for version works
249
- self.path(:aspera_license)
250
- self.path(:aspera_conf)
251
- ascp_path=File.join(folder_path,ascp_filename)
268
+ path(:aspera_license)
269
+ path(:aspera_conf)
270
+ ascp_path=File.join(sdk_folder,ascp_filename)
252
271
  raise "No #{ascp_filename} found in SDK archive" unless File.exist?(ascp_path)
253
272
  FileUtils.chmod(0755,ascp_path)
254
273
  FileUtils.chmod(0755,ascp_path.gsub('ascp','ascp4'))
255
- ascp_version=get_ascp_version(File.join(folder_path,ascp_filename))
274
+ ascp_version=get_ascp_version(File.join(sdk_folder,ascp_filename))
256
275
  trd_path=transferd_filepath
257
276
  Log.log.warn("No #{trd_path} in SDK archive") unless File.exist?(trd_path)
258
277
  FileUtils.chmod(0755,trd_path) if File.exist?(trd_path)
259
278
  transferd_version=get_exe_version(trd_path,'version')
260
279
  sdk_version = transferd_version||ascp_version
261
- File.write(File.join(folder_path,PRODUCT_INFO),"<product><name>IBM Aspera SDK</name><version>#{sdk_version}</version></product>")
280
+ File.write(File.join(sdk_folder,PRODUCT_INFO),"<product><name>IBM Aspera SDK</name><version>#{sdk_version}</version></product>")
262
281
  return sdk_version
263
282
  end
264
283
 
@@ -276,7 +295,7 @@ module Aspera
276
295
 
277
296
  def initialize
278
297
  @path_to_ascp=nil
279
- @sdk_folder=nil
298
+ @sdk_dir=nil
280
299
  @found_products=nil
281
300
  end
282
301
 
@@ -288,20 +307,13 @@ module Aspera
288
307
  return found.first
289
308
  end
290
309
 
291
- # @return the path to folder where SDK is installed
292
- def folder_path
293
- raise "Undefined path to SDK" if @sdk_folder.nil?
294
- FileUtils.mkdir_p(@sdk_folder) unless Dir.exist?(@sdk_folder)
295
- @sdk_folder
296
- end
297
-
298
310
  # filename for ascp with optional extension (Windows)
299
311
  def ascp_filename
300
312
  return 'ascp'+Environment.exe_extension
301
313
  end
302
314
 
303
315
  def transferd_filepath
304
- return File.join(folder_path,'asperatransferd'+Environment.exe_extension)
316
+ return File.join(sdk_folder,'asperatransferd'+Environment.exe_extension)
305
317
  end
306
318
 
307
319
  # @return product folders depending on OS fields
@@ -313,49 +325,49 @@ module Aspera
313
325
  def product_locations
314
326
  case Aspera::Environment.os
315
327
  when Aspera::Environment::OS_WINDOWS; return [{
316
- :expected =>PRODUCT_CONNECT,
317
- :app_root =>File.join(ENV['LOCALAPPDATA'],'Programs','Aspera','Aspera Connect'),
318
- :log_root =>File.join(ENV['LOCALAPPDATA'],'Aspera','Aspera Connect','var','log'),
319
- :run_root =>File.join(ENV['LOCALAPPDATA'],'Aspera','Aspera Connect')
328
+ expected: PRODUCT_CONNECT,
329
+ app_root: File.join(ENV['LOCALAPPDATA'],'Programs','Aspera','Aspera Connect'),
330
+ log_root: File.join(ENV['LOCALAPPDATA'],'Aspera','Aspera Connect','var','log'),
331
+ run_root: File.join(ENV['LOCALAPPDATA'],'Aspera','Aspera Connect')
320
332
  },{
321
- :expected =>PRODUCT_CLI_V1,
322
- :app_root =>File.join('C:','Program Files','Aspera','cli'),
323
- :log_root =>File.join('C:','Program Files','Aspera','cli','var','log'),
333
+ expected: PRODUCT_CLI_V1,
334
+ app_root: File.join('C:','Program Files','Aspera','cli'),
335
+ log_root: File.join('C:','Program Files','Aspera','cli','var','log')
324
336
  },{
325
- :expected =>PRODUCT_ENTSRV,
326
- :app_root =>File.join('C:','Program Files','Aspera','Enterprise Server'),
327
- :log_root =>File.join('C:','Program Files','Aspera','Enterprise Server','var','log'),
337
+ expected: PRODUCT_ENTSRV,
338
+ app_root: File.join('C:','Program Files','Aspera','Enterprise Server'),
339
+ log_root: File.join('C:','Program Files','Aspera','Enterprise Server','var','log')
328
340
  }]
329
341
  when Aspera::Environment::OS_X; return [{
330
- :expected =>PRODUCT_CONNECT,
331
- :app_root =>File.join(Dir.home,'Applications','Aspera Connect.app'),
332
- :log_root =>File.join(Dir.home,'Library','Logs','Aspera_Connect'),
333
- :run_root =>File.join(Dir.home,'Library','Application Support','Aspera','Aspera Connect'),
334
- :sub_bin =>File.join('Contents','Resources'),
342
+ expected: PRODUCT_CONNECT,
343
+ app_root: File.join(Dir.home,'Applications','Aspera Connect.app'),
344
+ log_root: File.join(Dir.home,'Library','Logs','Aspera_Connect'),
345
+ run_root: File.join(Dir.home,'Library','Application Support','Aspera','Aspera Connect'),
346
+ sub_bin: File.join('Contents','Resources')
335
347
  },{
336
- :expected =>PRODUCT_CLI_V1,
337
- :app_root =>File.join(Dir.home,'Applications','Aspera CLI'),
338
- :log_root =>File.join(Dir.home,'Library','Logs','Aspera')
348
+ expected: PRODUCT_CLI_V1,
349
+ app_root: File.join(Dir.home,'Applications','Aspera CLI'),
350
+ log_root: File.join(Dir.home,'Library','Logs','Aspera')
339
351
  },{
340
- :expected =>PRODUCT_ENTSRV,
341
- :app_root =>File.join('','Library','Aspera'),
342
- :log_root =>File.join(Dir.home,'Library','Logs','Aspera'),
352
+ expected: PRODUCT_ENTSRV,
353
+ app_root: File.join('','Library','Aspera'),
354
+ log_root: File.join(Dir.home,'Library','Logs','Aspera')
343
355
  },{
344
- :expected =>PRODUCT_DRIVE,
345
- :app_root =>File.join('','Applications','Aspera Drive.app'),
346
- :log_root =>File.join(Dir.home,'Library','Logs','Aspera_Drive'),
347
- :sub_bin =>File.join('Contents','Resources'),
356
+ expected: PRODUCT_DRIVE,
357
+ app_root: File.join('','Applications','Aspera Drive.app'),
358
+ log_root: File.join(Dir.home,'Library','Logs','Aspera_Drive'),
359
+ sub_bin: File.join('Contents','Resources')
348
360
  }]
349
- else; return [{ # other: Linux and Unix family
350
- :expected =>PRODUCT_CONNECT,
351
- :app_root =>File.join(Dir.home,'.aspera','connect'),
352
- :run_root =>File.join(Dir.home,'.aspera','connect')
361
+ else; return [{ # other: Linux and Unix family
362
+ expected: PRODUCT_CONNECT,
363
+ app_root: File.join(Dir.home,'.aspera','connect'),
364
+ run_root: File.join(Dir.home,'.aspera','connect')
353
365
  },{
354
- :expected =>PRODUCT_CLI_V1,
355
- :app_root =>File.join(Dir.home,'.aspera','cli'),
366
+ expected: PRODUCT_CLI_V1,
367
+ app_root: File.join(Dir.home,'.aspera','cli')
356
368
  },{
357
- :expected =>PRODUCT_ENTSRV,
358
- :app_root =>File.join('','opt','aspera'),
369
+ expected: PRODUCT_ENTSRV,
370
+ app_root: File.join('','opt','aspera')
359
371
  }]
360
372
  end
361
373
  end
@@ -365,10 +377,10 @@ module Aspera
365
377
  # @param id in repository 1 for dsa, 2 for rsa
366
378
  def get_key(type,id)
367
379
  hf=['begin','end'].map{|t|"-----#{t} #{type} private key-----".upcase}
368
- bin=Base64.strict_encode64(DataRepository.instance.get_bin(id))
369
- hf.insert(1,bin).join("\n")
380
+ bin=Base64.strict_encode64(DataRepository.instance.data(id))
381
+ # validate valie and generate key in connonical format
382
+ OpenSSL::PKey.const_get(type.upcase).send(:new,hf.insert(1,bin).join("\n")).to_pem
370
383
  end
371
-
372
384
  end # Installation
373
385
  end
374
386
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Aspera
2
3
  module Fasp
3
4
  # imlement this class to get transfer events
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/log'
2
3
  require 'aspera/command_line_builder'
3
4
  require 'aspera/temp_file_manager'
@@ -5,7 +6,6 @@ require 'securerandom'
5
6
  require 'base64'
6
7
  require 'json'
7
8
  require 'yaml'
8
- require 'securerandom'
9
9
  require 'fileutils'
10
10
  require 'openssl'
11
11
 
@@ -13,68 +13,79 @@ module Aspera
13
13
  module Fasp
14
14
  # translate transfer specification to ascp parameter list
15
15
  class Parameters
16
- private
17
- # Temp folder for file lists, must contain only file lists
18
- # because of garbage collection takes any file there
19
- # this could be refined, as , for instance, on macos, temp folder is already user specific
20
- @@file_list_folder=TempFileManager.instance.new_file_path_global('asession_filelists')
21
- @@param_description_cache=nil
22
- # @return normaiwed description of transfer spec parameters
23
- def self.description
24
- return @@param_description_cache unless @@param_description_cache.nil?
25
- # config file in same folder with same name as this source
26
- @@param_description_cache=YAML.load_file("#{__FILE__[0..-3]}yaml")
27
- Aspera::CommandLineBuilder.normalize_description(@@param_description_cache)
28
- end
29
-
30
16
  # Agents shown in manual for parameters (sub list)
31
17
  SUPPORTED_AGENTS=[:direct,:node,:connect]
32
18
  # Short names of columns in manual
33
19
  SUPPORTED_AGENTS_SHORT=SUPPORTED_AGENTS.map{|a|a.to_s[0].to_sym}
34
20
 
35
- # @return a table suitable to display a manual
36
- def self.man_table
37
- result=[]
38
- description.keys.map do |k|
39
- i=description[k]
40
- param={name: k, type: [i[:accepted_types]].flatten.join(','),description: i[:desc]}
41
- SUPPORTED_AGENTS.each do |a|
42
- param[a.to_s[0].to_sym]=i[:context].nil? || i[:context].include?(a) ? 'Y' : ''
43
- end
44
- # only keep lines that are usable in supported agents
45
- next if SUPPORTED_AGENTS_SHORT.inject(true){|m,i|m and param[i].empty?}
46
- param[:cli]=case i[:cltype]
47
- when :envvar; 'env:'+i[:clvarname]
48
- when :opt_without_arg,:opt_with_arg; i[:option_switch]
49
- else ''
50
- end
51
- if i.has_key?(:enum)
52
- param[:description] << "\nAllowed values: #{i[:enum].join(', ')}"
21
+ class << self
22
+ # Temp folder for file lists, must contain only file lists
23
+ # because of garbage collection takes any file there
24
+ # this could be refined, as , for instance, on macos, temp folder is already user specific
25
+ @file_list_folder=TempFileManager.instance.new_file_path_global('asession_filelists')
26
+ @param_description_cache=nil
27
+ # @return normalized description of transfer spec parameters, direct from yaml
28
+ def description
29
+ return @param_description_cache unless @param_description_cache.nil?
30
+ # config file in same folder with same name as this source
31
+ @param_description_cache=YAML.load_file("#{__FILE__[0..-3]}yaml")
32
+ Aspera::CommandLineBuilder.normalize_description(@param_description_cache)
33
+ end
34
+
35
+ # @return a table suitable to display in manual
36
+ def man_table
37
+ result=[]
38
+ description.each do |k,i|
39
+ param={name: k, type: [i[:accepted_types]].flatten.join(','),description: i[:desc]}
40
+ SUPPORTED_AGENTS.each do |a|
41
+ param[a.to_s[0].to_sym]=i[:tragents].nil? || i[:tragents].include?(a) ? 'Y' : ''
42
+ end
43
+ # only keep lines that are usable in supported agents
44
+ next if SUPPORTED_AGENTS_SHORT.inject(true){|m,j|m && param[j].empty?}
45
+ param[:cli]=
46
+ case i[:cltype]
47
+ when :envvar then 'env:'+i[:clvarname]
48
+ when :opt_without_arg,:opt_with_arg then i[:clswitch]
49
+ else ''
50
+ end
51
+ if i.has_key?(:enum)
52
+ param[:description] += "\nAllowed values: #{i[:enum].join(', ')}"
53
+ end
54
+ result.push(param)
53
55
  end
54
- result.push(param)
56
+ return result
55
57
  end
56
- return result
57
- end
58
58
 
59
- # special encoding methods used in YAML (key: :encode)
60
- def self.encode_cipher(v)
61
- v.tr('-','')
62
- end
59
+ # special encoding methods used in YAML (key: :clconvert)
60
+ def clconv_remove_hyphen(v); v.tr('-',''); end
63
61
 
64
- # special encoding methods used in YAML (key: :encode)
65
- def self.encode_source_root(v)
66
- Base64.strict_encode64(v)
67
- end
62
+ # special encoding methods used in YAML (key: :clconvert)
63
+ def clconv_json64(v); Base64.strict_encode64(JSON.generate(v)); end
68
64
 
69
- # special encoding methods used in YAML (key: :encode)
70
- def self.encode_tags(v)
71
- Base64.strict_encode64(JSON.generate(v))
72
- end
65
+ # special encoding methods used in YAML (key: :clconvert)
66
+ def clconv_base64(v); Base64.strict_encode64(v); end
73
67
 
74
- def self.ts_has_file_list(ts)
75
- ts.has_key?('EX_ascp_args') and ts['EX_ascp_args'].is_a?(Array) and ['--file-list','--file-pair-list'].any?{|i|ts['EX_ascp_args'].include?(i)}
76
- end
68
+ def ts_has_file_list(ts)
69
+ ts.has_key?('EX_ascp_args') and ts['EX_ascp_args'].is_a?(Array) and ['--file-list','--file-pair-list'].any?{|i|ts['EX_ascp_args'].include?(i)}
70
+ end
77
71
 
72
+ def ts_to_env_args(transfer_spec,options)
73
+ return Parameters.new(transfer_spec,options).ascp_args()
74
+ end
75
+
76
+ # temp file list files are created here
77
+ def file_list_folder=(v)
78
+ @file_list_folder=v
79
+ return if @file_list_folder.nil?
80
+ FileUtils.mkdir_p(@file_list_folder)
81
+ TempFileManager.instance.cleanup_expired(@file_list_folder)
82
+ end
83
+
84
+ # static methods
85
+ attr_reader :file_list_folder
86
+ end # self
87
+
88
+ # @param options [Hash] key: :wss: bool
78
89
  def initialize(job_spec,options)
79
90
  @job_spec=job_spec
80
91
  @options=options
@@ -82,28 +93,26 @@ module Aspera
82
93
  Log.log.debug("agent options: #{@options}")
83
94
  end
84
95
 
85
- public
86
-
87
96
  # translate transfer spec to env vars and command line arguments for ascp
88
97
  # NOTE: parameters starting with "EX_" (extended) are not standard
89
- def ascp_args()
98
+ def ascp_args
90
99
  env_args={
91
- :args=>[],
92
- :env=>{},
93
- :ascp_version=>:ascp
100
+ args: [],
101
+ env: {},
102
+ ascp_version: :ascp
94
103
  }
95
104
  # some ssh credentials are required to avoid interactive password input
96
- if !@job_spec.has_key?('remote_password') and
97
- !@job_spec.has_key?('ssh_private_key') and
98
- !@job_spec.has_key?('EX_ssh_key_paths') then
99
- raise Fasp::Error.new('required: password or ssh key (value or path)')
105
+ if !@job_spec.has_key?('remote_password') &&
106
+ !@job_spec.has_key?('ssh_private_key') &&
107
+ !@job_spec.has_key?('EX_ssh_key_paths')
108
+ raise Fasp::Error, 'required: password or ssh key (value or path)'
100
109
  end
101
110
 
102
111
  # special cases
103
- @job_spec.delete('source_root') if @job_spec.has_key?('source_root') and @job_spec['source_root'].empty?
112
+ @job_spec.delete('source_root') if @job_spec.has_key?('source_root') && @job_spec['source_root'].empty?
104
113
 
105
114
  # use web socket session initiation ?
106
- if @builder.process_param('wss_enabled',:get_value) and ( @options[:wss] or !@job_spec.has_key?('fasp_port') )
115
+ if @builder.process_param('wss_enabled',:get_value) && (@options[:wss] || !@job_spec.has_key?('fasp_port'))
107
116
  # by default use web socket session if available, unless removed by user
108
117
  @builder.add_command_line_options(['--ws-connect'])
109
118
  # TODO: option to give order ssh,ws (legacy http is implied bu ssh)
@@ -112,9 +121,9 @@ module Aspera
112
121
  @job_spec.delete('fasp_port')
113
122
  @job_spec.delete('EX_ssh_key_paths')
114
123
  @job_spec.delete('sshfp')
115
- # set default location for CA bundle, see env var SSL_CERT_FILE / SSL_CERT_DIR
124
+ # set location for CA bundle to be the one of Ruby, see env var SSL_CERT_FILE / SSL_CERT_DIR
116
125
  @job_spec['EX_ssh_key_paths']=[OpenSSL::X509::DEFAULT_CERT_FILE]
117
- Log.log.debug("CA certs: EX_ssh_key_paths <- DEFAULT_CERT_FILE from openssl")
126
+ Log.log.debug('CA certs: EX_ssh_key_paths <- DEFAULT_CERT_FILE from openssl')
118
127
  else
119
128
  # remove unused parameter (avoid warning)
120
129
  @job_spec.delete('wss_port')
@@ -135,17 +144,17 @@ module Aspera
135
144
  file_list_provided=self.class.ts_has_file_list(@job_spec)
136
145
  @builder.params_definition['paths'][:mandatory]=!@job_spec.has_key?('keepalive') and !file_list_provided
137
146
  paths_array=@builder.process_param('paths',:get_value)
138
- if file_list_provided and ! paths_array.nil?
139
- Log.log.warn("file list provided both in transfer spec and ascp file list. Keeping file list only.")
147
+ if file_list_provided && !paths_array.nil?
148
+ Log.log.warn('file list provided both in transfer spec and ascp file list. Keeping file list only.')
140
149
  paths_array=nil
141
150
  end
142
- if ! paths_array.nil?
151
+ if !paths_array.nil?
143
152
  # it's an array
144
- raise "paths is empty in transfer spec" if paths_array.empty?
153
+ raise 'paths is empty in transfer spec' if paths_array.empty?
145
154
  # use file list if there is storage defined for it.
146
- if @@file_list_folder.nil?
155
+ if self.class.file_list_folder.nil?
147
156
  # not safe for special characters ? (maybe not, depends on OS)
148
- Log.log.debug("placing source file list on command line (no file list file)")
157
+ Log.log.debug('placing source file list on command line (no file list file)')
149
158
  @builder.add_command_line_options(paths_array.map{|i|i['source']})
150
159
  else
151
160
  file_list_file=@builder.process_param('EX_file_list',:get_value)
@@ -161,13 +170,13 @@ module Aspera
161
170
  # TODO: well, we test only the first one, but anyway it shall be consistent
162
171
  if paths_array.first.has_key?('destination')
163
172
  option='--file-pair-list'
164
- lines=paths_array.inject([]){|m,e|m.push(e['source'],e['destination']);m}
173
+ lines=paths_array.each_with_object([]){|e,m|m.push(e['source'],e['destination']);}
165
174
  else
166
175
  option='--file-list'
167
176
  lines=paths_array.map{|i|i['source']}
168
177
  end
169
- file_list_file=Aspera::TempFileManager.instance.new_file_path_in_folder(@@file_list_folder)
170
- File.open(file_list_file, 'w+'){|f|f.write(lines.join("\n"))}
178
+ file_list_file=Aspera::TempFileManager.instance.new_file_path_in_folder(self.class.file_list_folder)
179
+ File.write(file_list_file, lines.join("\n"))
171
180
  Log.log.debug{"#{option}=\n#{File.read(file_list_file)}".red}
172
181
  end
173
182
  end
@@ -187,24 +196,6 @@ module Aspera
187
196
 
188
197
  return env_args
189
198
  end
190
-
191
- # temp file list files are created here
192
- def self.file_list_folder=(v)
193
- @@file_list_folder=v
194
- if !@@file_list_folder.nil?
195
- FileUtils.mkdir_p(@@file_list_folder)
196
- TempFileManager.instance.cleanup_expired(@@file_list_folder)
197
- end
198
- end
199
-
200
- # static methods
201
- class << self
202
- def file_list_folder; @@file_list_folder;end
203
-
204
- def ts_to_env_args(transfer_spec,options)
205
- return Parameters.new(transfer_spec,options).ascp_args()
206
- end
207
- end
208
199
  end # Parameters
209
200
  end
210
201
  end