aspera-cli 4.6.0 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +427 -300
  3. data/bin/ascli +2 -1
  4. data/bin/asession +1 -0
  5. data/docs/test_env.conf +2 -0
  6. data/examples/aoc.rb +4 -3
  7. data/examples/faspex4.rb +21 -19
  8. data/examples/proxy.pac +1 -1
  9. data/examples/transfer.rb +15 -15
  10. data/lib/aspera/aoc.rb +135 -124
  11. data/lib/aspera/ascmd.rb +85 -75
  12. data/lib/aspera/ats_api.rb +11 -10
  13. data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
  14. data/lib/aspera/cli/extended_value.rb +42 -33
  15. data/lib/aspera/cli/formater.rb +138 -111
  16. data/lib/aspera/cli/info.rb +17 -0
  17. data/lib/aspera/cli/listener/line_dump.rb +3 -2
  18. data/lib/aspera/cli/listener/logger.rb +2 -1
  19. data/lib/aspera/cli/listener/progress.rb +16 -18
  20. data/lib/aspera/cli/listener/progress_multi.rb +13 -16
  21. data/lib/aspera/cli/main.rb +122 -130
  22. data/lib/aspera/cli/manager.rb +146 -154
  23. data/lib/aspera/cli/plugin.rb +38 -34
  24. data/lib/aspera/cli/plugins/alee.rb +6 -6
  25. data/lib/aspera/cli/plugins/aoc.rb +273 -276
  26. data/lib/aspera/cli/plugins/ats.rb +82 -76
  27. data/lib/aspera/cli/plugins/bss.rb +14 -16
  28. data/lib/aspera/cli/plugins/config.rb +350 -306
  29. data/lib/aspera/cli/plugins/console.rb +23 -19
  30. data/lib/aspera/cli/plugins/cos.rb +18 -18
  31. data/lib/aspera/cli/plugins/faspex.rb +180 -159
  32. data/lib/aspera/cli/plugins/faspex5.rb +64 -54
  33. data/lib/aspera/cli/plugins/node.rb +147 -140
  34. data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
  35. data/lib/aspera/cli/plugins/preview.rb +92 -96
  36. data/lib/aspera/cli/plugins/server.rb +79 -75
  37. data/lib/aspera/cli/plugins/shares.rb +23 -24
  38. data/lib/aspera/cli/plugins/sync.rb +20 -22
  39. data/lib/aspera/cli/transfer_agent.rb +40 -39
  40. data/lib/aspera/cli/version.rb +2 -1
  41. data/lib/aspera/colors.rb +35 -27
  42. data/lib/aspera/command_line_builder.rb +48 -34
  43. data/lib/aspera/cos_node.rb +29 -21
  44. data/lib/aspera/data_repository.rb +3 -2
  45. data/lib/aspera/environment.rb +50 -45
  46. data/lib/aspera/fasp/agent_base.rb +22 -20
  47. data/lib/aspera/fasp/agent_connect.rb +13 -11
  48. data/lib/aspera/fasp/agent_direct.rb +48 -59
  49. data/lib/aspera/fasp/agent_httpgw.rb +33 -39
  50. data/lib/aspera/fasp/agent_node.rb +15 -13
  51. data/lib/aspera/fasp/agent_trsdk.rb +12 -14
  52. data/lib/aspera/fasp/error.rb +2 -1
  53. data/lib/aspera/fasp/error_info.rb +68 -52
  54. data/lib/aspera/fasp/installation.rb +106 -94
  55. data/lib/aspera/fasp/listener.rb +1 -0
  56. data/lib/aspera/fasp/parameters.rb +83 -92
  57. data/lib/aspera/fasp/parameters.yaml +305 -249
  58. data/lib/aspera/fasp/resume_policy.rb +11 -14
  59. data/lib/aspera/fasp/transfer_spec.rb +26 -0
  60. data/lib/aspera/fasp/uri.rb +22 -21
  61. data/lib/aspera/faspex_gw.rb +55 -90
  62. data/lib/aspera/hash_ext.rb +4 -3
  63. data/lib/aspera/id_generator.rb +8 -7
  64. data/lib/aspera/keychain/encrypted_hash.rb +17 -16
  65. data/lib/aspera/keychain/macos_security.rb +6 -10
  66. data/lib/aspera/log.rb +25 -20
  67. data/lib/aspera/nagios.rb +13 -12
  68. data/lib/aspera/node.rb +30 -22
  69. data/lib/aspera/oauth.rb +175 -226
  70. data/lib/aspera/open_application.rb +4 -3
  71. data/lib/aspera/persistency_action_once.rb +6 -6
  72. data/lib/aspera/persistency_folder.rb +5 -9
  73. data/lib/aspera/preview/file_types.rb +6 -5
  74. data/lib/aspera/preview/generator.rb +25 -24
  75. data/lib/aspera/preview/options.rb +16 -14
  76. data/lib/aspera/preview/utils.rb +98 -98
  77. data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
  78. data/lib/aspera/proxy_auto_config.rb +111 -20
  79. data/lib/aspera/rest.rb +115 -113
  80. data/lib/aspera/rest_call_error.rb +2 -2
  81. data/lib/aspera/rest_error_analyzer.rb +23 -25
  82. data/lib/aspera/rest_errors_aspera.rb +15 -14
  83. data/lib/aspera/ssh.rb +12 -10
  84. data/lib/aspera/sync.rb +42 -41
  85. data/lib/aspera/temp_file_manager.rb +18 -14
  86. data/lib/aspera/timer_limiter.rb +2 -1
  87. data/lib/aspera/uri_reader.rb +7 -5
  88. data/lib/aspera/web_auth.rb +79 -76
  89. metadata +64 -21
  90. data/docs/Makefile +0 -65
  91. data/docs/README.erb.md +0 -4424
  92. data/docs/README.md +0 -13
  93. data/docs/diagrams.txt +0 -49
  94. data/docs/doc_tools.rb +0 -58
  95. data/lib/aspera/cli/plugins/shares2.rb +0 -114
  96. data/lib/aspera/fasp/default.rb +0 -17
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/fasp/agent_base'
3
+ require 'aspera/fasp/transfer_spec'
2
4
  require 'aspera/log'
3
5
  require 'tty-spinner'
4
6
 
@@ -10,7 +12,7 @@ module Aspera
10
12
  # option include: root_id if the node is an access key
11
13
  attr_writer :options
12
14
  def initialize(options)
13
- raise "node specification must be Hash" unless options.is_a?(Hash)
15
+ raise 'node specification must be Hash' unless options.is_a?(Hash)
14
16
  [:url,:username,:password].each { |k| raise "missing parameter [#{k}] in node specification: #{options}" unless options.has_key?(k) }
15
17
  super()
16
18
  # root id is required for access key
@@ -21,7 +23,7 @@ module Aspera
21
23
  'X-Aspera-AccessKey'=>options[:username],
22
24
  'Authorization' =>options[:password]
23
25
  }
24
- raise "root_id is required for access key" if @root_id.nil?
26
+ raise 'root_id is required for access key' if @root_id.nil?
25
27
  else
26
28
  rest_params[:auth]={
27
29
  type: :basic,
@@ -44,24 +46,24 @@ module Aspera
44
46
 
45
47
  # use this to set the node_api end point before using the class.
46
48
  def node_api=(new_value)
47
- if !@node_api.nil? and !new_value.nil?
49
+ if !@node_api.nil? && !new_value.nil?
48
50
  Log.log.warn('overriding existing node api value')
49
51
  end
50
52
  @node_api=new_value
51
53
  end
52
54
 
53
55
  # generic method
54
- def start_transfer(transfer_spec,options=nil)
56
+ def start_transfer(transfer_spec,_options=nil)
55
57
  # add root id if access key
56
- if ! @root_id.nil?
58
+ if !@root_id.nil?
57
59
  case transfer_spec['direction']
58
- when 'send';transfer_spec['source_root_id']=@root_id
59
- when 'receive';transfer_spec['destination_root_id']=@root_id
60
+ when Fasp::TransferSpec::DIRECTION_SEND then transfer_spec['source_root_id']=@root_id
61
+ when Fasp::TransferSpec::DIRECTION_RECEIVE then transfer_spec['destination_root_id']=@root_id
60
62
  else raise "unexpected direction in ts: #{transfer_spec['direction']}"
61
63
  end
62
64
  end
63
65
  # manage special additional parameter
64
- if transfer_spec.has_key?('EX_ssh_key_paths') and transfer_spec['EX_ssh_key_paths'].is_a?(Array) and !transfer_spec['EX_ssh_key_paths'].empty?
66
+ if transfer_spec.has_key?('EX_ssh_key_paths') && transfer_spec['EX_ssh_key_paths'].is_a?(Array) && !transfer_spec['EX_ssh_key_paths'].empty?
65
67
  # not standard, so place standard field
66
68
  if transfer_spec.has_key?('ssh_private_key')
67
69
  Log.log.warn('Both ssh_private_key and EX_ssh_key_paths are present, using ssh_private_key')
@@ -71,7 +73,7 @@ module Aspera
71
73
  transfer_spec.delete('EX_ssh_key_paths')
72
74
  end
73
75
  end
74
- if transfer_spec['tags'].is_a?(Hash) and transfer_spec['tags']['aspera'].is_a?(Hash)
76
+ if transfer_spec['tags'].is_a?(Hash) && transfer_spec['tags']['aspera'].is_a?(Hash)
75
77
  transfer_spec['tags']['aspera']['xfer_retry']||=150
76
78
  end
77
79
  # optimisation in case of sending to the same node
@@ -91,14 +93,14 @@ module Aspera
91
93
  # lets emulate management events to display progress bar
92
94
  loop do
93
95
  # status is empty sometimes with status 200...
94
- trdata=node_api_.read("ops/transfers/#{@transfer_id}")[:data] || {"status"=>"unknown"} rescue {"status"=>"waiting(read error)"}
96
+ trdata=node_api_.read("ops/transfers/#{@transfer_id}")[:data] || {'status'=>'unknown'} rescue {'status'=>'waiting(read error)'}
95
97
  case trdata['status']
96
98
  when 'completed'
97
99
  notify_end(@transfer_id)
98
100
  break
99
101
  when 'waiting','partially_completed','unknown','waiting(read error)'
100
102
  if spinner.nil?
101
- spinner = TTY::Spinner.new("[:spinner] :title", format: :classic)
103
+ spinner = TTY::Spinner.new('[:spinner] :title', format: :classic)
102
104
  spinner.start
103
105
  end
104
106
  spinner.update(title: trdata['status'])
@@ -106,7 +108,7 @@ module Aspera
106
108
  #puts trdata
107
109
  when 'running'
108
110
  #puts "running: sessions:#{trdata["sessions"].length}, #{trdata["sessions"].map{|i| i['bytes_transferred']}.join(',')}"
109
- if !started and trdata['precalc'].is_a?(Hash) and
111
+ if !started && trdata['precalc'].is_a?(Hash) &&
110
112
  trdata['precalc']['status'].eql?('ready')
111
113
  notify_begin(@transfer_id,trdata['precalc']['bytes_expected'])
112
114
  started=true
@@ -115,7 +117,7 @@ module Aspera
115
117
  end
116
118
  else
117
119
  Log.log.warn("trdata -> #{trdata}")
118
- raise Fasp::Error.new("#{trdata['status']}: #{trdata['error_desc']}")
120
+ raise Fasp::Error, "#{trdata['status']}: #{trdata['error_desc']}"
119
121
  end
120
122
  sleep 1
121
123
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/fasp/agent_base'
2
3
  require 'aspera/fasp/installation'
3
4
  require 'json'
@@ -7,22 +8,19 @@ module Aspera
7
8
  class AgentTrsdk < AgentBase
8
9
  DEFAULT_OPTIONS = {
9
10
  address: '127.0.0.1',
10
- port: 55002,
11
+ port: 55_002
11
12
  }
12
13
  private_constant :DEFAULT_OPTIONS
13
14
 
14
15
  # options come from transfer_info
15
16
  def initialize(user_opts)
16
- raise "expecting Hash (or nil), but have #{user_opts.class}" unless user_opts.nil? or user_opts.is_a?(Hash)
17
+ raise "expecting Hash (or nil), but have #{user_opts.class}" unless user_opts.nil? || user_opts.is_a?(Hash)
17
18
  # set default options and override if specified
18
19
  options=DEFAULT_OPTIONS.clone
19
20
  if !user_opts.nil?
20
21
  user_opts.each do |k,v|
21
- if DEFAULT_OPTIONS.has_key?(k)
22
- options[k]=v
23
- else
24
- raise "Unknown local agent parameter: #{k}, expect one of #{DEFAULT_OPTIONS.keys.map{|i|i.to_s}.join(",")}"
25
- end
22
+ raise "Unknown local agent parameter: #{k}, expect one of #{DEFAULT_OPTIONS.keys.map(&:to_s).join(',')}" unless DEFAULT_OPTIONS.has_key?(k)
23
+ options[k]=v
26
24
  end
27
25
  end
28
26
  Log.log.debug("options= #{options}")
@@ -34,8 +32,8 @@ module Aspera
34
32
  begin
35
33
  get_info_response = @transfer_client.get_info(Transfersdk::InstanceInfoRequest.new)
36
34
  Log.log.debug("daemon info: #{get_info_response}")
37
- rescue GRPC::Unavailable => e
38
- Log.log.warn("no daemon present, starting daemon...")
35
+ rescue GRPC::Unavailable
36
+ Log.log.warn('no daemon present, starting daemon...')
39
37
  # location of daemon binary
40
38
  bin_folder=File.realpath(File.join(Installation.instance.sdk_ruby_folder,'..'))
41
39
  # config file and logs are created in same folder
@@ -49,19 +47,19 @@ module Aspera
49
47
  use_embedded: false,
50
48
  user_defined: {
51
49
  bin: bin_folder,
52
- etc: bin_folder,
50
+ etc: bin_folder
53
51
  }
54
52
  }
55
53
  }
56
54
  File.write(conf_file,config.to_json)
57
- trd_pid = Process.spawn(Installation.instance.path(:transferd),'--config' , conf_file, out: "#{log_base}.out", err: "#{log_base}.err")
55
+ trd_pid = Process.spawn(Installation.instance.path(:transferd),'--config', conf_file, out: "#{log_base}.out", err: "#{log_base}.err")
58
56
  Process.detach(trd_pid)
59
57
  sleep(2.0)
60
58
  retry
61
59
  end
62
60
  end
63
61
 
64
- def start_transfer(transfer_spec,options=nil)
62
+ def start_transfer(transfer_spec,_options=nil)
65
63
  # create a transfer request
66
64
  transfer_request = Transfersdk::TransferRequest.new(
67
65
  transferType: Transfersdk::TransferType::FILE_REGULAR, # transfer type (file/stream)
@@ -82,7 +80,7 @@ module Aspera
82
80
  #Log.log.debug("#{response.sessionInfo.preTransferBytes} #{response.transferInfo.bytesTransferred}")
83
81
  case response.status
84
82
  when :RUNNING
85
- if !started and !response.sessionInfo.preTransferBytes.eql?(0)
83
+ if !started && !response.sessionInfo.preTransferBytes.eql?(0)
86
84
  notify_begin(@transfer_id,response.sessionInfo.preTransferBytes)
87
85
  started=true
88
86
  elsif started
@@ -90,7 +88,7 @@ module Aspera
90
88
  end
91
89
  when :FAILED, :COMPLETED, :CANCELED
92
90
  notify_end(@transfer_id)
93
- raise Fasp::Error.new(JSON.parse(response.message)['Description']) unless :COMPLETED.eql?(response.status)
91
+ raise Fasp::Error, JSON.parse(response.message)['Description'] unless :COMPLETED.eql?(response.status)
94
92
  break
95
93
  when :QUEUED,:UNKNOWN_STATUS,:PAUSED,:ORPHANED
96
94
  # ignore
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aspera/fasp/error_info'
2
3
 
3
4
  module Aspera
@@ -11,7 +12,7 @@ module Aspera
11
12
  end
12
13
 
13
14
  def info
14
- r=Fasp::ERROR_INFO[@err_code] || {r: false , c: 'UNKNOWN', m: 'unknown', a: 'unknown'}
15
+ r=Fasp::ERROR_INFO[@err_code] || {r: false, c: 'UNKNOWN', m: 'unknown', a: 'unknown'}
15
16
  return r.merge({i: @err_code})
16
17
  end
17
18
 
@@ -1,60 +1,76 @@
1
+ # frozen_string_literal: true
1
2
  module Aspera
2
3
  module Fasp
3
4
  # from https://www.google.com/search?q=FASP+error+codes
4
5
  # Note that the fact that an error is retryable is not internally defined by protocol, it's client responsibility
5
6
  ERROR_INFO = {
6
- # id retryable mnemo message additional info
7
- 1 => { r: false , c: 'FASP_PROTO', m: 'Generic fasp(tm) protocol error', a: 'fasp(tm) error'},
8
- 2 => { r: false , c: 'ASCP', m: 'Generic SCP error', a: 'ASCP error'},
9
- 3 => { r: false , c: 'AMBIGUOUS_TARGET', m: 'Target incorrectly specified', a: 'Ambiguous target'},
10
- 4 => { r: false , c: 'NO_SUCH_FILE', m: 'No such file or directory', a: 'No such file or directory'},
11
- 5 => { r: false , c: 'NO_PERMS', m: 'Insufficient permission to read or write', a: 'Insufficient permissions'},
12
- 6 => { r: false , c: 'NOT_DIR', m: 'Target is not a directory', a: 'Target must be a directory'},
13
- 7 => { r: false , c: 'IS_DIR', m: 'File is a directory - expected regular file', a: 'Expected regular file'},
14
- 8 => { r: false , c: 'USAGE', m: 'Incorrect usage of scp command', a: 'Incorrect usage of Aspera scp command'},
15
- 9 => { r: false , c: 'LIC_DUP', m: 'Duplicate license', a: 'Duplicate license'},
16
- 10 => { r: false , c: 'LIC_RATE_EXCEEDED', m: 'Rate exceeds the cap imposed by license', a: 'Rate exceeds cap imposed by license'},
17
- 11 => { r: false , c: 'INTERNAL_ERROR', m: 'Internal error (unexpected error)', a: 'Internal error'},
18
- 12 => { r: true , c: 'TRANSFER_ERROR', m: 'Error establishing control connection', a: 'Error establishing SSH connection (check SSH port and firewall)'},
19
- 13 => { r: true , c: 'TRANSFER_TIMEOUT', m: 'Timeout establishing control connection', a: 'Timeout establishing SSH connection (check SSH port and firewall)'},
20
- 14 => { r: true , c: 'CONNECTION_ERROR', m: 'Error establishing data connection', a: 'Error establishing UDP connection (check UDP port and firewall)'},
21
- 15 => { r: true , c: 'CONNECTION_TIMEOUT', m: 'Timeout establishing data connection', a: 'Timeout establishing UDP connection (check UDP port and firewall)'},
22
- 16 => { r: true , c: 'CONNECTION_LOST', m: 'Connection lost', a: 'Connection lost'},
23
- 17 => { r: true , c: 'RCVR_SEND_ERROR', m: 'Receiver fails to send feedback', a: 'Network failure (receiver can\'t send feedback)'},
24
- 18 => { r: true , c: 'RCVR_RECV_ERROR', m: 'Receiver fails to receive data packets', a: 'Network failure (receiver can\'t receive UDP data)'},
25
- 19 => { r: false , c: 'AUTH', m: 'Authentication failure', a: 'Authentication failure'},
26
- 20 => { r: false , c: 'NOTHING', m: 'Nothing to transfer', a: 'Nothing to transfer'},
27
- 21 => { r: false , c: 'NOT_REGULAR', m: 'Not a regular file (special file)', a: 'Not a regular file'},
28
- 22 => { r: false , c: 'FILE_TABLE_OVR', m: 'File table overflow', a: 'File table overflow'},
29
- 23 => { r: true , c: 'TOO_MANY_FILES', m: 'Too many files open', a: 'Too many files open'},
30
- 24 => { r: false , c: 'FILE_TOO_BIG', m: 'File too big for file system', a: 'File too big for filesystem'},
31
- 25 => { r: false , c: 'NO_SPACE_LEFT', m: 'No space left on disk', a: 'No space left on disk'},
32
- 26 => { r: false , c: 'READ_ONLY_FS', m: 'Read only file system', a: 'Read only filesystem'},
33
- 27 => { r: false , c: 'SOME_FILE_ERRS', m: 'Some individual files failed', a: 'One or more files failed'},
34
- 28 => { r: false , c: 'USER_CANCEL', m: 'Cancelled by user', a: 'Cancelled by user'},
35
- 29 => { r: false , c: 'LIC_NOLIC', m: 'License not found or unable to access', a: 'Unable to access license info'},
36
- 30 => { r: false , c: 'LIC_EXPIRED', m: 'License expired', a: 'License expired'},
37
- 31 => { r: false , c: 'SOCK_SETUP', m: 'Unable to setup socket (create, bind, etc ...)', a: 'Unable to set up socket'},
38
- 32 => { r: true , c: 'OUT_OF_MEMORY', m: 'Out of memory, unable to allocate', a: 'Out of memory'},
39
- 33 => { r: true , c: 'THREAD_SPAWN', m: 'Can\'t spawn thread', a: 'Unable to spawn thread'},
40
- 34 => { r: false , c: 'UNAUTHORIZED', m: 'Unauthorized by external auth server', a: 'Unauthorized'},
41
- 35 => { r: true , c: 'DISK_READ', m: 'Error reading source file from disk', a: 'Disk read error'},
42
- 36 => { r: true , c: 'DISK_WRITE', m: 'Error writing to disk', a: 'Disk write error'},
43
- 37 => { r: true , c: 'AUTHORIZATION', m: 'Used interchangeably with ERR_UNAUTHORIZED', a: 'Authorization failure'},
44
- 38 => { r: false , c: 'LIC_ILLEGAL', m: 'Operation not permitted by license', a: 'Operation not permitted by license'},
45
- 39 => { r: true , c: 'PEER_ABORTED_SESSION', m: 'Remote peer terminated session', a: 'Peer aborted session'},
46
- 40 => { r: true , c: 'DATA_TRANSFER_TIMEOUT', m: 'Transfer stalled, timed out', a: 'Data transfer stalled, timed out'},
47
- 41 => { r: false , c: 'BAD_PATH', m: 'Path violates docroot containment', a: 'File location is outside \'docroot\' hierarchy'},
48
- 42 => { r: false , c: 'ALREADY_EXISTS', m: 'File or directory already exists', a: 'File or directory already exists'},
49
- 43 => { r: false , c: 'STAT_FAILS', m: 'Cannot stat file', a: 'Cannot collect details about file or directory'},
50
- 44 => { r: true , c: 'PMTU_BRTT_ERROR', m: 'UDP session initiation fatal error', a: 'UDP session initiation fatal error'},
51
- 45 => { r: true , c: 'BWMEAS_ERROR', m: 'Bandwidth measurement fatal error', a: 'Bandwidth measurement fatal error'},
52
- 46 => { r: false , c: 'VLINK_ERROR', m: 'Virtual link error', a: 'Virtual link error'},
53
- 47 => { r: false , c: 'CONNECTION_ERROR_HTTP', m: 'Error establishing HTTP connection', a: 'Error establishing HTTP connection (check HTTP port and firewall)'},
54
- 48 => { r: false , c: 'FILE_ENCRYPTION_ERROR', m: 'File encryption error, e.g. corrupt file', a: 'File encryption/decryption error, e.g. corrupt file'},
55
- 49 => { r: false , c: 'FILE_DECRYPTION_PASS', m: 'File encryption/decryption error, e.g. corrupt file', a: 'File decryption error, bad passphrase'},
56
- 50 => { r: false , c: 'BAD_CONFIGURATION', m: 'Aspera.conf contains invalid data and was rejected', a: 'Invalid configuration'},
57
- 51 => { r: false , c: 'UNDEFINED', m: 'Should never happen, report to Aspera', a: 'Undefined error'},
7
+ # id retryable mnemo message additional info
8
+ 1 => { r: false, c: 'FASP_PROTO', m: 'Generic fasp(tm) protocol error', a: 'fasp(tm) error'},
9
+ 2 => { r: false, c: 'ASCP', m: 'Generic SCP error', a: 'ASCP error'},
10
+ 3 => { r: false, c: 'AMBIGUOUS_TARGET', m: 'Target incorrectly specified', a: 'Ambiguous target'},
11
+ 4 => { r: false, c: 'NO_SUCH_FILE', m: 'No such file or directory', a: 'No such file or directory'},
12
+ 5 => { r: false, c: 'NO_PERMS', m: 'Insufficient permission to read or write', a: 'Insufficient permissions'},
13
+ 6 => { r: false, c: 'NOT_DIR', m: 'Target is not a directory', a: 'Target must be a directory'},
14
+ 7 => { r: false, c: 'IS_DIR', m: 'File is a directory - expected regular file', a: 'Expected regular file'},
15
+ 8 => { r: false, c: 'USAGE', m: 'Incorrect usage of scp command', a: 'Incorrect usage of Aspera scp command'},
16
+ 9 => { r: false, c: 'LIC_DUP', m: 'Duplicate license', a: 'Duplicate license'},
17
+ 10 => { r: false, c: 'LIC_RATE_EXCEEDED', m: 'Rate exceeds the cap imposed by license', a: 'Rate exceeds cap imposed by license'},
18
+ 11 => { r: false, c: 'INTERNAL_ERROR', m: 'Internal error (unexpected error)', a: 'Internal error'},
19
+ 12 => { r: true, c: 'TRANSFER_ERROR', m: 'Error establishing control connection', a: 'Error establishing SSH connection (check SSH port and firewall)'},
20
+ 13 => { r: true, c: 'TRANSFER_TIMEOUT', m: 'Timeout establishing control connection', a: 'Timeout establishing SSH connection (check SSH port and firewall)'},
21
+ 14 => { r: true, c: 'CONNECTION_ERROR', m: 'Error establishing data connection', a: 'Error establishing UDP connection (check UDP port and firewall)'},
22
+ 15 => { r: true, c: 'CONNECTION_TIMEOUT', m: 'Timeout establishing data connection', a: 'Timeout establishing UDP connection (check UDP port and firewall)'},
23
+ 16 => { r: true, c: 'CONNECTION_LOST', m: 'Connection lost', a: 'Connection lost'},
24
+ 17 => { r: true, c: 'RCVR_SEND_ERROR', m: 'Receiver fails to send feedback', a: 'Network failure (receiver can\'t send feedback)'},
25
+ 18 => { r: true, c: 'RCVR_RECV_ERROR', m: 'Receiver fails to receive data packets', a: 'Network failure (receiver can\'t receive UDP data)'},
26
+ 19 => { r: false, c: 'AUTH', m: 'Authentication failure', a: 'Authentication failure'},
27
+ 20 => { r: false, c: 'NOTHING', m: 'Nothing to transfer', a: 'Nothing to transfer'},
28
+ 21 => { r: false, c: 'NOT_REGULAR', m: 'Not a regular file (special file)', a: 'Not a regular file'},
29
+ 22 => { r: false, c: 'FILE_TABLE_OVR', m: 'File table overflow', a: 'File table overflow'},
30
+ 23 => { r: true, c: 'TOO_MANY_FILES', m: 'Too many files open', a: 'Too many files open'},
31
+ 24 => { r: false, c: 'FILE_TOO_BIG', m: 'File too big for file system', a: 'File too big for filesystem'},
32
+ 25 => { r: false, c: 'NO_SPACE_LEFT', m: 'No space left on disk', a: 'No space left on disk'},
33
+ 26 => { r: false, c: 'READ_ONLY_FS', m: 'Read only file system', a: 'Read only filesystem'},
34
+ 27 => { r: false, c: 'SOME_FILE_ERRS', m: 'Some individual files failed', a: 'One or more files failed'},
35
+ 28 => { r: false, c: 'USER_CANCEL', m: 'Cancelled by user', a: 'Cancelled by user'},
36
+ 29 => { r: false, c: 'LIC_NOLIC', m: 'License not found or unable to access', a: 'Unable to access license info'},
37
+ 30 => { r: false, c: 'LIC_EXPIRED', m: 'License expired', a: 'License expired'},
38
+ 31 => { r: false, c: 'SOCK_SETUP', m: 'Unable to setup socket (create, bind, etc ...)', a: 'Unable to set up socket'},
39
+ 32 => { r: true, c: 'OUT_OF_MEMORY', m: 'Out of memory, unable to allocate', a: 'Out of memory'},
40
+ 33 => { r: true, c: 'THREAD_SPAWN', m: 'Can\'t spawn thread', a: 'Unable to spawn thread'},
41
+ 34 => { r: false, c: 'UNAUTHORIZED', m: 'Unauthorized by external auth server', a: 'Unauthorized'},
42
+ 35 => { r: true, c: 'DISK_READ', m: 'Error reading source file from disk', a: 'Disk read error'},
43
+ 36 => { r: true, c: 'DISK_WRITE', m: 'Error writing to disk', a: 'Disk write error'},
44
+ 37 => { r: true, c: 'AUTHORIZATION', m: 'Used interchangeably with ERR_UNAUTHORIZED', a: 'Authorization failure'},
45
+ 38 => { r: false, c: 'LIC_ILLEGAL', m: 'Operation not permitted by license', a: 'Operation not permitted by license'},
46
+ 39 => { r: true, c: 'PEER_ABORTED_SESSION', m: 'Remote peer terminated session', a: 'Peer aborted session'},
47
+ 40 => { r: true, c: 'DATA_TRANSFER_TIMEOUT', m: 'Transfer stalled, timed out', a: 'Data transfer stalled, timed out'},
48
+ 41 => { r: false, c: 'BAD_PATH', m: 'Path violates docroot containment', a: 'File location is outside \'docroot\' hierarchy'},
49
+ 42 => { r: false, c: 'ALREADY_EXISTS', m: 'File or directory already exists', a: 'File or directory already exists'},
50
+ 43 => { r: false, c: 'STAT_FAILS', m: 'Cannot stat file', a: 'Cannot collect details about file or directory'},
51
+ 44 => { r: true, c: 'PMTU_BRTT_ERROR', m: 'UDP session initiation fatal error', a: 'UDP session initiation fatal error'},
52
+ 45 => { r: true, c: 'BWMEAS_ERROR', m: 'Bandwidth measurement fatal error', a: 'Bandwidth measurement fatal error'},
53
+ 46 => { r: false, c: 'VLINK_ERROR', m: 'Virtual link error', a: 'Virtual link error'},
54
+ 47 => { r: false, c: 'CONNECTION_ERROR_HTTP', m: 'Error establishing HTTP connection', a: 'Error establishing HTTP connection (check HTTP port and firewall)'},
55
+ 48 => { r: false, c: 'FILE_ENCRYPTION_ERROR', m: 'File encryption error, e.g. corrupt file', a: 'File encryption/decryption error, e.g. corrupt file'},
56
+ 49 => { r: false, c: 'FILE_DECRYPTION_PASS', m: 'File encryption/decryption error, e.g. corrupt file', a: 'File decryption error, bad passphrase'},
57
+ 50 => { r: false, c: 'BAD_CONFIGURATION', m: 'Aspera.conf contains invalid data and was rejected', a: 'Invalid configuration'},
58
+ 51 => { r: false, c: 'INSECURE_CONNECTION', m: 'Remote-host key check failure', a: 'Remote host is not who we expected'},
59
+ 52 => { r: false, c: 'START_VALIDATION_FAILED', m: 'File start validation failed', a: 'File start validation failed'},
60
+ 53 => { r: false, c: 'STOP_VALIDATION_FAILED', m: 'File stop validation failed', a: 'File stop validation failed'},
61
+ 54 => { r: false, c: 'THRESHOLD_VALIDATION_FAILED',m: 'File threshold validation failed', a: 'File threshold validation failed'},
62
+ 55 => { r: false, c: 'FILEPATH_TOO_LONG', m: 'File path/name too long for underlying file system', a: 'File path exceeds underlying file system limit'},
63
+ 56 => { r: false, c: 'ILLEGAL_CHARS_IN_PATH', m: 'Windows path contains illegal characters', a: 'Path being written to Windows file system contains illegal characters'},
64
+ 57 => { r: false, c: 'CHUNK_MUST_MATCH_ALIGNMENT', m: 'Chunk size/start must be aligned with storage', a: 'Chunk size/start must be aligned with storage'},
65
+ 58 => { r: false, c: 'VALIDATION_SESSION_ABORT', m: 'Session aborted to due to validation error', a: 'Session aborted to due validation error'},
66
+ 59 => { r: false, c: 'REMOTE_STORAGE_ERROR', m: 'Remote storage errored', a: 'Remote storage errored'},
67
+ 60 => { r: false, c: 'LUA_SCRIPT_ABORTED_SESSION', m: 'Session aborted due to Lua script abort', a: 'Session aborted due to Lua script abort'},
68
+ 61 => { r: true, c: 'SSEAR_RETRYABLE', m: 'Transfer failed because of a retryable Encryption at Rest error', a: 'Transfer failed because of a retryable Encryption at Rest error'},
69
+ 62 => { r: false, c: 'SSEAR_FATAL', m: 'Transfer failed because of a fatal Encryption at Rest error', a: 'Transfer failed because of a fatal Encryption at Rest error'},
70
+ 63 => { r: false, c: 'LINK_LOOP', m: 'Path refers to a symbolic link loop', a: 'Path refers to a symbolic link loop'},
71
+ 64 => { r: false, c: 'CANNOT_RENAME_PARTIAL_FILES',m: 'Can\'t rename a partial file', a: 'Can\'t rename a partial file.'},
72
+ 65 => { r: false, c: 'CIPHER_NON_COMPAT_FIPS', m: 'Can\'t use this cipher with FIPS mode enabled', a: 'Can\'t use this cipher with FIPS mode enabled'},
73
+ 66 => { r: false, c: 'PEER_REQUIRES_FIPS', m: 'Peer rejects cipher due to FIPS mode enabled on peer', a: 'Peer rejects cipher due to FIPS mode enabled on peer'}
58
74
  }
59
75
  end
60
76
  end