aspera-cli 4.10.0 → 4.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +621 -378
- data/bin/ascli +4 -4
- data/bin/asession +11 -11
- data/docs/test_env.conf +28 -19
- data/examples/aoc.rb +4 -4
- data/examples/dascli +11 -9
- data/examples/faspex4.rb +8 -8
- data/examples/node.rb +11 -11
- data/examples/server.rb +9 -9
- 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/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 +110 -110
- data/lib/aspera/cli/plugin.rb +54 -37
- data/lib/aspera/cli/plugins/alee.rb +4 -4
- data/lib/aspera/cli/plugins/aoc.rb +308 -669
- 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 +447 -344
- 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 +110 -112
- data/lib/aspera/cli/plugins/faspex5.rb +67 -46
- data/lib/aspera/cli/plugins/node.rb +364 -288
- 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 +57 -57
- 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 +30 -28
- 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 +65 -67
- data/lib/aspera/fasp/agent_httpgw.rb +72 -68
- 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 +78 -78
- data/lib/aspera/fasp/listener.rb +1 -1
- data/lib/aspera/fasp/parameters.rb +75 -72
- data/lib/aspera/fasp/parameters.yaml +2 -2
- 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 +23 -28
- data/lib/aspera/keychain/macos_security.rb +21 -20
- 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 +13 -13
- 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 +16 -16
- data/lib/aspera/rest.rb +56 -60
- 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 +8 -5
- metadata.gz.sig +0 -0
@@ -2,27 +2,26 @@
|
|
2
2
|
|
3
3
|
require 'aspera/fasp/listener'
|
4
4
|
require 'ruby-progressbar'
|
5
|
+
require 'aspera/environment'
|
5
6
|
|
6
7
|
module Aspera
|
7
8
|
module Cli
|
8
9
|
module Listener
|
9
10
|
# a listener to FASP event that displays a progress bar
|
10
|
-
class Progress < Fasp::Listener
|
11
|
+
class Progress < Aspera::Fasp::Listener
|
11
12
|
def initialize
|
12
13
|
super
|
13
14
|
@progress = nil
|
14
15
|
@cumulative = 0
|
15
16
|
end
|
16
17
|
|
17
|
-
BYTE_PER_MEGABIT = (1024 * 1024) / 8
|
18
|
-
|
19
18
|
def event_struct(data)
|
20
19
|
case data['Type']
|
21
20
|
when 'NOTIFICATION'
|
22
|
-
if data.
|
21
|
+
if data.key?('PreTransferBytes')
|
23
22
|
@progress = ProgressBar.create(
|
24
23
|
format: '%a %B %p%% %r Mbps %e',
|
25
|
-
rate_scale: lambda{|rate|rate /
|
24
|
+
rate_scale: lambda{|rate|rate / Environment::BYTES_PER_MEBIBIT},
|
26
25
|
title: 'progress',
|
27
26
|
total: data['PreTransferBytes'].to_i)
|
28
27
|
end
|
@@ -33,7 +32,7 @@ module Aspera
|
|
33
32
|
if @progress.nil?
|
34
33
|
puts '.'
|
35
34
|
else
|
36
|
-
@progress.progress = data.
|
35
|
+
@progress.progress = data.key?('Bytescont') ? @cumulative + data['Bytescont'].to_i : data['TransferBytes'].to_i
|
37
36
|
end
|
38
37
|
when 'DONE'
|
39
38
|
if @progress.nil?
|
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'aspera/fasp/listener'
|
4
4
|
require 'aspera/fasp/agent_base'
|
5
|
+
require 'aspera/environment'
|
5
6
|
require 'ruby-progressbar'
|
6
7
|
|
7
8
|
module Aspera
|
8
9
|
module Cli
|
9
10
|
module Listener
|
10
11
|
# a listener to FASP event that displays a progress bar
|
11
|
-
class ProgressMulti < Fasp::Listener
|
12
|
+
class ProgressMulti < Aspera::Fasp::Listener
|
12
13
|
def initialize
|
13
14
|
super
|
14
15
|
@progress_bar = nil
|
@@ -20,34 +21,28 @@ module Aspera
|
|
20
21
|
@sessions = {}
|
21
22
|
end
|
22
23
|
|
23
|
-
BYTE_PER_MEGABIT = 1024 * 1024 / 8
|
24
|
-
|
25
24
|
def update_total
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
nil
|
30
|
-
end
|
25
|
+
@progress_bar.total = @sessions.values.inject(0){|m, s|m + s[:job_size].to_i}
|
26
|
+
rescue StandardError
|
27
|
+
nil
|
31
28
|
end
|
32
29
|
|
33
30
|
def update_progress
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
nil
|
38
|
-
end
|
31
|
+
@progress_bar.progress = @sessions.values.inject(0){|m, s|m + s[:current].to_i}
|
32
|
+
rescue StandardError
|
33
|
+
nil
|
39
34
|
end
|
40
35
|
|
41
36
|
def event_enhanced(data)
|
42
37
|
if @progress_bar.nil?
|
43
38
|
@progress_bar = ProgressBar.create(
|
44
39
|
format: '%t %a %B %p%% %r Mbps %e',
|
45
|
-
rate_scale: lambda{|rate|rate /
|
40
|
+
rate_scale: lambda{|rate|rate / Environment::BYTES_PER_MEBIBIT},
|
46
41
|
title: '',
|
47
42
|
total: nil)
|
48
43
|
end
|
49
|
-
if !data.
|
50
|
-
Log.log.error
|
44
|
+
if !data.key?(Fasp::AgentBase::LISTENER_SESSION_ID_S)
|
45
|
+
Log.log.error{"Internal error: no #{Fasp::AgentBase::LISTENER_SESSION_ID_S} in event: #{data}"}
|
51
46
|
return
|
52
47
|
end
|
53
48
|
newtitle = @sessions.length < 2 ? '' : "multi=#{@sessions.length}"
|
@@ -61,7 +56,7 @@ module Aspera
|
|
61
56
|
when 'INIT' # connection to ascp (get id)
|
62
57
|
when 'SESSION' # session information
|
63
58
|
when 'NOTIFICATION' # sent from remote
|
64
|
-
if data.
|
59
|
+
if data.key?('pre_transfer_bytes')
|
65
60
|
session[:job_size] = data['pre_transfer_bytes']
|
66
61
|
update_total
|
67
62
|
end
|
@@ -69,7 +64,7 @@ module Aspera
|
|
69
64
|
if @progress_bar.total.nil?
|
70
65
|
@progress_bar.increment
|
71
66
|
else
|
72
|
-
session[:current] = data.
|
67
|
+
session[:current] = data.key?('bytescont') ? session[:cumulative] + data['bytescont'].to_i : data['transfer_bytes'].to_i
|
73
68
|
update_progress
|
74
69
|
end
|
75
70
|
when 'STOP'
|
@@ -80,7 +75,7 @@ module Aspera
|
|
80
75
|
update_progress
|
81
76
|
update_total
|
82
77
|
else
|
83
|
-
Log.log.debug
|
78
|
+
Log.log.debug{"ignore: #{data['type']}"}
|
84
79
|
end
|
85
80
|
end
|
86
81
|
end
|
data/lib/aspera/cli/main.rb
CHANGED
@@ -25,7 +25,7 @@ module Aspera
|
|
25
25
|
# prefix to display error messages in user messages (terminal)
|
26
26
|
ERROR_FLASH = 'ERROR:'.bg_red.gray.blink.freeze
|
27
27
|
WARNING_FLASH = 'WARNING:'.bg_red.gray.blink.freeze
|
28
|
-
private_constant :ERROR_FLASH
|
28
|
+
private_constant :ERROR_FLASH, :WARNING_FLASH
|
29
29
|
|
30
30
|
# store transfer result using this key and use result_transfer_multiple
|
31
31
|
STATUS_FIELD = 'status'
|
@@ -66,7 +66,7 @@ module Aspera
|
|
66
66
|
item[STATUS_FIELD] = item[STATUS_FIELD].map(&:to_s).join(',')
|
67
67
|
end
|
68
68
|
raise global_status unless global_status.eql?(:success)
|
69
|
-
return {type: :object_list,data: status_table}
|
69
|
+
return {type: :object_list, data: status_table}
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -85,9 +85,9 @@ module Aspera
|
|
85
85
|
# @param http [Net::HTTP] the newly created http session object
|
86
86
|
def http_parameters=(http)
|
87
87
|
if @option_insecure
|
88
|
-
url=http.inspect.gsub(/^[^ ]* /,'https://').gsub(/ [^ ]*$/,'')
|
88
|
+
url = http.inspect.gsub(/^[^ ]* /, 'https://').gsub(/ [^ ]*$/, '')
|
89
89
|
if !@ssl_warned_urls.include?(url)
|
90
|
-
@plugin_env[:formater].display_message(:error,"#{WARNING_FLASH} ignoring certificate for: #{url}. Do not use unsafe certificates in production.")
|
90
|
+
@plugin_env[:formater].display_message(:error, "#{WARNING_FLASH} ignoring certificate for: #{url}. Do not use unsafe certificates in production.")
|
91
91
|
@ssl_warned_urls.push(url)
|
92
92
|
end
|
93
93
|
http.verify_mode = SELF_SIGNED_CERT
|
@@ -95,14 +95,14 @@ module Aspera
|
|
95
95
|
http.set_debug_output($stdout) if @option_rest_debug
|
96
96
|
raise 'http_options expects Hash' unless @option_http_options.is_a?(Hash)
|
97
97
|
|
98
|
-
@option_http_options.each do |k,v|
|
98
|
+
@option_http_options.each do |k, v|
|
99
99
|
method = "#{k}=".to_sym
|
100
100
|
# check if accessor is a method of Net::HTTP
|
101
101
|
# continue_timeout= read_timeout= write_timeout=
|
102
102
|
if http.respond_to?(method)
|
103
|
-
http.send(method,v)
|
103
|
+
http.send(method, v)
|
104
104
|
else
|
105
|
-
Log.log.error
|
105
|
+
Log.log.error{"no such attribute: #{k}"}
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
@@ -113,7 +113,7 @@ module Aspera
|
|
113
113
|
early_debug_setup(argv)
|
114
114
|
# compare $0 with expected name
|
115
115
|
current_prog_name = File.basename($PROGRAM_NAME)
|
116
|
-
@plugin_env[:formater].display_message(:error,"#{'WARNING'.bg_red.blink.gray} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}'") \
|
116
|
+
@plugin_env[:formater].display_message(:error, "#{'WARNING'.bg_red.blink.gray} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}'") \
|
117
117
|
unless current_prog_name.eql?(PROGRAM_NAME)
|
118
118
|
@option_help = false
|
119
119
|
@bash_completion = false
|
@@ -122,11 +122,11 @@ module Aspera
|
|
122
122
|
@option_rest_debug = false
|
123
123
|
@option_cache_tokens = true
|
124
124
|
@option_http_options = {}
|
125
|
-
@ssl_warned_urls=[]
|
125
|
+
@ssl_warned_urls = []
|
126
126
|
# environment provided to plugin for various capabilities
|
127
127
|
@plugin_env = {}
|
128
128
|
# give command line arguments to option manager
|
129
|
-
@plugin_env[:options] = @opt_mgr = Manager.new(PROGRAM_NAME,argv: argv)
|
129
|
+
@plugin_env[:options] = @opt_mgr = Manager.new(PROGRAM_NAME, argv: argv)
|
130
130
|
# formatter adds options
|
131
131
|
@plugin_env[:formater] = Formater.new(@plugin_env[:options])
|
132
132
|
Rest.user_agent = PROGRAM_NAME
|
@@ -136,13 +136,13 @@ module Aspera
|
|
136
136
|
# the Config plugin adds the @preset parser, so declare before TransferAgent which may use it
|
137
137
|
@plugin_env[:config] = Plugins::Config.new(@plugin_env, gem: GEM_NAME, name: PROGRAM_NAME, help: DOC_URL, version: Aspera::Cli::VERSION)
|
138
138
|
# the TransferAgent plugin may use the @preset parser
|
139
|
-
@plugin_env[:transfer] = TransferAgent.new(@plugin_env[:options]
|
139
|
+
@plugin_env[:transfer] = TransferAgent.new(@plugin_env[:options], @plugin_env[:config])
|
140
140
|
# data persistency
|
141
|
-
@plugin_env[:persistency] = PersistencyFolder.new(File.join(@plugin_env[:config].main_folder,'persist_store'))
|
141
|
+
@plugin_env[:persistency] = PersistencyFolder.new(File.join(@plugin_env[:config].main_folder, 'persist_store'))
|
142
142
|
Log.log.debug('plugin env created'.red)
|
143
143
|
Oauth.persist_mgr = @plugin_env[:persistency] if @option_cache_tokens
|
144
|
-
Fasp::Parameters.file_list_folder = File.join(@plugin_env[:config].main_folder,'filelists')
|
145
|
-
Aspera::RestErrorAnalyzer.instance.log_file = File.join(@plugin_env[:config].main_folder,'rest_exceptions.log')
|
144
|
+
Fasp::Parameters.file_list_folder = File.join(@plugin_env[:config].main_folder, 'filelists')
|
145
|
+
Aspera::RestErrorAnalyzer.instance.log_file = File.join(@plugin_env[:config].main_folder, 'rest_exceptions.log')
|
146
146
|
# register aspera REST call error handlers
|
147
147
|
Aspera::RestErrorsAspera.register_handlers
|
148
148
|
# set banner when all environment is created so that additional extended value modifiers are known, e.g. @preset
|
@@ -150,7 +150,7 @@ module Aspera
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def app_banner
|
153
|
-
t=' '*8
|
153
|
+
t = ' ' * 8
|
154
154
|
return <<~END_OF_BANNER
|
155
155
|
NAME
|
156
156
|
#{t}#{PROGRAM_NAME} -- a command line tool for Aspera Applications (v#{Aspera::Cli::VERSION})
|
@@ -187,32 +187,31 @@ module Aspera
|
|
187
187
|
# define header for manual
|
188
188
|
def init_global_options
|
189
189
|
Log.log.debug('init_global_options')
|
190
|
-
@opt_mgr.add_opt_switch(:help,'-h','Show this message.') { @option_help = true }
|
191
|
-
@opt_mgr.add_opt_switch(:bash_comp,'generate bash completion for command') { @bash_completion = true }
|
190
|
+
@opt_mgr.add_opt_switch(:help, '-h', 'Show this message.') { @option_help = true }
|
191
|
+
@opt_mgr.add_opt_switch(:bash_comp, 'generate bash completion for command') { @bash_completion = true }
|
192
192
|
@opt_mgr.add_opt_switch(:show_config, 'Display parameters used for the provided action.') { @option_show_config = true }
|
193
|
-
@opt_mgr.add_opt_switch(:rest_debug,'-r','more debug for HTTP calls') { @option_rest_debug = true }
|
194
|
-
@opt_mgr.add_opt_switch(:version,'-v','display version') { @plugin_env[:formater].display_message(:data,Aspera::Cli::VERSION);Process.exit(0) }
|
195
|
-
@opt_mgr.add_opt_switch(:warnings,'-w','check for language warnings') { $VERBOSE = true }
|
193
|
+
@opt_mgr.add_opt_switch(:rest_debug, '-r', 'more debug for HTTP calls') { @option_rest_debug = true }
|
194
|
+
@opt_mgr.add_opt_switch(:version, '-v', 'display version') { @plugin_env[:formater].display_message(:data, Aspera::Cli::VERSION); Process.exit(0) } # rubocop:disable Style/Semicolon, Layout/LineLength
|
195
|
+
@opt_mgr.add_opt_switch(:warnings, '-w', 'check for language warnings') { $VERBOSE = true }
|
196
196
|
# handler must be set before declaration
|
197
|
-
@opt_mgr.set_obj_attr(:log_level,Log.instance
|
198
|
-
@opt_mgr.set_obj_attr(:logger,Log.instance
|
199
|
-
@opt_mgr.set_obj_attr(:insecure,self
|
200
|
-
@opt_mgr.set_obj_attr(:ui,self
|
201
|
-
@opt_mgr.set_obj_attr(:http_options,self
|
202
|
-
@opt_mgr.set_obj_attr(:log_secrets,SecretHider
|
203
|
-
@opt_mgr.set_obj_attr(:cache_tokens,self
|
204
|
-
@opt_mgr.add_opt_list(:ui,OpenApplication.user_interfaces,'method to start browser')
|
205
|
-
@opt_mgr.add_opt_list(:log_level,Log.levels,'Log level')
|
206
|
-
@opt_mgr.add_opt_list(:logger,Log.logtypes,'log method')
|
207
|
-
@opt_mgr.add_opt_simple(:lock_port,'prevent dual execution of a command, e.g. in cron')
|
208
|
-
@opt_mgr.add_opt_simple(:
|
209
|
-
@opt_mgr.
|
210
|
-
@opt_mgr.add_opt_boolean(:
|
211
|
-
@opt_mgr.add_opt_boolean(:
|
212
|
-
@opt_mgr.add_opt_boolean(:
|
213
|
-
@opt_mgr.
|
214
|
-
@opt_mgr.set_option(:
|
215
|
-
@opt_mgr.set_option(:once_only,false)
|
197
|
+
@opt_mgr.set_obj_attr(:log_level, Log.instance, :level)
|
198
|
+
@opt_mgr.set_obj_attr(:logger, Log.instance, :logger_type)
|
199
|
+
@opt_mgr.set_obj_attr(:insecure, self, :option_insecure, :no)
|
200
|
+
@opt_mgr.set_obj_attr(:ui, self, :option_ui)
|
201
|
+
@opt_mgr.set_obj_attr(:http_options, self, :option_http_options)
|
202
|
+
@opt_mgr.set_obj_attr(:log_secrets, SecretHider, :log_secrets)
|
203
|
+
@opt_mgr.set_obj_attr(:cache_tokens, self, :option_cache_tokens)
|
204
|
+
@opt_mgr.add_opt_list(:ui, OpenApplication.user_interfaces, 'method to start browser')
|
205
|
+
@opt_mgr.add_opt_list(:log_level, Log.levels, 'Log level')
|
206
|
+
@opt_mgr.add_opt_list(:logger, Log.logtypes, 'log method')
|
207
|
+
@opt_mgr.add_opt_simple(:lock_port, 'prevent dual execution of a command, e.g. in cron')
|
208
|
+
@opt_mgr.add_opt_simple(:http_options, 'options for http socket (extended value)')
|
209
|
+
@opt_mgr.add_opt_boolean(:insecure, 'do not validate HTTPS certificate')
|
210
|
+
@opt_mgr.add_opt_boolean(:once_only, 'process only new items (some commands)')
|
211
|
+
@opt_mgr.add_opt_boolean(:log_secrets, 'show passwords in logs')
|
212
|
+
@opt_mgr.add_opt_boolean(:cache_tokens, 'save and reuse Oauth tokens')
|
213
|
+
@opt_mgr.set_option(:ui, OpenApplication.default_gui_mode)
|
214
|
+
@opt_mgr.set_option(:once_only, false)
|
216
215
|
# parse declared options
|
217
216
|
@opt_mgr.parse_options!
|
218
217
|
end
|
@@ -220,21 +219,21 @@ module Aspera
|
|
220
219
|
# @return the plugin instance, based on name
|
221
220
|
# also loads the plugin options, and default values from conf file
|
222
221
|
# @param plugin_name_sym : symbol for plugin name
|
223
|
-
def get_plugin_instance_with_options(plugin_name_sym,env=nil)
|
222
|
+
def get_plugin_instance_with_options(plugin_name_sym, env=nil)
|
224
223
|
env ||= @plugin_env
|
225
|
-
Log.log.debug
|
224
|
+
Log.log.debug{"get_plugin_instance_with_options(#{plugin_name_sym})"}
|
226
225
|
require @plugin_env[:config].plugins[plugin_name_sym][:require_stanza]
|
227
226
|
# load default params only if no param already loaded before plugin instanciation
|
228
227
|
env[:config].add_plugin_default_preset(plugin_name_sym)
|
229
228
|
command_plugin = Plugins::Config.plugin_class(plugin_name_sym).new(env)
|
230
|
-
Log.log.debug
|
229
|
+
Log.log.debug{"got #{command_plugin.class}"}
|
231
230
|
# TODO: check that ancestor is Plugin?
|
232
231
|
return command_plugin
|
233
232
|
end
|
234
233
|
|
235
234
|
def generate_bash_completion
|
236
|
-
if @opt_mgr.get_next_argument('',expected: :multiple,mandatory: false).nil?
|
237
|
-
@plugin_env[:config].plugins.
|
235
|
+
if @opt_mgr.get_next_argument('', expected: :multiple, mandatory: false).nil?
|
236
|
+
@plugin_env[:config].plugins.each_key{|p|puts p.to_s}
|
238
237
|
else
|
239
238
|
Log.log.warn('only first level completion so far')
|
240
239
|
end
|
@@ -244,19 +243,19 @@ module Aspera
|
|
244
243
|
def exit_with_usage(all_plugins)
|
245
244
|
Log.log.debug('exit_with_usage'.bg_red)
|
246
245
|
# display main plugin options
|
247
|
-
@plugin_env[:formater].display_message(:error
|
246
|
+
@plugin_env[:formater].display_message(:error, @opt_mgr.parser)
|
248
247
|
if all_plugins
|
249
248
|
# list plugins that have a "require" field, i.e. all but main plugin
|
250
|
-
@plugin_env[:config].plugins.
|
249
|
+
@plugin_env[:config].plugins.each_key do |plugin_name_sym|
|
251
250
|
next if plugin_name_sym.eql?(Plugins::Config::CONF_PLUGIN_SYM)
|
252
251
|
# override main option parser with a brand new, to avoid having global options
|
253
252
|
plugin_env = @plugin_env.clone
|
254
253
|
plugin_env[:man_only] = true
|
255
254
|
plugin_env[:options] = Manager.new(PROGRAM_NAME)
|
256
255
|
plugin_env[:options].parser.banner = '' # remove default banner
|
257
|
-
get_plugin_instance_with_options(plugin_name_sym,plugin_env)
|
256
|
+
get_plugin_instance_with_options(plugin_name_sym, plugin_env)
|
258
257
|
# display generated help for plugin options
|
259
|
-
@plugin_env[:formater].display_message(:error,plugin_env[:options].parser.help)
|
258
|
+
@plugin_env[:formater].display_message(:error, plugin_env[:options].parser.help)
|
260
259
|
end
|
261
260
|
end
|
262
261
|
Process.exit(0)
|
@@ -316,7 +315,7 @@ module Aspera
|
|
316
315
|
# help requested for current plugin
|
317
316
|
exit_with_usage(false) if @option_help
|
318
317
|
if @option_show_config
|
319
|
-
@plugin_env[:formater].display_results({type: :single_object,data: @opt_mgr.declared_options(only_defined: true)})
|
318
|
+
@plugin_env[:formater].display_results({type: :single_object, data: @opt_mgr.declared_options(only_defined: true)})
|
320
319
|
execute_command = false
|
321
320
|
end
|
322
321
|
# locking for single execution (only after "per plugin" option, in case lock port is there)
|
@@ -324,45 +323,45 @@ module Aspera
|
|
324
323
|
if !lock_port.nil?
|
325
324
|
begin
|
326
325
|
# no need to close later, will be freed on process exit. must save in member else it is garbage collected
|
327
|
-
Log.log.debug
|
328
|
-
@tcp_server = TCPServer.new('127.0.0.1',lock_port.to_i)
|
326
|
+
Log.log.debug{"Opening lock port #{lock_port.to_i}"}
|
327
|
+
@tcp_server = TCPServer.new('127.0.0.1', lock_port.to_i)
|
329
328
|
rescue StandardError => e
|
330
329
|
execute_command = false
|
331
|
-
Log.log.warn
|
330
|
+
Log.log.warn{"Another instance is already running (#{e.message})."}
|
332
331
|
end
|
333
332
|
end
|
334
333
|
# execute and display (if not exclusive execution)
|
335
334
|
@plugin_env[:formater].display_results(command_plugin.execute_action) if execute_command
|
336
335
|
# finish
|
337
336
|
@plugin_env[:transfer].shutdown
|
338
|
-
rescue Net::SSH::AuthenticationFailed => e; exception_info = {e: e,t: 'SSH',security: true}
|
339
|
-
rescue CliBadArgument => e; exception_info = {e: e,t: 'Argument',usage: true}
|
340
|
-
rescue CliNoSuchId => e; exception_info = {e: e,t: 'Identifier'}
|
341
|
-
rescue CliError => e; exception_info = {e: e,t: 'Tool',usage: true}
|
342
|
-
rescue Fasp::Error => e; exception_info = {e: e,t: 'FASP(ascp)'}
|
343
|
-
rescue Aspera::RestCallError => e; exception_info = {e: e,t: 'Rest'}
|
344
|
-
rescue SocketError => e; exception_info = {e: e,t: 'Network'}
|
345
|
-
rescue StandardError => e; exception_info = {e: e,t: 'Other',debug: true}
|
346
|
-
rescue Interrupt => e; exception_info = {e: e,t: 'Interruption',debug: true}
|
337
|
+
rescue Net::SSH::AuthenticationFailed => e; exception_info = {e: e, t: 'SSH', security: true}
|
338
|
+
rescue CliBadArgument => e; exception_info = {e: e, t: 'Argument', usage: true}
|
339
|
+
rescue CliNoSuchId => e; exception_info = {e: e, t: 'Identifier'}
|
340
|
+
rescue CliError => e; exception_info = {e: e, t: 'Tool', usage: true}
|
341
|
+
rescue Fasp::Error => e; exception_info = {e: e, t: 'FASP(ascp)'}
|
342
|
+
rescue Aspera::RestCallError => e; exception_info = {e: e, t: 'Rest'}
|
343
|
+
rescue SocketError => e; exception_info = {e: e, t: 'Network'}
|
344
|
+
rescue StandardError => e; exception_info = {e: e, t: 'Other', debug: true}
|
345
|
+
rescue Interrupt => e; exception_info = {e: e, t: 'Interruption', debug: true}
|
347
346
|
end
|
348
347
|
# cleanup file list files
|
349
348
|
TempFileManager.instance.cleanup
|
350
349
|
# 1- processing of error condition
|
351
350
|
unless exception_info.nil?
|
352
351
|
Log.log.warn(exception_info[:e].message) if Aspera::Log.instance.logger_type.eql?(:syslog) && exception_info[:security]
|
353
|
-
@plugin_env[:formater].display_message(:error,"#{ERROR_FLASH} #{exception_info[:t]}: #{exception_info[:e].message}")
|
354
|
-
@plugin_env[:formater].display_message(:error,'Use option -h to get help.') if exception_info[:usage]
|
352
|
+
@plugin_env[:formater].display_message(:error, "#{ERROR_FLASH} #{exception_info[:t]}: #{exception_info[:e].message}")
|
353
|
+
@plugin_env[:formater].display_message(:error, 'Use option -h to get help.') if exception_info[:usage]
|
355
354
|
if exception_info[:e].is_a?(Fasp::Error) && exception_info[:e].message.eql?('Remote host is not who we expected')
|
356
|
-
@plugin_env[:formater].display_message(:error,"For this specific error, refer to:\n"\
|
355
|
+
@plugin_env[:formater].display_message(:error, "For this specific error, refer to:\n"\
|
357
356
|
"#{SRC_URL}#error-remote-host-is-not-who-we-expected\nAdd this to arguments:\n--ts=@json:'{\"sshfp\":null}'")
|
358
357
|
end
|
359
358
|
end
|
360
359
|
# 2- processing of command not processed (due to exception or bad command line)
|
361
360
|
if execute_command || @option_show_config
|
362
361
|
@opt_mgr.final_errors.each do |msg|
|
363
|
-
@plugin_env[:formater].display_message(:error,"#{ERROR_FLASH} Argument: #{msg}")
|
362
|
+
@plugin_env[:formater].display_message(:error, "#{ERROR_FLASH} Argument: #{msg}")
|
364
363
|
# add code as exception if there is not already an error
|
365
|
-
exception_info = {e: Exception.new(msg),t: 'UnusedArg'} if exception_info.nil?
|
364
|
+
exception_info = {e: Exception.new(msg), t: 'UnusedArg'} if exception_info.nil?
|
366
365
|
end
|
367
366
|
end
|
368
367
|
# 3- in case of error, fail the process status
|
@@ -370,7 +369,7 @@ module Aspera
|
|
370
369
|
# show stack trace in debug mode
|
371
370
|
raise exception_info[:e] if Log.instance.level.eql?(:debug)
|
372
371
|
# else give hint and exit
|
373
|
-
@plugin_env[:formater].display_message(:error,'Use --log-level=debug to get more details.') if exception_info[:debug]
|
372
|
+
@plugin_env[:formater].display_message(:error, 'Use --log-level=debug to get more details.') if exception_info[:debug]
|
374
373
|
Process.exit(1)
|
375
374
|
end
|
376
375
|
return nil
|