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
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'aspera/fasp/agent_base'
|
3
|
+
require 'aspera/fasp/installation'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Aspera
|
7
|
+
module Fasp
|
8
|
+
class AgentTrsdk < AgentBase
|
9
|
+
DEFAULT_OPTIONS = {
|
10
|
+
address: '127.0.0.1',
|
11
|
+
port: 55_002
|
12
|
+
}
|
13
|
+
private_constant :DEFAULT_OPTIONS
|
14
|
+
|
15
|
+
# options come from transfer_info
|
16
|
+
def initialize(user_opts)
|
17
|
+
raise "expecting Hash (or nil), but have #{user_opts.class}" unless user_opts.nil? || user_opts.is_a?(Hash)
|
18
|
+
# set default options and override if specified
|
19
|
+
options=DEFAULT_OPTIONS.clone
|
20
|
+
if !user_opts.nil?
|
21
|
+
user_opts.each do |k,v|
|
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
|
24
|
+
end
|
25
|
+
end
|
26
|
+
Log.log.debug("options= #{options}")
|
27
|
+
super()
|
28
|
+
# load and create SDK stub
|
29
|
+
$LOAD_PATH.unshift(Installation.instance.sdk_ruby_folder)
|
30
|
+
require 'transfer_services_pb'
|
31
|
+
@transfer_client = Transfersdk::TransferService::Stub.new("#{options[:address]}:#{options[:port]}",:this_channel_is_insecure)
|
32
|
+
begin
|
33
|
+
get_info_response = @transfer_client.get_info(Transfersdk::InstanceInfoRequest.new)
|
34
|
+
Log.log.debug("daemon info: #{get_info_response}")
|
35
|
+
rescue GRPC::Unavailable
|
36
|
+
Log.log.warn('no daemon present, starting daemon...')
|
37
|
+
# location of daemon binary
|
38
|
+
bin_folder=File.realpath(File.join(Installation.instance.sdk_ruby_folder,'..'))
|
39
|
+
# config file and logs are created in same folder
|
40
|
+
conf_file = File.join(bin_folder,'sdk.conf')
|
41
|
+
log_base = File.join(bin_folder,'transferd')
|
42
|
+
# create a config file for daemon
|
43
|
+
config = {
|
44
|
+
address: options[:address],
|
45
|
+
port: options[:port],
|
46
|
+
fasp_runtime: {
|
47
|
+
use_embedded: false,
|
48
|
+
user_defined: {
|
49
|
+
bin: bin_folder,
|
50
|
+
etc: bin_folder
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
File.write(conf_file,config.to_json)
|
55
|
+
trd_pid = Process.spawn(Installation.instance.path(:transferd),'--config', conf_file, out: "#{log_base}.out", err: "#{log_base}.err")
|
56
|
+
Process.detach(trd_pid)
|
57
|
+
sleep(2.0)
|
58
|
+
retry
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def start_transfer(transfer_spec,_options=nil)
|
63
|
+
# create a transfer request
|
64
|
+
transfer_request = Transfersdk::TransferRequest.new(
|
65
|
+
transferType: Transfersdk::TransferType::FILE_REGULAR, # transfer type (file/stream)
|
66
|
+
config: Transfersdk::TransferConfig.new, # transfer configuration
|
67
|
+
transferSpec: transfer_spec.to_json) # transfer definition
|
68
|
+
# send start transfer request to the transfer manager daemon
|
69
|
+
start_transfer_response = @transfer_client.start_transfer(transfer_request)
|
70
|
+
Log.log.debug("start transfer response #{start_transfer_response}")
|
71
|
+
@transfer_id = start_transfer_response.transferId
|
72
|
+
Log.log.debug("transfer started with id #{@transfer_id}")
|
73
|
+
end
|
74
|
+
|
75
|
+
def wait_for_transfers_completion
|
76
|
+
started=false
|
77
|
+
# monitor transfer status
|
78
|
+
@transfer_client.monitor_transfers(Transfersdk::RegistrationRequest.new(transferId: [@transfer_id])) do |response|
|
79
|
+
Log.dump(:response, response.to_h)
|
80
|
+
#Log.log.debug("#{response.sessionInfo.preTransferBytes} #{response.transferInfo.bytesTransferred}")
|
81
|
+
case response.status
|
82
|
+
when :RUNNING
|
83
|
+
if !started && !response.sessionInfo.preTransferBytes.eql?(0)
|
84
|
+
notify_begin(@transfer_id,response.sessionInfo.preTransferBytes)
|
85
|
+
started=true
|
86
|
+
elsif started
|
87
|
+
notify_progress(@transfer_id,response.transferInfo.bytesTransferred)
|
88
|
+
end
|
89
|
+
when :FAILED, :COMPLETED, :CANCELED
|
90
|
+
notify_end(@transfer_id)
|
91
|
+
raise Fasp::Error, JSON.parse(response.message)['Description'] unless :COMPLETED.eql?(response.status)
|
92
|
+
break
|
93
|
+
when :QUEUED,:UNKNOWN_STATUS,:PAUSED,:ORPHANED
|
94
|
+
# ignore
|
95
|
+
else
|
96
|
+
Log.log.error("unknown status#{response.status}")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
# TODO return status
|
100
|
+
return []
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/aspera/fasp/error.rb
CHANGED
@@ -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
|
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
|
7
|
-
1 => { r: false
|
8
|
-
2 => { r: false
|
9
|
-
3 => { r: false
|
10
|
-
4 => { r: false
|
11
|
-
5 => { r: false
|
12
|
-
6 => { r: false
|
13
|
-
7 => { r: false
|
14
|
-
8 => { r: false
|
15
|
-
9 => { r: false
|
16
|
-
10 => { r: false
|
17
|
-
11 => { r: false
|
18
|
-
12 => { r: true
|
19
|
-
13 => { r: true
|
20
|
-
14 => { r: true
|
21
|
-
15 => { r: true
|
22
|
-
16 => { r: true
|
23
|
-
17 => { r: true
|
24
|
-
18 => { r: true
|
25
|
-
19 => { r: false
|
26
|
-
20 => { r: false
|
27
|
-
21 => { r: false
|
28
|
-
22 => { r: false
|
29
|
-
23 => { r: true
|
30
|
-
24 => { r: false
|
31
|
-
25 => { r: false
|
32
|
-
26 => { r: false
|
33
|
-
27 => { r: false
|
34
|
-
28 => { r: false
|
35
|
-
29 => { r: false
|
36
|
-
30 => { r: false
|
37
|
-
31 => { r: false
|
38
|
-
32 => { r: true
|
39
|
-
33 => { r: true
|
40
|
-
34 => { r: false
|
41
|
-
35 => { r: true
|
42
|
-
36 => { r: true
|
43
|
-
37 => { r: true
|
44
|
-
38 => { r: false
|
45
|
-
39 => { r: true
|
46
|
-
40 => { r: true
|
47
|
-
41 => { r: false
|
48
|
-
42 => { r: false
|
49
|
-
43 => { r: false
|
50
|
-
44 => { r: true
|
51
|
-
45 => { r: true
|
52
|
-
46 => { r: false
|
53
|
-
47 => { r: false
|
54
|
-
48 => { r: false
|
55
|
-
49 => { r: false
|
56
|
-
50 => { r: false
|
57
|
-
51 => { r: false
|
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
|