aspera-cli 4.13.0 → 4.15.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/CHANGELOG.md +81 -7
- data/CONTRIBUTING.md +22 -6
- data/README.md +2038 -1080
- data/bin/ascli +18 -9
- data/bin/asession +12 -14
- data/examples/dascli +1 -1
- data/examples/proxy.pac +1 -1
- data/examples/rubyc +24 -0
- data/lib/aspera/aoc.rb +219 -159
- data/lib/aspera/ascmd.rb +25 -14
- data/lib/aspera/cli/basic_auth_plugin.rb +12 -9
- data/lib/aspera/cli/error.rb +17 -0
- data/lib/aspera/cli/extended_value.rb +47 -12
- data/lib/aspera/cli/formatter.rb +260 -179
- data/lib/aspera/cli/hints.rb +80 -0
- data/lib/aspera/cli/main.rb +104 -156
- data/lib/aspera/cli/manager.rb +259 -209
- data/lib/aspera/cli/plugin.rb +123 -63
- data/lib/aspera/cli/plugins/alee.rb +2 -3
- data/lib/aspera/cli/plugins/aoc.rb +341 -261
- data/lib/aspera/cli/plugins/ats.rb +22 -21
- data/lib/aspera/cli/plugins/bss.rb +5 -5
- data/lib/aspera/cli/plugins/config.rb +578 -627
- data/lib/aspera/cli/plugins/console.rb +44 -6
- data/lib/aspera/cli/plugins/cos.rb +15 -17
- data/lib/aspera/cli/plugins/faspex.rb +114 -100
- data/lib/aspera/cli/plugins/faspex5.rb +411 -264
- data/lib/aspera/cli/plugins/node.rb +354 -259
- data/lib/aspera/cli/plugins/orchestrator.rb +61 -29
- data/lib/aspera/cli/plugins/preview.rb +82 -90
- data/lib/aspera/cli/plugins/server.rb +79 -32
- data/lib/aspera/cli/plugins/shares.rb +55 -42
- data/lib/aspera/cli/sync_actions.rb +68 -0
- data/lib/aspera/cli/transfer_agent.rb +66 -73
- data/lib/aspera/cli/transfer_progress.rb +74 -0
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/colors.rb +12 -8
- data/lib/aspera/command_line_builder.rb +14 -11
- data/lib/aspera/cos_node.rb +3 -2
- data/lib/aspera/data/6 +0 -0
- data/lib/aspera/environment.rb +24 -9
- data/lib/aspera/fasp/agent_aspera.rb +126 -0
- data/lib/aspera/fasp/agent_base.rb +31 -77
- data/lib/aspera/fasp/agent_connect.rb +25 -21
- data/lib/aspera/fasp/agent_direct.rb +89 -103
- data/lib/aspera/fasp/agent_httpgw.rb +231 -149
- data/lib/aspera/fasp/agent_node.rb +41 -34
- data/lib/aspera/fasp/agent_trsdk.rb +75 -32
- data/lib/aspera/fasp/error_info.rb +4 -2
- data/lib/aspera/fasp/faux_file.rb +52 -0
- data/lib/aspera/fasp/installation.rb +53 -195
- data/lib/aspera/fasp/management.rb +244 -0
- data/lib/aspera/fasp/parameters.rb +71 -37
- data/lib/aspera/fasp/parameters.yaml +76 -8
- data/lib/aspera/fasp/products.rb +162 -0
- data/lib/aspera/fasp/resume_policy.rb +3 -3
- data/lib/aspera/fasp/transfer_spec.rb +7 -6
- data/lib/aspera/fasp/uri.rb +26 -24
- data/lib/aspera/faspex_gw.rb +2 -2
- data/lib/aspera/faspex_postproc.rb +2 -2
- data/lib/aspera/hash_ext.rb +14 -4
- data/lib/aspera/json_rpc.rb +49 -0
- data/lib/aspera/keychain/macos_security.rb +13 -13
- data/lib/aspera/line_logger.rb +23 -0
- data/lib/aspera/log.rb +58 -16
- data/lib/aspera/node.rb +157 -92
- data/lib/aspera/oauth.rb +37 -19
- data/lib/aspera/open_application.rb +4 -4
- data/lib/aspera/persistency_action_once.rb +1 -1
- data/lib/aspera/persistency_folder.rb +2 -2
- data/lib/aspera/preview/file_types.rb +4 -2
- data/lib/aspera/preview/generator.rb +22 -35
- data/lib/aspera/preview/options.rb +2 -0
- data/lib/aspera/preview/terminal.rb +73 -16
- data/lib/aspera/preview/utils.rb +21 -28
- data/lib/aspera/proxy_auto_config.js +2 -2
- data/lib/aspera/rest.rb +136 -68
- data/lib/aspera/rest_call_error.rb +1 -1
- data/lib/aspera/rest_error_analyzer.rb +15 -14
- data/lib/aspera/rest_errors_aspera.rb +37 -34
- data/lib/aspera/secret_hider.rb +18 -15
- data/lib/aspera/ssh.rb +5 -2
- data/lib/aspera/sync.rb +127 -119
- data/lib/aspera/temp_file_manager.rb +10 -3
- data/lib/aspera/web_auth.rb +10 -7
- data/lib/aspera/web_server_simple.rb +9 -4
- data.tar.gz.sig +0 -0
- metadata +34 -17
- metadata.gz.sig +0 -0
- data/docs/test_env.conf +0 -186
- data/lib/aspera/cli/listener/line_dump.rb +0 -19
- data/lib/aspera/cli/listener/logger.rb +0 -22
- data/lib/aspera/cli/listener/progress.rb +0 -50
- data/lib/aspera/cli/listener/progress_multi.rb +0 -84
- data/lib/aspera/cli/plugins/sync.rb +0 -44
- data/lib/aspera/data/7 +0 -0
- data/lib/aspera/fasp/listener.rb +0 -13
data/lib/aspera/sync.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# cspell:words logdir bidi watchd cooloff asyncadmin
|
4
|
+
|
3
5
|
require 'aspera/command_line_builder'
|
4
6
|
require 'aspera/fasp/installation'
|
7
|
+
require 'aspera/log'
|
5
8
|
require 'json'
|
6
9
|
require 'base64'
|
10
|
+
require 'open3'
|
11
|
+
require 'English'
|
7
12
|
|
8
13
|
module Aspera
|
9
14
|
# builds command line arg for async
|
10
|
-
|
11
|
-
# default is push
|
15
|
+
module Sync
|
16
|
+
# sync direction, default is push
|
12
17
|
DIRECTIONS = %i[push pull bidi].freeze
|
13
|
-
DIRECTION_TO_REQUEST_TYPE = {
|
14
|
-
push: :sync_upload,
|
15
|
-
pull: :sync_download,
|
16
|
-
bidi: :sync
|
17
|
-
}.freeze
|
18
18
|
PARAMS_VX_INSTANCE =
|
19
19
|
{
|
20
20
|
'alt_logdir' => { cli: { type: :opt_with_arg}, accepted_types: :string},
|
@@ -80,132 +80,140 @@ module Aspera
|
|
80
80
|
}.freeze
|
81
81
|
|
82
82
|
ASYNC_EXECUTABLE = 'async'
|
83
|
+
ASYNC_ADMIN_EXECUTABLE = 'asyncadmin'
|
83
84
|
|
84
|
-
private_constant :PARAMS_VX_INSTANCE, :PARAMS_VX_SESSION, :PARAMS_VX_KEYS, :ASYNC_EXECUTABLE, :
|
85
|
+
private_constant :PARAMS_VX_INSTANCE, :PARAMS_VX_SESSION, :PARAMS_VX_KEYS, :TS_TO_PARAMS_V2, :ASYNC_EXECUTABLE, :ASYNC_ADMIN_EXECUTABLE
|
85
86
|
|
86
|
-
|
87
|
+
class << self
|
88
|
+
# Set remote_dir in sync parameters based on transfer spec
|
89
|
+
# @param params [Hash] sync parameters, old or new format
|
90
|
+
# @param remote_dir_key [String] key to update in above hash
|
91
|
+
# @param transfer_spec [Hash] transfer spec
|
92
|
+
def update_remote_dir(sync_params, remote_dir_key, transfer_spec)
|
93
|
+
if transfer_spec.dig(*%w[tags aspera node file_id])
|
94
|
+
# in AoC, use gen4
|
95
|
+
sync_params[remote_dir_key] = '/'
|
96
|
+
elsif transfer_spec['cookie']&.start_with?('aspera.shares2')
|
97
|
+
# TODO : something more generic, independent of Shares
|
98
|
+
# in Shares, the actual folder on remote end is not always the same as the name of the share
|
99
|
+
actual_remote = transfer_spec['paths']&.first&.[]('source')
|
100
|
+
sync_params[remote_dir_key] = actual_remote if actual_remote
|
101
|
+
end
|
102
|
+
nil
|
103
|
+
end
|
87
104
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
105
|
+
# @param sync_params [Hash] sync parameters, old or new format
|
106
|
+
# @param block [nil, Proc] block to generate transfer spec, takes: direction (one of DIRECTIONS), local_dir, remote_dir
|
107
|
+
def start(sync_params, &block)
|
108
|
+
raise 'Internal Error: sync_params parameter must be Hash' unless sync_params.is_a?(Hash)
|
109
|
+
env_args = {
|
110
|
+
args: [],
|
111
|
+
env: {}
|
112
|
+
}
|
113
|
+
if sync_params.key?('local')
|
114
|
+
# async native JSON format (v2)
|
115
|
+
raise StandardError, 'remote must be Hash' unless sync_params['remote'].is_a?(Hash)
|
116
|
+
if block
|
117
|
+
transfer_spec = yield((sync_params['direction'] || 'push').to_sym, sync_params['local']['path'], sync_params['remote']['path'])
|
118
|
+
# async native JSON format
|
119
|
+
raise StandardError, 'sync parameter "local" must be Hash' unless sync_params['local'].is_a?(Hash)
|
120
|
+
TS_TO_PARAMS_V2.each do |ts_param, sy_path|
|
121
|
+
next unless transfer_spec.key?(ts_param)
|
122
|
+
sy_dig = sy_path.split('.')
|
123
|
+
param = sy_dig.pop
|
124
|
+
hash = sy_dig.empty? ? sync_params : sync_params[sy_dig.first]
|
125
|
+
hash = sync_params[sy_dig.first] = {} if hash.nil?
|
126
|
+
hash[param] = transfer_spec[ts_param]
|
127
|
+
end
|
128
|
+
sync_params['remote']['connect_mode'] ||= sync_params['remote'].key?('ws_port') ? 'ws' : 'ssh'
|
129
|
+
sync_params['remote']['private_key_paths'] ||= Fasp::Installation.instance.aspera_token_ssh_key_paths if transfer_spec.key?('token')
|
130
|
+
update_remote_dir(sync_params['remote'], 'path', transfer_spec)
|
111
131
|
end
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
PARAMS_VX_SESSION.each do |async_param, behavior|
|
124
|
-
if behavior.key?(:ts)
|
125
|
-
tspec_param = behavior[:ts].is_a?(TrueClass) ? async_param : behavior[:ts].to_s
|
126
|
-
session[async_param] ||= transfer_spec[tspec_param] if transfer_spec.key?(tspec_param)
|
132
|
+
env_args[:args] = ["--conf64=#{Base64.strict_encode64(JSON.generate(sync_params))}"]
|
133
|
+
elsif sync_params.key?('sessions')
|
134
|
+
# ascli JSON format (v1)
|
135
|
+
if block
|
136
|
+
sync_params['sessions'].each do |session|
|
137
|
+
transfer_spec = yield((session['direction'] || 'push').to_sym, session['local_dir'], session['remote_dir'])
|
138
|
+
PARAMS_VX_SESSION.each do |async_param, behavior|
|
139
|
+
if behavior.key?(:ts)
|
140
|
+
tspec_param = behavior[:ts].is_a?(TrueClass) ? async_param : behavior[:ts].to_s
|
141
|
+
session[async_param] ||= transfer_spec[tspec_param] if transfer_spec.key?(tspec_param)
|
142
|
+
end
|
127
143
|
end
|
144
|
+
session['private_key_paths'] = Fasp::Installation.instance.aspera_token_ssh_key_paths if transfer_spec.key?('token')
|
145
|
+
update_remote_dir(session, 'remote_dir', transfer_spec)
|
128
146
|
end
|
129
|
-
session['private_key_paths'] = Fasp::Installation.instance.bypass_keys if transfer_spec.key?('token')
|
130
|
-
session['remote_dir'] = '/' if transfer_spec.dig(*%w[tags aspera node file_id])
|
131
147
|
end
|
132
|
-
|
133
|
-
|
134
|
-
sync_params
|
135
|
-
|
136
|
-
raise StandardError, 'sessions key requires at least one Hash' unless sync_params['sessions'].first.is_a?(Hash)
|
148
|
+
raise StandardError, "Only 'sessions', and optionally 'instance' keys are allowed" unless
|
149
|
+
sync_params.keys.push('instance').uniq.sort.eql?(PARAMS_VX_KEYS)
|
150
|
+
raise StandardError, 'sessions key must be Array' unless sync_params['sessions'].is_a?(Array)
|
151
|
+
raise StandardError, 'sessions key requires at least one Hash' unless sync_params['sessions'].first.is_a?(Hash)
|
137
152
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
153
|
+
if sync_params.key?('instance')
|
154
|
+
raise StandardError, 'instance key must be Hash' unless sync_params['instance'].is_a?(Hash)
|
155
|
+
instance_builder = Aspera::CommandLineBuilder.new(sync_params['instance'], PARAMS_VX_INSTANCE)
|
156
|
+
instance_builder.process_params
|
157
|
+
instance_builder.add_env_args(env_args)
|
158
|
+
end
|
144
159
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
160
|
+
sync_params['sessions'].each do |session_params|
|
161
|
+
raise StandardError, 'sessions must contain hashes' unless session_params.is_a?(Hash)
|
162
|
+
raise StandardError, 'session must contain at least name' unless session_params.key?('name')
|
163
|
+
session_builder = Aspera::CommandLineBuilder.new(session_params, PARAMS_VX_SESSION)
|
164
|
+
session_builder.process_params
|
165
|
+
session_builder.add_env_args(env_args)
|
166
|
+
end
|
167
|
+
else
|
168
|
+
raise 'At least one of `local` or `sessions` must be present in async parameters'
|
151
169
|
end
|
152
|
-
|
153
|
-
raise 'At least one of `local` or `sessions` must be present in async parameters'
|
154
|
-
end
|
155
|
-
Log.dump(:sync, sync_params)
|
156
|
-
end
|
170
|
+
Log.log.debug{Log.dump(:sync_params, sync_params)}
|
157
171
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
172
|
+
Log.log.debug{"execute: #{env_args[:env].map{|k, v| "#{k}=\"#{v}\""}.join(' ')} \"#{ASYNC_EXECUTABLE}\" \"#{env_args[:args].join('" "')}\""}
|
173
|
+
res = system(env_args[:env], [ASYNC_EXECUTABLE, ASYNC_EXECUTABLE], *env_args[:args])
|
174
|
+
Log.log.debug{"result=#{res}"}
|
175
|
+
case res
|
176
|
+
when true then return nil
|
177
|
+
when false then raise "failed: #{$CHILD_STATUS}"
|
178
|
+
when nil then raise "not started: #{$CHILD_STATUS}"
|
179
|
+
else raise 'internal error: unspecified case'
|
180
|
+
end
|
167
181
|
end
|
168
|
-
end
|
169
|
-
end # end Sync
|
170
182
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
183
|
+
def admin_status(sync_params, session_name)
|
184
|
+
command_line = [ASYNC_ADMIN_EXECUTABLE, '--quiet']
|
185
|
+
if sync_params.key?('local')
|
186
|
+
raise 'Missing session name' if sync_params['name'].nil?
|
187
|
+
raise 'Session not found' unless session_name.nil? || session_name.eql?(sync_params['name'])
|
188
|
+
command_line.push("--name=#{sync_params['name']}")
|
189
|
+
if sync_params.key?('local_db_dir')
|
190
|
+
command_line.push("--local-db-dir=#{sync_params['local_db_dir']}")
|
191
|
+
elsif sync_params.dig('local', 'path')
|
192
|
+
command_line.push("--local-dir=#{sync_params.dig('local', 'path')}")
|
193
|
+
else
|
194
|
+
raise 'Missing either local_db_dir or local.path'
|
195
|
+
end
|
196
|
+
elsif sync_params.key?('sessions')
|
197
|
+
session = session_name.nil? ? sync_params['sessions'].first : sync_params['sessions'].find{|s|s['name'].eql?(session_name)}
|
198
|
+
raise "Session #{session_name} not found in #{sync_params['sessions'].map{|s|s['name']}.join(',')}" if session.nil?
|
199
|
+
raise 'Missing session name' if session['name'].nil?
|
200
|
+
command_line.push("--name=#{session['name']}")
|
201
|
+
if session.key?('local_db_dir')
|
202
|
+
command_line.push("--local-db-dir=#{session['local_db_dir']}")
|
203
|
+
elsif session.key?('local_dir')
|
204
|
+
command_line.push("--local-dir=#{session['local_dir']}")
|
205
|
+
else
|
206
|
+
raise 'Missing either local_db_dir or local_dir'
|
207
|
+
end
|
196
208
|
else
|
197
|
-
raise '
|
209
|
+
raise 'At least one of `local` or `sessions` must be present in async parameters'
|
198
210
|
end
|
199
|
-
|
200
|
-
|
211
|
+
Log.log.debug{"execute: #{command_line.join(' ')}"}
|
212
|
+
stdout, stderr, status = Open3.capture3(*command_line)
|
213
|
+
Log.log.debug{"status=#{status}, stderr=#{stderr}"}
|
214
|
+
raise "Sync failed: #{status.exitstatus} : #{stderr}" unless status.success?
|
215
|
+
return stdout.split("\n").each_with_object({}){|l, m|i = l.split(':', 2); m[i.first.lstrip] = i.last.lstrip} # rubocop:disable Style/Semicolon
|
201
216
|
end
|
202
217
|
end
|
203
|
-
|
204
|
-
|
205
|
-
stdout, stderr, status = Open3.capture3(*@cmdline)
|
206
|
-
Log.log.debug{"status=#{status}, stderr=#{stderr}"}
|
207
|
-
raise "Sync failed: #{status.exitstatus} : #{stderr}" unless status.success?
|
208
|
-
return stdout.split("\n").each_with_object({}){|l, m|i = l.split(/: */); m[i.first.lstrip] = i.last.lstrip} # rubocop:disable Style/Semicolon
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
218
|
+
end # end Sync
|
219
|
+
end # end Aspera
|
@@ -14,14 +14,21 @@ module Aspera
|
|
14
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
|
+
attr_accessor :cleanup_on_exit
|
18
|
+
|
17
19
|
def initialize
|
18
20
|
@created_files = []
|
21
|
+
@cleanup_on_exit = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_file(filepath)
|
25
|
+
File.delete(filepath) if @cleanup_on_exit
|
19
26
|
end
|
20
27
|
|
21
28
|
# call this on process exit
|
22
29
|
def cleanup
|
23
30
|
@created_files.each do |filepath|
|
24
|
-
|
31
|
+
delete_file(filepath) if File.file?(filepath)
|
25
32
|
end
|
26
33
|
@created_files = []
|
27
34
|
end
|
@@ -29,7 +36,7 @@ module Aspera
|
|
29
36
|
# ensure that provided folder exists, or create it, generate a unique filename
|
30
37
|
# @return path to that unique file
|
31
38
|
def new_file_path_in_folder(temp_folder, add_base = '')
|
32
|
-
FileUtils.mkdir_p(temp_folder)
|
39
|
+
FileUtils.mkdir_p(temp_folder)
|
33
40
|
new_file = File.join(temp_folder, add_base + SecureRandom.uuid)
|
34
41
|
@created_files.push(new_file)
|
35
42
|
new_file
|
@@ -54,7 +61,7 @@ module Aspera
|
|
54
61
|
# check age of file, delete too old
|
55
62
|
if File.file?(file_path) && (age_sec > FILE_LIST_AGE_MAX_SEC)
|
56
63
|
Log.log.debug{"garbage collecting #{name}"}
|
57
|
-
|
64
|
+
delete_file(file_path)
|
58
65
|
end
|
59
66
|
end
|
60
67
|
end
|
data/lib/aspera/web_auth.rb
CHANGED
@@ -6,20 +6,22 @@ require 'stringio'
|
|
6
6
|
module Aspera
|
7
7
|
# servlet called on callback: it records the callback request
|
8
8
|
class WebAuthServlet < WEBrick::HTTPServlet::AbstractServlet
|
9
|
-
|
9
|
+
# @param server [WEBrick::HTTPServer]
|
10
|
+
# @param web_auth [WebAuth]
|
11
|
+
def initialize(server, web_auth)
|
10
12
|
Log.log.debug('WebAuthServlet initialize')
|
11
13
|
super(server)
|
12
|
-
@
|
14
|
+
@web_auth = web_auth
|
13
15
|
end
|
14
16
|
|
15
17
|
def service(request, response)
|
16
18
|
Log.log.debug{"received request from browser #{request.request_method} #{request.path}"}
|
17
19
|
raise WEBrick::HTTPStatus::MethodNotAllowed, "unexpected method: #{request.request_method}" unless request.request_method.eql?('GET')
|
18
|
-
raise WEBrick::HTTPStatus::NotFound, "unexpected path: #{request.path}" unless request.path.eql?(@
|
20
|
+
raise WEBrick::HTTPStatus::NotFound, "unexpected path: #{request.path}" unless request.path.eql?(@web_auth.expected_path)
|
19
21
|
# acquire lock and signal change
|
20
|
-
@
|
21
|
-
@
|
22
|
-
@
|
22
|
+
@web_auth.mutex.synchronize do
|
23
|
+
@web_auth.query = request.query
|
24
|
+
@web_auth.cond.signal
|
23
25
|
end
|
24
26
|
response.status = 200
|
25
27
|
response.content_type = 'text/html'
|
@@ -42,7 +44,8 @@ module Aspera
|
|
42
44
|
@cond = ConditionVariable.new
|
43
45
|
@expected_path = uri.path.empty? ? '/' : uri.path
|
44
46
|
@query = nil
|
45
|
-
|
47
|
+
# last argument (self) is provided to constructor of servlet
|
48
|
+
mount(@expected_path, WebAuthServlet, self)
|
46
49
|
Thread.new { start }
|
47
50
|
end
|
48
51
|
|
@@ -8,12 +8,17 @@ require 'openssl'
|
|
8
8
|
module Aspera
|
9
9
|
class WebServerSimple < WEBrick::HTTPServer
|
10
10
|
CERT_PARAMETERS = %i[key cert chain].freeze
|
11
|
+
GENERIC_ISSUER = '/C=FR/O=Test/OU=Test/CN=Test'
|
12
|
+
ONE_YEAR_SECONDS = 365 * 24 * 60 * 60
|
13
|
+
|
14
|
+
private_constant :CERT_PARAMETERS, :GENERIC_ISSUER, :ONE_YEAR_SECONDS
|
15
|
+
|
11
16
|
class << self
|
12
17
|
# generates and adds self signed cert to provided webrick options
|
13
|
-
def fill_self_signed_cert(cert, key)
|
14
|
-
cert.subject = cert.issuer = OpenSSL::X509::Name.parse(
|
18
|
+
def fill_self_signed_cert(cert, key, digest = 'SHA256')
|
19
|
+
cert.subject = cert.issuer = OpenSSL::X509::Name.parse(GENERIC_ISSUER)
|
15
20
|
cert.not_before = Time.now
|
16
|
-
cert.not_after = Time.now +
|
21
|
+
cert.not_after = Time.now + ONE_YEAR_SECONDS
|
17
22
|
cert.public_key = key.public_key
|
18
23
|
cert.serial = 0x0
|
19
24
|
cert.version = 2
|
@@ -26,7 +31,7 @@ module Aspera
|
|
26
31
|
# ef.create_extension('keyUsage', 'cRLSign,keyCertSign', true),
|
27
32
|
]
|
28
33
|
cert.add_extension(ef.create_extension('authorityKeyIdentifier', 'keyid:always,issuer:always'))
|
29
|
-
cert.sign(key, OpenSSL::Digest.new(
|
34
|
+
cert.sign(key, OpenSSL::Digest.new(digest))
|
30
35
|
end
|
31
36
|
end
|
32
37
|
|
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.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Laurent Martin
|
@@ -37,24 +37,24 @@ cert_chain:
|
|
37
37
|
eTf9kxhVM40wGQOECVNA8UsEEZHD48eF+csUYZtAJOF5oxTI8UyV9T/o6CgO0c9/
|
38
38
|
Gzz+Qm5ULOUcPiJLjSpaiTrkiIVYiDGnqNSr6R1Hb1c=
|
39
39
|
-----END CERTIFICATE-----
|
40
|
-
date: 2023-
|
40
|
+
date: 2023-11-17 00:00:00.000000000 Z
|
41
41
|
dependencies:
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: blankslate
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '3.1'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '3.1'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: execjs
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
@@ -68,19 +68,19 @@ dependencies:
|
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '2.0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: jwt
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0
|
76
|
+
version: '2.0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0
|
83
|
+
version: '2.0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: net-ssh
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -221,6 +221,20 @@ dependencies:
|
|
221
221
|
- - "~>"
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0.3'
|
224
|
+
- !ruby/object:Gem::Dependency
|
225
|
+
name: rmagick
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
227
|
+
requirements:
|
228
|
+
- - "~>"
|
229
|
+
- !ruby/object:Gem::Version
|
230
|
+
version: '5.3'
|
231
|
+
type: :development
|
232
|
+
prerelease: false
|
233
|
+
version_requirements: !ruby/object:Gem::Requirement
|
234
|
+
requirements:
|
235
|
+
- - "~>"
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '5.3'
|
224
238
|
- !ruby/object:Gem::Dependency
|
225
239
|
name: bundler
|
226
240
|
requirement: !ruby/object:Gem::Requirement
|
@@ -362,20 +376,18 @@ files:
|
|
362
376
|
- README.md
|
363
377
|
- bin/ascli
|
364
378
|
- bin/asession
|
365
|
-
- docs/test_env.conf
|
366
379
|
- examples/dascli
|
367
380
|
- examples/proxy.pac
|
381
|
+
- examples/rubyc
|
368
382
|
- lib/aspera/aoc.rb
|
369
383
|
- lib/aspera/ascmd.rb
|
370
384
|
- lib/aspera/ats_api.rb
|
371
385
|
- lib/aspera/cli/basic_auth_plugin.rb
|
386
|
+
- lib/aspera/cli/error.rb
|
372
387
|
- lib/aspera/cli/extended_value.rb
|
373
388
|
- lib/aspera/cli/formatter.rb
|
389
|
+
- lib/aspera/cli/hints.rb
|
374
390
|
- lib/aspera/cli/info.rb
|
375
|
-
- lib/aspera/cli/listener/line_dump.rb
|
376
|
-
- lib/aspera/cli/listener/logger.rb
|
377
|
-
- lib/aspera/cli/listener/progress.rb
|
378
|
-
- lib/aspera/cli/listener/progress_multi.rb
|
379
391
|
- lib/aspera/cli/main.rb
|
380
392
|
- lib/aspera/cli/manager.rb
|
381
393
|
- lib/aspera/cli/plugin.rb
|
@@ -393,8 +405,9 @@ files:
|
|
393
405
|
- lib/aspera/cli/plugins/preview.rb
|
394
406
|
- lib/aspera/cli/plugins/server.rb
|
395
407
|
- lib/aspera/cli/plugins/shares.rb
|
396
|
-
- lib/aspera/cli/
|
408
|
+
- lib/aspera/cli/sync_actions.rb
|
397
409
|
- lib/aspera/cli/transfer_agent.rb
|
410
|
+
- lib/aspera/cli/transfer_progress.rb
|
398
411
|
- lib/aspera/cli/version.rb
|
399
412
|
- lib/aspera/colors.rb
|
400
413
|
- lib/aspera/command_line_builder.rb
|
@@ -405,9 +418,9 @@ files:
|
|
405
418
|
- lib/aspera/data/4
|
406
419
|
- lib/aspera/data/5
|
407
420
|
- lib/aspera/data/6
|
408
|
-
- lib/aspera/data/7
|
409
421
|
- lib/aspera/data_repository.rb
|
410
422
|
- lib/aspera/environment.rb
|
423
|
+
- lib/aspera/fasp/agent_aspera.rb
|
411
424
|
- lib/aspera/fasp/agent_base.rb
|
412
425
|
- lib/aspera/fasp/agent_connect.rb
|
413
426
|
- lib/aspera/fasp/agent_direct.rb
|
@@ -416,10 +429,12 @@ files:
|
|
416
429
|
- lib/aspera/fasp/agent_trsdk.rb
|
417
430
|
- lib/aspera/fasp/error.rb
|
418
431
|
- lib/aspera/fasp/error_info.rb
|
432
|
+
- lib/aspera/fasp/faux_file.rb
|
419
433
|
- lib/aspera/fasp/installation.rb
|
420
|
-
- lib/aspera/fasp/
|
434
|
+
- lib/aspera/fasp/management.rb
|
421
435
|
- lib/aspera/fasp/parameters.rb
|
422
436
|
- lib/aspera/fasp/parameters.yaml
|
437
|
+
- lib/aspera/fasp/products.rb
|
423
438
|
- lib/aspera/fasp/resume_policy.rb
|
424
439
|
- lib/aspera/fasp/transfer_spec.rb
|
425
440
|
- lib/aspera/fasp/uri.rb
|
@@ -427,8 +442,10 @@ files:
|
|
427
442
|
- lib/aspera/faspex_postproc.rb
|
428
443
|
- lib/aspera/hash_ext.rb
|
429
444
|
- lib/aspera/id_generator.rb
|
445
|
+
- lib/aspera/json_rpc.rb
|
430
446
|
- lib/aspera/keychain/encrypted_hash.rb
|
431
447
|
- lib/aspera/keychain/macos_security.rb
|
448
|
+
- lib/aspera/line_logger.rb
|
432
449
|
- lib/aspera/log.rb
|
433
450
|
- lib/aspera/nagios.rb
|
434
451
|
- lib/aspera/node.rb
|
metadata.gz.sig
CHANGED
Binary file
|