aspera-cli 4.21.2 → 4.22.0

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 (97) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/BUGS.md +1 -1
  4. data/CHANGELOG.md +34 -16
  5. data/CONTRIBUTING.md +6 -10
  6. data/README.md +805 -574
  7. data/examples/get_proto_file.rb +1 -1
  8. data/lib/aspera/agent/base.rb +9 -5
  9. data/lib/aspera/agent/connect.rb +30 -28
  10. data/lib/aspera/agent/desktop.rb +29 -25
  11. data/lib/aspera/agent/direct.rb +137 -125
  12. data/lib/aspera/agent/httpgw.rb +22 -26
  13. data/lib/aspera/agent/node.rb +14 -11
  14. data/lib/aspera/agent/transferd.rb +6 -2
  15. data/lib/aspera/api/aoc.rb +6 -6
  16. data/lib/aspera/api/cos_node.rb +1 -1
  17. data/lib/aspera/api/httpgw.rb +7 -3
  18. data/lib/aspera/api/node.rb +6 -4
  19. data/lib/aspera/ascmd.rb +3 -3
  20. data/lib/aspera/ascp/installation.rb +15 -16
  21. data/lib/aspera/ascp/management.rb +1 -1
  22. data/lib/aspera/assert.rb +11 -2
  23. data/lib/aspera/cli/error.rb +2 -2
  24. data/lib/aspera/cli/extended_value.rb +38 -19
  25. data/lib/aspera/cli/formatter.rb +48 -48
  26. data/lib/aspera/cli/hints.rb +1 -1
  27. data/lib/aspera/cli/main.rb +190 -168
  28. data/lib/aspera/cli/manager.rb +15 -15
  29. data/lib/aspera/cli/plugin.rb +23 -20
  30. data/lib/aspera/cli/plugin_factory.rb +1 -1
  31. data/lib/aspera/cli/plugins/alee.rb +1 -1
  32. data/lib/aspera/cli/plugins/aoc.rb +144 -107
  33. data/lib/aspera/cli/plugins/ats.rb +19 -17
  34. data/lib/aspera/cli/plugins/config.rb +67 -83
  35. data/lib/aspera/cli/plugins/console.rb +5 -3
  36. data/lib/aspera/cli/plugins/faspex.rb +39 -35
  37. data/lib/aspera/cli/plugins/faspex5.rb +104 -80
  38. data/lib/aspera/cli/plugins/faspio.rb +13 -1
  39. data/lib/aspera/cli/plugins/httpgw.rb +13 -1
  40. data/lib/aspera/cli/plugins/node.rb +306 -179
  41. data/lib/aspera/cli/plugins/orchestrator.rb +34 -40
  42. data/lib/aspera/cli/plugins/preview.rb +3 -3
  43. data/lib/aspera/cli/plugins/server.rb +6 -6
  44. data/lib/aspera/cli/plugins/shares.rb +5 -5
  45. data/lib/aspera/cli/sync_actions.rb +19 -18
  46. data/lib/aspera/cli/transfer_agent.rb +5 -5
  47. data/lib/aspera/cli/transfer_progress.rb +2 -2
  48. data/lib/aspera/cli/version.rb +1 -1
  49. data/lib/aspera/command_line_builder.rb +116 -95
  50. data/lib/aspera/coverage.rb +4 -3
  51. data/lib/aspera/environment.rb +6 -6
  52. data/lib/aspera/faspex_gw.rb +14 -14
  53. data/lib/aspera/faspex_postproc.rb +7 -6
  54. data/lib/aspera/hash_ext.rb +2 -2
  55. data/lib/aspera/json_rpc.rb +1 -1
  56. data/lib/aspera/keychain/encrypted_hash.rb +47 -34
  57. data/lib/aspera/keychain/factory.rb +41 -0
  58. data/lib/aspera/keychain/hashicorp_vault.rb +71 -0
  59. data/lib/aspera/keychain/macos_security.rb +19 -11
  60. data/lib/aspera/log.rb +28 -34
  61. data/lib/aspera/nagios.rb +6 -6
  62. data/lib/aspera/node_simulator.rb +8 -8
  63. data/lib/aspera/oauth/base.rb +8 -6
  64. data/lib/aspera/oauth/factory.rb +5 -6
  65. data/lib/aspera/oauth/url_json.rb +6 -6
  66. data/lib/aspera/persistency_action_once.rb +6 -4
  67. data/lib/aspera/persistency_folder.rb +2 -2
  68. data/lib/aspera/preview/generator.rb +1 -1
  69. data/lib/aspera/preview/options.rb +16 -16
  70. data/lib/aspera/preview/terminal.rb +3 -3
  71. data/lib/aspera/preview/utils.rb +11 -13
  72. data/lib/aspera/products/connect.rb +1 -1
  73. data/lib/aspera/products/desktop.rb +1 -1
  74. data/lib/aspera/products/transferd.rb +1 -1
  75. data/lib/aspera/proxy_auto_config.rb +2 -2
  76. data/lib/aspera/rest.rb +52 -43
  77. data/lib/aspera/rest_errors_aspera.rb +1 -1
  78. data/lib/aspera/secret_hider.rb +5 -5
  79. data/lib/aspera/ssh.rb +4 -4
  80. data/lib/aspera/transfer/convert.rb +29 -0
  81. data/lib/aspera/transfer/error_info.rb +66 -66
  82. data/lib/aspera/transfer/parameters.rb +13 -68
  83. data/lib/aspera/transfer/spec.rb +5 -6
  84. data/lib/aspera/transfer/spec.schema.yaml +753 -0
  85. data/lib/aspera/transfer/spec_doc.rb +62 -0
  86. data/lib/aspera/transfer/sync.rb +23 -72
  87. data/lib/aspera/transfer/sync_instance.schema.yaml +13 -0
  88. data/lib/aspera/transfer/sync_session.schema.yaml +79 -0
  89. data/lib/aspera/transfer/uri.rb +6 -6
  90. data/lib/aspera/uri_reader.rb +1 -1
  91. data/lib/aspera/web_auth.rb +1 -1
  92. data/lib/aspera/web_server_simple.rb +53 -44
  93. data.tar.gz.sig +1 -2
  94. metadata +37 -4
  95. metadata.gz.sig +0 -0
  96. data/examples/build_package.sh +0 -28
  97. data/lib/aspera/transfer/spec.yaml +0 -718
@@ -12,15 +12,13 @@ module Aspera
12
12
  # operations with id
13
13
  INSTANCE_OPS = %i[modify delete show].freeze
14
14
  # all standard operations
15
- ALL_OPS = [GLOBAL_OPS, INSTANCE_OPS].flatten.freeze
15
+ ALL_OPS = (GLOBAL_OPS + INSTANCE_OPS).freeze
16
16
  # special query parameter: max number of items for list command
17
17
  MAX_ITEMS = 'max'
18
18
  # special query parameter: max number of pages for list command
19
19
  MAX_PAGES = 'pmax'
20
20
  # special identifier format: look for this name to find where supported
21
21
  REGEX_LOOKUP_ID_BY_FIELD = /^%([^:]+):(.*)$/.freeze
22
- # instance variables, also constructor parameters
23
- INIT_PARAMS = %i[options transfer config formatter persistency only_manual].freeze
24
22
 
25
23
  class << self
26
24
  def declare_generic_options(options)
@@ -31,18 +29,17 @@ module Aspera
31
29
  end
32
30
  end
33
31
 
34
- attr_accessor(*INIT_PARAMS)
32
+ def options; @broker.options; end
33
+ def transfer; @broker.transfer; end
34
+ def config; @broker.config; end
35
+ def formatter; @broker.formatter; end
36
+ def persistency; @broker.persistency; end
35
37
 
36
- def initialize(options:, transfer:, config:, formatter:, persistency:, only_manual:, man_header: true)
38
+ def initialize(broker:, man_header: true)
37
39
  # check presence in descendant of mandatory method and constant
38
40
  Aspera.assert(respond_to?(:execute_action)){"Missing method 'execute_action' in #{self.class}"}
39
41
  Aspera.assert(self.class.constants.include?(:ACTIONS)){"Missing constant 'ACTIONS' in #{self.class}"}
40
- @options = options
41
- @transfer = transfer
42
- @config = config
43
- @formatter = formatter
44
- @persistency = persistency
45
- @only_manual = only_manual
42
+ @broker = broker
46
43
  add_manual_header if man_header
47
44
  end
48
45
 
@@ -56,7 +53,7 @@ module Aspera
56
53
 
57
54
  # @return a hash of instance variables
58
55
  def init_params
59
- INIT_PARAMS.map{|p| [p, instance_variable_get("@#{p}".to_sym)]}.to_h
56
+ return {broker: @broker}
60
57
  end
61
58
 
62
59
  # must be called AFTER the instance action, ... folder browse <call instance_identifier>
@@ -121,10 +118,10 @@ module Aspera
121
118
  end
122
119
  display_fields = [id_result, 'status']
123
120
  if is_bulk
124
- return {type: :object_list, data: result_list, fields: display_fields}
121
+ return Main.result_object_list(result_list, fields: display_fields)
125
122
  else
126
123
  display_fields = fields unless fields.eql?(:default)
127
- return {type: :single_object, data: result_list.first, fields: display_fields}
124
+ return Main.result_single_object(result_list.first, fields: display_fields)
128
125
  end
129
126
  end
130
127
 
@@ -164,7 +161,13 @@ module Aspera
164
161
  if !delete_style.nil?
165
162
  one_res_id = [one_res_id] unless one_res_id.is_a?(Array)
166
163
  Aspera.assert_type(one_res_id, Array, exception_class: Cli::BadArgument)
167
- rest_api.call(operation: 'DELETE', subpath: res_class_path, headers: {'Accept' => 'application/json'}, body: {delete_style => one_res_id}, body_type: :json)
164
+ rest_api.call(
165
+ operation: 'DELETE',
166
+ subpath: res_class_path,
167
+ content_type: Rest::MIME_JSON,
168
+ body: {delete_style => one_res_id},
169
+ headers: {'Accept' => Rest::MIME_JSON}
170
+ )
168
171
  return Main.result_status('deleted')
169
172
  end
170
173
  return do_bulk_operation(command: command, descr: 'identifier', values: one_res_id) do |one_id|
@@ -172,9 +175,9 @@ module Aspera
172
175
  {'id' => one_id}
173
176
  end
174
177
  when :show
175
- return {type: :single_object, data: rest_api.read(one_res_path), fields: display_fields}
178
+ return Main.result_single_object(rest_api.read(one_res_path), fields: display_fields)
176
179
  when :list
177
- resp = rest_api.call(operation: 'GET', subpath: res_class_path, headers: {'Accept' => 'application/json'}, query: query_read_delete)
180
+ resp = rest_api.call(operation: 'GET', subpath: res_class_path, headers: {'Accept' => Rest::MIME_JSON}, query: query_read_delete)
178
181
  return Main.result_empty if resp[:http].code == '204'
179
182
  data = resp[:data]
180
183
  # TODO: not generic : which application is this for ?
@@ -190,10 +193,10 @@ module Aspera
190
193
  end
191
194
  case data
192
195
  when Hash
193
- return {type: :single_object, data: data, fields: display_fields}
196
+ return Main.result_single_object(data, fields: display_fields)
194
197
  when Array
195
- return {type: :object_list, data: data, fields: display_fields} if data.empty? || data.first.is_a?(Hash)
196
- return {type: :value_list, data: data, name: 'id'}
198
+ return Main.result_object_list(data, fields: display_fields) if data.empty? || data.first.is_a?(Hash)
199
+ return Main.result_value_list(data, name: 'id')
197
200
  else
198
201
  raise "An error occurred: unexpected result type for list: #{data.class}"
199
202
  end
@@ -40,7 +40,7 @@ module Aspera
40
40
  next unless File.directory?(folder)
41
41
  # TODO: add gem root to load path ? and require short folder ?
42
42
  # $LOAD_PATH.push(folder) if i[:add_path]
43
- Dir.entries(folder).select{|file|file.end_with?(RUBY_FILE_EXT)}.each do |source|
43
+ Dir.entries(folder).select{ |file| file.end_with?(RUBY_FILE_EXT)}.each do |source|
44
44
  add_plugin_info(File.join(folder, source))
45
45
  end
46
46
  end
@@ -27,7 +27,7 @@ module Aspera
27
27
  entitlement_id = options.get_option(:username, mandatory: true)
28
28
  customer_id = options.get_option(:password, mandatory: true)
29
29
  api_metering = Api::Alee.new(entitlement_id, customer_id)
30
- return {type: :single_object, data: api_metering.read('entitlement')}
30
+ return Main.result_single_object(api_metering.read('entitlement'))
31
31
  end
32
32
  end
33
33
  end