aspera-cli 4.17.0 → 4.18.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -4
  3. data/CHANGELOG.md +33 -0
  4. data/CONTRIBUTING.md +15 -1
  5. data/README.md +711 -432
  6. data/bin/ascli +5 -0
  7. data/bin/asession +2 -2
  8. data/examples/build_package.sh +28 -0
  9. data/lib/aspera/agent/alpha.rb +10 -8
  10. data/lib/aspera/agent/base.rb +9 -6
  11. data/lib/aspera/agent/connect.rb +7 -8
  12. data/lib/aspera/agent/direct.rb +56 -37
  13. data/lib/aspera/agent/httpgw.rb +23 -324
  14. data/lib/aspera/agent/node.rb +19 -20
  15. data/lib/aspera/agent/trsdk.rb +19 -20
  16. data/lib/aspera/api/aoc.rb +17 -14
  17. data/lib/aspera/api/cos_node.rb +4 -4
  18. data/lib/aspera/api/httpgw.rb +342 -0
  19. data/lib/aspera/api/node.rb +135 -89
  20. data/lib/aspera/ascmd.rb +4 -3
  21. data/lib/aspera/ascp/installation.rb +15 -7
  22. data/lib/aspera/ascp/management.rb +2 -2
  23. data/lib/aspera/ascp/products.rb +1 -1
  24. data/lib/aspera/cli/basic_auth_plugin.rb +5 -9
  25. data/lib/aspera/cli/extended_value.rb +35 -16
  26. data/lib/aspera/cli/formatter.rb +161 -70
  27. data/lib/aspera/cli/hints.rb +18 -0
  28. data/lib/aspera/cli/main.rb +32 -39
  29. data/lib/aspera/cli/manager.rb +151 -119
  30. data/lib/aspera/cli/plugin.rb +27 -21
  31. data/lib/aspera/cli/plugin_factory.rb +31 -20
  32. data/lib/aspera/cli/plugins/alee.rb +14 -2
  33. data/lib/aspera/cli/plugins/aoc.rb +152 -141
  34. data/lib/aspera/cli/plugins/ats.rb +1 -1
  35. data/lib/aspera/cli/plugins/config.rb +72 -65
  36. data/lib/aspera/cli/plugins/console.rb +8 -5
  37. data/lib/aspera/cli/plugins/faspex.rb +32 -23
  38. data/lib/aspera/cli/plugins/faspex5.rb +232 -156
  39. data/lib/aspera/cli/plugins/faspio.rb +85 -0
  40. data/lib/aspera/cli/plugins/httpgw.rb +55 -0
  41. data/lib/aspera/cli/plugins/node.rb +129 -64
  42. data/lib/aspera/cli/plugins/orchestrator.rb +33 -30
  43. data/lib/aspera/cli/plugins/preview.rb +7 -3
  44. data/lib/aspera/cli/plugins/server.rb +6 -6
  45. data/lib/aspera/cli/plugins/shares.rb +16 -14
  46. data/lib/aspera/cli/special_values.rb +13 -0
  47. data/lib/aspera/cli/sync_actions.rb +10 -10
  48. data/lib/aspera/cli/transfer_agent.rb +7 -6
  49. data/lib/aspera/cli/version.rb +1 -1
  50. data/lib/aspera/environment.rb +70 -9
  51. data/lib/aspera/faspex_gw.rb +5 -4
  52. data/lib/aspera/faspex_postproc.rb +2 -2
  53. data/lib/aspera/log.rb +6 -3
  54. data/lib/aspera/node_simulator.rb +2 -2
  55. data/lib/aspera/oauth/base.rb +31 -19
  56. data/lib/aspera/oauth/factory.rb +12 -13
  57. data/lib/aspera/oauth/generic.rb +1 -0
  58. data/lib/aspera/oauth/jwt.rb +18 -15
  59. data/lib/aspera/oauth/url_json.rb +8 -6
  60. data/lib/aspera/oauth/web.rb +2 -2
  61. data/lib/aspera/persistency_folder.rb +2 -2
  62. data/lib/aspera/preview/generator.rb +3 -3
  63. data/lib/aspera/preview/options.rb +3 -3
  64. data/lib/aspera/preview/terminal.rb +4 -4
  65. data/lib/aspera/preview/utils.rb +3 -3
  66. data/lib/aspera/proxy_auto_config.rb +5 -1
  67. data/lib/aspera/rest.rb +105 -88
  68. data/lib/aspera/rest_call_error.rb +1 -1
  69. data/lib/aspera/rest_error_analyzer.rb +2 -2
  70. data/lib/aspera/rest_errors_aspera.rb +1 -1
  71. data/lib/aspera/resumer.rb +1 -1
  72. data/lib/aspera/secret_hider.rb +2 -4
  73. data/lib/aspera/ssh.rb +1 -1
  74. data/lib/aspera/transfer/parameters.rb +39 -36
  75. data/lib/aspera/transfer/spec.rb +2 -0
  76. data/lib/aspera/transfer/sync.rb +2 -1
  77. data/lib/aspera/transfer/uri.rb +1 -1
  78. data/lib/aspera/uri_reader.rb +5 -4
  79. data/lib/aspera/web_auth.rb +1 -1
  80. data/lib/aspera/web_server_simple.rb +4 -3
  81. data.tar.gz.sig +0 -0
  82. metadata +7 -4
  83. metadata.gz.sig +0 -0
  84. data/lib/aspera/cli/plugins/bss.rb +0 -71
  85. data/lib/aspera/open_application.rb +0 -71
@@ -22,12 +22,10 @@ module Aspera
22
22
  # Agents shown in manual for parameters (sub list)
23
23
  SUPPORTED_AGENTS = %i[direct node connect trsdk httpgw].freeze
24
24
  # Short names of columns in manual
25
- SUPPORTED_AGENTS_SHORT = SUPPORTED_AGENTS.map{|a|a.to_s[0].to_sym}
25
+ SUPPORTED_AGENTS_SHORT = SUPPORTED_AGENTS.map{|agent_sym|agent_sym.to_s[0].to_sym}
26
26
  FILE_LIST_OPTIONS = ['--file-list', '--file-pair-list'].freeze
27
- # options that can be provided to the constructor, and then in @options
28
- SUPPORTED_OPTIONS = %i[ascp_args wss check_ignore_cb quiet trusted_certs].freeze
29
27
 
30
- private_constant :SUPPORTED_AGENTS, :FILE_LIST_OPTIONS, :SUPPORTED_OPTIONS
28
+ private_constant :SUPPORTED_AGENTS, :FILE_LIST_OPTIONS
31
29
 
32
30
  class << self
33
31
  # Temp folder for file lists, must contain only file lists
@@ -35,18 +33,18 @@ module Aspera
35
33
  # this could be refined, as , for instance, on macos, temp folder is already user specific
36
34
  @file_list_folder = TempFileManager.instance.new_file_path_global('asession_filelists') # cspell:disable-line
37
35
 
38
- # @param to_text [bool] replace HTML entities with text equivalent
36
+ # @param formatter [Cli::Formatter] formatter to use
39
37
  # @return a table suitable to display in manual
40
- def man_table
38
+ def man_table(formatter)
41
39
  result = []
42
40
  Spec::DESCRIPTION.each do |name, options|
43
41
  param = {name: name, type: [options[:accepted_types]].flatten.join(','), description: options[:desc]}
44
42
  # add flags for supported agents in doc
45
- SUPPORTED_AGENTS.each do |a|
46
- param[a.to_s[0].to_sym] = Cli::Formatter.tick(options[:agents].nil? || options[:agents].include?(a))
43
+ SUPPORTED_AGENTS.each do |agent_sym|
44
+ param[agent_sym.to_s[0].to_sym] = Cli::Formatter.tick(options[:agents].nil? || options[:agents].include?(agent_sym))
47
45
  end
48
46
  # only keep lines that are usable in supported agents
49
- next if SUPPORTED_AGENTS_SHORT.inject(true){|m, j|m && param[j].empty?}
47
+ next if SUPPORTED_AGENTS_SHORT.inject(true){|memory, agent_short_sym|memory && param[agent_short_sym].empty?}
50
48
  param[:cli] =
51
49
  case options[:cli][:type]
52
50
  when :envvar then 'env:' + options[:cli][:variable]
@@ -63,8 +61,8 @@ module Aspera
63
61
  end.map{|n|"{#{n}}"}.join('|')
64
62
  conversion_tag = options[:cli].key?(:convert) ? '(conversion)' : ''
65
63
  "#{options[:cli][:switch]} #{conversion_tag}#{values}"
66
- when :special then Cli::Formatter.special('special')
67
- when :ignore then Cli::Formatter.special('ignored')
64
+ when :special then formatter.special_format('special')
65
+ when :ignore then formatter.special_format('ignored')
68
66
  else
69
67
  param[:d].eql?(tick_yes) ? '' : 'n/a'
70
68
  end
@@ -75,17 +73,17 @@ module Aspera
75
73
  param[:description] = param[:description].gsub('&sol;', '\\')
76
74
  result.push(param)
77
75
  end
78
- return result.sort_by { |a| a[:name] }
76
+ return result.sort_by { |parameter_info| parameter_info[:name] }
79
77
  end
80
78
 
81
79
  # special encoding methods used in YAML (key: :convert)
82
- def convert_remove_hyphen(v); v.tr('-', ''); end
80
+ def convert_remove_hyphen(value); value.tr('-', ''); end
83
81
 
84
82
  # special encoding methods used in YAML (key: :convert)
85
- def convert_json64(v); Base64.strict_encode64(JSON.generate(v)); end
83
+ def convert_json64(value); Base64.strict_encode64(JSON.generate(value)); end
86
84
 
87
85
  # special encoding methods used in YAML (key: :convert)
88
- def convert_base64(v); Base64.strict_encode64(v); end
86
+ def convert_base64(value); Base64.strict_encode64(value); end
89
87
 
90
88
  # file list is provided directly with ascp arguments
91
89
  # @param ascp_args [Array,NilClass] ascp arguments
@@ -94,8 +92,8 @@ module Aspera
94
92
  end
95
93
 
96
94
  # temp file list files are created here
97
- def file_list_folder=(v)
98
- @file_list_folder = v
95
+ def file_list_folder=(value)
96
+ @file_list_folder = value
99
97
  return if @file_list_folder.nil?
100
98
  FileUtils.mkdir_p(@file_list_folder)
101
99
  TempFileManager.instance.cleanup_expired(@file_list_folder)
@@ -103,28 +101,33 @@ module Aspera
103
101
 
104
102
  # static methods
105
103
  attr_reader :file_list_folder
106
- end # self
104
+ end
107
105
 
108
106
  # @param options [Hash] key: :wss: bool, :ascp_args: array of strings
109
- def initialize(job_spec, options)
110
- Aspera.assert_type(job_spec, Hash)
111
- Aspera.assert_type(options, Hash)
107
+ def initialize(
108
+ job_spec,
109
+ ascp_args:,
110
+ wss:,
111
+ quiet:,
112
+ trusted_certs:,
113
+ check_ignore_cb:
114
+ )
112
115
  @job_spec = job_spec
113
- # check necessary options
114
- missing_options = SUPPORTED_OPTIONS - options.keys
115
- Aspera.assert(missing_options.empty?){"missing options: #{missing_options.join(', ')}"}
116
- @options = SUPPORTED_OPTIONS.each_with_object({}){|o, h| h[o] = options[o]}
117
- Log.log.debug{Log.dump(:parameters_options, @options)}
118
- Log.log.debug{Log.dump(:dismiss_options, options.keys - SUPPORTED_OPTIONS)}
119
- Aspera.assert_type(@options[:ascp_args], Array){'ascp_args'}
120
- Aspera.assert(@options[:ascp_args].all?(String)){'ascp arguments must Strings'}
116
+ @ascp_args = ascp_args
117
+ @wss = wss
118
+ @quiet = quiet
119
+ @trusted_certs = trusted_certs
120
+ @check_ignore_cb = check_ignore_cb
121
+ Aspera.assert_type(job_spec, Hash)
122
+ Aspera.assert_type(@ascp_args, Array){'ascp_args'}
123
+ Aspera.assert(@ascp_args.all?(String)){'ascp arguments must be Strings'}
121
124
  @builder = CommandLineBuilder.new(@job_spec, Spec::DESCRIPTION)
122
125
  end
123
126
 
124
127
  # either place source files on command line, or add file list file
125
128
  def process_file_list
126
129
  # is the file list provided through ascp parameters?
127
- ascp_file_list_provided = self.class.ascp_args_file_list?(@options[:ascp_args])
130
+ ascp_file_list_provided = self.class.ascp_args_file_list?(@ascp_args)
128
131
  # set if paths is mandatory in ts
129
132
  @builder.params_definition['paths'][:mandatory] = !@job_spec.key?('keepalive') && !ascp_file_list_provided # cspell:words keepalive
130
133
  # get paths in transfer spec (after setting if it is mandatory)
@@ -162,7 +165,7 @@ module Aspera
162
165
  def remote_certificates
163
166
  certificates_to_use = []
164
167
  # use web socket secure for session ?
165
- if @builder.read_param('wss_enabled') && (@options[:wss] || !@job_spec.key?('fasp_port'))
168
+ if @builder.read_param('wss_enabled') && (@wss || !@job_spec.key?('fasp_port'))
166
169
  # by default use web socket session if available, unless removed by user
167
170
  @builder.add_command_line_options(['--ws-connect'])
168
171
  # TODO: option to give order ssh,ws (legacy http is implied by ssh)
@@ -171,9 +174,9 @@ module Aspera
171
174
  @job_spec.delete('fasp_port')
172
175
  @job_spec.delete('sshfp')
173
176
  # set location for CA bundle to be the one of Ruby, see env var SSL_CERT_FILE / SSL_CERT_DIR
174
- certificates_to_use.concat(@options[:trusted_certs]) if @options[:trusted_certs].is_a?(Array)
177
+ certificates_to_use.concat(@trusted_certs) if @trusted_certs.is_a?(Array)
175
178
  # ignore cert for wss ?
176
- if @options[:check_ignore_cb]&.call(@job_spec['remote_host'], @job_spec['wss_port'])
179
+ if @check_ignore_cb&.call(@job_spec['remote_host'], @job_spec['wss_port'])
177
180
  wss_cert_file = TempFileManager.instance.new_file_path_global('wss_cert')
178
181
  wss_url = "https://#{@job_spec['remote_host']}:#{@job_spec['wss_port']}"
179
182
  File.write(wss_cert_file, Rest.remote_certificate_chain(wss_url))
@@ -228,7 +231,7 @@ module Aspera
228
231
  # destination will be base64 encoded, put this before source path arguments
229
232
  @builder.add_command_line_options(['--dest64']) if base64_destination
230
233
  # optional arguments, at the end to override previous ones (to allow override)
231
- @builder.add_command_line_options(@options[:ascp_args])
234
+ @builder.add_command_line_options(@ascp_args)
232
235
  # get list of source files to transfer and build arg for ascp
233
236
  process_file_list
234
237
  # process destination folder
@@ -238,7 +241,7 @@ module Aspera
238
241
  # destination MUST be last command line argument to ascp
239
242
  @builder.add_command_line_options([destination_folder])
240
243
  @builder.add_env_args(env_args)
241
- env_args[:args].unshift('-q') if @options[:quiet]
244
+ env_args[:args].unshift('-q') if @quiet
242
245
  # add fallback cert and key as arguments if needed
243
246
  if ['1', 1, true, 'force'].include?(@job_spec['http_fallback'])
244
247
  env_args[:args].unshift('-Y', Ascp::Installation.instance.path(:fallback_private_key))
@@ -247,6 +250,6 @@ module Aspera
247
250
  Log.log.debug{"ascp args: #{env_args}"}
248
251
  return env_args
249
252
  end
250
- end # Parameters
253
+ end
251
254
  end
252
255
  end
@@ -17,6 +17,8 @@ module Aspera
17
17
  'ssh_port' => SSH_PORT,
18
18
  'fasp_port' => UDP_PORT
19
19
  }.freeze
20
+ # fields for transport
21
+ TRANSPORT_FIELDS = %w[remote_host remote_user ssh_port fasp_port wss_enabled wss_port].freeze
20
22
  # reserved tag for Aspera
21
23
  TAG_RESERVED = 'aspera'
22
24
  class << self
@@ -48,7 +48,8 @@ module Aspera
48
48
  'cooloff' => { cli: { type: :opt_with_arg}, accepted_types: :int},
49
49
  'pending_max' => { cli: { type: :opt_with_arg}, accepted_types: :int},
50
50
  'scan_intensity' => { cli: { type: :opt_with_arg}, accepted_types: :string},
51
- 'cipher' => { cli: { type: :opt_with_arg, convert: 'Aspera::Transfer::Parameters.convert_remove_hyphen'}, accepted_types: :string, ts: true},
51
+ 'cipher' => { cli: { type: :opt_with_arg, convert: 'Aspera::Transfer::Parameters.convert_remove_hyphen'},
52
+ accepted_types: :string, ts: true},
52
53
  'transfer_threads' => { cli: { type: :opt_with_arg}, accepted_types: :int},
53
54
  'preserve_time' => { cli: { type: :opt_without_arg}, ts: :preserve_times},
54
55
  'preserve_access_time' => { cli: { type: :opt_without_arg}, ts: nil},
@@ -24,7 +24,7 @@ module Aspera
24
24
  result_ts['ssh_port'] = @fasp_uri.port
25
25
  result_ts['paths'] = [{'source' => URI.decode_www_form_component(@fasp_uri.path)}]
26
26
  # faspex 4 does not encode trailing base64 padding, fix that to be able to decode properly
27
- fixed_query = @fasp_uri.query.gsub(/(=+)$/){|x|'%3D' * x.length}
27
+ fixed_query = @fasp_uri.query.gsub(/(=+)$/){|trail_equals|'%3D' * trail_equals.length}
28
28
 
29
29
  Rest.decode_query(fixed_query).each do |name, value|
30
30
  case name
@@ -4,21 +4,22 @@ require 'uri'
4
4
  require 'aspera/rest'
5
5
 
6
6
  module Aspera
7
+ # read some content from some URI, support file: , http: and https: schemes
7
8
  module UriReader
8
9
  class << self
9
10
  # read some content from some URI, support file: , http: and https: schemes
10
11
  def read(uri_to_read)
11
- proxy_uri = URI.parse(uri_to_read)
12
- case proxy_uri.scheme
12
+ uri = URI.parse(uri_to_read)
13
+ case uri.scheme
13
14
  when 'http', 'https'
14
15
  return Rest.new(base_url: uri_to_read, redirect_max: 5).call(operation: 'GET', subpath: '', headers: {'Accept' => 'text/plain'})[:data]
15
16
  when 'file', NilClass
16
- local_file_path = proxy_uri.path
17
+ local_file_path = uri.path
17
18
  raise 'URL shall have a path, check syntax' if local_file_path.nil?
18
19
  local_file_path = File.expand_path(local_file_path.gsub(%r{^/}, '')) if %r{^/(~|.|..)/}.match?(local_file_path)
19
20
  return File.read(local_file_path)
20
21
  else
21
- raise "unknown scheme: [#{proxy_uri.scheme}] for [#{uri_to_read}]"
22
+ raise "unknown scheme: [#{uri.scheme}] for [#{uri_to_read}]"
22
23
  end
23
24
  end
24
25
  end
@@ -28,7 +28,7 @@ module Aspera
28
28
  response.body = '<html><head><title>Ok</title></head><body><h1>Thank you !</h1><p>You can close this window.</p></body></html>'
29
29
  return nil
30
30
  end
31
- end # WebAuthServlet
31
+ end
32
32
 
33
33
  # start a local web server, then start a browser that will callback the local server upon authentication
34
34
  class WebAuth < WebServerSimple
@@ -7,6 +7,7 @@ require 'aspera/assert'
7
7
  require 'openssl'
8
8
 
9
9
  module Aspera
10
+ # Simple WEBrick server with HTTPS support
10
11
  class WebServerSimple < WEBrick::HTTPServer
11
12
  CERT_PARAMETERS = %i[key cert chain].freeze
12
13
  GENERIC_ISSUER = '/C=FR/O=Test/OU=Test/CN=Test'
@@ -18,8 +19,8 @@ module Aspera
18
19
  # generates and adds self signed cert to provided webrick options
19
20
  def fill_self_signed_cert(cert, key, digest = 'SHA256')
20
21
  cert.subject = cert.issuer = OpenSSL::X509::Name.parse(GENERIC_ISSUER)
21
- cert.not_before = Time.now
22
- cert.not_after = Time.now + ONE_YEAR_SECONDS
22
+ cert.not_before = cert.not_after = Time.now
23
+ cert.not_after += ONE_YEAR_SECONDS
23
24
  cert.public_key = key.public_key
24
25
  cert.serial = 0x0
25
26
  cert.version = 2
@@ -56,7 +57,7 @@ module Aspera
56
57
  else
57
58
  Aspera.assert_type(certificate, Hash)
58
59
  certificate = certificate.symbolize_keys
59
- raise "unexpected key in certificate config: only: #{CERT_PARAMETERS.join(', ')}" if certificate.keys.any?{|k|!CERT_PARAMETERS.include?(k)}
60
+ raise "unexpected key in certificate config: only: #{CERT_PARAMETERS.join(', ')}" if certificate.keys.any?{|key|!CERT_PARAMETERS.include?(key)}
60
61
  webrick_options[:SSLPrivateKey] = if certificate.key?(:key)
61
62
  OpenSSL::PKey::RSA.new(File.read(certificate[:key]))
62
63
  else
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aspera-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.17.0
4
+ version: 4.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent Martin
@@ -37,7 +37,7 @@ cert_chain:
37
37
  eTf9kxhVM40wGQOECVNA8UsEEZHD48eF+csUYZtAJOF5oxTI8UyV9T/o6CgO0c9/
38
38
  Gzz+Qm5ULOUcPiJLjSpaiTrkiIVYiDGnqNSr6R1Hb1c=
39
39
  -----END CERTIFICATE-----
40
- date: 2024-05-13 00:00:00.000000000 Z
40
+ date: 2024-08-21 00:00:00.000000000 Z
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: blankslate
@@ -390,6 +390,7 @@ files:
390
390
  - README.md
391
391
  - bin/ascli
392
392
  - bin/asession
393
+ - examples/build_package.sh
393
394
  - examples/dascli
394
395
  - examples/proxy.pac
395
396
  - examples/rubyc
@@ -403,6 +404,7 @@ files:
403
404
  - lib/aspera/api/aoc.rb
404
405
  - lib/aspera/api/ats.rb
405
406
  - lib/aspera/api/cos_node.rb
407
+ - lib/aspera/api/httpgw.rb
406
408
  - lib/aspera/api/node.rb
407
409
  - lib/aspera/ascmd.rb
408
410
  - lib/aspera/ascp/installation.rb
@@ -422,17 +424,19 @@ files:
422
424
  - lib/aspera/cli/plugins/alee.rb
423
425
  - lib/aspera/cli/plugins/aoc.rb
424
426
  - lib/aspera/cli/plugins/ats.rb
425
- - lib/aspera/cli/plugins/bss.rb
426
427
  - lib/aspera/cli/plugins/config.rb
427
428
  - lib/aspera/cli/plugins/console.rb
428
429
  - lib/aspera/cli/plugins/cos.rb
429
430
  - lib/aspera/cli/plugins/faspex.rb
430
431
  - lib/aspera/cli/plugins/faspex5.rb
432
+ - lib/aspera/cli/plugins/faspio.rb
433
+ - lib/aspera/cli/plugins/httpgw.rb
431
434
  - lib/aspera/cli/plugins/node.rb
432
435
  - lib/aspera/cli/plugins/orchestrator.rb
433
436
  - lib/aspera/cli/plugins/preview.rb
434
437
  - lib/aspera/cli/plugins/server.rb
435
438
  - lib/aspera/cli/plugins/shares.rb
439
+ - lib/aspera/cli/special_values.rb
436
440
  - lib/aspera/cli/sync_actions.rb
437
441
  - lib/aspera/cli/transfer_agent.rb
438
442
  - lib/aspera/cli/transfer_progress.rb
@@ -466,7 +470,6 @@ files:
466
470
  - lib/aspera/oauth/jwt.rb
467
471
  - lib/aspera/oauth/url_json.rb
468
472
  - lib/aspera/oauth/web.rb
469
- - lib/aspera/open_application.rb
470
473
  - lib/aspera/persistency_action_once.rb
471
474
  - lib/aspera/persistency_folder.rb
472
475
  - lib/aspera/preview/file_types.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,71 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'aspera/rest'
4
-
5
- module Aspera
6
- module Cli
7
- module Plugins
8
- class Bss < Cli::BasicAuthPlugin
9
- ACTIONS = %i[subscription].freeze
10
-
11
- FIELDS = {
12
- 'bssSubscriptions' => %w[id name termVolumeGb termMonths trial startDate endDate plan renewalType chargeAgreementNumber customerName]
13
- }.freeze
14
-
15
- def initialize(**env)
16
- super
17
- end
18
-
19
- def all_fields(name)
20
- return FIELDS[name].join(' ')
21
- end
22
-
23
- def execute_action
24
- if @api_bss.nil?
25
- key = options.get_option(:password, mandatory: true)
26
- @api_bss = Rest.new(
27
- base_url: 'https://dashboard.bss.asperasoft.com/platform',
28
- headers: {cookie: "_dashboard_key=#{key}"})
29
- end
30
- command = options.get_next_command(ACTIONS)
31
- case command
32
- when :subscription
33
- command = options.get_next_command(%i[find show instances])
34
- object = 'bssSubscriptions'
35
- case command
36
- when :find
37
- query = options.get_option(:query, mandatory: true) # AOC_ORGANIZATION_QUERY AOC_USER_EMAIL
38
- value = value_create_modify(command: command)
39
- request = {
40
- 'variables' => {'filter' => {'key' => query, 'value' => value}},
41
- 'query' => "query($filter: BssSubscriptionFilter!) {#{object}(filter: $filter) { #{all_fields('bssSubscriptions')} } }"
42
- }
43
- result = @api_bss.create('graphql', request)[:data]
44
- # give fields to keep order
45
- return {type: :object_list, data: result['data'][object], fields: FIELDS['bssSubscriptions']}
46
- when :show
47
- id = instance_identifier
48
- request = {
49
- 'variables' => {'id' => id},
50
- 'query' => "query($id: ID!) {#{object}(id: $id) { #{all_fields('bssSubscriptions')} roleAssignments(uniqueSubjectId: true) { id subjectId } " \
51
- 'instances { id state planId serviceId ssmSubscriptionId entitlement { id } aocOrganization { id subdomainName name status tier urlId trialExpiresAt ' \
52
- 'users(organizationAdmin: true) { id name email atsAdmin subscriptionAdmin } } } } }'
53
- }
54
- result = @api_bss.create('graphql', request)[:data]['data'][object].first
55
- result.delete('instances')
56
- return {type: :single_object, data: result}
57
- when :instances
58
- id = instance_identifier
59
- request = {
60
- 'variables' => {'id' => id},
61
- 'query' => "query($id: ID!) {#{object}(id: $id) { aocOrganization { id subdomainName name status tier urlId trialExpiresAt } } } }"
62
- }
63
- result = @api_bss.create('graphql', request)[:data]['data'][object].first
64
- return {type: :object_list, data: result['instances']}
65
- end
66
- end
67
- end
68
- end # Bss
69
- end # Plugins
70
- end # Cli
71
- end # Aspera
@@ -1,71 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'aspera/log'
4
- require 'aspera/environment'
5
- require 'rbconfig'
6
- require 'singleton'
7
-
8
- module Aspera
9
- # Allows a user to open a Url
10
- # if method is "text", then URL is displayed on terminal
11
- # if method is "graphical", then the URL will be opened with the default browser.
12
- class OpenApplication
13
- include Singleton
14
- class << self
15
- USER_INTERFACES = %i[text graphical].freeze
16
- # User Interfaces
17
- def user_interfaces; USER_INTERFACES; end
18
-
19
- def default_gui_mode
20
- return :graphical if [Environment::OS_WINDOWS, Environment::OS_X].include?(Environment.os)
21
- # unix family
22
- return :graphical if ENV.key?('DISPLAY') && !ENV['DISPLAY'].empty?
23
- return :text
24
- end
25
-
26
- # command must be non blocking
27
- def uri_graphical(uri)
28
- case Environment.os
29
- when Environment::OS_X then return system('open', uri.to_s)
30
- when Environment::OS_WINDOWS then return system('start', 'explorer', %Q{"#{uri}"})
31
- when Environment::OS_LINUX then return system('xdg-open', uri.to_s)
32
- else
33
- raise "no graphical open method for #{Environment.os}"
34
- end
35
- end
36
-
37
- def editor(file_path)
38
- if ENV.key?('EDITOR')
39
- system(ENV['EDITOR'], file_path.to_s)
40
- elsif Environment.os.eql?(Environment::OS_WINDOWS)
41
- system('notepad.exe', %Q{"#{file_path}"})
42
- else
43
- uri_graphical(file_path.to_s)
44
- end
45
- end
46
- end # self
47
-
48
- attr_accessor :url_method
49
-
50
- def initialize
51
- @url_method = self.class.default_gui_mode
52
- end
53
-
54
- # this is non blocking
55
- def uri(the_url)
56
- case @url_method
57
- when :graphical
58
- self.class.uri_graphical(the_url)
59
- when :text
60
- case the_url.to_s
61
- when /^http/
62
- puts "USER ACTION: please enter this url in a browser:\n#{the_url.to_s.red}\n"
63
- else
64
- puts "USER ACTION: open this:\n#{the_url.to_s.red}\n"
65
- end
66
- else
67
- raise StandardError, "unsupported url open method: #{@url_method}"
68
- end
69
- end
70
- end # OpenApplication
71
- end # Aspera