aspera-cli 4.10.0 → 4.11.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/BUGS.md +20 -0
- data/CHANGELOG.md +509 -0
- data/CONTRIBUTING.md +118 -0
- data/README.md +621 -378
- data/bin/ascli +4 -4
- data/bin/asession +11 -11
- data/docs/test_env.conf +28 -19
- data/examples/aoc.rb +4 -4
- data/examples/dascli +11 -9
- data/examples/faspex4.rb +8 -8
- data/examples/node.rb +11 -11
- data/examples/server.rb +9 -9
- data/lib/aspera/aoc.rb +273 -266
- data/lib/aspera/ascmd.rb +56 -54
- data/lib/aspera/ats_api.rb +4 -4
- data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
- data/lib/aspera/cli/extended_value.rb +5 -5
- data/lib/aspera/cli/formater.rb +64 -64
- data/lib/aspera/cli/listener/line_dump.rb +1 -1
- data/lib/aspera/cli/listener/logger.rb +1 -1
- data/lib/aspera/cli/listener/progress.rb +5 -6
- data/lib/aspera/cli/listener/progress_multi.rb +14 -19
- data/lib/aspera/cli/main.rb +66 -67
- data/lib/aspera/cli/manager.rb +110 -110
- data/lib/aspera/cli/plugin.rb +54 -37
- data/lib/aspera/cli/plugins/alee.rb +4 -4
- data/lib/aspera/cli/plugins/aoc.rb +308 -669
- data/lib/aspera/cli/plugins/ats.rb +44 -46
- data/lib/aspera/cli/plugins/bss.rb +10 -10
- data/lib/aspera/cli/plugins/config.rb +447 -344
- data/lib/aspera/cli/plugins/console.rb +12 -12
- data/lib/aspera/cli/plugins/cos.rb +18 -20
- data/lib/aspera/cli/plugins/faspex.rb +110 -112
- data/lib/aspera/cli/plugins/faspex5.rb +67 -46
- data/lib/aspera/cli/plugins/node.rb +364 -288
- data/lib/aspera/cli/plugins/orchestrator.rb +46 -46
- data/lib/aspera/cli/plugins/preview.rb +122 -114
- data/lib/aspera/cli/plugins/server.rb +137 -83
- data/lib/aspera/cli/plugins/shares.rb +30 -29
- data/lib/aspera/cli/plugins/sync.rb +13 -33
- data/lib/aspera/cli/transfer_agent.rb +57 -57
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/colors.rb +3 -3
- data/lib/aspera/command_line_builder.rb +27 -27
- data/lib/aspera/cos_node.rb +22 -20
- data/lib/aspera/data_repository.rb +1 -1
- data/lib/aspera/environment.rb +30 -28
- data/lib/aspera/fasp/agent_base.rb +15 -15
- data/lib/aspera/fasp/agent_connect.rb +23 -21
- data/lib/aspera/fasp/agent_direct.rb +65 -67
- data/lib/aspera/fasp/agent_httpgw.rb +72 -68
- data/lib/aspera/fasp/agent_node.rb +23 -21
- data/lib/aspera/fasp/agent_trsdk.rb +20 -20
- data/lib/aspera/fasp/error.rb +3 -2
- data/lib/aspera/fasp/error_info.rb +11 -8
- data/lib/aspera/fasp/installation.rb +78 -78
- data/lib/aspera/fasp/listener.rb +1 -1
- data/lib/aspera/fasp/parameters.rb +75 -72
- data/lib/aspera/fasp/parameters.yaml +2 -2
- data/lib/aspera/fasp/resume_policy.rb +8 -8
- data/lib/aspera/fasp/transfer_spec.rb +35 -2
- data/lib/aspera/fasp/uri.rb +7 -7
- data/lib/aspera/faspex_gw.rb +7 -5
- data/lib/aspera/hash_ext.rb +3 -3
- data/lib/aspera/id_generator.rb +5 -5
- data/lib/aspera/keychain/encrypted_hash.rb +23 -28
- data/lib/aspera/keychain/macos_security.rb +21 -20
- data/lib/aspera/log.rb +7 -7
- data/lib/aspera/nagios.rb +19 -18
- data/lib/aspera/node.rb +209 -35
- data/lib/aspera/oauth.rb +37 -36
- data/lib/aspera/open_application.rb +19 -11
- data/lib/aspera/persistency_action_once.rb +4 -4
- data/lib/aspera/persistency_folder.rb +13 -13
- data/lib/aspera/preview/file_types.rb +8 -8
- data/lib/aspera/preview/generator.rb +67 -67
- data/lib/aspera/preview/utils.rb +27 -27
- data/lib/aspera/proxy_auto_config.js +41 -41
- data/lib/aspera/proxy_auto_config.rb +16 -16
- data/lib/aspera/rest.rb +56 -60
- data/lib/aspera/rest_call_error.rb +2 -1
- data/lib/aspera/rest_error_analyzer.rb +18 -17
- data/lib/aspera/rest_errors_aspera.rb +16 -16
- data/lib/aspera/secret_hider.rb +15 -13
- data/lib/aspera/ssh.rb +11 -10
- data/lib/aspera/sync.rb +158 -44
- data/lib/aspera/temp_file_manager.rb +2 -2
- data/lib/aspera/uri_reader.rb +4 -4
- data/lib/aspera/web_auth.rb +14 -13
- data.tar.gz.sig +0 -0
- metadata +8 -5
- 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
|
-
|
|
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
|
-
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
#
|
|
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(
|
|
50
|
-
Aspera::CommandLineBuilder.normalize_description(
|
|
57
|
+
Aspera::CommandLineBuilder.normalize_description(PARAMS_VX_INSTANCE)
|
|
58
|
+
Aspera::CommandLineBuilder.normalize_description(PARAMS_VX_SESSION)
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
PARAMS_VX_KEYS = %w[instance sessions].freeze
|
|
53
61
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
76
|
+
private_constant :PARAMS_VX_INSTANCE, :PARAMS_VX_SESSION, :PARAMS_VX_KEYS, :ASYNC_EXECUTABLE
|
|
59
77
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
56
|
+
Log.log.debug{"garbage collecting #{name}"}
|
|
57
57
|
File.delete(file_path)
|
|
58
58
|
end
|
|
59
59
|
end
|
data/lib/aspera/uri_reader.rb
CHANGED
|
@@ -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(
|
|
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}]"
|
data/lib/aspera/web_auth.rb
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
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:
|
|
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
|
|
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
|