aspera-cli 4.10.0 → 4.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/BUGS.md +20 -0
  4. data/CHANGELOG.md +509 -0
  5. data/CONTRIBUTING.md +118 -0
  6. data/README.md +621 -378
  7. data/bin/ascli +4 -4
  8. data/bin/asession +11 -11
  9. data/docs/test_env.conf +28 -19
  10. data/examples/aoc.rb +4 -4
  11. data/examples/dascli +11 -9
  12. data/examples/faspex4.rb +8 -8
  13. data/examples/node.rb +11 -11
  14. data/examples/server.rb +9 -9
  15. data/lib/aspera/aoc.rb +273 -266
  16. data/lib/aspera/ascmd.rb +56 -54
  17. data/lib/aspera/ats_api.rb +4 -4
  18. data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
  19. data/lib/aspera/cli/extended_value.rb +5 -5
  20. data/lib/aspera/cli/formater.rb +64 -64
  21. data/lib/aspera/cli/listener/line_dump.rb +1 -1
  22. data/lib/aspera/cli/listener/logger.rb +1 -1
  23. data/lib/aspera/cli/listener/progress.rb +5 -6
  24. data/lib/aspera/cli/listener/progress_multi.rb +14 -19
  25. data/lib/aspera/cli/main.rb +66 -67
  26. data/lib/aspera/cli/manager.rb +110 -110
  27. data/lib/aspera/cli/plugin.rb +54 -37
  28. data/lib/aspera/cli/plugins/alee.rb +4 -4
  29. data/lib/aspera/cli/plugins/aoc.rb +308 -669
  30. data/lib/aspera/cli/plugins/ats.rb +44 -46
  31. data/lib/aspera/cli/plugins/bss.rb +10 -10
  32. data/lib/aspera/cli/plugins/config.rb +447 -344
  33. data/lib/aspera/cli/plugins/console.rb +12 -12
  34. data/lib/aspera/cli/plugins/cos.rb +18 -20
  35. data/lib/aspera/cli/plugins/faspex.rb +110 -112
  36. data/lib/aspera/cli/plugins/faspex5.rb +67 -46
  37. data/lib/aspera/cli/plugins/node.rb +364 -288
  38. data/lib/aspera/cli/plugins/orchestrator.rb +46 -46
  39. data/lib/aspera/cli/plugins/preview.rb +122 -114
  40. data/lib/aspera/cli/plugins/server.rb +137 -83
  41. data/lib/aspera/cli/plugins/shares.rb +30 -29
  42. data/lib/aspera/cli/plugins/sync.rb +13 -33
  43. data/lib/aspera/cli/transfer_agent.rb +57 -57
  44. data/lib/aspera/cli/version.rb +1 -1
  45. data/lib/aspera/colors.rb +3 -3
  46. data/lib/aspera/command_line_builder.rb +27 -27
  47. data/lib/aspera/cos_node.rb +22 -20
  48. data/lib/aspera/data_repository.rb +1 -1
  49. data/lib/aspera/environment.rb +30 -28
  50. data/lib/aspera/fasp/agent_base.rb +15 -15
  51. data/lib/aspera/fasp/agent_connect.rb +23 -21
  52. data/lib/aspera/fasp/agent_direct.rb +65 -67
  53. data/lib/aspera/fasp/agent_httpgw.rb +72 -68
  54. data/lib/aspera/fasp/agent_node.rb +23 -21
  55. data/lib/aspera/fasp/agent_trsdk.rb +20 -20
  56. data/lib/aspera/fasp/error.rb +3 -2
  57. data/lib/aspera/fasp/error_info.rb +11 -8
  58. data/lib/aspera/fasp/installation.rb +78 -78
  59. data/lib/aspera/fasp/listener.rb +1 -1
  60. data/lib/aspera/fasp/parameters.rb +75 -72
  61. data/lib/aspera/fasp/parameters.yaml +2 -2
  62. data/lib/aspera/fasp/resume_policy.rb +8 -8
  63. data/lib/aspera/fasp/transfer_spec.rb +35 -2
  64. data/lib/aspera/fasp/uri.rb +7 -7
  65. data/lib/aspera/faspex_gw.rb +7 -5
  66. data/lib/aspera/hash_ext.rb +3 -3
  67. data/lib/aspera/id_generator.rb +5 -5
  68. data/lib/aspera/keychain/encrypted_hash.rb +23 -28
  69. data/lib/aspera/keychain/macos_security.rb +21 -20
  70. data/lib/aspera/log.rb +7 -7
  71. data/lib/aspera/nagios.rb +19 -18
  72. data/lib/aspera/node.rb +209 -35
  73. data/lib/aspera/oauth.rb +37 -36
  74. data/lib/aspera/open_application.rb +19 -11
  75. data/lib/aspera/persistency_action_once.rb +4 -4
  76. data/lib/aspera/persistency_folder.rb +13 -13
  77. data/lib/aspera/preview/file_types.rb +8 -8
  78. data/lib/aspera/preview/generator.rb +67 -67
  79. data/lib/aspera/preview/utils.rb +27 -27
  80. data/lib/aspera/proxy_auto_config.js +41 -41
  81. data/lib/aspera/proxy_auto_config.rb +16 -16
  82. data/lib/aspera/rest.rb +56 -60
  83. data/lib/aspera/rest_call_error.rb +2 -1
  84. data/lib/aspera/rest_error_analyzer.rb +18 -17
  85. data/lib/aspera/rest_errors_aspera.rb +16 -16
  86. data/lib/aspera/secret_hider.rb +15 -13
  87. data/lib/aspera/ssh.rb +11 -10
  88. data/lib/aspera/sync.rb +158 -44
  89. data/lib/aspera/temp_file_manager.rb +2 -2
  90. data/lib/aspera/uri_reader.rb +4 -4
  91. data/lib/aspera/web_auth.rb +14 -13
  92. data.tar.gz.sig +0 -0
  93. metadata +8 -5
  94. metadata.gz.sig +0 -0
data/lib/aspera/sync.rb CHANGED
@@ -1,90 +1,204 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'aspera/command_line_builder'
4
+ require 'aspera/fasp/installation'
5
+ require 'json'
6
+ require 'base64'
4
7
 
5
8
  module Aspera
6
9
  # builds command line arg for async
7
10
  class Sync
8
- INSTANCE_PARAMS =
11
+ PARAMS_VX_INSTANCE =
9
12
  {
10
13
  'alt_logdir' => { cltype: :opt_with_arg, accepted_types: :string},
11
14
  'watchd' => { cltype: :opt_with_arg, accepted_types: :string},
12
15
  'apply_local_docroot' => { cltype: :opt_without_arg},
13
- 'quiet' => { cltype: :opt_without_arg}
16
+ 'quiet' => { cltype: :opt_without_arg},
17
+ 'ws_connect' => { cltype: :opt_without_arg}
14
18
  }.freeze
15
- SESSION_PARAMS =
19
+
20
+ # map sync session parameters to transfer spec: sync -> ts, true if same
21
+ PARAMS_VX_SESSION =
16
22
  {
17
23
  'name' => { cltype: :opt_with_arg, accepted_types: :string},
18
24
  'local_dir' => { cltype: :opt_with_arg, accepted_types: :string},
19
25
  'remote_dir' => { cltype: :opt_with_arg, accepted_types: :string},
20
26
  'local_db_dir' => { cltype: :opt_with_arg, accepted_types: :string},
21
27
  'remote_db_dir' => { cltype: :opt_with_arg, accepted_types: :string},
22
- 'host' => { cltype: :opt_with_arg, accepted_types: :string},
23
- 'user' => { cltype: :opt_with_arg, accepted_types: :string},
24
- 'private_key_path' => { cltype: :opt_with_arg, accepted_types: :string},
28
+ 'host' => { cltype: :opt_with_arg, accepted_types: :string, ts: :remote_host},
29
+ 'user' => { cltype: :opt_with_arg, accepted_types: :string, ts: :remote_user},
30
+ 'private_key_paths' => { cltype: :opt_with_arg, accepted_types: :array, clswitch: '--private-key-path'},
25
31
  'direction' => { cltype: :opt_with_arg, accepted_types: :string},
26
32
  'checksum' => { cltype: :opt_with_arg, accepted_types: :string},
27
- 'tcp_port' => { cltype: :opt_with_arg, accepted_types: :int},
33
+ 'tags' => { cltype: :opt_with_arg, accepted_types: :hash, ts: true,
34
+ clswitch: '--tags64', clconvert: 'Aspera::Fasp::Parameters.clconv_json64'},
35
+ 'tcp_port' => { cltype: :opt_with_arg, accepted_types: :int, ts: :ssh_port},
28
36
  'rate_policy' => { cltype: :opt_with_arg, accepted_types: :string},
29
37
  'target_rate' => { cltype: :opt_with_arg, accepted_types: :string},
30
38
  'cooloff' => { cltype: :opt_with_arg, accepted_types: :int},
31
39
  'pending_max' => { cltype: :opt_with_arg, accepted_types: :int},
32
40
  'scan_intensity' => { cltype: :opt_with_arg, accepted_types: :string},
33
- 'cipher' => { cltype: :opt_with_arg, accepted_types: :string},
41
+ 'cipher' => { cltype: :opt_with_arg, accepted_types: :string, ts: true},
34
42
  'transfer_threads' => { cltype: :opt_with_arg, accepted_types: :int},
35
- 'preserve_time' => { cltype: :opt_without_arg},
36
- 'preserve_access_time' => { cltype: :opt_without_arg},
37
- 'preserve_modification_time' => { cltype: :opt_without_arg},
38
- 'preserve_uid' => { cltype: :opt_without_arg},
39
- 'preserve_gid' => { cltype: :opt_without_arg},
40
- 'create_dir' => { cltype: :opt_without_arg},
43
+ 'preserve_time' => { cltype: :opt_without_arg, ts: :preserve_times},
44
+ 'preserve_access_time' => { cltype: :opt_without_arg, ts: nil},
45
+ 'preserve_modification_time' => { cltype: :opt_without_arg, ts: nil},
46
+ 'preserve_uid' => { cltype: :opt_without_arg, ts: :preserve_file_owner_uid},
47
+ 'preserve_gid' => { cltype: :opt_without_arg, ts: :preserve_file_owner_gid},
48
+ 'create_dir' => { cltype: :opt_without_arg, ts: true},
41
49
  'reset' => { cltype: :opt_without_arg},
42
- # note: only one env var, but multiple sessions... may be a problem
43
- 'remote_password' => { cltype: :envvar, clvarname: 'ASPERA_SCP_PASS'},
44
- 'cookie' => { cltype: :envvar, clvarname: 'ASPERA_SCP_COOKIE'},
45
- 'token' => { cltype: :envvar, clvarname: 'ASPERA_SCP_TOKEN'},
50
+ # NOTE: only one env var, but multiple sessions... could be a problem
51
+ 'remote_password' => { cltype: :envvar, clvarname: 'ASPERA_SCP_PASS', ts: true},
52
+ 'cookie' => { cltype: :envvar, clvarname: 'ASPERA_SCP_COOKIE', ts: true},
53
+ 'token' => { cltype: :envvar, clvarname: 'ASPERA_SCP_TOKEN', ts: true},
46
54
  'license' => { cltype: :envvar, clvarname: 'ASPERA_SCP_LICENSE'}
47
55
  }.freeze
48
56
 
49
- Aspera::CommandLineBuilder.normalize_description(INSTANCE_PARAMS)
50
- Aspera::CommandLineBuilder.normalize_description(SESSION_PARAMS)
57
+ Aspera::CommandLineBuilder.normalize_description(PARAMS_VX_INSTANCE)
58
+ Aspera::CommandLineBuilder.normalize_description(PARAMS_VX_SESSION)
51
59
 
52
- private_constant :INSTANCE_PARAMS,:SESSION_PARAMS
60
+ PARAMS_VX_KEYS = %w[instance sessions].freeze
53
61
 
54
- def initialize(sync_params)
55
- @sync_params = sync_params
56
- end
62
+ TS_TO_PARAMS = {
63
+ 'remote_host' => 'remote.host',
64
+ 'remote_user' => 'remote.user',
65
+ 'remote_password' => 'remote.pass',
66
+ 'sshfp' => 'remote.fingerprint',
67
+ 'ssh_port' => 'remote.port',
68
+ 'wss_port' => 'remote.ws_port',
69
+ 'proxy' => 'remote.proxy',
70
+ 'token' => 'remote.token',
71
+ 'tags' => 'tags'
72
+ }.freeze
73
+
74
+ ASYNC_EXECUTABLE = 'async'
57
75
 
58
- MANDATORY_KEYS = %w[instance sessions].freeze
76
+ private_constant :PARAMS_VX_INSTANCE, :PARAMS_VX_SESSION, :PARAMS_VX_KEYS, :ASYNC_EXECUTABLE
59
77
 
60
- def compute_args
61
- raise StandardError,'parameter must be Hash' unless @sync_params.is_a?(Hash)
62
- raise StandardError,"parameter hash must have at least 'sessions', and optionally 'instance' keys." unless
63
- @sync_params.keys.push('instance').uniq.sort.eql?(MANDATORY_KEYS)
64
- raise StandardError,'sessions key must be Array' unless @sync_params['sessions'].is_a?(Array)
65
- raise StandardError,'sessions key must has at least one element (hash)' unless @sync_params['sessions'].first.is_a?(Hash)
78
+ class << self
79
+ def update_parameters_with_transfer_spec(sync_params, transfer_spec)
80
+ if sync_params.key?('local')
81
+ # async native JSON format
82
+ raise StandardError, 'local must be Hash' unless sync_params['local'].is_a?(Hash)
83
+ TS_TO_PARAMS.each do |ts_param, sy_path|
84
+ next unless transfer_spec.key?(ts_param)
85
+ sy_dig = sy_path.split('.')
86
+ param = sy_dig.pop
87
+ hash = sy_dig.empty? ? sync_params : sync_params[sy_dig.first]
88
+ hash = sync_params[sy_dig.first] = {} if hash.nil?
89
+ hash[param] = transfer_spec[ts_param]
90
+ end
91
+ # 'remote.path',
92
+ sync_params['remote']['connect_mode'] ||= sync_params['remote'].key?('ws_port') ? 'ws' : 'ssh'
93
+ sync_params['remote']['private_key_paths'] ||= Fasp::Installation.instance.bypass_keys if transfer_spec.key?('token')
94
+ sync_params['remote']['path'] ||= '/' if transfer_spec.dig(*%w[tags aspera node file_id])
95
+ elsif sync_params.key?('sessions')
96
+ sync_params['sessions'].each do |session|
97
+ PARAMS_VX_SESSION.each do |async_param, behaviour|
98
+ if behaviour.key?(:ts)
99
+ tspec_param = behaviour[:ts].is_a?(TrueClass) ? async_param : behaviour[:ts].to_s
100
+ session[async_param] ||= transfer_spec[tspec_param] if transfer_spec.key?(tspec_param)
101
+ end
102
+ end
103
+ session['private_key_paths'] = Fasp::Installation.instance.bypass_keys if transfer_spec.key?('token')
104
+ session['remote_dir'] = '/' if transfer_spec.dig(*%w[tags aspera node file_id])
105
+ end
106
+ else
107
+ raise 'At least one of `local` or `sessions` must be present in async parameters'
108
+ end
109
+ Log.dump(:sync, sync_params)
110
+ end
111
+ end
66
112
 
67
- env_args = {
113
+ attr_reader :env_args
114
+
115
+ def initialize(sync_params)
116
+ raise StandardError, 'parameter must be Hash' unless sync_params.is_a?(Hash)
117
+ @env_args = {
68
118
  args: [],
69
119
  env: {}
70
120
  }
121
+ if sync_params.key?('local')
122
+ # async native JSON format
123
+ raise StandardError, 'remote must be Hash' unless sync_params['remote'].is_a?(Hash)
124
+ @env_args[:args] = "--conf64=#{Base64.strict_encode64(JSON.generate(sync_params))}"
125
+ elsif sync_params.key?('sessions')
126
+ # ascli JSON format
127
+ raise StandardError, "Only 'sessions', and optionally 'instance' keys are allowed" unless
128
+ sync_params.keys.push('instance').uniq.sort.eql?(PARAMS_VX_KEYS)
129
+ raise StandardError, 'sessions key must be Array' unless sync_params['sessions'].is_a?(Array)
130
+ raise StandardError, 'sessions key requires at least one Hash' unless sync_params['sessions'].first.is_a?(Hash)
71
131
 
72
- if @sync_params.has_key?('instance')
73
- raise StandardError,'instance key must be hash' unless @sync_params['instance'].is_a?(Hash)
74
- instance_builder = CommandLineBuilder.new(@sync_params['instance'],INSTANCE_PARAMS)
75
- instance_builder.process_params
76
- instance_builder.add_env_args(env_args[:env],env_args[:args])
132
+ if sync_params.key?('instance')
133
+ raise StandardError, 'instance key must be Hash' unless sync_params['instance'].is_a?(Hash)
134
+ instance_builder = Aspera::CommandLineBuilder.new(sync_params['instance'], PARAMS_VX_INSTANCE)
135
+ instance_builder.process_params
136
+ instance_builder.add_env_args(@env_args[:env], @env_args[:args])
137
+ end
138
+
139
+ sync_params['sessions'].each do |session_params|
140
+ raise StandardError, 'sessions must contain hashes' unless session_params.is_a?(Hash)
141
+ raise StandardError, 'session must contain at leat name' unless session_params.key?('name')
142
+ session_builder = Aspera::CommandLineBuilder.new(session_params, PARAMS_VX_SESSION)
143
+ session_builder.process_params
144
+ session_builder.add_env_args(@env_args[:env], @env_args[:args])
145
+ end
146
+ else
147
+ raise 'At least one of `local` or `sessions` must be present in async parameters'
77
148
  end
149
+ end
78
150
 
79
- @sync_params['sessions'].each do |session_params|
80
- raise StandardError,'sessions must contain hashes' unless session_params.is_a?(Hash)
81
- raise StandardError,'session must contain at leat name' unless session_params.has_key?('name')
82
- session_builder = CommandLineBuilder.new(session_params,SESSION_PARAMS)
83
- session_builder.process_params
84
- session_builder.add_env_args(env_args[:env],env_args[:args])
151
+ def start
152
+ Log.log.debug{"execute: #{@env_args[:env].map{|k, v| "#{k}=\"#{v}\""}.join(' ')} \"#{ASYNC_EXECUTABLE}\" \"#{@env_args[:args].join('" "')}\""}
153
+ res = system(@env_args[:env], [ASYNC_EXECUTABLE, ASYNC_EXECUTABLE], *@env_args[:args])
154
+ Log.log.debug{"result=#{res}"}
155
+ case res
156
+ when true then return nil
157
+ when false then raise "failed: #{$CHILD_STATUS}"
158
+ when nil then raise "not started: #{$CHILD_STATUS}"
159
+ else raise 'internal error: unspecified case'
85
160
  end
161
+ end
162
+ end
163
+
164
+ class SyncAdmin
165
+ ASYNC_ADMIN_EXECUTABLE = 'asyncadmin'
166
+ private_constant :ASYNC_ADMIN_EXECUTABLE
167
+ def initialize(sync_params, session_name)
168
+ @cmdline = [ASYNC_ADMIN_EXECUTABLE, '--quiet']
169
+ if sync_params.key?('local')
170
+ raise 'Missing session name' if sync_params['name'].nil?
171
+ raise 'Session not found' unless session_name.nil? || session_name.eql?(sync_params['name'])
172
+ @cmdline.push("--name=#{sync_params['name']}")
173
+ if sync_params.key?('local_db_dir')
174
+ @cmdline.push("--local-db-dir=#{sync_params['local_db_dir']}")
175
+ elsif sync_params.dig('local', 'path')
176
+ @cmdline.push("--local-dir=#{sync_params.dig('local', 'path')}")
177
+ else
178
+ raise 'Missing either local_db_dir or local.path'
179
+ end
180
+ elsif sync_params.key?('sessions')
181
+ session = session_name.nil? ? sync_params['sessions'].first : sync_params['sessions'].find{|s|s['name'].eql?(session_name)}
182
+ raise 'Session not found' if session.nil?
183
+ raise 'Missing session name' if session['name'].nil?
184
+ @cmdline.push("--name=#{session['name']}")
185
+ if session.key?('local_db_dir')
186
+ @cmdline.push("--local-db-dir=#{session['local_db_dir']}")
187
+ elsif session.key?('local_dir')
188
+ @cmdline.push("--local-dir=#{session['local_dir']}")
189
+ else
190
+ raise 'Missing either local_db_dir or local_dir'
191
+ end
192
+ else
193
+ raise 'At least one of `local` or `sessions` must be present in async parameters'
194
+ end
195
+ end
86
196
 
87
- return env_args
197
+ def status
198
+ stdout, stderr, status = Open3.capture3(*@cmdline)
199
+ Log.log.debug{"status=#{status}, stderr=#{stderr}"}
200
+ raise "Sync failed: #{status.exitstatus} : #{stderr}" unless status.success?
201
+ return stdout.split("\n").each_with_object({}){|l, m|i = l.split(/: */); m[i.first.lstrip] = i.last.lstrip} # rubocop:disable Style/Semicolon
88
202
  end
89
203
  end
90
204
  end
@@ -11,7 +11,7 @@ module Aspera
11
11
  SEC_IN_DAY = 86_400
12
12
  # assume no transfer last longer than this
13
13
  # (garbage collect file list which were not deleted after transfer)
14
- FILE_LIST_AGE_MAX_SEC = 5 * SEC_IN_DAY
14
+ FILE_LIST_AGE_MAX_SEC = SEC_IN_DAY * 5
15
15
  private_constant :SEC_IN_DAY, :FILE_LIST_AGE_MAX_SEC
16
16
  include Singleton
17
17
  def initialize
@@ -53,7 +53,7 @@ module Aspera
53
53
  age_sec = (Time.now - File.stat(file_path).mtime).to_i
54
54
  # check age of file, delete too old
55
55
  if File.file?(file_path) && (age_sec > FILE_LIST_AGE_MAX_SEC)
56
- Log.log.debug("garbage collecting #{name}")
56
+ Log.log.debug{"garbage collecting #{name}"}
57
57
  File.delete(file_path)
58
58
  end
59
59
  end
@@ -10,12 +10,12 @@ module Aspera
10
10
  def read(uri_to_read)
11
11
  proxy_uri = URI.parse(uri_to_read)
12
12
  case proxy_uri.scheme
13
- when 'http','https'
14
- return Rest.new(base_url: uri_to_read,redirect_max: 5).call(operation: 'GET', subpath: '', headers: {'Accept' => 'text/plain'})[:data]
15
- when 'file',NilClass
13
+ when 'http', 'https'
14
+ return Rest.new(base_url: uri_to_read, redirect_max: 5).call(operation: 'GET', subpath: '', headers: {'Accept' => 'text/plain'})[:data]
15
+ when 'file', NilClass
16
16
  local_file_path = proxy_uri.path
17
17
  raise 'URL shall have a path, check syntax' if local_file_path.nil?
18
- local_file_path = File.expand_path(local_file_path.gsub(/^\//,'')) if /^\/(~|.|..)\//.match?(local_file_path)
18
+ local_file_path = File.expand_path(local_file_path.gsub(%r{^/}, '')) if %r{^/(~|.|..)/}.match?(local_file_path)
19
19
  return File.read(local_file_path)
20
20
  else
21
21
  raise "unknown scheme: [#{proxy_uri.scheme}] for [#{uri_to_read}]"
@@ -7,16 +7,16 @@ require 'stringio'
7
7
  module Aspera
8
8
  # servlet called on callback: it records the callback request
9
9
  class WebAuthServlet < WEBrick::HTTPServlet::AbstractServlet
10
- def initialize(server,application) # additional args get here
10
+ def initialize(server, application) # additional args get here
11
11
  Log.log.debug('WebAuthServlet initialize')
12
12
  super(server)
13
13
  @app = application
14
14
  end
15
15
 
16
16
  def service(request, response)
17
- Log.log.debug("received request from browser #{request.request_method} #{request.path}")
18
- raise WEBrick::HTTPStatus::MethodNotAllowed,"unexpected method: #{request.request_method}" unless request.request_method.eql?('GET')
19
- raise WEBrick::HTTPStatus::NotFound,"unexpected path: #{request.path}" unless request.path.eql?(@app.expected_path)
17
+ Log.log.debug{"received request from browser #{request.request_method} #{request.path}"}
18
+ raise WEBrick::HTTPStatus::MethodNotAllowed, "unexpected method: #{request.request_method}" unless request.request_method.eql?('GET')
19
+ raise WEBrick::HTTPStatus::NotFound, "unexpected path: #{request.path}" unless request.path.eql?(@app.expected_path)
20
20
  # acquire lock and signal change
21
21
  @app.mutex.synchronize do
22
22
  @app.query = request.query
@@ -30,7 +30,7 @@ module Aspera
30
30
  end # WebAuthServlet
31
31
 
32
32
  # generates and adds self signed cert to provided webrick options
33
- #def fill_self_signed_cert(cert,key)
33
+ # def fill_self_signed_cert(cert,key)
34
34
  # cert.subject = cert.issuer = OpenSSL::X509::Name.parse('/C=FR/O=Test/OU=Test/CN=Test')
35
35
  # cert.not_before = Time.now
36
36
  # cert.not_after = Time.now + 365 * 24 * 60 * 60
@@ -47,12 +47,13 @@ module Aspera
47
47
  # ]
48
48
  # cert.add_extension(ef.create_extension('authorityKeyIdentifier','keyid:always,issuer:always'))
49
49
  # cert.sign(key, OpenSSL::Digest::SHA256.new)
50
- #end
50
+ # end
51
51
 
52
52
  # start a local web server, then start a browser that will callback the local server upon authentication
53
53
  class WebAuth
54
- attr_reader :expected_path,:mutex,:cond
54
+ attr_reader :expected_path, :mutex, :cond
55
55
  attr_writer :query
56
+
56
57
  # @param endpoint_url [String] e.g. 'https://127.0.0.1:12345'
57
58
  def initialize(endpoint_url)
58
59
  uri = URI.parse(endpoint_url)
@@ -74,14 +75,14 @@ module Aspera
74
75
  when 'https'
75
76
  webrick_options[:SSLEnable] = true
76
77
  # a- automatic certificate generation
77
- webrick_options[:SSLCertName] = [['CN',WEBrick::Utils.getservername]]
78
+ webrick_options[:SSLCertName] = [['CN', WEBrick::Utils.getservername]]
78
79
  # b- generate self signed cert
79
- #webrick_options[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(4096)
80
- #webrick_options[:SSLCertificate] = OpenSSL::X509::Certificate.new
81
- #self.class.fill_self_signed_cert(webrick_options[:SSLCertificate],webrick_options[:SSLPrivateKey])
80
+ # webrick_options[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(4096)
81
+ # webrick_options[:SSLCertificate] = OpenSSL::X509::Certificate.new
82
+ # self.class.fill_self_signed_cert(webrick_options[:SSLCertificate],webrick_options[:SSLPrivateKey])
82
83
  ## c- good cert
83
- #webrick_options[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.read('.../myserver.key'))
84
- #webrick_options[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read('.../myserver.crt'))
84
+ # webrick_options[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.read('.../myserver.key'))
85
+ # webrick_options[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read('.../myserver.crt'))
85
86
  end
86
87
  # self signed certificate generates characters on STDERR, see create_self_signed_cert in webrick/ssl.rb
87
88
  Log.capture_stderr { @server = WEBrick::HTTPServer.new(webrick_options) }
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.10.0
4
+ version: 4.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent Martin
@@ -35,7 +35,7 @@ cert_chain:
35
35
  ZjkOWbUc1aLIsfaQFHWyNfisY9X2RgkFHjX0p5493wnoA7aWh52MUhc145npFh8z
36
36
  v4P9xwkT02Shkert4B4iwNvVjoAUGk+J4090svZCroAyXBjon5LV7MJ4fyw=
37
37
  -----END CERTIFICATE-----
38
- date: 2022-12-01 00:00:00.000000000 Z
38
+ date: 2023-01-26 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: execjs
@@ -89,14 +89,14 @@ dependencies:
89
89
  name: net-ssh
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
- - - "~>"
92
+ - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: '6.0'
95
95
  type: :runtime
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
98
98
  requirements:
99
- - - "~>"
99
+ - - ">="
100
100
  - !ruby/object:Gem::Version
101
101
  version: '6.0'
102
102
  - !ruby/object:Gem::Dependency
@@ -360,6 +360,9 @@ executables:
360
360
  extensions: []
361
361
  extra_rdoc_files: []
362
362
  files:
363
+ - BUGS.md
364
+ - CHANGELOG.md
365
+ - CONTRIBUTING.md
363
366
  - README.md
364
367
  - bin/ascli
365
368
  - bin/asession
@@ -485,7 +488,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
485
488
  version: '0'
486
489
  requirements:
487
490
  - Read the manual for any requirement
488
- rubygems_version: 3.1.6
491
+ rubygems_version: 3.4.1
489
492
  signing_key:
490
493
  specification_version: 4
491
494
  summary: 'Execute actions using command line on IBM Aspera Server products: Aspera
metadata.gz.sig CHANGED
Binary file