aspera-cli 4.9.0 → 4.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/BUGS.md +20 -0
  4. data/CHANGELOG.md +509 -0
  5. data/CONTRIBUTING.md +118 -0
  6. data/README.md +1241 -916
  7. data/bin/ascli +4 -4
  8. data/bin/asession +11 -11
  9. data/docs/test_env.conf +32 -21
  10. data/examples/aoc.rb +4 -4
  11. data/examples/dascli +16 -9
  12. data/examples/faspex4.rb +8 -8
  13. data/examples/node.rb +12 -12
  14. data/examples/server.rb +10 -10
  15. data/lib/aspera/aoc.rb +273 -266
  16. data/lib/aspera/ascmd.rb +56 -54
  17. data/lib/aspera/ats_api.rb +4 -4
  18. data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
  19. data/lib/aspera/cli/extended_value.rb +5 -5
  20. data/lib/aspera/cli/formater.rb +64 -64
  21. data/lib/aspera/cli/info.rb +2 -2
  22. data/lib/aspera/cli/listener/line_dump.rb +1 -1
  23. data/lib/aspera/cli/listener/logger.rb +1 -1
  24. data/lib/aspera/cli/listener/progress.rb +5 -6
  25. data/lib/aspera/cli/listener/progress_multi.rb +14 -19
  26. data/lib/aspera/cli/main.rb +66 -67
  27. data/lib/aspera/cli/manager.rb +112 -110
  28. data/lib/aspera/cli/plugin.rb +57 -36
  29. data/lib/aspera/cli/plugins/alee.rb +4 -4
  30. data/lib/aspera/cli/plugins/aoc.rb +309 -670
  31. data/lib/aspera/cli/plugins/ats.rb +44 -46
  32. data/lib/aspera/cli/plugins/bss.rb +10 -10
  33. data/lib/aspera/cli/plugins/config.rb +497 -378
  34. data/lib/aspera/cli/plugins/console.rb +12 -12
  35. data/lib/aspera/cli/plugins/cos.rb +18 -20
  36. data/lib/aspera/cli/plugins/faspex.rb +112 -114
  37. data/lib/aspera/cli/plugins/faspex5.rb +71 -46
  38. data/lib/aspera/cli/plugins/node.rb +379 -283
  39. data/lib/aspera/cli/plugins/orchestrator.rb +46 -46
  40. data/lib/aspera/cli/plugins/preview.rb +122 -114
  41. data/lib/aspera/cli/plugins/server.rb +137 -83
  42. data/lib/aspera/cli/plugins/shares.rb +30 -29
  43. data/lib/aspera/cli/plugins/sync.rb +13 -33
  44. data/lib/aspera/cli/transfer_agent.rb +60 -59
  45. data/lib/aspera/cli/version.rb +1 -1
  46. data/lib/aspera/colors.rb +3 -3
  47. data/lib/aspera/command_line_builder.rb +27 -27
  48. data/lib/aspera/cos_node.rb +22 -20
  49. data/lib/aspera/data_repository.rb +1 -1
  50. data/lib/aspera/environment.rb +35 -15
  51. data/lib/aspera/fasp/agent_base.rb +15 -15
  52. data/lib/aspera/fasp/agent_connect.rb +23 -21
  53. data/lib/aspera/fasp/agent_direct.rb +66 -64
  54. data/lib/aspera/fasp/agent_httpgw.rb +141 -78
  55. data/lib/aspera/fasp/agent_node.rb +23 -21
  56. data/lib/aspera/fasp/agent_trsdk.rb +20 -20
  57. data/lib/aspera/fasp/error.rb +3 -2
  58. data/lib/aspera/fasp/error_info.rb +11 -8
  59. data/lib/aspera/fasp/installation.rb +79 -79
  60. data/lib/aspera/fasp/listener.rb +1 -1
  61. data/lib/aspera/fasp/parameters.rb +86 -71
  62. data/lib/aspera/fasp/parameters.yaml +7 -4
  63. data/lib/aspera/fasp/resume_policy.rb +8 -8
  64. data/lib/aspera/fasp/transfer_spec.rb +35 -2
  65. data/lib/aspera/fasp/uri.rb +7 -7
  66. data/lib/aspera/faspex_gw.rb +7 -5
  67. data/lib/aspera/hash_ext.rb +3 -3
  68. data/lib/aspera/id_generator.rb +5 -5
  69. data/lib/aspera/keychain/encrypted_hash.rb +38 -105
  70. data/lib/aspera/keychain/macos_security.rb +128 -57
  71. data/lib/aspera/log.rb +7 -7
  72. data/lib/aspera/nagios.rb +19 -18
  73. data/lib/aspera/node.rb +209 -35
  74. data/lib/aspera/oauth.rb +37 -36
  75. data/lib/aspera/open_application.rb +19 -11
  76. data/lib/aspera/persistency_action_once.rb +4 -4
  77. data/lib/aspera/persistency_folder.rb +16 -15
  78. data/lib/aspera/preview/file_types.rb +8 -8
  79. data/lib/aspera/preview/generator.rb +67 -67
  80. data/lib/aspera/preview/utils.rb +27 -27
  81. data/lib/aspera/proxy_auto_config.js +41 -41
  82. data/lib/aspera/proxy_auto_config.rb +21 -14
  83. data/lib/aspera/rest.rb +72 -67
  84. data/lib/aspera/rest_call_error.rb +2 -1
  85. data/lib/aspera/rest_error_analyzer.rb +18 -17
  86. data/lib/aspera/rest_errors_aspera.rb +16 -16
  87. data/lib/aspera/secret_hider.rb +15 -13
  88. data/lib/aspera/ssh.rb +11 -10
  89. data/lib/aspera/sync.rb +158 -44
  90. data/lib/aspera/temp_file_manager.rb +2 -2
  91. data/lib/aspera/uri_reader.rb +4 -4
  92. data/lib/aspera/web_auth.rb +14 -13
  93. data.tar.gz.sig +0 -0
  94. metadata +11 -36
  95. metadata.gz.sig +0 -0
@@ -8,34 +8,39 @@ module Aspera
8
8
  GLOBAL_OPS = %i[create list].freeze
9
9
  # operations with id
10
10
  INSTANCE_OPS = %i[modify delete show].freeze
11
- ALL_OPS = [GLOBAL_OPS,INSTANCE_OPS].flatten.freeze
11
+ ALL_OPS = [].concat(GLOBAL_OPS, INSTANCE_OPS).freeze
12
12
  # max number of items for list command
13
13
  MAX_ITEMS = 'max'
14
14
  # max number of pages for list command
15
15
  MAX_PAGES = 'pmax'
16
+ # used when all resources are selected
17
+ VAL_ALL = 'ALL'
16
18
 
17
- #AGENTS=%i[options transfer config formater persistency].freeze
19
+ # AGENTS=%i[options transfer config formater persistency].freeze
18
20
 
19
21
  # global for inherited classes
20
22
  @@options_created = false # rubocop:disable Style/ClassVars
21
23
 
22
24
  def initialize(env)
23
25
  raise 'must be Hash' unless env.is_a?(Hash)
24
- #env.each_key {|k| raise "wrong agent key #{k}" unless AGENTS.include?(k)}
26
+ # env.each_key {|k| raise "wrong agent key #{k}" unless AGENTS.include?(k)}
25
27
  @agents = env
26
28
  # check presence in descendant of mandatory method and constant
27
- raise StandardError,"missing method 'execute_action' in #{self.class}" unless respond_to?(:execute_action)
28
- raise StandardError,'ACTIONS shall be redefined by subclass' unless self.class.constants.include?(:ACTIONS)
29
+ raise StandardError, "missing method 'execute_action' in #{self.class}" unless respond_to?(:execute_action)
30
+ raise StandardError, 'ACTIONS shall be redefined by subclass' unless self.class.constants.include?(:ACTIONS)
29
31
  options.parser.separator('')
30
32
  options.parser.separator("COMMAND: #{self.class.name.split('::').last.downcase}")
31
- options.parser.separator("SUBCOMMANDS: #{self.class.const_get(:ACTIONS).map(&:to_s).join(' ')}")
33
+ options.parser.separator("SUBCOMMANDS: #{self.class.const_get(:ACTIONS).map(&:to_s).sort.join(' ')}")
32
34
  options.parser.separator('OPTIONS:')
33
35
  return if @@options_created
34
- options.add_opt_simple(:value,'extended value for create, update, list filter')
35
- options.add_opt_simple(:property,'name of property to set')
36
- options.add_opt_simple(:id,"resource identifier (#{INSTANCE_OPS.join(',')})")
37
- options.add_opt_boolean(:bulk,'Bulk operation (only some)')
38
- options.set_option(:bulk,:no)
36
+ options.add_opt_simple(:query, 'additional filter for API calls (extended value) (some commands)')
37
+ options.add_opt_simple(:value, 'extended value for create, update, list filter')
38
+ options.add_opt_simple(:property, 'name of property to set')
39
+ options.add_opt_simple(:id, "resource identifier (#{INSTANCE_OPS.join(',')})")
40
+ options.add_opt_boolean(:bulk, 'Bulk operation (only some)')
41
+ options.add_opt_boolean(:bfail, 'Bulk operation error handling')
42
+ options.set_option(:bulk, :no)
43
+ options.set_option(:bfail, :yes)
39
44
  options.parse_options!
40
45
  @@options_created = true # rubocop:disable Style/ClassVars
41
46
  end
@@ -48,19 +53,19 @@ module Aspera
48
53
  end
49
54
 
50
55
  # TODO
51
- #def get_next_id_command(instance_ops: INSTANCE_OPS,global_ops: GLOBAL_OPS)
56
+ # def get_next_id_command(instance_ops: INSTANCE_OPS,global_ops: GLOBAL_OPS)
52
57
  # return get_next_argument('command',expected: command_list)
53
- #end
58
+ # end
54
59
 
55
60
  # For create and delete operations: execute one actin or multiple if bulk is yes
56
61
  # @param params either single id or hash, or array for bulk
57
62
  # @param success_msg deleted or created
58
- def do_bulk_operation(single_or_array,success_msg,id_result: 'id',fields: :default)
63
+ def do_bulk_operation(single_or_array, success_msg, id_result: 'id', fields: :default)
59
64
  raise 'programming error: missing block' unless block_given?
60
65
  params = options.get_option(:bulk) ? single_or_array : [single_or_array]
61
66
  raise 'expecting Array for bulk operation' unless params.is_a?(Array)
62
67
  Log.log.warn('Empty list given for bulk operation') if params.empty?
63
- Log.dump(:bulk_create,params)
68
+ Log.dump(:bulk_create, params)
64
69
  result_list = []
65
70
  params.each do |param|
66
71
  # init for delete
@@ -72,16 +77,17 @@ module Aspera
72
77
  result = res if param.is_a?(Hash)
73
78
  result['status'] = success_msg
74
79
  rescue StandardError => e
80
+ raise e if options.get_option(:bfail)
75
81
  result['status'] = e.to_s
76
82
  end
77
83
  result_list.push(result)
78
84
  end
79
- display_fields = [id_result,'status']
85
+ display_fields = [id_result, 'status']
80
86
  if options.get_option(:bulk)
81
- return {type: :object_list,data: result_list,fields: display_fields}
87
+ return {type: :object_list, data: result_list, fields: display_fields}
82
88
  else
83
89
  display_fields = fields unless fields.eql?(:default)
84
- return {type: :single_object,data: result_list.first,fields: display_fields}
90
+ return {type: :single_object, data: result_list.first, fields: display_fields}
85
91
  end
86
92
  end
87
93
 
@@ -92,7 +98,7 @@ module Aspera
92
98
  # @param id_default [String] default identifier to use for existing entity commands (show, modify)
93
99
  # @param item_list_key [String] result is in a subkey of the json
94
100
  # @return result suitable for CLI result
95
- def entity_command(command,rest_api,res_class_path,display_fields: nil,id_default: nil,item_list_key: false)
101
+ def entity_command(command, rest_api, res_class_path, display_fields: nil, id_default: nil, item_list_key: false)
96
102
  if INSTANCE_OPS.include?(command)
97
103
  begin
98
104
  one_res_id = instance_identifier
@@ -104,7 +110,7 @@ module Aspera
104
110
  end
105
111
  # parameters mandatory for create/modify
106
112
  if %i[create modify].include?(command)
107
- parameters = options.get_option(:value,is_type: :mandatory)
113
+ parameters = options.get_option(:value, is_type: :mandatory)
108
114
  end
109
115
  # parameters optional for list
110
116
  if [:list].include?(command)
@@ -112,27 +118,27 @@ module Aspera
112
118
  end
113
119
  case command
114
120
  when :create
115
- return do_bulk_operation(parameters,'created',fields: display_fields) do |params|
121
+ return do_bulk_operation(parameters, 'created', fields: display_fields) do |params|
116
122
  raise 'expecting Hash' unless params.is_a?(Hash)
117
- rest_api.create(res_class_path,params)[:data]
123
+ rest_api.create(res_class_path, params)[:data]
118
124
  end
119
125
  when :delete
120
- return do_bulk_operation(one_res_id,'deleted') do |one_id|
126
+ return do_bulk_operation(one_res_id, 'deleted') do |one_id|
121
127
  rest_api.delete("#{res_class_path}/#{one_id}")
122
128
  {'id' => one_id}
123
129
  end
124
130
  when :show
125
131
  return {type: :single_object, data: rest_api.read(one_res_path)[:data], fields: display_fields}
126
132
  when :list
127
- resp = rest_api.read(res_class_path,parameters)
133
+ resp = rest_api.read(res_class_path, parameters)
128
134
  data = resp[:data]
129
135
  # TODO: not generic : which application is this for ?
130
136
  if resp[:http]['Content-Type'].start_with?('application/vnd.api+json')
131
137
  data = data[res_class_path]
132
138
  end
133
139
  if item_list_key
134
- item_list=data[item_list_key]
135
- total_count=data['total_count']
140
+ item_list = data[item_list_key]
141
+ total_count = data['total_count']
136
142
  if !total_count.nil?
137
143
  count_msg = "Items: #{item_list.length}/#{total_count}"
138
144
  count_msg = count_msg.bg_red unless item_list.length.eql?(total_count.to_i)
@@ -140,11 +146,12 @@ module Aspera
140
146
  end
141
147
  data = item_list
142
148
  end
143
- return {type: :object_list, data: data, fields: display_fields}
149
+ return {type: :object_list, data: data, fields: display_fields} if data.empty? || data.first.is_a?(Hash)
150
+ return {type: :value_list, data: data, name: 'id'}
144
151
  when :modify
145
152
  property = options.get_option(:property)
146
153
  parameters = {property => parameters} unless property.nil?
147
- rest_api.update(one_res_path,parameters)
154
+ rest_api.update(one_res_path, parameters)
148
155
  return Main.result_status('modified')
149
156
  else
150
157
  raise "unknown action: #{command}"
@@ -152,22 +159,36 @@ module Aspera
152
159
  end
153
160
 
154
161
  # implement generic rest operations on given resource path
155
- def entity_action(rest_api,res_class_path,**opts)
156
- #res_name=res_class_path.gsub(%r{^.*/},'').gsub(%r{s$},'').gsub('_',' ')
162
+ def entity_action(rest_api, res_class_path, **opts)
163
+ # res_name=res_class_path.gsub(%r{^.*/},'').gsub(%r{s$},'').gsub('_',' ')
157
164
  command = options.get_next_command(ALL_OPS)
158
- return entity_command(command,rest_api,res_class_path,**opts)
165
+ return entity_command(command, rest_api, res_class_path, **opts)
166
+ end
167
+
168
+ # query for list operation
169
+ def option_url_query(default)
170
+ query = options.get_option(:query)
171
+ query = default if query.nil?
172
+ Log.log.debug{"Query=#{query}".bg_red}
173
+ begin
174
+ # check it is suitable
175
+ URI.encode_www_form(query) unless query.nil?
176
+ rescue StandardError => e
177
+ raise CliBadArgument, "query must be an extended value which can be encoded with URI.encode_www_form. Refer to manual. (#{e.message})"
178
+ end
179
+ return query
159
180
  end
160
181
 
161
182
  # shortcuts helpers for plugin environment
162
- def options; return @agents[:options];end
183
+ def options; return @agents[:options]; end
163
184
 
164
- def transfer; return @agents[:transfer];end
185
+ def transfer; return @agents[:transfer]; end
165
186
 
166
- def config; return @agents[:config];end
187
+ def config; return @agents[:config]; end
167
188
 
168
- def format; return @agents[:formater];end
189
+ def format; return @agents[:formater]; end
169
190
 
170
- def persistency; return @agents[:persistency];end
191
+ def persistency; return @agents[:persistency]; end
171
192
  end # Plugin
172
193
  end # Cli
173
194
  end # Aspera
@@ -6,16 +6,16 @@ require 'aspera/aoc'
6
6
  module Aspera
7
7
  module Cli
8
8
  module Plugins
9
- class Alee < BasicAuthPlugin
9
+ class Alee < Aspera::Cli::BasicAuthPlugin
10
10
  ACTIONS = %i[entitlement].freeze
11
11
 
12
12
  def execute_action
13
13
  command = options.get_next_command(ACTIONS)
14
14
  case command
15
15
  when :entitlement
16
- entitlement_id = options.get_option(:username,is_type: :mandatory)
17
- customer_id = options.get_option(:password,is_type: :mandatory)
18
- api_metering = AoC.metering_api(entitlement_id,customer_id)
16
+ entitlement_id = options.get_option(:username, is_type: :mandatory)
17
+ customer_id = options.get_option(:password, is_type: :mandatory)
18
+ api_metering = AoC.metering_api(entitlement_id, customer_id)
19
19
  return {type: :single_object, data: api_metering.read('entitlement')[:data]}
20
20
  end
21
21
  end