aspera-cli 4.24.0 → 4.24.2

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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +19 -1
  4. data/README.md +1264 -941
  5. data/bin/ascli +20 -1
  6. data/bin/asession +23 -27
  7. data/lib/aspera/agent/base.rb +10 -21
  8. data/lib/aspera/agent/connect.rb +2 -3
  9. data/lib/aspera/agent/desktop.rb +2 -2
  10. data/lib/aspera/agent/direct.rb +49 -32
  11. data/lib/aspera/agent/factory.rb +31 -0
  12. data/lib/aspera/api/aoc.rb +79 -49
  13. data/lib/aspera/api/faspex.rb +212 -0
  14. data/lib/aspera/api/node.rb +99 -84
  15. data/lib/aspera/ascp/installation.rb +22 -21
  16. data/lib/aspera/ascp/management.rb +119 -23
  17. data/lib/aspera/assert.rb +14 -8
  18. data/lib/aspera/cli/extended_value.rb +15 -15
  19. data/lib/aspera/cli/formatter.rb +7 -5
  20. data/lib/aspera/cli/hints.rb +8 -0
  21. data/lib/aspera/cli/info.rb +4 -4
  22. data/lib/aspera/cli/main.rb +56 -71
  23. data/lib/aspera/cli/manager.rb +7 -4
  24. data/lib/aspera/cli/plugins/alee.rb +2 -1
  25. data/lib/aspera/cli/plugins/aoc.rb +110 -186
  26. data/lib/aspera/cli/plugins/ats.rb +4 -4
  27. data/lib/aspera/cli/plugins/base.rb +335 -0
  28. data/lib/aspera/cli/plugins/basic_auth.rb +45 -0
  29. data/lib/aspera/cli/plugins/config.rb +263 -221
  30. data/lib/aspera/cli/plugins/console.rb +15 -15
  31. data/lib/aspera/cli/plugins/cos.rb +2 -2
  32. data/lib/aspera/cli/plugins/factory.rb +78 -0
  33. data/lib/aspera/cli/plugins/faspex.rb +17 -20
  34. data/lib/aspera/cli/plugins/faspex5.rb +79 -193
  35. data/lib/aspera/cli/plugins/faspio.rb +14 -13
  36. data/lib/aspera/cli/plugins/httpgw.rb +13 -12
  37. data/lib/aspera/cli/plugins/node.rb +34 -32
  38. data/lib/aspera/cli/plugins/oauth.rb +48 -0
  39. data/lib/aspera/cli/plugins/orchestrator.rb +15 -13
  40. data/lib/aspera/cli/plugins/preview.rb +4 -4
  41. data/lib/aspera/cli/plugins/server.rb +15 -13
  42. data/lib/aspera/cli/plugins/shares.rb +18 -15
  43. data/lib/aspera/cli/sync_actions.rb +1 -1
  44. data/lib/aspera/cli/transfer_agent.rb +24 -20
  45. data/lib/aspera/cli/transfer_progress.rb +6 -6
  46. data/lib/aspera/cli/version.rb +3 -3
  47. data/lib/aspera/cli/wizard.rb +74 -65
  48. data/lib/aspera/colors.rb +6 -0
  49. data/lib/aspera/command_line_builder.rb +45 -50
  50. data/lib/aspera/command_line_converter.rb +2 -1
  51. data/lib/aspera/coverage.rb +1 -1
  52. data/lib/aspera/data_repository.rb +1 -1
  53. data/lib/aspera/environment.rb +13 -9
  54. data/lib/aspera/faspex_gw.rb +6 -4
  55. data/lib/aspera/faspex_postproc.rb +1 -1
  56. data/lib/aspera/keychain/macos_security.rb +1 -1
  57. data/lib/aspera/log.rb +88 -37
  58. data/lib/aspera/nagios.rb +1 -1
  59. data/lib/aspera/oauth/base.rb +17 -10
  60. data/lib/aspera/oauth/factory.rb +8 -8
  61. data/lib/aspera/oauth/web.rb +2 -2
  62. data/lib/aspera/products/connect.rb +4 -3
  63. data/lib/aspera/products/desktop.rb +1 -4
  64. data/lib/aspera/products/other.rb +9 -1
  65. data/lib/aspera/products/transferd.rb +0 -1
  66. data/lib/aspera/rest.rb +126 -83
  67. data/lib/aspera/ssh.rb +3 -3
  68. data/lib/aspera/sync/args.schema.yaml +46 -3
  69. data/lib/aspera/sync/conf.schema.yaml +130 -94
  70. data/lib/aspera/sync/operations.rb +71 -74
  71. data/lib/aspera/temp_file_manager.rb +17 -5
  72. data/lib/aspera/transfer/error.rb +16 -7
  73. data/lib/aspera/transfer/parameters.rb +34 -20
  74. data/lib/aspera/transfer/resumer.rb +74 -0
  75. data/lib/aspera/transfer/spec.rb +4 -3
  76. data/lib/aspera/transfer/spec.schema.yaml +132 -51
  77. data/lib/aspera/transfer/spec_doc.rb +41 -35
  78. data/lib/aspera/uri_reader.rb +1 -1
  79. data/lib/aspera/web_auth.rb +6 -6
  80. data.tar.gz.sig +0 -0
  81. metadata +9 -7
  82. metadata.gz.sig +2 -2
  83. data/lib/aspera/cli/basic_auth_plugin.rb +0 -43
  84. data/lib/aspera/cli/plugin.rb +0 -333
  85. data/lib/aspera/cli/plugin_factory.rb +0 -81
  86. data/lib/aspera/resumer.rb +0 -77
  87. data/lib/aspera/transfer/error_info.rb +0 -91
data/lib/aspera/rest.rb CHANGED
@@ -54,80 +54,91 @@ module Aspera
54
54
  # rest call errors are raised as exception RestCallError
55
55
  # and error are analyzed in RestErrorAnalyzer
56
56
  class Rest
57
- # flag for array parameters prefixed with []
58
- ARRAY_PARAMS = '[]'
59
-
60
- private_constant :ARRAY_PARAMS
61
-
62
- # error message when entity not found (TODO: use specific exception)
57
+ # Error message when entity not found (TODO: use specific exception)
63
58
  ENTITY_NOT_FOUND = 'No such'
64
59
 
65
60
  MIME_JSON = 'application/json'
66
61
  MIME_WWW = 'application/x-www-form-urlencoded'
67
62
  MIME_TEXT = 'text/plain'
68
63
 
69
- # Content-Type that are JSON
70
- JSON_DECODE = [MIME_JSON, 'application/vnd.api+json', 'application/x-javascript'].freeze
71
-
72
- UNAVAILABLE_CODES = ['503']
64
+ # Special query parameter: max number of items for list command
65
+ MAX_ITEMS = 'max'
66
+ # Special query parameter: max number of pages for list command
67
+ MAX_PAGES = 'pmax'
73
68
 
74
69
  class << self
75
70
  # @return [String] Basic auth token
76
71
  def basic_authorization(user, pass); return "Basic #{Base64.strict_encode64("#{user}:#{pass}")}"; end
77
72
 
78
- # Build a parameter list prefixed with "[]"
79
- # @param values [Array] list of values
80
- def array_params(values)
81
- return [ARRAY_PARAMS].concat(values)
82
- end
83
-
84
- def array_params?(values)
85
- return values.first.eql?(ARRAY_PARAMS)
73
+ # Indicate that the given Hash query uses php style for array parameters
74
+ # a[]=1&a[]=2
75
+ def php_style(query)
76
+ Aspera.assert_type(query, Hash){'query'}
77
+ query[:x_array_php_style] = true
78
+ query
86
79
  end
87
80
 
88
81
  # Build URI from URL and parameters and check it is http or https
89
- # encode array [] parameters
90
- # @param query [Hash,Array]
91
- def build_uri(url, query = nil)
82
+ # Check iof php style is specified
83
+ # @param url [String] The URL without query.
84
+ # @param query [Hash,Array,String] The query.
85
+ def build_uri(url, query)
92
86
  uri = URI.parse(url)
93
- Aspera.assert(%w[http https].include?(uri.scheme)){"REST endpoint shall be http/s not #{uri.scheme}"}
87
+ Aspera.assert_values(uri.scheme, %w[http https]){'URI scheme'}
94
88
  return uri if query.nil? || query.respond_to?(:empty?) && query.empty?
95
89
  Log.dump(:query, query)
96
- query_array = []
97
- case query
98
- when Hash
99
- query.each do |k, v|
100
- case v
101
- when Array
102
- # support array for query parameter, there is no standard. Either p[]=1&p[]=2, or p=1&p=2
103
- suffix = array_params?(v) ? v.shift : ''
104
- v.each do |e|
105
- query_array.push(["#{k}#{suffix}", e])
106
- end
107
- else
108
- query_array.push([k, v])
90
+ uri.query =
91
+ case query
92
+ when String
93
+ query
94
+ when Hash
95
+ URI.encode_www_form(h_to_query_array(query))
96
+ when Array
97
+ Aspera.assert(query.all?{ |i| i.is_a?(Array) && i.length.eql?(2)}){'Query must be array of arrays of 2 elements'}
98
+ URI.encode_www_form(query)
99
+ else Aspera.error_unexpected_value(query.class){'query type'}
100
+ end.gsub('%5B%5D=', '[]=')
101
+ # [] is allowed in url parameters
102
+ uri
103
+ end
104
+
105
+ # @param query [Hash] HTTP query as hash
106
+ def h_to_query_array(query)
107
+ Aspera.assert_type(query, Hash)
108
+ # Support array for query parameter, there is no standard.
109
+ # Either p[]=1&p[]=2, or p=1&p=2
110
+ suffix = query.delete(:x_array_php_style) ? '[]' : nil
111
+ query.each_with_object([]) do |(k, v), query_array|
112
+ case v
113
+ when Array
114
+ v.each do |e|
115
+ query_array.push(["#{k}#{suffix}", e])
109
116
  end
117
+ else
118
+ query_array.push([k, v])
110
119
  end
111
- when Array
112
- Aspera.assert(query.all?{ |i| i.is_a?(Array) && i.length.eql?(2)}){'Query must be array of arrays or 2 elements'}
113
- query_array = query
114
- else
115
- raise "Query must be Hash or Array, not #{query.class}"
116
120
  end
117
- # [] is allowed in url parameters
118
- uri.query = URI.encode_www_form(query_array).gsub('%5B%5D=', '[]=')
119
- return uri
120
121
  end
121
122
 
122
123
  # Decode query string as Hash
123
- # Does not support arrays in query string, no standard, e.g. PHP's way is p[]=1&p[]=2
124
+ # if parameter is only once, then it's a scalar
125
+ # if a parameter is several, then it's array
126
+ # if parameter has [] then it's an array, and [] is removed
127
+ # Support arrays in query string, e.g. PHP's way is p[]=1&p[]=2
124
128
  # @param query [String] query string as in URI.query
125
129
  # @return [Hash] decoded query
126
130
  def query_to_h(query)
127
- URI.decode_www_form(query).each_with_object({}) do |pair, h|
128
- key = pair.first
129
- raise "Array not supported in query string: #{key}" if key.include?('[]') || h.key?(key)
130
- h[key] = pair.last
131
+ URI.decode_www_form(query).each_with_object({}) do |(key, value), h|
132
+ if key.end_with?('[]')
133
+ key = key[..-3]
134
+ h[key] = [] unless h.key?(key)
135
+ end
136
+ if h.key?(key)
137
+ h[key] = [h[key]] if !h[key].is_a?(Array)
138
+ h[key].push(value)
139
+ else
140
+ h[key] = value
141
+ end
131
142
  end
132
143
  end
133
144
 
@@ -135,13 +146,14 @@ module Aspera
135
146
  # @param base_url [String] base url of HTTP/S session
136
147
  # @return [Net::HTTP] a started HTTP session
137
148
  def start_http_session(base_url)
138
- uri = build_uri(base_url)
139
- # this honors http_proxy env var
149
+ uri = URI.parse(base_url)
150
+ Aspera.assert_values(uri.scheme, %w[http https]){'URI scheme'}
151
+ # This honors http_proxy env var
140
152
  http_session = Net::HTTP.new(uri.host, uri.port)
141
153
  http_session.use_ssl = uri.scheme.eql?('https')
142
- # set http options in callback, such as timeout and cert. verification
154
+ # Set http options in callback, such as timeout and cert. verification
143
155
  RestParameters.instance.session_cb&.call(http_session)
144
- # manually start session for keep alive (if supported by server, else, session is closed every time)
156
+ # Manually start session for keep alive (if supported by server, else, session is closed every time)
145
157
  http_session.start
146
158
  return http_session
147
159
  end
@@ -174,19 +186,31 @@ module Aspera
174
186
  return result
175
187
  end
176
188
 
177
- # Parse a header string as returned by HTTP
178
- # @param header [String] header string, e.g. "application/json; charset=utf-8"
179
- # @return [Hash] parsed header with type and parameters
180
- # {type: 'application/json', parameters: {charset: 'utf-8'}}
189
+ # Parses an HTTP Content-Type header string into its media type and parameters
190
+ # according to RFC 9110 and RFC 6838.
191
+ # TODO: use gem: content_type
192
+ #
193
+ # @param header [String] The Content-Type header string, e.g., "application/json; charset=utf-8"
194
+ # @return [Hash] A hash with :type and :parameters keys.
195
+ # Example:
196
+ # {
197
+ # type: "application/json",
198
+ # parameters: {
199
+ # charset: "utf-8",
200
+ # version: "1.0"
201
+ # }
202
+ # }
181
203
  def parse_header(header)
182
- type, *params = header.split(/;\s*/)
183
- parameters = params.map do |param|
184
- one = param.split(/=\s*/)
185
- one[0] = one[0].to_sym
186
- one[1] = one[1].gsub(/\A"|"\z/, '')
187
- one
204
+ parts = header.split(';').map(&:strip)
205
+ media_type = parts.shift.downcase
206
+ parameters = parts.filter_map do |param|
207
+ key, value = param.split('=', 2)
208
+ next unless key && value
209
+ key = key.strip.downcase.to_sym
210
+ value = value.strip.gsub(/\A"|"\z/, '')
211
+ [key, value]
188
212
  end.to_h
189
- {type: type.downcase, parameters: parameters}
213
+ {type: media_type, parameters: parameters}
190
214
  end
191
215
  end
192
216
 
@@ -200,8 +224,13 @@ module Aspera
200
224
 
201
225
  public
202
226
 
203
- attr_reader :base_url
227
+ # All original constructor parameters
204
228
  attr_reader :auth_params
229
+
230
+ # The root URL for the API
231
+ attr_reader :base_url
232
+
233
+ # Base common headers of API
205
234
  attr_reader :headers
206
235
 
207
236
  # @return creation parameters
@@ -278,7 +307,7 @@ module Aspera
278
307
  # @param body [Hash, String] body parameters
279
308
  # @param headers [Hash] additional headers (override Content-Type)
280
309
  # @param save_to_file (filepath)
281
- # @param return_error (bool)
310
+ # @param exception (bool) true, error raise exception
282
311
  def call(
283
312
  operation:,
284
313
  subpath: nil,
@@ -287,12 +316,14 @@ module Aspera
287
316
  body: nil,
288
317
  headers: nil,
289
318
  save_to_file: nil,
290
- return_error: false
319
+ exception: true
291
320
  )
292
321
  subpath = subpath.to_s if subpath.is_a?(Symbol)
293
322
  subpath = '' if subpath.nil?
294
323
  Log.log.debug{"call #{operation} [#{subpath}]".red.bold.bg_green}
295
- Log.dump(:body, body)
324
+ Log.dump(:body, body, level: :trace1)
325
+ Log.dump(:query, query, level: :trace1)
326
+ Log.dump(:headers, headers, level: :trace1)
296
327
  Aspera.assert_type(subpath, String)
297
328
  if headers.nil?
298
329
  headers = @headers.clone
@@ -462,12 +493,12 @@ module Aspera
462
493
  body: body,
463
494
  content_type: content_type,
464
495
  save_to_file: save_to_file,
465
- return_error: return_error,
496
+ exception: exception,
466
497
  headers: headers
467
498
  )
468
499
  end
469
500
  # raise exception if could not retry and not return error in result
470
- raise e unless return_error
501
+ raise e if exception
471
502
  end
472
503
  Log.log.debug{"result=http:#{result[:http]}, data:#{result[:data].class}"}
473
504
  return result
@@ -478,31 +509,36 @@ module Aspera
478
509
  # If specific elements are needed, then use the full `call` method
479
510
  #
480
511
 
481
- def create(subpath, params)
482
- return call(operation: 'POST', subpath: subpath, headers: {'Accept' => MIME_JSON}, body: params, content_type: MIME_JSON)[:data]
512
+ # Create: `POST`
513
+ def create(subpath, params, **kwargs)
514
+ return call(operation: 'POST', subpath: subpath, headers: {'Accept' => MIME_JSON}, body: params, content_type: MIME_JSON, **kwargs)[:data]
483
515
  end
484
516
 
485
- def read(subpath, query = nil)
486
- return call(operation: 'GET', subpath: subpath, headers: {'Accept' => MIME_JSON}, query: query)[:data]
517
+ # Read: `GET`
518
+ def read(subpath, query = nil, **kwargs)
519
+ return call(operation: 'GET', subpath: subpath, headers: {'Accept' => MIME_JSON}, query: query, **kwargs)[:data]
487
520
  end
488
521
 
489
- def update(subpath, params)
490
- return call(operation: 'PUT', subpath: subpath, headers: {'Accept' => MIME_JSON}, body: params, content_type: MIME_JSON)[:data]
522
+ # Update: `PUT`
523
+ def update(subpath, params, **kwargs)
524
+ return call(operation: 'PUT', subpath: subpath, headers: {'Accept' => MIME_JSON}, body: params, content_type: MIME_JSON, **kwargs)[:data]
491
525
  end
492
526
 
493
- def delete(subpath, params = nil)
494
- return call(operation: 'DELETE', subpath: subpath, headers: {'Accept' => MIME_JSON}, query: params)[:data]
527
+ # Delete: `DELETE`
528
+ def delete(subpath, params = nil, **kwargs)
529
+ return call(operation: 'DELETE', subpath: subpath, headers: {'Accept' => MIME_JSON}, query: params, **kwargs)[:data]
495
530
  end
496
531
 
497
- def cancel(subpath)
498
- return call(operation: 'CANCEL', subpath: subpath, headers: {'Accept' => MIME_JSON})[:data]
532
+ # Cancel: `CANCEL`
533
+ def cancel(subpath, **kwargs)
534
+ return call(operation: 'CANCEL', subpath: subpath, headers: {'Accept' => MIME_JSON}, **kwargs)[:data]
499
535
  end
500
536
 
501
537
  # Query entity by general search (read with parameter `q`)
502
538
  # TODO: not generic enough ? move somewhere ? inheritance ?
503
- # @param subpath path of entity in API
504
- # @param search_name name of searched entity
505
- # @param query additional search query parameters
539
+ # @param subpath [String] Path of entity in API
540
+ # @param search_name [String] Name of searched entity
541
+ # @param query [Hash] Additional search query parameters
506
542
  # @returns [Hash] A single entity matching the search, or an exception if not found or multiple found
507
543
  def lookup_by_name(subpath, search_name, query: nil)
508
544
  query = {} if query.nil?
@@ -520,10 +556,17 @@ module Aspera
520
556
  name_matches = matching_items.select{ |i| i['name'].casecmp?(search_name)}
521
557
  case name_matches.length
522
558
  when 1 then return name_matches.first
523
- when 0 then raise %Q(#{subpath}: multiple case insensitive partial match for: "#{search_name}": #{matching_items.map{ |i| i['name']}} but no case insensitive full match. Please be more specific or give exact name.)
559
+ when 0 then raise %Q(#{subpath}: Multiple case insensitive partial match for: "#{search_name}": #{matching_items.map{ |i| i['name']}} but no case insensitive full match. Please be more specific or give exact name.)
524
560
  else raise "Two entities cannot have the same case insensitive name: #{name_matches.map{ |i| i['name']}}"
525
561
  end
526
562
  end
527
563
  end
564
+
565
+ # Content-Type that are JSON
566
+ JSON_DECODE = [MIME_JSON, 'application/vnd.api+json', 'application/x-javascript'].freeze
567
+
568
+ UNAVAILABLE_CODES = ['503']
569
+
570
+ private_constant :JSON_DECODE, :UNAVAILABLE_CODES
528
571
  end
529
572
  end
data/lib/aspera/ssh.rb CHANGED
@@ -17,7 +17,7 @@ module Aspera
17
17
  $VERBOSE = nil
18
18
  Net::SSH::Authentication::Session.class_eval do
19
19
  define_method(:default_keys) do
20
- %w[~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa].freeze
20
+ %w[.ssh .ssh2].product(%w[rsa dsa ecdsa]).map{"~/#{_1}/id_#{_2}"}.freeze
21
21
  end
22
22
  private(:default_keys)
23
23
  end rescue nil
@@ -81,6 +81,6 @@ module Aspera
81
81
  end
82
82
  end
83
83
 
84
- # HACK: deactivate ed25519 and ecdsa private keys from SSH identities, as it usually causes problems
85
- Aspera::Ssh.disable_ed25519_keys if ENV.fetch('ASCLI_ENABLE_ED25519', 'false').eql?('false')
84
+ # Deactivate ed25519 and ecdsa private keys from SSH identities, as it usually causes problems
85
+ Aspera::Ssh.disable_ed25519_keys if Gem::Specification.find_all_by_name('ed25519').none?
86
86
  Aspera::Ssh.disable_ecd_sha2_algorithms if defined?(JRUBY_VERSION) && ENV.fetch('ASCLI_ENABLE_ECDSHA2', 'false').eql?('false')
@@ -1,22 +1,30 @@
1
1
  $schema: https://json-schema.org/draft/2020-12/schema
2
2
  $id: https://github.com/IBM/aspera-cli/tree/main/lib/aspera/transfer/sync_instance.schema.yaml
3
+ title: Aspera Sync job description (args)
4
+ description: Instance (global) and Session (per-sync) parameters for async, specific to `ascli`.
3
5
  $comment: >-
4
- `x-` fields documented in `command_line_builder.rb`
5
6
  This spec is specific to `ascli`.
6
7
  The native async `conf` format is now preferred.
7
- title: SyncInstanceSpec
8
- description: Instance (global) and Session (per-sync) parameters for async.
8
+ `x-` fields are documented in `command_line_builder.rb`
9
9
  type: object
10
10
  properties:
11
11
  alt_logdir:
12
12
  type: string
13
+ x-cli-option: true
13
14
  watchd:
14
15
  type: string
16
+ x-cli-option: true
15
17
  apply_local_docroot:
18
+ type: boolean
19
+ x-cli-option: true
16
20
  x-cli-switch: true
17
21
  quiet:
22
+ type: boolean
23
+ x-cli-option: true
18
24
  x-cli-switch: true
19
25
  ws_connect:
26
+ type: boolean
27
+ x-cli-option: true
20
28
  x-cli-switch: true
21
29
  sessions:
22
30
  type: array
@@ -26,27 +34,36 @@ properties:
26
34
  properties:
27
35
  name:
28
36
  type: string
37
+ x-cli-option: true
29
38
  local_dir:
30
39
  type: string
40
+ x-cli-option: true
31
41
  remote_dir:
32
42
  type: string
43
+ x-cli-option: true
33
44
  local_db_dir:
34
45
  type: string
46
+ x-cli-option: true
35
47
  remote_db_dir:
36
48
  type: string
49
+ x-cli-option: true
37
50
  host:
38
51
  type: string
52
+ x-cli-option: true
39
53
  x-ts-name: remote_host
40
54
  user:
41
55
  type: string
56
+ x-cli-option: true
42
57
  x-ts-name: remote_user
43
58
  private_key_paths:
44
59
  type: array
45
60
  x-cli-option: "--private-key-path"
46
61
  direction:
47
62
  type: string
63
+ x-cli-option: true
48
64
  checksum:
49
65
  type: string
66
+ x-cli-option: true
50
67
  tags:
51
68
  type: object
52
69
  x-cli-option: "--tags64"
@@ -54,49 +71,75 @@ properties:
54
71
  x-ts-name: tags
55
72
  tcp_port:
56
73
  type: integer
74
+ x-cli-option: true
57
75
  x-ts-name: ssh_port
58
76
  rate_policy:
59
77
  type: string
78
+ x-cli-option: true
60
79
  target_rate:
61
80
  type: string
81
+ x-cli-option: true
62
82
  cooloff:
63
83
  type: integer
84
+ x-cli-option: true
64
85
  pending_max:
65
86
  type: integer
87
+ x-cli-option: true
66
88
  scan_intensity:
67
89
  type: string
90
+ x-cli-option: true
68
91
  cipher:
69
92
  type: string
93
+ x-cli-option: true
70
94
  x-cli-convert: remove_hyphen
71
95
  x-ts-name: cipher
72
96
  transfer_threads:
73
97
  type: integer
98
+ x-cli-option: true
74
99
  preserve_time:
100
+ type: boolean
101
+ x-cli-option: true
75
102
  x-cli-switch: true
76
103
  x-ts-name: preserve_times
77
104
  preserve_access_time:
105
+ type: boolean
106
+ x-cli-option: true
78
107
  x-cli-switch: true
79
108
  preserve_modification_time:
109
+ type: boolean
110
+ x-cli-option: true
80
111
  x-cli-switch: true
81
112
  preserve_uid:
113
+ type: boolean
114
+ x-cli-option: true
82
115
  x-cli-switch: true
83
116
  x-ts-name: preserve_file_owner_uid
84
117
  preserve_gid:
118
+ type: boolean
119
+ x-cli-option: true
85
120
  x-cli-switch: true
86
121
  x-ts-name: preserve_file_owner_gid
87
122
  create_dir:
123
+ type: boolean
124
+ x-cli-option: true
88
125
  x-cli-switch: true
89
126
  x-ts-name: create_dir
90
127
  reset:
128
+ type: boolean
129
+ x-cli-option: true
91
130
  x-cli-switch: true
92
131
  remote_password:
132
+ type: string
93
133
  x-cli-envvar: ASPERA_SCP_PASS
94
134
  x-ts-name: remote_password
95
135
  cookie:
136
+ type: string
96
137
  x-cli-envvar: ASPERA_SCP_COOKIE
97
138
  x-ts-name: cookie
98
139
  token:
140
+ type: string
99
141
  x-cli-envvar: ASPERA_SCP_TOKEN
100
142
  x-ts-name: token
101
143
  license:
144
+ type: string
102
145
  x-cli-envvar: ASPERA_SCP_LICENSE