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
data/lib/aspera/environment.rb
CHANGED
@@ -1,66 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'aspera/log'
|
2
3
|
require 'rbconfig'
|
3
4
|
|
4
5
|
module Aspera
|
5
|
-
# detect OS, architecture, and
|
6
|
+
# detect OS, architecture, and specific stuff
|
6
7
|
class Environment
|
7
8
|
OS_WINDOWS = :windows
|
8
9
|
OS_X = :osx
|
9
10
|
OS_LINUX = :linux
|
10
11
|
OS_AIX = :aix
|
11
|
-
OS_LIST=[OS_WINDOWS,OS_X,OS_LINUX,OS_AIX]
|
12
|
-
|
13
|
-
def self.os
|
14
|
-
case RbConfig::CONFIG['host_os']
|
15
|
-
when /mswin/,/msys/,/mingw/,/cygwin/,/bccwin/,/wince/,/emc/
|
16
|
-
return OS_WINDOWS
|
17
|
-
when /darwin/,/mac os/
|
18
|
-
return OS_X
|
19
|
-
when /linux/
|
20
|
-
return OS_LINUX
|
21
|
-
when /aix/
|
22
|
-
return OS_AIX
|
23
|
-
else
|
24
|
-
raise "Unknown OS: #{RbConfig::CONFIG['host_os']}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
CPU_X86_64=:x86_64
|
12
|
+
OS_LIST=[OS_WINDOWS,OS_X,OS_LINUX,OS_AIX].freeze
|
13
|
+
CPU_X86_64=:x86_64 # rubocop:disable Naming/VariableNumber
|
28
14
|
CPU_PPC64=:ppc64
|
29
15
|
CPU_PPC64LE=:ppc64le
|
30
16
|
CPU_S390=:s390
|
31
|
-
CPU_LIST=[CPU_X86_64,CPU_PPC64,CPU_PPC64LE,CPU_S390]
|
17
|
+
CPU_LIST=[CPU_X86_64,CPU_PPC64,CPU_PPC64LE,CPU_S390].freeze
|
32
18
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
return :x86_64
|
37
|
-
when /powerpc/
|
38
|
-
return :ppc64le if os.eql?(OS_LINUX)
|
39
|
-
return :ppc64
|
40
|
-
when /s390/
|
41
|
-
return :s390
|
42
|
-
else # other
|
43
|
-
raise "Unknown CPU: #{RbConfig::CONFIG['host_cpu']}"
|
19
|
+
class<<self
|
20
|
+
def ruby_version
|
21
|
+
return RbConfig::CONFIG['RUBY_PROGRAM_VERSION']
|
44
22
|
end
|
45
|
-
end
|
46
23
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
24
|
+
def os
|
25
|
+
case RbConfig::CONFIG['host_os']
|
26
|
+
when /mswin/,/msys/,/mingw/,/cygwin/,/bccwin/,/wince/,/emc/
|
27
|
+
return OS_WINDOWS
|
28
|
+
when /darwin/,/mac os/
|
29
|
+
return OS_X
|
30
|
+
when /linux/
|
31
|
+
return OS_LINUX
|
32
|
+
when /aix/
|
33
|
+
return OS_AIX
|
34
|
+
else
|
35
|
+
raise "Unknown OS: #{RbConfig::CONFIG['host_os']}"
|
36
|
+
end
|
37
|
+
end
|
55
38
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
39
|
+
def cpu
|
40
|
+
case RbConfig::CONFIG['host_cpu']
|
41
|
+
when /x86_64/,/x64/
|
42
|
+
return CPU_X86_64
|
43
|
+
when /powerpc/,/ppc64/
|
44
|
+
return CPU_PPC64LE if os.eql?(OS_LINUX)
|
45
|
+
return CPU_PPC64
|
46
|
+
when /s390/
|
47
|
+
return CPU_S390
|
48
|
+
else # other
|
49
|
+
raise "Unknown CPU: #{RbConfig::CONFIG['host_cpu']}"
|
62
50
|
end
|
63
51
|
end
|
52
|
+
|
53
|
+
def architecture
|
54
|
+
return "#{os}-#{cpu}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def exe_extension
|
58
|
+
return '.exe' if os.eql?(OS_WINDOWS)
|
59
|
+
return ''
|
60
|
+
end
|
61
|
+
|
62
|
+
# on Windows, the env var %USERPROFILE% provides the path to user's home more reliably than %HOMEDRIVE%%HOMEPATH%
|
63
|
+
# so, tell Ruby the right way
|
64
|
+
def fix_home
|
65
|
+
return unless os.eql?(OS_WINDOWS) && ENV.has_key?('USERPROFILE') && Dir.exist?(ENV['USERPROFILE'])
|
66
|
+
ENV['HOME']=ENV['USERPROFILE']
|
67
|
+
Log.log.debug("Windows: set home to USERPROFILE: #{ENV['HOME']}")
|
68
|
+
end
|
64
69
|
end
|
65
70
|
end
|
66
71
|
end
|
@@ -1,30 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Aspera
|
2
3
|
module Fasp
|
3
4
|
# Base class for FASP transfer agents
|
4
5
|
# sub classes shall implement start_transfer and shutdown
|
5
|
-
class
|
6
|
+
class AgentBase
|
7
|
+
# fields description for JSON generation
|
8
|
+
INTEGER_FIELDS=%w[Bytescont FaspFileArgIndex StartByte Rate MinRate Port Priority RateCap MinRateCap TCPPort CreatePolicy TimePolicy DatagramSize XoptFlags VLinkVersion
|
9
|
+
PeerVLinkVersion DSPipelineDepth PeerDSPipelineDepth ReadBlockSize WriteBlockSize ClusterNumNodes ClusterNodeId Size Written Loss FileBytes PreTransferBytes TransferBytes PMTU Elapsedusec ArgScansAttempted ArgScansCompleted PathScansAttempted FileScansCompleted TransfersAttempted TransfersPassed Delay].freeze
|
10
|
+
BOOLEAN_FIELDS=%w[Encryption Remote RateLock MinRateLock PolicyLock FilesEncrypt FilesDecrypt VLinkLocalEnabled VLinkRemoteEnabled MoveRange Keepalive TestLogin UseProxy
|
11
|
+
Precalc RTTAutocorrect].freeze
|
12
|
+
EXPECTED_METHODS=%i[text struct enhanced].freeze
|
13
|
+
private_constant :INTEGER_FIELDS,:BOOLEAN_FIELDS,:EXPECTED_METHODS
|
6
14
|
|
7
15
|
private
|
8
16
|
|
9
|
-
# fields description for JSON generation
|
10
|
-
IntegerFields=['Bytescont','FaspFileArgIndex','StartByte','Rate','MinRate','Port','Priority','RateCap','MinRateCap','TCPPort','CreatePolicy','TimePolicy','DatagramSize','XoptFlags','VLinkVersion','PeerVLinkVersion','DSPipelineDepth','PeerDSPipelineDepth','ReadBlockSize','WriteBlockSize','ClusterNumNodes','ClusterNodeId','Size','Written','Loss','FileBytes','PreTransferBytes','TransferBytes','PMTU','Elapsedusec','ArgScansAttempted','ArgScansCompleted','PathScansAttempted','FileScansCompleted','TransfersAttempted','TransfersPassed','Delay']
|
11
|
-
BooleanFields=['Encryption','Remote','RateLock','MinRateLock','PolicyLock','FilesEncrypt','FilesDecrypt','VLinkLocalEnabled','VLinkRemoteEnabled','MoveRange','Keepalive','TestLogin','UseProxy','Precalc','RTTAutocorrect']
|
12
|
-
ExpectedMethod=[:text,:struct,:enhanced]
|
13
|
-
|
14
17
|
# translates legacy event into enhanced (JSON) event
|
15
18
|
def enhanced_event_format(event)
|
16
|
-
return event.keys.
|
19
|
+
return event.keys.each_with_object({}) do |e,h|
|
17
20
|
# capital_to_snake_case
|
18
21
|
new_name=e.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
23
|
+
gsub(/([a-z\d])(usec)$/,'\1_\2').
|
24
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
25
|
+
downcase
|
23
26
|
value=event[e]
|
24
|
-
value=value.to_i if
|
25
|
-
value=value.eql?('Yes')
|
27
|
+
value=value.to_i if INTEGER_FIELDS.include?(e)
|
28
|
+
value=value.eql?('Yes') if BOOLEAN_FIELDS.include?(e)
|
26
29
|
h[new_name]=value
|
27
|
-
h
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -33,14 +35,14 @@ module Aspera
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def notify_listeners(current_event_text,current_event_data)
|
36
|
-
Log.log.debug(
|
38
|
+
Log.log.debug('send event to listeners')
|
37
39
|
enhanced_event=nil
|
38
40
|
@listeners.each do |listener|
|
39
|
-
listener.
|
40
|
-
listener.
|
41
|
+
listener.event_text(current_event_text) if listener.respond_to?(:event_text)
|
42
|
+
listener.event_struct(current_event_data) if listener.respond_to?(:event_struct)
|
41
43
|
if listener.respond_to?(:event_enhanced)
|
42
44
|
enhanced_event=enhanced_event_format(current_event_data) if enhanced_event.nil?
|
43
|
-
listener.
|
45
|
+
listener.event_enhanced(enhanced_event)
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end # notify_listeners
|
@@ -58,27 +60,28 @@ module Aspera
|
|
58
60
|
end
|
59
61
|
|
60
62
|
public
|
63
|
+
|
61
64
|
LISTENER_SESSION_ID_B='ListenerSessionId'
|
62
65
|
LISTENER_SESSION_ID_S='listener_session_id'
|
63
66
|
|
64
67
|
# listener receives events
|
65
68
|
def add_listener(listener)
|
66
|
-
raise "expect one of #{
|
69
|
+
raise "expect one of #{EXPECTED_METHODS}" if EXPECTED_METHODS.inject(0){|m,e|m+=listener.respond_to?("event_#{e}")?1:0;m}.eql?(0)
|
67
70
|
@listeners.push(listener)
|
68
71
|
self
|
69
72
|
end
|
70
73
|
|
71
|
-
# the following methods must be implemented by subclass:
|
72
|
-
# start_transfer(transfer_spec,options) : start and wait for completion
|
73
|
-
# wait_for_transfers_completion : wait for termination of all transfers, @return list of : :success or error message
|
74
|
-
# optional: shutdown
|
75
|
-
|
76
74
|
# This checks the validity of the value returned by wait_for_transfers_completion
|
77
75
|
# it must be a list of :success or exception
|
78
76
|
def self.validate_status_list(statuses)
|
79
77
|
raise "internal error: bad statuses type: #{statuses.class}" unless statuses.is_a?(Array)
|
80
|
-
raise "internal error: bad statuses content: #{statuses}" unless statuses.select{|i|!i.eql?(:success)
|
78
|
+
raise "internal error: bad statuses content: #{statuses}" unless statuses.select{|i|!i.eql?(:success) && !i.is_a?(StandardError)}.empty?
|
81
79
|
end
|
80
|
+
|
81
|
+
# the following methods must be implemented by subclass:
|
82
|
+
# start_transfer(transfer_spec,options) : start and wait for completion
|
83
|
+
# wait_for_transfers_completion : wait for termination of all transfers, @return list of : :success or error message
|
84
|
+
# optional: shutdown
|
82
85
|
end
|
83
86
|
end
|
84
87
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'aspera/fasp/agent_base'
|
2
3
|
require 'aspera/rest'
|
3
4
|
require 'aspera/open_application'
|
4
5
|
require 'securerandom'
|
@@ -6,19 +7,15 @@ require 'tty-spinner'
|
|
6
7
|
|
7
8
|
module Aspera
|
8
9
|
module Fasp
|
9
|
-
class
|
10
|
+
class AgentConnect < AgentBase
|
10
11
|
MAX_CONNECT_START_RETRY=3
|
11
12
|
SLEEP_SEC_BETWEEN_RETRY=2
|
12
13
|
private_constant :MAX_CONNECT_START_RETRY,:SLEEP_SEC_BETWEEN_RETRY
|
13
|
-
def initialize
|
14
|
-
super
|
14
|
+
def initialize(_options)
|
15
|
+
super()
|
15
16
|
@connect_settings={
|
16
17
|
'app_id' => SecureRandom.uuid
|
17
18
|
}
|
18
|
-
# TODO: start here and create monitor
|
19
|
-
end
|
20
|
-
|
21
|
-
def start_transfer(transfer_spec,options=nil)
|
22
19
|
raise 'Using connect requires a graphical environment' if !OpenApplication.default_gui_mode.eql?(:graphical)
|
23
20
|
trynumber=0
|
24
21
|
begin
|
@@ -26,7 +23,8 @@ module Aspera
|
|
26
23
|
Log.log.debug("found: #{connect_url}")
|
27
24
|
@connect_api=Rest.new({base_url: "#{connect_url}/v5/connect",headers: {'Origin'=>Rest.user_agent}}) # could use v6 also now
|
28
25
|
cinfo=@connect_api.read('info/version')[:data]
|
29
|
-
|
26
|
+
Log.dump(:connect_version,cinfo)
|
27
|
+
rescue StandardError => e # Errno::ECONNREFUSED
|
30
28
|
raise StandardError,"Unable to start connect after #{trynumber} try" if trynumber >= MAX_CONNECT_START_RETRY
|
31
29
|
Log.log.warn("connect is not started. Retry ##{trynumber}, err=#{e}")
|
32
30
|
trynumber+=1
|
@@ -37,24 +35,27 @@ module Aspera
|
|
37
35
|
sleep(SLEEP_SEC_BETWEEN_RETRY)
|
38
36
|
retry
|
39
37
|
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def start_transfer(transfer_spec,_options=nil)
|
40
41
|
if transfer_spec['direction'] == 'send'
|
41
42
|
Log.log.warn("Connect requires upload selection using GUI, ignoring #{transfer_spec['paths']}".red)
|
42
43
|
transfer_spec.delete('paths')
|
43
|
-
resdata=@connect_api.create('windows/select-open-file-dialog/',
|
44
|
+
resdata=@connect_api.create('windows/select-open-file-dialog/',
|
45
|
+
{'aspera_connect_settings'=>@connect_settings,'title'=>'Select Files','suggestedName'=>'','allowMultipleSelection'=>true,'allowedFileTypes'=>''})[:data]
|
44
46
|
transfer_spec['paths']=resdata['dataTransfer']['files'].map { |i| {'source'=>i['name']}}
|
45
47
|
end
|
46
48
|
@request_id=SecureRandom.uuid
|
47
49
|
# if there is a token, we ask connect client to use well known ssh private keys
|
48
50
|
# instead of asking password
|
49
51
|
transfer_spec['authentication']='token' if transfer_spec.has_key?('token')
|
50
|
-
connect_settings=
|
51
52
|
connect_transfer_args={
|
52
53
|
'aspera_connect_settings'=>@connect_settings.merge({
|
53
54
|
'request_id' =>@request_id,
|
54
|
-
'allow_dialogs' =>true
|
55
|
+
'allow_dialogs' =>true
|
55
56
|
}),
|
56
57
|
'transfer_specs' =>[{
|
57
|
-
'transfer_spec' =>transfer_spec
|
58
|
+
'transfer_spec' =>transfer_spec
|
58
59
|
}]}
|
59
60
|
# asynchronous anyway
|
60
61
|
res=@connect_api.create('transfers/start',connect_transfer_args)[:data]
|
@@ -65,42 +66,50 @@ module Aspera
|
|
65
66
|
connect_activity_args={'aspera_connect_settings'=>@connect_settings}
|
66
67
|
started=false
|
67
68
|
spinner=nil
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
# TODO: get session id
|
77
|
-
case trdata['status']
|
78
|
-
when 'completed'
|
79
|
-
notify_end(@connect_settings['app_id'])
|
80
|
-
break
|
81
|
-
when 'initiating','queued'
|
82
|
-
if spinner.nil?
|
83
|
-
spinner = TTY::Spinner.new('[:spinner] :title', format: :classic)
|
84
|
-
spinner.start
|
69
|
+
begin
|
70
|
+
loop do
|
71
|
+
tr_info=@connect_api.create("transfers/info/#{@xfer_id}",connect_activity_args)[:data]
|
72
|
+
if tr_info['transfer_info'].is_a?(Hash)
|
73
|
+
trdata=tr_info['transfer_info']
|
74
|
+
if trdata.nil?
|
75
|
+
Log.log.warn('no session in Connect')
|
76
|
+
break
|
85
77
|
end
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
78
|
+
# TODO: get session id
|
79
|
+
case trdata['status']
|
80
|
+
when 'completed'
|
81
|
+
notify_end(@connect_settings['app_id'])
|
82
|
+
break
|
83
|
+
when 'initiating','queued'
|
84
|
+
if spinner.nil?
|
85
|
+
spinner = TTY::Spinner.new('[:spinner] :title', format: :classic)
|
86
|
+
spinner.start
|
87
|
+
end
|
88
|
+
spinner.update(title: trdata['status'])
|
89
|
+
spinner.spin
|
90
|
+
when 'running'
|
91
|
+
#puts "running: sessions:#{trdata['sessions'].length}, #{trdata['sessions'].map{|i| i['bytes_transferred']}.join(',')}"
|
92
|
+
if !started && (trdata['bytes_expected'] != 0)
|
93
|
+
spinner.success unless spinner.nil?
|
94
|
+
notify_begin(@connect_settings['app_id'],trdata['bytes_expected'])
|
95
|
+
started=true
|
96
|
+
else
|
97
|
+
notify_progress(@connect_settings['app_id'],trdata['bytes_written'])
|
98
|
+
end
|
99
|
+
when 'failed'
|
100
|
+
spinner.error unless spinner.nil?
|
101
|
+
raise Fasp::Error, trdata['error_desc']
|
93
102
|
else
|
94
|
-
|
103
|
+
raise Fasp::Error, "unknown status: #{trdata['status']}: #{trdata['error_desc']}"
|
95
104
|
end
|
96
|
-
else
|
97
|
-
raise Fasp::Error.new("unknown status: #{trdata['status']}: #{trdata['error_desc']}")
|
98
105
|
end
|
106
|
+
sleep 1
|
99
107
|
end
|
100
|
-
|
108
|
+
rescue StandardError => e
|
109
|
+
return [e]
|
101
110
|
end
|
102
|
-
return []
|
111
|
+
return [:success]
|
103
112
|
end # wait
|
104
|
-
end #
|
113
|
+
end # AgentConnect
|
105
114
|
end
|
106
115
|
end
|