aspera-cli 4.0.0.pre3 → 4.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +695 -205
- data/bin/dascli +13 -0
- data/docs/README.erb.md +615 -157
- data/docs/test_env.conf +23 -5
- data/docs/transfer_spec.html +1 -1
- data/examples/aoc.rb +14 -3
- data/examples/faspex4.rb +78 -0
- data/lib/aspera/aoc.rb +87 -108
- data/lib/aspera/cli/formater.rb +2 -0
- data/lib/aspera/cli/main.rb +46 -34
- data/lib/aspera/cli/plugin.rb +9 -4
- data/lib/aspera/cli/plugins/alee.rb +1 -1
- data/lib/aspera/cli/plugins/aoc.rb +207 -182
- data/lib/aspera/cli/plugins/ats.rb +2 -2
- data/lib/aspera/cli/plugins/config.rb +173 -117
- data/lib/aspera/cli/plugins/console.rb +2 -2
- data/lib/aspera/cli/plugins/faspex.rb +51 -36
- data/lib/aspera/cli/plugins/faspex5.rb +82 -41
- data/lib/aspera/cli/plugins/node.rb +3 -3
- data/lib/aspera/cli/plugins/preview.rb +35 -25
- data/lib/aspera/cli/plugins/server.rb +23 -8
- data/lib/aspera/cli/transfer_agent.rb +7 -6
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cos_node.rb +33 -28
- data/lib/aspera/environment.rb +2 -2
- data/lib/aspera/fasp/connect.rb +28 -21
- data/lib/aspera/fasp/http_gw.rb +140 -28
- data/lib/aspera/fasp/installation.rb +101 -53
- data/lib/aspera/fasp/local.rb +88 -45
- data/lib/aspera/fasp/manager.rb +15 -0
- data/lib/aspera/fasp/node.rb +4 -4
- data/lib/aspera/fasp/parameters.rb +6 -18
- data/lib/aspera/fasp/resume_policy.rb +13 -12
- data/lib/aspera/log.rb +1 -1
- data/lib/aspera/node.rb +61 -1
- data/lib/aspera/oauth.rb +49 -46
- data/lib/aspera/persistency_folder.rb +9 -4
- data/lib/aspera/preview/file_types.rb +53 -21
- data/lib/aspera/preview/generator.rb +3 -3
- data/lib/aspera/rest.rb +29 -18
- data/lib/aspera/secrets.rb +20 -0
- data/lib/aspera/temp_file_manager.rb +19 -0
- data/lib/aspera/web_auth.rb +105 -0
- metadata +42 -22
@@ -1,9 +1,11 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'aspera/log'
|
2
|
+
require 'singleton'
|
3
3
|
|
4
4
|
module Aspera
|
5
5
|
module Preview
|
6
|
+
# function conversion_type returns one of the types: CONVERSION_TYPES
|
6
7
|
class FileTypes
|
8
|
+
include Singleton
|
7
9
|
# values for conversion_type : input format
|
8
10
|
CONVERSION_TYPES=[
|
9
11
|
:image,
|
@@ -148,6 +150,7 @@ module Aspera
|
|
148
150
|
'dif' => :office,
|
149
151
|
'divx' => :video,
|
150
152
|
'dng' => :image,
|
153
|
+
'docx' => :office,
|
151
154
|
'dpx' => :image,
|
152
155
|
'epdf' => :image,
|
153
156
|
'epi' => :image,
|
@@ -204,6 +207,7 @@ module Aspera
|
|
204
207
|
'pam' => :image,
|
205
208
|
'pcd' => :image,
|
206
209
|
'pcds' => :image,
|
210
|
+
'pdf' => :pdf,
|
207
211
|
'pef' => :image,
|
208
212
|
'picon' => :image,
|
209
213
|
'pict' => :image,
|
@@ -261,39 +265,67 @@ module Aspera
|
|
261
265
|
'x3f' => :image,
|
262
266
|
'xcf' => :image,
|
263
267
|
'xlk' => :office,
|
268
|
+
'xlsx' => :office,
|
269
|
+
'xls' => :office,
|
264
270
|
'ycbcr' => :image,
|
265
271
|
'ycbcra' => :image,
|
266
272
|
'yuv' => :image,
|
267
273
|
'zabw' => :office}
|
268
274
|
|
269
|
-
|
275
|
+
private_constant :SUPPORTED_MIME_TYPES, :SUPPORTED_EXTENSIONS
|
270
276
|
|
271
|
-
|
277
|
+
# @attr use_mimemagic [bool] true to use mimemagic to determine real mime type based on file content
|
278
|
+
attr_accessor :use_mimemagic
|
279
|
+
|
280
|
+
def initialize
|
281
|
+
@use_mimemagic=false
|
282
|
+
end
|
283
|
+
|
284
|
+
# use mime magic to find mime type based on file content (magic numbers)
|
285
|
+
def mime_from_file(filepath)
|
286
|
+
# moved here, as mimemagic can cause installation issues
|
287
|
+
require 'mimemagic'
|
288
|
+
require 'mimemagic/version'
|
289
|
+
require 'mimemagic/overlay' if MimeMagic::VERSION.start_with?('0.3.')
|
290
|
+
# check magic number inside file (empty string if not found)
|
272
291
|
detected_mime=MimeMagic.by_magic(File.open(filepath)).to_s
|
273
|
-
|
292
|
+
# check extension only
|
293
|
+
if !SUPPORTED_MIME_TYPES.has_key?(detected_mime)
|
294
|
+
Log.log.debug("no conversion for #{detected_mime}, trying extension")
|
295
|
+
detected_mime=MimeMagic.by_extension(File.extname(filepath)).to_s
|
296
|
+
end
|
274
297
|
detected_mime=nil if detected_mime.empty?
|
298
|
+
Log.log.debug("mimemagic: #{detected_mime.class.name} [#{detected_mime}]")
|
275
299
|
return detected_mime
|
276
300
|
end
|
277
301
|
|
278
|
-
|
279
|
-
|
280
|
-
|
302
|
+
# return file type, one of enum CONVERSION_TYPES
|
303
|
+
# @param filepath [String] full path to file
|
304
|
+
# @param mimetype [String] provided by node api
|
305
|
+
def conversion_type(filepath,mimetype)
|
306
|
+
Log.log.debug("conversion_type(#{filepath},m=#{mimetype},t=#{@use_mimemagic})")
|
307
|
+
# 1- get type from provided mime type, using local mapping
|
308
|
+
conv_type=SUPPORTED_MIME_TYPES[mimetype] if ! mimetype.nil?
|
309
|
+
# 2- else, from computed mime type (if available)
|
310
|
+
if conv_type.nil? and @use_mimemagic
|
281
311
|
detected_mime=mime_from_file(filepath)
|
282
|
-
if
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
312
|
+
if ! detected_mime.nil?
|
313
|
+
conv_type=SUPPORTED_MIME_TYPES[detected_mime]
|
314
|
+
if ! mimetype.nil?
|
315
|
+
if mimetype.eql?(detected_mime)
|
316
|
+
Log.log.debug("matching mime type per magic number")
|
317
|
+
else
|
318
|
+
# note: detected can be nil
|
319
|
+
Log.log.debug("non matching mime types: node=[#{mimetype}], magic=[#{detected_mime}]")
|
320
|
+
end
|
321
|
+
end
|
287
322
|
end
|
288
323
|
end
|
289
|
-
#
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
# 3- else, from local extensions
|
295
|
-
result||=FileTypes::SUPPORTED_EXTENSIONS[extension]
|
296
|
-
return result
|
324
|
+
# 3- else, from extensions, using local mapping
|
325
|
+
extension = File.extname(filepath.downcase)[1..-1]
|
326
|
+
conv_type=SUPPORTED_EXTENSIONS[extension] if conv_type.nil?
|
327
|
+
Log.log.debug("conversion_type(#{extension}): #{conv_type.class.name} [#{conv_type}]")
|
328
|
+
return conv_type
|
297
329
|
end
|
298
330
|
end
|
299
331
|
end
|
@@ -15,7 +15,7 @@ module Aspera
|
|
15
15
|
|
16
16
|
# @param src source file path
|
17
17
|
# @param dst destination file path
|
18
|
-
# @param api_mime_type optional mime type as provided by node api
|
18
|
+
# @param api_mime_type optional mime type as provided by node api (or nil)
|
19
19
|
# node API mime types are from: http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
|
20
20
|
# supported preview type is one of Preview::PREVIEW_FORMATS
|
21
21
|
# the resulting preview file type is taken from destination file extension.
|
@@ -25,14 +25,14 @@ module Aspera
|
|
25
25
|
# -> preview_format is one of Generator::PREVIEW_FORMATS
|
26
26
|
# the conversion video->mp4 is implemented in methods: convert_video_to_mp4_using_<video_conversion>
|
27
27
|
# -> conversion method is one of Generator::VIDEO_CONVERSION_METHODS
|
28
|
-
def initialize(options,src,dst,main_temp_dir,api_mime_type
|
28
|
+
def initialize(options,src,dst,main_temp_dir,api_mime_type)
|
29
29
|
@options=options
|
30
30
|
@source_file_path=src
|
31
31
|
@destination_file_path=dst
|
32
32
|
@temp_folder=File.join(main_temp_dir,@source_file_path.split('/').last.gsub(/\s/, '_').gsub(/\W/, ''))
|
33
33
|
# extract preview format from extension of target file
|
34
34
|
@preview_format_symb=File.extname(@destination_file_path).gsub(/^\./,'').to_sym
|
35
|
-
@conversion_type=FileTypes.conversion_type(@source_file_path,api_mime_type
|
35
|
+
@conversion_type=FileTypes.instance.conversion_type(@source_file_path,api_mime_type)
|
36
36
|
end
|
37
37
|
|
38
38
|
# name of processing method in this object
|
data/lib/aspera/rest.rb
CHANGED
@@ -7,6 +7,7 @@ require 'net/http'
|
|
7
7
|
require 'net/https'
|
8
8
|
require 'json'
|
9
9
|
require 'base64'
|
10
|
+
require 'cgi'
|
10
11
|
require 'ruby-progressbar'
|
11
12
|
|
12
13
|
# add cancel method to http
|
@@ -33,6 +34,7 @@ module Aspera
|
|
33
34
|
# true if https ignore certificate
|
34
35
|
@@insecure=false
|
35
36
|
@@user_agent='Ruby'
|
37
|
+
@@download_partial_suffix='.http_partial'
|
36
38
|
|
37
39
|
public
|
38
40
|
def self.insecure=(v); @@insecure=v;Log.log.debug("insecure => #{@@insecure}".red);end
|
@@ -98,9 +100,10 @@ module Aspera
|
|
98
100
|
public
|
99
101
|
|
100
102
|
attr_reader :params
|
103
|
+
attr_reader :oauth
|
101
104
|
|
102
|
-
# @param a_rest_params default call parameters and authentication (:auth) :
|
103
|
-
# :type (:basic, :oauth2, :url)
|
105
|
+
# @param a_rest_params default call parameters (merged at call) and (+) authentication (:auth) :
|
106
|
+
# :type (:basic, :oauth2, :url, :none)
|
104
107
|
# :username [:basic]
|
105
108
|
# :password [:basic]
|
106
109
|
# :url_creds [:url]
|
@@ -117,16 +120,6 @@ module Aspera
|
|
117
120
|
# default is no auth
|
118
121
|
@params[:auth]||={:type=>:none}
|
119
122
|
@params[:not_auth_codes]||=['401']
|
120
|
-
# translate old auth parameters, remove prefix, place in auth
|
121
|
-
[:auth,:basic,:oauth].each do |p_sym|
|
122
|
-
p_str=p_sym.to_s+'_'
|
123
|
-
@params.keys.select{|k|k.to_s.start_with?(p_str)}.each do |k_sym|
|
124
|
-
name=k_sym.to_s[p_str.length..-1]
|
125
|
-
name='grant' if k_sym.eql?(:oauth_type)
|
126
|
-
@params[:auth][name.to_sym]=@params[k_sym]
|
127
|
-
@params.delete(k_sym)
|
128
|
-
end
|
129
|
-
end
|
130
123
|
@oauth=Oauth.new(@params[:auth]) if @params[:auth][:type].eql?(:oauth2)
|
131
124
|
Log.dump('REST params(2)',@params)
|
132
125
|
end
|
@@ -153,6 +146,7 @@ module Aspera
|
|
153
146
|
Log.log.debug("accessing #{call_data[:subpath]}".red.bold.bg_green)
|
154
147
|
call_data[:headers]||={}
|
155
148
|
call_data[:headers]['User-Agent'] ||= @@user_agent
|
149
|
+
# defaults from @params are overriden by call dataz
|
156
150
|
call_data=@params.deep_merge(call_data)
|
157
151
|
case call_data[:auth][:type]
|
158
152
|
when :none
|
@@ -206,10 +200,13 @@ module Aspera
|
|
206
200
|
|
207
201
|
Log.log.debug("call_data = #{call_data}")
|
208
202
|
result={:http=>nil}
|
203
|
+
# start a block to be able to retry the actual HTTP request
|
209
204
|
begin
|
210
205
|
# we try the call, and will retry only if oauth, as we can, first with refresh, and then re-auth if refresh is bad
|
211
206
|
oauth_tries ||= 2
|
207
|
+
tries_remain_redirect||=4
|
212
208
|
Log.log.debug("send request")
|
209
|
+
# make http request (pipelined)
|
213
210
|
http_session.request(req) do |response|
|
214
211
|
result[:http] = response
|
215
212
|
if call_data.has_key?(:save_to_file)
|
@@ -223,12 +220,12 @@ module Aspera
|
|
223
220
|
target_file=call_data[:save_to_file]
|
224
221
|
# override user's path to path in header
|
225
222
|
if !response['Content-Disposition'].nil? and m=response['Content-Disposition'].match(/filename="([^"]+)"/)
|
226
|
-
target_file=m[1]
|
223
|
+
target_file=File.join(File.dirname(target_file),m[1])
|
227
224
|
end
|
228
225
|
# download with temp filename
|
229
|
-
target_file_tmp=target_file
|
226
|
+
target_file_tmp="#{target_file}#{@@download_partial_suffix}"
|
230
227
|
Log.log.debug("saving to: #{target_file}")
|
231
|
-
File.open(target_file_tmp,
|
228
|
+
File.open(target_file_tmp, 'wb') do |file|
|
232
229
|
result[:http].read_body do |fragment|
|
233
230
|
file.write(fragment)
|
234
231
|
new_process=progress.progress+fragment.length
|
@@ -239,7 +236,7 @@ module Aspera
|
|
239
236
|
# rename at the end
|
240
237
|
File.rename(target_file_tmp, target_file)
|
241
238
|
progress=nil
|
242
|
-
end
|
239
|
+
end # save_to_file
|
243
240
|
end
|
244
241
|
# sometimes there is a ITF8 char (e.g. (c) )
|
245
242
|
result[:http].body.force_encoding("UTF-8") if result[:http].body.is_a?(String)
|
@@ -267,10 +264,24 @@ module Aspera
|
|
267
264
|
end
|
268
265
|
Log.log.debug("using new token=#{call_data[:headers]['Authorization']}")
|
269
266
|
retry unless (oauth_tries -= 1).zero?
|
270
|
-
end # if
|
267
|
+
end # if oauth
|
268
|
+
# moved ?
|
269
|
+
if e.response.is_a?(Net::HTTPRedirection)
|
270
|
+
if tries_remain_redirect > 0
|
271
|
+
tries_remain_redirect-=1
|
272
|
+
Log.log.info("URL is moved: #{e.response['location']}")
|
273
|
+
raise e
|
274
|
+
# TODO: rebuild request with new location
|
275
|
+
#retry
|
276
|
+
else
|
277
|
+
raise "too many redirect"
|
278
|
+
end
|
279
|
+
else
|
280
|
+
raise e
|
281
|
+
end
|
271
282
|
# raise exception if could not retry and not return error in result
|
272
283
|
raise e unless call_data[:return_error]
|
273
|
-
end
|
284
|
+
end # begin request
|
274
285
|
Log.log.debug("result=#{result}")
|
275
286
|
return result
|
276
287
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Aspera
|
2
|
+
# Manage secrets in CLI using secure way (encryption, wallet, etc...)
|
3
|
+
class Secrets
|
4
|
+
attr_accessor :default_secret,:all_secrets
|
5
|
+
def initialize()
|
6
|
+
@default_secret=nil
|
7
|
+
@all_secrets={}
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_secret(id=nil,mandatory=true)
|
11
|
+
secret=@default_secret || @all_secrets[id]
|
12
|
+
raise "please provide secret for #{id}" if secret.nil? and mandatory
|
13
|
+
return secret
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_secrets
|
17
|
+
return @all_secrets
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -6,6 +6,11 @@ module Aspera
|
|
6
6
|
# create a temp file name for a given folder
|
7
7
|
# files can be deleted on process exit by calling cleanup
|
8
8
|
class TempFileManager
|
9
|
+
SEC_IN_DAY=86400
|
10
|
+
# assume no transfer last longer than this
|
11
|
+
# (garbage collect file list which were not deleted after transfer)
|
12
|
+
FILE_LIST_AGE_MAX_SEC=5*SEC_IN_DAY
|
13
|
+
private_constant :SEC_IN_DAY,:FILE_LIST_AGE_MAX_SEC
|
9
14
|
include Singleton
|
10
15
|
def initialize
|
11
16
|
@created_files=[]
|
@@ -33,5 +38,19 @@ module Aspera
|
|
33
38
|
username = Etc.getlogin || Etc.getpwuid(Process.uid).name || 'unknown_user' rescue 'unknown_user'
|
34
39
|
return new_file_path_in_folder(Etc.systmpdir,base_name+'_'+username+'_')
|
35
40
|
end
|
41
|
+
|
42
|
+
def cleanup_expired(temp_folder)
|
43
|
+
# garbage collect undeleted files
|
44
|
+
Dir.entries(temp_folder).each do |name|
|
45
|
+
file_path=File.join(temp_folder,name)
|
46
|
+
age_sec=(Time.now - File.stat(file_path).mtime).to_i
|
47
|
+
# check age of file, delete too old
|
48
|
+
if File.file?(file_path) and age_sec > FILE_LIST_AGE_MAX_SEC
|
49
|
+
Log.log.debug("garbage collecting #{name}")
|
50
|
+
File.delete(file_path)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
36
55
|
end
|
37
56
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'webrick/https'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
module Aspera
|
6
|
+
class WebAuth
|
7
|
+
# server for auth page
|
8
|
+
class FxGwServlet < WEBrick::HTTPServlet::AbstractServlet
|
9
|
+
def initialize(server,info) # additional args get here
|
10
|
+
@shared=info
|
11
|
+
end
|
12
|
+
|
13
|
+
def do_GET (request, response)
|
14
|
+
if ! request.path.eql?(@shared[:expected_path])
|
15
|
+
response.status=400
|
16
|
+
return
|
17
|
+
end
|
18
|
+
@shared[:mutex].synchronize do
|
19
|
+
@shared[:query]=request.query
|
20
|
+
@shared[:cond].signal
|
21
|
+
end
|
22
|
+
response.status=200
|
23
|
+
response.content_type = 'text/html'
|
24
|
+
response.body='<html><head><title>Ok</title></head><body><h1>Thank you !</h1><p>You can close this window.</p></body></html>'
|
25
|
+
end
|
26
|
+
end # FxGwServlet
|
27
|
+
|
28
|
+
# generates and adds self signed cert to provided webrick options
|
29
|
+
def fill_self_signed_cert(options)
|
30
|
+
key = OpenSSL::PKey::RSA.new(4096)
|
31
|
+
cert = OpenSSL::X509::Certificate.new
|
32
|
+
cert.subject = cert.issuer = OpenSSL::X509::Name.parse('/C=FR/O=Test/OU=Test/CN=Test')
|
33
|
+
cert.not_before = Time.now
|
34
|
+
cert.not_after = Time.now + 365 * 24 * 60 * 60
|
35
|
+
cert.public_key = key.public_key
|
36
|
+
cert.serial = 0x0
|
37
|
+
cert.version = 2
|
38
|
+
ef = OpenSSL::X509::ExtensionFactory.new
|
39
|
+
ef.issuer_certificate = cert
|
40
|
+
ef.subject_certificate = cert
|
41
|
+
cert.extensions = [
|
42
|
+
ef.create_extension('basicConstraints','CA:TRUE', true),
|
43
|
+
ef.create_extension('subjectKeyIdentifier', 'hash'),
|
44
|
+
# ef.create_extension('keyUsage', 'cRLSign,keyCertSign', true),
|
45
|
+
]
|
46
|
+
cert.add_extension(ef.create_extension('authorityKeyIdentifier','keyid:always,issuer:always'))
|
47
|
+
cert.sign(key, OpenSSL::Digest::SHA256.new)
|
48
|
+
options[:SSLPrivateKey] = key
|
49
|
+
options[:SSLCertificate] = cert
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(endpoint_url)
|
53
|
+
uri=URI.parse(endpoint_url)
|
54
|
+
webrick_options = {
|
55
|
+
:app => WebAuth,
|
56
|
+
:Port => uri.port,
|
57
|
+
:Logger => Log.log
|
58
|
+
}
|
59
|
+
uri_path=uri.path.empty? ? '/' : uri.path
|
60
|
+
case uri.scheme
|
61
|
+
when 'http'
|
62
|
+
Log.log.debug('HTTP mode')
|
63
|
+
when 'https'
|
64
|
+
webrick_options[:SSLEnable]=true
|
65
|
+
webrick_options[:SSLVerifyClient]=OpenSSL::SSL::VERIFY_NONE
|
66
|
+
case 0
|
67
|
+
when 0
|
68
|
+
# generate self signed cert
|
69
|
+
fill_self_signed_cert(webrick_options)
|
70
|
+
when 1
|
71
|
+
# short
|
72
|
+
webrick_options[:SSLCertName] = [ [ 'CN',WEBrick::Utils::getservername ] ]
|
73
|
+
Log.log.error(">>>#{webrick_options[:SSLCertName]}")
|
74
|
+
when 2
|
75
|
+
# good cert
|
76
|
+
webrick_options[:SSLPrivateKey] =OpenSSL::PKey::RSA.new(File.read('/Users/laurent/workspace/Tools/certificate/myserver.key'))
|
77
|
+
webrick_options[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read('/Users/laurent/workspace/Tools/certificate/myserver.crt'))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
# parameters for servlet
|
81
|
+
@shared_info={
|
82
|
+
expected_path: uri_path,
|
83
|
+
mutex: Mutex.new,
|
84
|
+
cond: ConditionVariable.new
|
85
|
+
}
|
86
|
+
@server = WEBrick::HTTPServer.new(webrick_options)
|
87
|
+
@server.mount(uri_path, FxGwServlet, @shared_info) # additional args provided to constructor
|
88
|
+
Thread.new { @server.start }
|
89
|
+
end
|
90
|
+
|
91
|
+
# wait for request on web server
|
92
|
+
# @return Hash the query
|
93
|
+
def get_request
|
94
|
+
Log.log.debug('get_request')
|
95
|
+
# called only once
|
96
|
+
raise "error, called twice ?" if @server.nil?
|
97
|
+
@shared_info[:mutex].synchronize do
|
98
|
+
@shared_info[:cond].wait(@shared_info[:mutex])
|
99
|
+
end
|
100
|
+
@server.shutdown
|
101
|
+
@server=nil
|
102
|
+
return @shared_info[:query]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aspera-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Laurent Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01
|
11
|
+
date: 2021-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xml-simple
|
@@ -58,28 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '6.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: mimemagic
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0.3'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0.3'
|
68
|
+
version: '6.0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: execjs
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +122,34 @@ dependencies:
|
|
136
122
|
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '2.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: websocket
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.2'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.2'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: websocket-client-simple
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.3'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.3'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: bundler
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,12 +198,14 @@ email:
|
|
184
198
|
executables:
|
185
199
|
- ascli
|
186
200
|
- asession
|
201
|
+
- dascli
|
187
202
|
extensions: []
|
188
203
|
extra_rdoc_files: []
|
189
204
|
files:
|
190
205
|
- README.md
|
191
206
|
- bin/ascli
|
192
207
|
- bin/asession
|
208
|
+
- bin/dascli
|
193
209
|
- docs/Makefile
|
194
210
|
- docs/README.erb.md
|
195
211
|
- docs/README.md
|
@@ -197,6 +213,7 @@ files:
|
|
197
213
|
- docs/test_env.conf
|
198
214
|
- docs/transfer_spec.html
|
199
215
|
- examples/aoc.rb
|
216
|
+
- examples/faspex4.rb
|
200
217
|
- examples/proxy.pac
|
201
218
|
- examples/transfer.rb
|
202
219
|
- lib/aspera/aoc.rb
|
@@ -277,10 +294,12 @@ files:
|
|
277
294
|
- lib/aspera/rest_call_error.rb
|
278
295
|
- lib/aspera/rest_error_analyzer.rb
|
279
296
|
- lib/aspera/rest_errors_aspera.rb
|
297
|
+
- lib/aspera/secrets.rb
|
280
298
|
- lib/aspera/ssh.rb
|
281
299
|
- lib/aspera/sync.rb
|
282
300
|
- lib/aspera/temp_file_manager.rb
|
283
301
|
- lib/aspera/uri_reader.rb
|
302
|
+
- lib/aspera/web_auth.rb
|
284
303
|
homepage: https://github.com/IBM/aspera-cli
|
285
304
|
licenses:
|
286
305
|
- Apache-2.0
|
@@ -290,6 +309,7 @@ metadata:
|
|
290
309
|
source_code_uri: https://github.com/IBM/aspera-cli
|
291
310
|
changelog_uri: https://github.com/IBM/aspera-cli
|
292
311
|
rubygems_uri: https://rubygems.org/gems/aspera-cli
|
312
|
+
documentation_uri: https://www.rubydoc.info/gems/aspera-cli
|
293
313
|
post_install_message:
|
294
314
|
rdoc_options: []
|
295
315
|
require_paths:
|
@@ -301,12 +321,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
301
321
|
version: '2.4'
|
302
322
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
303
323
|
requirements:
|
304
|
-
- - "
|
324
|
+
- - ">="
|
305
325
|
- !ruby/object:Gem::Version
|
306
|
-
version:
|
326
|
+
version: '0'
|
307
327
|
requirements:
|
308
|
-
-
|
309
|
-
rubygems_version: 3.0.3
|
328
|
+
- Read the manual for any requirement
|
329
|
+
rubygems_version: 3.0.3.1
|
310
330
|
signing_key:
|
311
331
|
specification_version: 4
|
312
332
|
summary: 'Execute actions using command line on IBM Aspera Server products: Aspera
|