aspera-cli 4.0.0.pre3 → 4.2.1
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
- 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
|