aspera-cli 4.4.0 → 4.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2095 -1503
- data/bin/ascli +2 -1
- data/bin/asession +4 -5
- data/docs/test_env.conf +3 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +25 -25
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +17 -17
- data/lib/aspera/aoc.rb +238 -185
- data/lib/aspera/ascmd.rb +93 -83
- data/lib/aspera/ats_api.rb +11 -10
- data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
- data/lib/aspera/cli/extended_value.rb +42 -33
- data/lib/aspera/cli/formater.rb +142 -108
- data/lib/aspera/cli/info.rb +17 -0
- data/lib/aspera/cli/listener/line_dump.rb +3 -2
- data/lib/aspera/cli/listener/logger.rb +2 -1
- data/lib/aspera/cli/listener/progress.rb +16 -18
- data/lib/aspera/cli/listener/progress_multi.rb +18 -21
- data/lib/aspera/cli/main.rb +173 -149
- data/lib/aspera/cli/manager.rb +163 -168
- data/lib/aspera/cli/plugin.rb +43 -31
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +405 -370
- data/lib/aspera/cli/plugins/ats.rb +86 -79
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +580 -362
- data/lib/aspera/cli/plugins/console.rb +23 -19
- data/lib/aspera/cli/plugins/cos.rb +18 -18
- data/lib/aspera/cli/plugins/faspex.rb +201 -158
- data/lib/aspera/cli/plugins/faspex5.rb +80 -57
- data/lib/aspera/cli/plugins/node.rb +183 -166
- data/lib/aspera/cli/plugins/orchestrator.rb +71 -67
- data/lib/aspera/cli/plugins/preview.rb +92 -96
- data/lib/aspera/cli/plugins/server.rb +79 -75
- data/lib/aspera/cli/plugins/shares.rb +35 -19
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +76 -113
- data/lib/aspera/cli/version.rb +2 -1
- data/lib/aspera/colors.rb +35 -27
- data/lib/aspera/command_line_builder.rb +48 -34
- data/lib/aspera/cos_node.rb +29 -21
- data/lib/aspera/data_repository.rb +3 -2
- data/lib/aspera/environment.rb +50 -45
- data/lib/aspera/fasp/{manager.rb → agent_base.rb} +28 -25
- data/lib/aspera/fasp/{connect.rb → agent_connect.rb} +52 -43
- data/lib/aspera/fasp/{local.rb → agent_direct.rb} +58 -72
- data/lib/aspera/fasp/{http_gw.rb → agent_httpgw.rb} +37 -43
- data/lib/aspera/fasp/{node.rb → agent_node.rb} +35 -16
- data/lib/aspera/fasp/agent_trsdk.rb +104 -0
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +152 -124
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +87 -92
- data/lib/aspera/fasp/parameters.yaml +305 -249
- data/lib/aspera/fasp/resume_policy.rb +11 -14
- data/lib/aspera/fasp/transfer_spec.rb +26 -0
- data/lib/aspera/fasp/uri.rb +22 -21
- data/lib/aspera/faspex_gw.rb +55 -89
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +121 -0
- data/lib/aspera/keychain/macos_security.rb +90 -0
- data/lib/aspera/log.rb +55 -37
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -25
- data/lib/aspera/oauth.rb +175 -226
- data/lib/aspera/open_application.rb +4 -3
- data/lib/aspera/persistency_action_once.rb +6 -6
- data/lib/aspera/persistency_folder.rb +5 -9
- data/lib/aspera/preview/file_types.rb +6 -5
- data/lib/aspera/preview/generator.rb +25 -24
- data/lib/aspera/preview/options.rb +16 -14
- data/lib/aspera/preview/utils.rb +98 -98
- data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
- data/lib/aspera/proxy_auto_config.rb +111 -20
- data/lib/aspera/rest.rb +154 -135
- data/lib/aspera/rest_call_error.rb +2 -2
- data/lib/aspera/rest_error_analyzer.rb +23 -25
- data/lib/aspera/rest_errors_aspera.rb +15 -14
- data/lib/aspera/ssh.rb +12 -10
- data/lib/aspera/sync.rb +42 -41
- data/lib/aspera/temp_file_manager.rb +18 -14
- data/lib/aspera/timer_limiter.rb +2 -1
- data/lib/aspera/uri_reader.rb +7 -5
- data/lib/aspera/web_auth.rb +79 -76
- metadata +116 -29
- data/docs/Makefile +0 -66
- data/docs/README.erb.md +0 -3973
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/api_detector.rb +0 -60
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- data/lib/aspera/secrets.rb +0 -20
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'aspera/log'
|
2
3
|
require 'aspera/command_line_builder'
|
3
4
|
require 'aspera/temp_file_manager'
|
@@ -5,75 +6,86 @@ require 'securerandom'
|
|
5
6
|
require 'base64'
|
6
7
|
require 'json'
|
7
8
|
require 'yaml'
|
8
|
-
require 'securerandom'
|
9
9
|
require 'fileutils'
|
10
|
+
require 'openssl'
|
10
11
|
|
11
12
|
module Aspera
|
12
13
|
module Fasp
|
13
14
|
# translate transfer specification to ascp parameter list
|
14
15
|
class Parameters
|
15
|
-
|
16
|
-
# Temp folder for file lists, must contain only file lists
|
17
|
-
# because of garbage collection takes any file there
|
18
|
-
# this could be refined, as , for instance, on macos, temp folder is already user specific
|
19
|
-
@@file_list_folder=TempFileManager.instance.new_file_path_global('asession_filelists')
|
20
|
-
@@param_description_cache=nil
|
21
|
-
# @return normaiwed description of transfer spec parameters
|
22
|
-
def self.description
|
23
|
-
return @@param_description_cache unless @@param_description_cache.nil?
|
24
|
-
# config file in same folder with same name as this source
|
25
|
-
@@param_description_cache=YAML.load_file("#{__FILE__[0..-3]}yaml")
|
26
|
-
Aspera::CommandLineBuilder.normalize_description(@@param_description_cache)
|
27
|
-
end
|
28
|
-
|
29
|
-
# Agents shown in manual
|
16
|
+
# Agents shown in manual for parameters (sub list)
|
30
17
|
SUPPORTED_AGENTS=[:direct,:node,:connect]
|
31
18
|
# Short names of columns in manual
|
32
19
|
SUPPORTED_AGENTS_SHORT=SUPPORTED_AGENTS.map{|a|a.to_s[0].to_sym}
|
33
20
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
21
|
+
class << self
|
22
|
+
# Temp folder for file lists, must contain only file lists
|
23
|
+
# because of garbage collection takes any file there
|
24
|
+
# this could be refined, as , for instance, on macos, temp folder is already user specific
|
25
|
+
@file_list_folder=TempFileManager.instance.new_file_path_global('asession_filelists')
|
26
|
+
@param_description_cache=nil
|
27
|
+
# @return normalized description of transfer spec parameters, direct from yaml
|
28
|
+
def description
|
29
|
+
return @param_description_cache unless @param_description_cache.nil?
|
30
|
+
# config file in same folder with same name as this source
|
31
|
+
@param_description_cache=YAML.load_file("#{__FILE__[0..-3]}yaml")
|
32
|
+
Aspera::CommandLineBuilder.normalize_description(@param_description_cache)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return a table suitable to display in manual
|
36
|
+
def man_table
|
37
|
+
result=[]
|
38
|
+
description.each do |k,i|
|
39
|
+
param={name: k, type: [i[:accepted_types]].flatten.join(','),description: i[:desc]}
|
40
|
+
SUPPORTED_AGENTS.each do |a|
|
41
|
+
param[a.to_s[0].to_sym]=i[:tragents].nil? || i[:tragents].include?(a) ? 'Y' : ''
|
42
|
+
end
|
43
|
+
# only keep lines that are usable in supported agents
|
44
|
+
next if SUPPORTED_AGENTS_SHORT.inject(true){|m,j|m && param[j].empty?}
|
45
|
+
param[:cli]=
|
46
|
+
case i[:cltype]
|
47
|
+
when :envvar then 'env:'+i[:clvarname]
|
48
|
+
when :opt_without_arg,:opt_with_arg then i[:clswitch]
|
49
|
+
else ''
|
50
|
+
end
|
51
|
+
if i.has_key?(:enum)
|
52
|
+
param[:description] += "\nAllowed values: #{i[:enum].join(', ')}"
|
53
|
+
end
|
54
|
+
result.push(param)
|
52
55
|
end
|
53
|
-
result
|
56
|
+
return result
|
54
57
|
end
|
55
|
-
return result
|
56
|
-
end
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
v.tr('-','')
|
61
|
-
end
|
59
|
+
# special encoding methods used in YAML (key: :clconvert)
|
60
|
+
def clconv_remove_hyphen(v); v.tr('-',''); end
|
62
61
|
|
63
|
-
|
64
|
-
|
65
|
-
Base64.strict_encode64(v)
|
66
|
-
end
|
62
|
+
# special encoding methods used in YAML (key: :clconvert)
|
63
|
+
def clconv_json64(v); Base64.strict_encode64(JSON.generate(v)); end
|
67
64
|
|
68
|
-
|
69
|
-
|
70
|
-
Base64.strict_encode64(JSON.generate(v))
|
71
|
-
end
|
65
|
+
# special encoding methods used in YAML (key: :clconvert)
|
66
|
+
def clconv_base64(v); Base64.strict_encode64(v); end
|
72
67
|
|
73
|
-
|
74
|
-
|
75
|
-
|
68
|
+
def ts_has_file_list(ts)
|
69
|
+
ts.has_key?('EX_ascp_args') and ts['EX_ascp_args'].is_a?(Array) and ['--file-list','--file-pair-list'].any?{|i|ts['EX_ascp_args'].include?(i)}
|
70
|
+
end
|
76
71
|
|
72
|
+
def ts_to_env_args(transfer_spec,options)
|
73
|
+
return Parameters.new(transfer_spec,options).ascp_args()
|
74
|
+
end
|
75
|
+
|
76
|
+
# temp file list files are created here
|
77
|
+
def file_list_folder=(v)
|
78
|
+
@file_list_folder=v
|
79
|
+
return if @file_list_folder.nil?
|
80
|
+
FileUtils.mkdir_p(@file_list_folder)
|
81
|
+
TempFileManager.instance.cleanup_expired(@file_list_folder)
|
82
|
+
end
|
83
|
+
|
84
|
+
# static methods
|
85
|
+
attr_reader :file_list_folder
|
86
|
+
end # self
|
87
|
+
|
88
|
+
# @param options [Hash] key: :wss: bool
|
77
89
|
def initialize(job_spec,options)
|
78
90
|
@job_spec=job_spec
|
79
91
|
@options=options
|
@@ -81,28 +93,26 @@ module Aspera
|
|
81
93
|
Log.log.debug("agent options: #{@options}")
|
82
94
|
end
|
83
95
|
|
84
|
-
public
|
85
|
-
|
86
96
|
# translate transfer spec to env vars and command line arguments for ascp
|
87
97
|
# NOTE: parameters starting with "EX_" (extended) are not standard
|
88
|
-
def ascp_args
|
98
|
+
def ascp_args
|
89
99
|
env_args={
|
90
|
-
:
|
91
|
-
:
|
92
|
-
:
|
100
|
+
args: [],
|
101
|
+
env: {},
|
102
|
+
ascp_version: :ascp
|
93
103
|
}
|
94
104
|
# some ssh credentials are required to avoid interactive password input
|
95
|
-
if !@job_spec.has_key?('remote_password')
|
96
|
-
!@job_spec.has_key?('ssh_private_key')
|
97
|
-
!@job_spec.has_key?('EX_ssh_key_paths')
|
98
|
-
raise Fasp::Error
|
105
|
+
if !@job_spec.has_key?('remote_password') &&
|
106
|
+
!@job_spec.has_key?('ssh_private_key') &&
|
107
|
+
!@job_spec.has_key?('EX_ssh_key_paths')
|
108
|
+
raise Fasp::Error, 'required: password or ssh key (value or path)'
|
99
109
|
end
|
100
110
|
|
101
111
|
# special cases
|
102
|
-
@job_spec.delete('source_root') if @job_spec.has_key?('source_root')
|
112
|
+
@job_spec.delete('source_root') if @job_spec.has_key?('source_root') && @job_spec['source_root'].empty?
|
103
113
|
|
104
114
|
# use web socket session initiation ?
|
105
|
-
if @builder.process_param('wss_enabled',:get_value)
|
115
|
+
if @builder.process_param('wss_enabled',:get_value) && (@options[:wss] || !@job_spec.has_key?('fasp_port'))
|
106
116
|
# by default use web socket session if available, unless removed by user
|
107
117
|
@builder.add_command_line_options(['--ws-connect'])
|
108
118
|
# TODO: option to give order ssh,ws (legacy http is implied bu ssh)
|
@@ -111,6 +121,9 @@ module Aspera
|
|
111
121
|
@job_spec.delete('fasp_port')
|
112
122
|
@job_spec.delete('EX_ssh_key_paths')
|
113
123
|
@job_spec.delete('sshfp')
|
124
|
+
# set location for CA bundle to be the one of Ruby, see env var SSL_CERT_FILE / SSL_CERT_DIR
|
125
|
+
@job_spec['EX_ssh_key_paths']=[OpenSSL::X509::DEFAULT_CERT_FILE]
|
126
|
+
Log.log.debug('CA certs: EX_ssh_key_paths <- DEFAULT_CERT_FILE from openssl')
|
114
127
|
else
|
115
128
|
# remove unused parameter (avoid warning)
|
116
129
|
@job_spec.delete('wss_port')
|
@@ -131,17 +144,17 @@ module Aspera
|
|
131
144
|
file_list_provided=self.class.ts_has_file_list(@job_spec)
|
132
145
|
@builder.params_definition['paths'][:mandatory]=!@job_spec.has_key?('keepalive') and !file_list_provided
|
133
146
|
paths_array=@builder.process_param('paths',:get_value)
|
134
|
-
if file_list_provided
|
135
|
-
Log.log.warn(
|
147
|
+
if file_list_provided && !paths_array.nil?
|
148
|
+
Log.log.warn('file list provided both in transfer spec and ascp file list. Keeping file list only.')
|
136
149
|
paths_array=nil
|
137
150
|
end
|
138
|
-
if !
|
151
|
+
if !paths_array.nil?
|
139
152
|
# it's an array
|
140
|
-
raise
|
153
|
+
raise 'paths is empty in transfer spec' if paths_array.empty?
|
141
154
|
# use file list if there is storage defined for it.
|
142
|
-
if
|
155
|
+
if self.class.file_list_folder.nil?
|
143
156
|
# not safe for special characters ? (maybe not, depends on OS)
|
144
|
-
Log.log.debug(
|
157
|
+
Log.log.debug('placing source file list on command line (no file list file)')
|
145
158
|
@builder.add_command_line_options(paths_array.map{|i|i['source']})
|
146
159
|
else
|
147
160
|
file_list_file=@builder.process_param('EX_file_list',:get_value)
|
@@ -157,14 +170,14 @@ module Aspera
|
|
157
170
|
# TODO: well, we test only the first one, but anyway it shall be consistent
|
158
171
|
if paths_array.first.has_key?('destination')
|
159
172
|
option='--file-pair-list'
|
160
|
-
lines=paths_array.
|
173
|
+
lines=paths_array.each_with_object([]){|e,m|m.push(e['source'],e['destination']);}
|
161
174
|
else
|
162
175
|
option='--file-list'
|
163
176
|
lines=paths_array.map{|i|i['source']}
|
164
177
|
end
|
165
|
-
file_list_file=Aspera::TempFileManager.instance.new_file_path_in_folder(
|
166
|
-
File.
|
167
|
-
Log.log.debug
|
178
|
+
file_list_file=Aspera::TempFileManager.instance.new_file_path_in_folder(self.class.file_list_folder)
|
179
|
+
File.write(file_list_file, lines.join("\n"))
|
180
|
+
Log.log.debug{"#{option}=\n#{File.read(file_list_file)}".red}
|
168
181
|
end
|
169
182
|
end
|
170
183
|
@builder.add_command_line_options(["#{option}=#{file_list_file}"])
|
@@ -183,24 +196,6 @@ module Aspera
|
|
183
196
|
|
184
197
|
return env_args
|
185
198
|
end
|
186
|
-
|
187
|
-
# temp file list files are created here
|
188
|
-
def self.file_list_folder=(v)
|
189
|
-
@@file_list_folder=v
|
190
|
-
if !@@file_list_folder.nil?
|
191
|
-
FileUtils.mkdir_p(@@file_list_folder)
|
192
|
-
TempFileManager.instance.cleanup_expired(@@file_list_folder)
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
# static methods
|
197
|
-
class << self
|
198
|
-
def file_list_folder; @@file_list_folder;end
|
199
|
-
|
200
|
-
def ts_to_env_args(transfer_spec,options)
|
201
|
-
return Parameters.new(transfer_spec,options).ascp_args()
|
202
|
-
end
|
203
|
-
end
|
204
199
|
end # Parameters
|
205
200
|
end
|
206
201
|
end
|