aspera-cli 4.9.0 → 4.11.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/BUGS.md +20 -0
- data/CHANGELOG.md +509 -0
- data/CONTRIBUTING.md +118 -0
- data/README.md +1241 -916
- data/bin/ascli +4 -4
- data/bin/asession +11 -11
- data/docs/test_env.conf +32 -21
- data/examples/aoc.rb +4 -4
- data/examples/dascli +16 -9
- data/examples/faspex4.rb +8 -8
- data/examples/node.rb +12 -12
- data/examples/server.rb +10 -10
- data/lib/aspera/aoc.rb +273 -266
- data/lib/aspera/ascmd.rb +56 -54
- data/lib/aspera/ats_api.rb +4 -4
- data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
- data/lib/aspera/cli/extended_value.rb +5 -5
- data/lib/aspera/cli/formater.rb +64 -64
- data/lib/aspera/cli/info.rb +2 -2
- data/lib/aspera/cli/listener/line_dump.rb +1 -1
- data/lib/aspera/cli/listener/logger.rb +1 -1
- data/lib/aspera/cli/listener/progress.rb +5 -6
- data/lib/aspera/cli/listener/progress_multi.rb +14 -19
- data/lib/aspera/cli/main.rb +66 -67
- data/lib/aspera/cli/manager.rb +112 -110
- data/lib/aspera/cli/plugin.rb +57 -36
- data/lib/aspera/cli/plugins/alee.rb +4 -4
- data/lib/aspera/cli/plugins/aoc.rb +309 -670
- data/lib/aspera/cli/plugins/ats.rb +44 -46
- data/lib/aspera/cli/plugins/bss.rb +10 -10
- data/lib/aspera/cli/plugins/config.rb +497 -378
- data/lib/aspera/cli/plugins/console.rb +12 -12
- data/lib/aspera/cli/plugins/cos.rb +18 -20
- data/lib/aspera/cli/plugins/faspex.rb +112 -114
- data/lib/aspera/cli/plugins/faspex5.rb +71 -46
- data/lib/aspera/cli/plugins/node.rb +379 -283
- data/lib/aspera/cli/plugins/orchestrator.rb +46 -46
- data/lib/aspera/cli/plugins/preview.rb +122 -114
- data/lib/aspera/cli/plugins/server.rb +137 -83
- data/lib/aspera/cli/plugins/shares.rb +30 -29
- data/lib/aspera/cli/plugins/sync.rb +13 -33
- data/lib/aspera/cli/transfer_agent.rb +60 -59
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/colors.rb +3 -3
- data/lib/aspera/command_line_builder.rb +27 -27
- data/lib/aspera/cos_node.rb +22 -20
- data/lib/aspera/data_repository.rb +1 -1
- data/lib/aspera/environment.rb +35 -15
- data/lib/aspera/fasp/agent_base.rb +15 -15
- data/lib/aspera/fasp/agent_connect.rb +23 -21
- data/lib/aspera/fasp/agent_direct.rb +66 -64
- data/lib/aspera/fasp/agent_httpgw.rb +141 -78
- data/lib/aspera/fasp/agent_node.rb +23 -21
- data/lib/aspera/fasp/agent_trsdk.rb +20 -20
- data/lib/aspera/fasp/error.rb +3 -2
- data/lib/aspera/fasp/error_info.rb +11 -8
- data/lib/aspera/fasp/installation.rb +79 -79
- data/lib/aspera/fasp/listener.rb +1 -1
- data/lib/aspera/fasp/parameters.rb +86 -71
- data/lib/aspera/fasp/parameters.yaml +7 -4
- data/lib/aspera/fasp/resume_policy.rb +8 -8
- data/lib/aspera/fasp/transfer_spec.rb +35 -2
- data/lib/aspera/fasp/uri.rb +7 -7
- data/lib/aspera/faspex_gw.rb +7 -5
- data/lib/aspera/hash_ext.rb +3 -3
- data/lib/aspera/id_generator.rb +5 -5
- data/lib/aspera/keychain/encrypted_hash.rb +38 -105
- data/lib/aspera/keychain/macos_security.rb +128 -57
- data/lib/aspera/log.rb +7 -7
- data/lib/aspera/nagios.rb +19 -18
- data/lib/aspera/node.rb +209 -35
- data/lib/aspera/oauth.rb +37 -36
- data/lib/aspera/open_application.rb +19 -11
- data/lib/aspera/persistency_action_once.rb +4 -4
- data/lib/aspera/persistency_folder.rb +16 -15
- data/lib/aspera/preview/file_types.rb +8 -8
- data/lib/aspera/preview/generator.rb +67 -67
- data/lib/aspera/preview/utils.rb +27 -27
- data/lib/aspera/proxy_auto_config.js +41 -41
- data/lib/aspera/proxy_auto_config.rb +21 -14
- data/lib/aspera/rest.rb +72 -67
- data/lib/aspera/rest_call_error.rb +2 -1
- data/lib/aspera/rest_error_analyzer.rb +18 -17
- data/lib/aspera/rest_errors_aspera.rb +16 -16
- data/lib/aspera/secret_hider.rb +15 -13
- data/lib/aspera/ssh.rb +11 -10
- data/lib/aspera/sync.rb +158 -44
- data/lib/aspera/temp_file_manager.rb +2 -2
- data/lib/aspera/uri_reader.rb +4 -4
- data/lib/aspera/web_auth.rb +14 -13
- data.tar.gz.sig +0 -0
- metadata +11 -36
- metadata.gz.sig +0 -0
data/lib/aspera/cli/manager.rb
CHANGED
@@ -12,10 +12,10 @@ module Aspera
|
|
12
12
|
class CliError < StandardError; end
|
13
13
|
|
14
14
|
# raised when an unexpected argument is provided
|
15
|
-
class CliBadArgument < CliError; end
|
15
|
+
class CliBadArgument < Aspera::Cli::CliError; end
|
16
16
|
|
17
|
-
class CliNoSuchId < CliError
|
18
|
-
def initialize(res_type,res_id)
|
17
|
+
class CliNoSuchId < Aspera::Cli::CliError
|
18
|
+
def initialize(res_type, res_id)
|
19
19
|
msg = "No such #{res_type} identifier: #{res_id}"
|
20
20
|
super(msg)
|
21
21
|
end
|
@@ -23,9 +23,9 @@ module Aspera
|
|
23
23
|
|
24
24
|
# option is retrieved from another object using accessor
|
25
25
|
class AttrAccessor
|
26
|
-
#attr_accessor :object
|
27
|
-
#attr_accessor :attr_symb
|
28
|
-
def initialize(object,attr_symb)
|
26
|
+
# attr_accessor :object
|
27
|
+
# attr_accessor :attr_symb
|
28
|
+
def initialize(object, attr_symb)
|
29
29
|
@object = object
|
30
30
|
@attr_symb = attr_symb
|
31
31
|
end
|
@@ -35,7 +35,7 @@ module Aspera
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def value=(val)
|
38
|
-
@object.send("#{@attr_symb}=",val)
|
38
|
+
@object.send("#{@attr_symb}=", val)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -44,15 +44,17 @@ module Aspera
|
|
44
44
|
# resolves on extended value syntax
|
45
45
|
class Manager
|
46
46
|
# boolean options are set to true/false from the following values
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
BOOLEAN_SIMPLE = %i[no yes].freeze
|
48
|
+
FALSE_VALUES = [BOOLEAN_SIMPLE.first, false].freeze
|
49
|
+
TRUE_VALUES = [BOOLEAN_SIMPLE.last, true].freeze
|
50
|
+
BOOLEAN_VALUES = [].concat(TRUE_VALUES, FALSE_VALUES).freeze
|
51
|
+
|
50
52
|
# option name separator on command line
|
51
53
|
OPTION_SEP_LINE = '-'
|
52
54
|
# option name separator in code (symbol)
|
53
55
|
OPTION_SEP_NAME = '_'
|
54
56
|
|
55
|
-
private_constant :TRUE_VALUES
|
57
|
+
private_constant :FALSE_VALUES, :TRUE_VALUES, :BOOLEAN_VALUES, :OPTION_SEP_LINE, :OPTION_SEP_NAME
|
56
58
|
|
57
59
|
class << self
|
58
60
|
def enum_to_bool(enum)
|
@@ -65,19 +67,19 @@ module Aspera
|
|
65
67
|
end
|
66
68
|
|
67
69
|
# find shortened string value in allowed symbol list
|
68
|
-
def get_from_list(shortval,descr,allowed_values)
|
70
|
+
def get_from_list(shortval, descr, allowed_values)
|
69
71
|
# we accept shortcuts
|
70
72
|
matching_exact = allowed_values.select{|i| i.to_s.eql?(shortval)}
|
71
73
|
return matching_exact.first if matching_exact.length == 1
|
72
74
|
matching = allowed_values.select{|i| i.to_s.start_with?(shortval)}
|
73
|
-
raise CliBadArgument,bad_arg_message_multi("unknown value for #{descr}: #{shortval}",allowed_values) if matching.empty?
|
74
|
-
raise CliBadArgument,bad_arg_message_multi("ambigous shortcut for #{descr}: #{shortval}",matching) unless matching.length.eql?(1)
|
75
|
+
raise CliBadArgument, bad_arg_message_multi("unknown value for #{descr}: #{shortval}", allowed_values) if matching.empty?
|
76
|
+
raise CliBadArgument, bad_arg_message_multi("ambigous shortcut for #{descr}: #{shortval}", matching) unless matching.length.eql?(1)
|
75
77
|
return enum_to_bool(matching.first) if allowed_values.eql?(BOOLEAN_VALUES)
|
76
78
|
return matching.first
|
77
79
|
end
|
78
80
|
|
79
|
-
def bad_arg_message_multi(error_msg,choices)
|
80
|
-
return [error_msg,'Use:'
|
81
|
+
def bad_arg_message_multi(error_msg, choices)
|
82
|
+
return [error_msg, 'Use:'].concat(choices.map{|c|"- #{c}"}.sort).join("\n")
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
@@ -85,7 +87,7 @@ module Aspera
|
|
85
87
|
attr_accessor :ask_missing_mandatory, :ask_missing_optional
|
86
88
|
attr_writer :fail_on_missing_mandatory
|
87
89
|
|
88
|
-
def initialize(program_name,argv: nil)
|
90
|
+
def initialize(program_name, argv: nil)
|
89
91
|
# command line values not starting with '-'
|
90
92
|
@unprocessed_cmd_line_arguments = []
|
91
93
|
# command line values starting with '-'
|
@@ -102,30 +104,30 @@ module Aspera
|
|
102
104
|
# those must be set before parse, parse consumes those defined only
|
103
105
|
@unprocessed_defaults = []
|
104
106
|
@unprocessed_env = []
|
105
|
-
#
|
107
|
+
# NOTE: was initially inherited but it is prefered to have specific methods
|
106
108
|
@parser = OptionParser.new
|
107
109
|
@parser.program_name = program_name
|
108
110
|
# options can also be provided by env vars : --param-name -> ASLMCLI_PARAM_NAME
|
109
111
|
env_prefix = program_name.upcase + OPTION_SEP_NAME
|
110
|
-
ENV.each do |k,v|
|
112
|
+
ENV.each do |k, v|
|
111
113
|
if k.start_with?(env_prefix)
|
112
|
-
@unprocessed_env.push([k[env_prefix.length..-1].downcase.to_sym,v])
|
114
|
+
@unprocessed_env.push([k[env_prefix.length..-1].downcase.to_sym, v])
|
113
115
|
end
|
114
116
|
end
|
115
|
-
Log.log.debug
|
117
|
+
Log.log.debug{"env=#{@unprocessed_env}".red}
|
116
118
|
@unprocessed_cmd_line_options = []
|
117
119
|
@unprocessed_cmd_line_arguments = []
|
118
120
|
# argv is nil when help is generated for every plugin
|
119
121
|
unless argv.nil?
|
120
122
|
@parser.separator('')
|
121
123
|
@parser.separator('OPTIONS: global')
|
122
|
-
set_obj_attr(:interactive,self
|
123
|
-
set_obj_attr(:ask_options,self
|
124
|
-
add_opt_boolean(:interactive,'use interactive input of missing params')
|
125
|
-
add_opt_boolean(:ask_options,'ask even optional options')
|
124
|
+
set_obj_attr(:interactive, self, :ask_missing_mandatory)
|
125
|
+
set_obj_attr(:ask_options, self, :ask_missing_optional)
|
126
|
+
add_opt_boolean(:interactive, 'use interactive input of missing params')
|
127
|
+
add_opt_boolean(:ask_options, 'ask even optional options')
|
126
128
|
parse_options!
|
127
129
|
process_options = true
|
128
|
-
|
130
|
+
until argv.empty?
|
129
131
|
value = argv.shift
|
130
132
|
if process_options && value.start_with?('-')
|
131
133
|
if value.eql?('--')
|
@@ -139,10 +141,10 @@ module Aspera
|
|
139
141
|
end
|
140
142
|
end
|
141
143
|
@initial_cli_options = @unprocessed_cmd_line_options.dup
|
142
|
-
Log.log.debug
|
144
|
+
Log.log.debug{"add_cmd_line_options:commands/args=#{@unprocessed_cmd_line_arguments},options=#{@unprocessed_cmd_line_options}".red}
|
143
145
|
end
|
144
146
|
|
145
|
-
def get_next_command(command_list); return get_next_argument('command',expected: command_list); end
|
147
|
+
def get_next_command(command_list); return get_next_argument('command', expected: command_list); end
|
146
148
|
|
147
149
|
# @param expected is
|
148
150
|
# - Array of allowed value (single value)
|
@@ -151,10 +153,10 @@ module Aspera
|
|
151
153
|
# @param mandatory true/false
|
152
154
|
# @param type expected class for result
|
153
155
|
# @return value, list or nil
|
154
|
-
def get_next_argument(descr,expected: :single,mandatory: true, type: nil)
|
156
|
+
def get_next_argument(descr, expected: :single, mandatory: true, type: nil)
|
155
157
|
unless type.nil?
|
156
158
|
raise 'internal: type must be a Class' unless type.is_a?(Class)
|
157
|
-
descr="#{descr} (#{type})"
|
159
|
+
descr = "#{descr} (#{type})"
|
158
160
|
end
|
159
161
|
result = nil
|
160
162
|
if !@unprocessed_cmd_line_arguments.empty?
|
@@ -169,21 +171,21 @@ module Aspera
|
|
169
171
|
result = result.first
|
170
172
|
end
|
171
173
|
else
|
172
|
-
result = self.class.get_from_list(@unprocessed_cmd_line_arguments.shift,descr,expected)
|
174
|
+
result = self.class.get_from_list(@unprocessed_cmd_line_arguments.shift, descr, expected)
|
173
175
|
end
|
174
176
|
elsif mandatory
|
175
177
|
# no value provided
|
176
|
-
result = get_interactive(:argument,descr,expected: expected)
|
178
|
+
result = get_interactive(:argument, descr, expected: expected)
|
177
179
|
end
|
178
|
-
Log.log.debug
|
180
|
+
Log.log.debug{"#{descr}=#{result}"}
|
179
181
|
raise "argument shall be #{type.name}" unless type.nil? || result.is_a?(type)
|
180
182
|
return result
|
181
183
|
end
|
182
184
|
|
183
185
|
# declare option of type :accessor, or :value
|
184
|
-
def declare_option(option_symbol,type)
|
185
|
-
Log.log.debug
|
186
|
-
if @declared_options.
|
186
|
+
def declare_option(option_symbol, type)
|
187
|
+
Log.log.debug{"declare_option: #{option_symbol}: #{type}: skip=#{@declared_options.key?(option_symbol)}".green}
|
188
|
+
if @declared_options.key?(option_symbol)
|
187
189
|
raise "INTERNAL ERROR: option #{option_symbol} already declared. only accessor can be redeclared and ignored" \
|
188
190
|
unless @declared_options[option_symbol][:type].eql?(:accessor)
|
189
191
|
return
|
@@ -194,23 +196,23 @@ module Aspera
|
|
194
196
|
end
|
195
197
|
|
196
198
|
# define option with handler
|
197
|
-
def set_obj_attr(option_symbol,object,attr_symb,default_value=nil)
|
198
|
-
Log.log.debug
|
199
|
-
declare_option(option_symbol
|
200
|
-
@declared_options[option_symbol][:accessor] = AttrAccessor.new(object,attr_symb)
|
201
|
-
set_option(option_symbol,default_value,'default obj attr') if !default_value.nil?
|
199
|
+
def set_obj_attr(option_symbol, object, attr_symb, default_value=nil)
|
200
|
+
Log.log.debug{"set attr obj #{option_symbol} (#{object},#{attr_symb})"}
|
201
|
+
declare_option(option_symbol, :accessor)
|
202
|
+
@declared_options[option_symbol][:accessor] = AttrAccessor.new(object, attr_symb)
|
203
|
+
set_option(option_symbol, default_value, 'default obj attr') if !default_value.nil?
|
202
204
|
end
|
203
205
|
|
204
206
|
# set an option value by name, either store value or call handler
|
205
|
-
def set_option(option_symbol,value,where='default')
|
206
|
-
if !@declared_options.
|
207
|
-
Log.log.debug
|
207
|
+
def set_option(option_symbol, value, where='default')
|
208
|
+
if !@declared_options.key?(option_symbol)
|
209
|
+
Log.log.debug{"set unknown option: #{option_symbol}"}
|
208
210
|
raise 'ERROR: cannot set undeclared option'
|
209
|
-
#declare_option(option_symbol)
|
211
|
+
# declare_option(option_symbol)
|
210
212
|
end
|
211
213
|
value = ExtendedValue.instance.evaluate(value)
|
212
214
|
value = Manager.enum_to_bool(value) if @declared_options[option_symbol][:values].eql?(BOOLEAN_VALUES)
|
213
|
-
Log.log.debug
|
215
|
+
Log.log.debug{"(#{@declared_options[option_symbol][:type]}/#{where}) set #{option_symbol}=#{value}"}
|
214
216
|
case @declared_options[option_symbol][:type]
|
215
217
|
when :accessor
|
216
218
|
@declared_options[option_symbol][:accessor].value = value
|
@@ -224,9 +226,9 @@ module Aspera
|
|
224
226
|
# get an option value by name
|
225
227
|
# either return value or call handler, can return nil
|
226
228
|
# ask interactively if requested/required
|
227
|
-
def get_option(option_symbol,is_type: :optional)
|
229
|
+
def get_option(option_symbol, is_type: :optional)
|
228
230
|
result = nil
|
229
|
-
if @declared_options.
|
231
|
+
if @declared_options.key?(option_symbol)
|
230
232
|
case @declared_options[option_symbol][:type]
|
231
233
|
when :accessor
|
232
234
|
result = @declared_options[option_symbol][:accessor].value
|
@@ -235,41 +237,41 @@ module Aspera
|
|
235
237
|
else
|
236
238
|
raise 'unknown type'
|
237
239
|
end
|
238
|
-
Log.log.debug
|
240
|
+
Log.log.debug{"(#{@declared_options[option_symbol][:type]}) get #{option_symbol}=#{result}"}
|
239
241
|
end
|
240
242
|
# do not fail for manual generation if option mandatory but not set
|
241
243
|
result = '' if result.nil? && is_type.eql?(:mandatory) && !@fail_on_missing_mandatory
|
242
|
-
#Log.log.debug
|
244
|
+
# Log.log.debug{"interactive=#{@ask_missing_mandatory}"}
|
243
245
|
if result.nil?
|
244
246
|
if !@ask_missing_mandatory
|
245
|
-
raise CliBadArgument,"Missing mandatory option: #{option_symbol}" if is_type.eql?(:mandatory)
|
247
|
+
raise CliBadArgument, "Missing mandatory option: #{option_symbol}" if is_type.eql?(:mandatory)
|
246
248
|
elsif @ask_missing_optional || is_type.eql?(:mandatory)
|
247
249
|
# ask_missing_mandatory
|
248
250
|
expected = :single
|
249
|
-
#print "please enter: #{option_symbol.to_s}"
|
250
|
-
if @declared_options.
|
251
|
+
# print "please enter: #{option_symbol.to_s}"
|
252
|
+
if @declared_options.key?(option_symbol) && @declared_options[option_symbol].key?(:values)
|
251
253
|
expected = @declared_options[option_symbol][:values]
|
252
254
|
end
|
253
|
-
result = get_interactive(:option,option_symbol.to_s,expected: expected)
|
254
|
-
set_option(option_symbol,result,'interactive')
|
255
|
+
result = get_interactive(:option, option_symbol.to_s, expected: expected)
|
256
|
+
set_option(option_symbol, result, 'interactive')
|
255
257
|
end
|
256
258
|
end
|
257
259
|
return result
|
258
260
|
end
|
259
261
|
|
260
262
|
# param must be hash
|
261
|
-
def add_option_preset(preset_hash,op: :push)
|
262
|
-
Log.log.debug
|
263
|
+
def add_option_preset(preset_hash, op: :push)
|
264
|
+
Log.log.debug{"add_option_preset=#{preset_hash}"}
|
263
265
|
raise "internal error: setting default with no hash: #{preset_hash.class}" if !preset_hash.is_a?(Hash)
|
264
266
|
# incremental override
|
265
|
-
preset_hash.each{|k,v|@unprocessed_defaults.send(op,[k.to_sym,v])}
|
267
|
+
preset_hash.each{|k, v|@unprocessed_defaults.send(op, [k.to_sym, v])}
|
266
268
|
end
|
267
269
|
|
268
270
|
# define an option with restricted values
|
269
|
-
def add_opt_list(option_symbol,values,help
|
270
|
-
declare_option(option_symbol
|
271
|
-
Log.log.debug
|
272
|
-
on_args.unshift(symbol_to_option(option_symbol,'ENUM'))
|
271
|
+
def add_opt_list(option_symbol, values, help, *on_args)
|
272
|
+
declare_option(option_symbol, :value)
|
273
|
+
Log.log.debug{"add_opt_list #{option_symbol}"}
|
274
|
+
on_args.unshift(symbol_to_option(option_symbol, 'ENUM'))
|
273
275
|
# this option value must be a symbol
|
274
276
|
@declared_options[option_symbol][:values] = values
|
275
277
|
value = get_option(option_symbol)
|
@@ -279,47 +281,47 @@ module Aspera
|
|
279
281
|
end
|
280
282
|
on_args.push(values)
|
281
283
|
on_args.push("#{help}: #{help_values}")
|
282
|
-
Log.log.debug
|
283
|
-
@parser.on(*on_args){|v|set_option(option_symbol,self.class.get_from_list(v.to_s,help,values),'cmdline')}
|
284
|
+
Log.log.debug{"on_args=#{on_args}"}
|
285
|
+
@parser.on(*on_args){|v|set_option(option_symbol, self.class.get_from_list(v.to_s, help, values), 'cmdline')}
|
284
286
|
end
|
285
287
|
|
286
|
-
def add_opt_boolean(option_symbol,help
|
287
|
-
add_opt_list(option_symbol,BOOLEAN_VALUES,help
|
288
|
+
def add_opt_boolean(option_symbol, help, *on_args)
|
289
|
+
add_opt_list(option_symbol, BOOLEAN_VALUES, help, *on_args)
|
288
290
|
# if default was defined for obj, it may still be enum (yes/no) instead of boolean
|
289
|
-
default_value=get_option(option_symbol)
|
290
|
-
set_option(option_symbol,default_value,'opt boolean') unless default_value.nil?
|
291
|
+
default_value = get_option(option_symbol)
|
292
|
+
set_option(option_symbol, default_value, 'opt boolean') unless default_value.nil?
|
291
293
|
end
|
292
294
|
|
293
295
|
# define an option with open values
|
294
|
-
def add_opt_simple(option_symbol
|
295
|
-
declare_option(option_symbol
|
296
|
-
Log.log.debug
|
297
|
-
on_args.unshift(symbol_to_option(option_symbol,'VALUE'))
|
298
|
-
Log.log.debug
|
299
|
-
@parser.on(*on_args) { |v| set_option(option_symbol,v,'cmdline') }
|
296
|
+
def add_opt_simple(option_symbol, *on_args)
|
297
|
+
declare_option(option_symbol, :value)
|
298
|
+
Log.log.debug{"add_opt_simple #{option_symbol}"}
|
299
|
+
on_args.unshift(symbol_to_option(option_symbol, 'VALUE'))
|
300
|
+
Log.log.debug{"on_args=#{on_args}"}
|
301
|
+
@parser.on(*on_args) { |v| set_option(option_symbol, v, 'cmdline') }
|
300
302
|
end
|
301
303
|
|
302
304
|
# define an option with date format
|
303
|
-
def add_opt_date(option_symbol
|
304
|
-
declare_option(option_symbol
|
305
|
-
Log.log.debug
|
306
|
-
on_args.unshift(symbol_to_option(option_symbol,'DATE'))
|
307
|
-
Log.log.debug
|
305
|
+
def add_opt_date(option_symbol, *on_args)
|
306
|
+
declare_option(option_symbol, :value)
|
307
|
+
Log.log.debug{"add_opt_date #{option_symbol}"}
|
308
|
+
on_args.unshift(symbol_to_option(option_symbol, 'DATE'))
|
309
|
+
Log.log.debug{"on_args=#{on_args}"}
|
308
310
|
@parser.on(*on_args) do |v|
|
309
311
|
case v
|
310
|
-
when 'now' then set_option(option_symbol,Manager.time_to_string(Time.now),'cmdline')
|
311
|
-
when /^-([0-9]+)h/ then set_option(option_symbol,Manager.time_to_string(Time.now - (
|
312
|
-
else set_option(option_symbol,v,'cmdline')
|
312
|
+
when 'now' then set_option(option_symbol, Manager.time_to_string(Time.now), 'cmdline')
|
313
|
+
when /^-([0-9]+)h/ then set_option(option_symbol, Manager.time_to_string(Time.now - (Regexp.last_match(1).to_i * 3600)), 'cmdline')
|
314
|
+
else set_option(option_symbol, v, 'cmdline')
|
313
315
|
end
|
314
316
|
end
|
315
317
|
end
|
316
318
|
|
317
319
|
# define an option without value
|
318
|
-
def add_opt_switch(option_symbol
|
319
|
-
Log.log.debug
|
320
|
-
on_args.unshift(symbol_to_option(option_symbol,nil))
|
321
|
-
Log.log.debug
|
322
|
-
@parser.on(*on_args
|
320
|
+
def add_opt_switch(option_symbol, *on_args, &block)
|
321
|
+
Log.log.debug{"add_opt_on #{option_symbol}"}
|
322
|
+
on_args.unshift(symbol_to_option(option_symbol, nil))
|
323
|
+
Log.log.debug{"on_args=#{on_args}"}
|
324
|
+
@parser.on(*on_args, &block)
|
323
325
|
end
|
324
326
|
|
325
327
|
# check if there were unprocessed values to generate error
|
@@ -345,13 +347,13 @@ module Aspera
|
|
345
347
|
when /^--([^=]+)=(.*)$/
|
346
348
|
name = Regexp.last_match(1)
|
347
349
|
value = Regexp.last_match(2)
|
348
|
-
name.gsub!(OPTION_SEP_LINE,OPTION_SEP_NAME)
|
350
|
+
name.gsub!(OPTION_SEP_LINE, OPTION_SEP_NAME)
|
349
351
|
value = ExtendedValue.instance.evaluate(value)
|
350
|
-
Log.log.debug
|
352
|
+
Log.log.debug{"option #{name}=#{value}"}
|
351
353
|
result[name] = value
|
352
354
|
@unprocessed_cmd_line_options.delete(optionval) if remove_from_remaining
|
353
355
|
else
|
354
|
-
raise CliBadArgument,"wrong option format: #{optionval}"
|
356
|
+
raise CliBadArgument, "wrong option format: #{optionval}"
|
355
357
|
end
|
356
358
|
end
|
357
359
|
return result
|
@@ -360,7 +362,7 @@ module Aspera
|
|
360
362
|
# return options as taken from config file and command line just before command execution
|
361
363
|
def declared_options(only_defined: false)
|
362
364
|
result = {}
|
363
|
-
@declared_options.
|
365
|
+
@declared_options.each_key do |option_symb|
|
364
366
|
v = get_option(option_symb)
|
365
367
|
result[option_symb.to_s] = v unless only_defined && v.nil?
|
366
368
|
end
|
@@ -371,8 +373,8 @@ module Aspera
|
|
371
373
|
def parse_options!
|
372
374
|
Log.log.debug('parse_options!'.red)
|
373
375
|
# first conf file, then env var
|
374
|
-
apply_options_preset(@unprocessed_defaults,'file')
|
375
|
-
apply_options_preset(@unprocessed_env,'env')
|
376
|
+
apply_options_preset(@unprocessed_defaults, 'file')
|
377
|
+
apply_options_preset(@unprocessed_env, 'env')
|
376
378
|
# command line override
|
377
379
|
unknown_options = []
|
378
380
|
begin
|
@@ -381,28 +383,28 @@ module Aspera
|
|
381
383
|
@parser.parse!(@unprocessed_cmd_line_options)
|
382
384
|
Log.log.debug('After parse'.red)
|
383
385
|
rescue OptionParser::InvalidOption => e
|
384
|
-
Log.log.debug
|
386
|
+
Log.log.debug{"InvalidOption #{e}".red}
|
385
387
|
# save for later processing
|
386
388
|
unknown_options.push(e.args.first)
|
387
389
|
retry
|
388
390
|
end
|
389
|
-
Log.log.debug
|
391
|
+
Log.log.debug{"remains: #{unknown_options}"}
|
390
392
|
# set unprocessed options for next time
|
391
393
|
@unprocessed_cmd_line_options = unknown_options
|
392
394
|
end
|
393
395
|
|
394
396
|
private
|
395
397
|
|
396
|
-
def prompt_user_input(prompt,sensitive)
|
398
|
+
def prompt_user_input(prompt, sensitive)
|
397
399
|
return $stdin.getpass("#{prompt}> ") if sensitive
|
398
400
|
print("#{prompt}> ")
|
399
401
|
return $stdin.gets.chomp
|
400
402
|
end
|
401
403
|
|
402
|
-
def get_interactive(type,descr,expected: :single)
|
404
|
+
def get_interactive(type, descr, expected: :single)
|
403
405
|
if !@ask_missing_mandatory
|
404
|
-
raise CliBadArgument,self.class.bad_arg_message_multi("missing: #{descr}",expected) if expected.is_a?(Array)
|
405
|
-
raise CliBadArgument,"missing argument (#{expected}): #{descr}"
|
406
|
+
raise CliBadArgument, self.class.bad_arg_message_multi("missing: #{descr}", expected) if expected.is_a?(Array)
|
407
|
+
raise CliBadArgument, "missing argument (#{expected}): #{descr}"
|
406
408
|
end
|
407
409
|
result = nil
|
408
410
|
sensitive = type.eql?(:option) && @declared_options[descr.to_sym][:sensitive]
|
@@ -413,21 +415,21 @@ module Aspera
|
|
413
415
|
result = []
|
414
416
|
puts(' (one per line, end with empty line)')
|
415
417
|
loop do
|
416
|
-
entry = prompt_user_input(default_prompt,sensitive)
|
418
|
+
entry = prompt_user_input(default_prompt, sensitive)
|
417
419
|
break if entry.empty?
|
418
420
|
result.push(ExtendedValue.instance.evaluate(entry))
|
419
421
|
end
|
420
422
|
when :single
|
421
|
-
result = ExtendedValue.instance.evaluate(prompt_user_input(default_prompt,sensitive))
|
423
|
+
result = ExtendedValue.instance.evaluate(prompt_user_input(default_prompt, sensitive))
|
422
424
|
else # one fixed
|
423
|
-
result = self.class.get_from_list(prompt_user_input("#{expected.join(' ')}\n#{default_prompt}",sensitive),descr,expected)
|
425
|
+
result = self.class.get_from_list(prompt_user_input("#{expected.join(' ')}\n#{default_prompt}", sensitive), descr, expected)
|
424
426
|
end
|
425
427
|
return result
|
426
428
|
end
|
427
429
|
|
428
430
|
# generate command line option from option symbol
|
429
|
-
def symbol_to_option(symbol,opt_val)
|
430
|
-
result = '--' + symbol.to_s.gsub(OPTION_SEP_NAME,OPTION_SEP_LINE)
|
431
|
+
def symbol_to_option(symbol, opt_val)
|
432
|
+
result = '--' + symbol.to_s.gsub(OPTION_SEP_NAME, OPTION_SEP_LINE)
|
431
433
|
result = result + '=' + opt_val unless opt_val.nil?
|
432
434
|
return result
|
433
435
|
end
|
@@ -436,16 +438,16 @@ module Aspera
|
|
436
438
|
$stdout.isatty ? value.to_s.red.bold : "[#{value}]"
|
437
439
|
end
|
438
440
|
|
439
|
-
def apply_options_preset(preset,where)
|
441
|
+
def apply_options_preset(preset, where)
|
440
442
|
unprocessed = []
|
441
443
|
preset.each do |pair|
|
442
|
-
k,v = *pair
|
443
|
-
if @declared_options.
|
444
|
+
k, v = *pair
|
445
|
+
if @declared_options.key?(k)
|
444
446
|
# constrained parameters as string are revert to symbol
|
445
|
-
if @declared_options[k].
|
446
|
-
v = self.class.get_from_list(v,k.to_s + " in #{where}"
|
447
|
+
if @declared_options[k].key?(:values) && v.is_a?(String)
|
448
|
+
v = self.class.get_from_list(v, k.to_s + " in #{where}", @declared_options[k][:values])
|
447
449
|
end
|
448
|
-
set_option(k,v,where)
|
450
|
+
set_option(k, v, where)
|
449
451
|
else
|
450
452
|
unprocessed.push(pair)
|
451
453
|
end
|