aspera-cli 4.6.0 → 4.7.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
- data/README.md +427 -300
- data/bin/ascli +2 -1
- data/bin/asession +1 -0
- data/docs/test_env.conf +2 -0
- data/examples/aoc.rb +4 -3
- data/examples/faspex4.rb +21 -19
- data/examples/proxy.pac +1 -1
- data/examples/transfer.rb +15 -15
- data/lib/aspera/aoc.rb +135 -124
- data/lib/aspera/ascmd.rb +85 -75
- data/lib/aspera/ats_api.rb +11 -10
- data/lib/aspera/cli/basic_auth_plugin.rb +13 -14
- data/lib/aspera/cli/extended_value.rb +42 -33
- data/lib/aspera/cli/formater.rb +138 -111
- data/lib/aspera/cli/info.rb +17 -0
- data/lib/aspera/cli/listener/line_dump.rb +3 -2
- data/lib/aspera/cli/listener/logger.rb +2 -1
- data/lib/aspera/cli/listener/progress.rb +16 -18
- data/lib/aspera/cli/listener/progress_multi.rb +13 -16
- data/lib/aspera/cli/main.rb +122 -130
- data/lib/aspera/cli/manager.rb +146 -154
- data/lib/aspera/cli/plugin.rb +38 -34
- data/lib/aspera/cli/plugins/alee.rb +6 -6
- data/lib/aspera/cli/plugins/aoc.rb +273 -276
- data/lib/aspera/cli/plugins/ats.rb +82 -76
- data/lib/aspera/cli/plugins/bss.rb +14 -16
- data/lib/aspera/cli/plugins/config.rb +350 -306
- data/lib/aspera/cli/plugins/console.rb +23 -19
- data/lib/aspera/cli/plugins/cos.rb +18 -18
- data/lib/aspera/cli/plugins/faspex.rb +180 -159
- data/lib/aspera/cli/plugins/faspex5.rb +64 -54
- data/lib/aspera/cli/plugins/node.rb +147 -140
- data/lib/aspera/cli/plugins/orchestrator.rb +68 -66
- data/lib/aspera/cli/plugins/preview.rb +92 -96
- data/lib/aspera/cli/plugins/server.rb +79 -75
- data/lib/aspera/cli/plugins/shares.rb +23 -24
- data/lib/aspera/cli/plugins/sync.rb +20 -22
- data/lib/aspera/cli/transfer_agent.rb +40 -39
- data/lib/aspera/cli/version.rb +2 -1
- data/lib/aspera/colors.rb +35 -27
- data/lib/aspera/command_line_builder.rb +48 -34
- data/lib/aspera/cos_node.rb +29 -21
- data/lib/aspera/data_repository.rb +3 -2
- data/lib/aspera/environment.rb +50 -45
- data/lib/aspera/fasp/agent_base.rb +22 -20
- data/lib/aspera/fasp/agent_connect.rb +13 -11
- data/lib/aspera/fasp/agent_direct.rb +48 -59
- data/lib/aspera/fasp/agent_httpgw.rb +33 -39
- data/lib/aspera/fasp/agent_node.rb +15 -13
- data/lib/aspera/fasp/agent_trsdk.rb +12 -14
- data/lib/aspera/fasp/error.rb +2 -1
- data/lib/aspera/fasp/error_info.rb +68 -52
- data/lib/aspera/fasp/installation.rb +106 -94
- data/lib/aspera/fasp/listener.rb +1 -0
- data/lib/aspera/fasp/parameters.rb +83 -92
- data/lib/aspera/fasp/parameters.yaml +305 -249
- data/lib/aspera/fasp/resume_policy.rb +11 -14
- data/lib/aspera/fasp/transfer_spec.rb +26 -0
- data/lib/aspera/fasp/uri.rb +22 -21
- data/lib/aspera/faspex_gw.rb +55 -90
- data/lib/aspera/hash_ext.rb +4 -3
- data/lib/aspera/id_generator.rb +8 -7
- data/lib/aspera/keychain/encrypted_hash.rb +17 -16
- data/lib/aspera/keychain/macos_security.rb +6 -10
- data/lib/aspera/log.rb +25 -20
- data/lib/aspera/nagios.rb +13 -12
- data/lib/aspera/node.rb +30 -22
- data/lib/aspera/oauth.rb +175 -226
- data/lib/aspera/open_application.rb +4 -3
- data/lib/aspera/persistency_action_once.rb +6 -6
- data/lib/aspera/persistency_folder.rb +5 -9
- data/lib/aspera/preview/file_types.rb +6 -5
- data/lib/aspera/preview/generator.rb +25 -24
- data/lib/aspera/preview/options.rb +16 -14
- data/lib/aspera/preview/utils.rb +98 -98
- data/lib/aspera/{proxy_auto_config.erb.js → proxy_auto_config.js} +23 -31
- data/lib/aspera/proxy_auto_config.rb +111 -20
- data/lib/aspera/rest.rb +115 -113
- data/lib/aspera/rest_call_error.rb +2 -2
- data/lib/aspera/rest_error_analyzer.rb +23 -25
- data/lib/aspera/rest_errors_aspera.rb +15 -14
- data/lib/aspera/ssh.rb +12 -10
- data/lib/aspera/sync.rb +42 -41
- data/lib/aspera/temp_file_manager.rb +18 -14
- data/lib/aspera/timer_limiter.rb +2 -1
- data/lib/aspera/uri_reader.rb +7 -5
- data/lib/aspera/web_auth.rb +79 -76
- metadata +64 -21
- data/docs/Makefile +0 -65
- data/docs/README.erb.md +0 -4424
- data/docs/README.md +0 -13
- data/docs/diagrams.txt +0 -49
- data/docs/doc_tools.rb +0 -58
- data/lib/aspera/cli/plugins/shares2.rb +0 -114
- data/lib/aspera/fasp/default.rb +0 -17
data/lib/aspera/cli/main.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'aspera/cli/manager'
|
|
2
3
|
require 'aspera/cli/formater'
|
|
3
4
|
require 'aspera/cli/plugins/config'
|
|
4
5
|
require 'aspera/cli/extended_value'
|
|
5
6
|
require 'aspera/cli/transfer_agent'
|
|
6
7
|
require 'aspera/cli/version'
|
|
8
|
+
require 'aspera/cli/info'
|
|
7
9
|
require 'aspera/fasp/error'
|
|
8
10
|
require 'aspera/open_application'
|
|
9
11
|
require 'aspera/temp_file_manager'
|
|
@@ -11,38 +13,74 @@ require 'aspera/persistency_folder'
|
|
|
11
13
|
require 'aspera/log'
|
|
12
14
|
require 'aspera/rest'
|
|
13
15
|
require 'aspera/nagios'
|
|
16
|
+
require 'aspera/colors'
|
|
14
17
|
|
|
15
18
|
module Aspera
|
|
16
19
|
module Cli
|
|
17
20
|
# The main CLI class
|
|
18
21
|
class Main
|
|
22
|
+
# prefix to display error messages
|
|
23
|
+
ERROR_FLASH='ERROR:'.bg_red.gray.blink.freeze
|
|
24
|
+
private_constant :ERROR_FLASH
|
|
19
25
|
|
|
20
|
-
private
|
|
21
|
-
# name of application, also used as foldername where config is stored
|
|
22
|
-
PROGRAM_NAME = 'ascli'
|
|
23
|
-
# name of the containing gem, same as in <gem name>.gemspec
|
|
24
|
-
GEM_NAME = 'aspera-cli'
|
|
25
|
-
HELP_URL = "http://www.rubydoc.info/gems/#{GEM_NAME}"
|
|
26
|
-
GEM_URL = "https://rubygems.org/gems/#{GEM_NAME}"
|
|
27
|
-
SRC_URL = 'https://github.com/IBM/aspera-cli'
|
|
28
26
|
# store transfer result using this key and use result_transfer_multiple
|
|
29
27
|
STATUS_FIELD = 'status'
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
class << self
|
|
30
|
+
# expect some list, but nothing to display
|
|
31
|
+
def result_empty; return {type: :empty, data: :nil}; end
|
|
32
|
+
|
|
33
|
+
# nothing expected
|
|
34
|
+
def result_nothing; return {type: :nothing, data: :nil}; end
|
|
35
|
+
|
|
36
|
+
def result_status(status); return {type: :status, data: status}; end
|
|
37
|
+
|
|
38
|
+
def result_success; return result_status('complete'); end
|
|
39
|
+
|
|
40
|
+
# Process statuses of finished transfer sessions
|
|
41
|
+
# raise exception if there is one error
|
|
42
|
+
# else returns an empty status
|
|
43
|
+
def result_transfer(statuses)
|
|
44
|
+
worst=TransferAgent.session_status(statuses)
|
|
45
|
+
raise worst unless worst.eql?(:success)
|
|
46
|
+
return Main.result_nothing
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# used when one command executes several transfer jobs (each job being possibly multi session)
|
|
50
|
+
# @param status_table [Array] [{STATUS_FIELD=>[status array],...},...]
|
|
51
|
+
# @return a status object suitable as command result
|
|
52
|
+
# each element has a key STATUS_FIELD which contains the result of possibly multiple sessions
|
|
53
|
+
def result_transfer_multiple(status_table)
|
|
54
|
+
global_status=:success
|
|
55
|
+
# transform status array into string and find if there was problem
|
|
56
|
+
status_table.each do |item|
|
|
57
|
+
worst=TransferAgent.session_status(item[STATUS_FIELD])
|
|
58
|
+
global_status=worst unless worst.eql?(:success)
|
|
59
|
+
item[STATUS_FIELD]=item[STATUS_FIELD].map(&:to_s).join(',')
|
|
60
|
+
end
|
|
61
|
+
raise global_status unless global_status.eql?(:success)
|
|
62
|
+
return {type: :object_list,data: status_table}
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
32
68
|
# =============================================================
|
|
33
69
|
# Parameter handlers
|
|
34
70
|
#
|
|
35
|
-
attr_accessor :option_insecure, :option_http_options
|
|
71
|
+
attr_accessor :option_insecure, :option_http_options, :option_cache_tokens
|
|
72
|
+
|
|
36
73
|
def option_ui; OpenApplication.instance.url_method; end
|
|
37
74
|
|
|
38
75
|
def option_ui=(value); OpenApplication.instance.url_method=value; end
|
|
39
76
|
|
|
40
77
|
# called everytime a new REST HTTP session is opened
|
|
41
78
|
# @param http [Net::HTTP] the newly created http session object
|
|
42
|
-
def
|
|
79
|
+
def http_parameters=(http)
|
|
43
80
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @option_insecure
|
|
44
81
|
http.set_debug_output($stdout) if @option_rest_debug
|
|
45
82
|
raise 'http_options expects Hash' unless @option_http_options.is_a?(Hash)
|
|
83
|
+
|
|
46
84
|
@option_http_options.each do |k,v|
|
|
47
85
|
method="#{k}=".to_sym
|
|
48
86
|
# check if accessor is a method of Net::HTTP
|
|
@@ -61,14 +99,13 @@ module Aspera
|
|
|
61
99
|
early_debug_setup(argv)
|
|
62
100
|
# compare $0 with expected name
|
|
63
101
|
current_prog_name=File.basename($PROGRAM_NAME)
|
|
64
|
-
unless current_prog_name.eql?(PROGRAM_NAME)
|
|
65
|
-
@plugin_env[:formater].display_message(:error,"#{"WARNING".bg_red.blink.gray} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}', '#{current_prog_name}' will be removed in a future version")
|
|
66
|
-
end
|
|
102
|
+
@plugin_env[:formater].display_message(:error,"#{'WARNING'.bg_red.blink.gray} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}'") unless current_prog_name.eql?(PROGRAM_NAME)
|
|
67
103
|
@option_help=false
|
|
68
104
|
@bash_completion=false
|
|
69
105
|
@option_show_config=false
|
|
70
106
|
@option_insecure=false
|
|
71
107
|
@option_rest_debug=false
|
|
108
|
+
@option_cache_tokens=true
|
|
72
109
|
@option_http_options={}
|
|
73
110
|
# environment provided to plugin for various capabilities
|
|
74
111
|
@plugin_env={}
|
|
@@ -77,47 +114,57 @@ module Aspera
|
|
|
77
114
|
# formatter adds options
|
|
78
115
|
@plugin_env[:formater]=Formater.new(@plugin_env[:options])
|
|
79
116
|
Rest.user_agent=PROGRAM_NAME
|
|
80
|
-
Rest.session_cb=lambda
|
|
117
|
+
Rest.session_cb=lambda{|http|self.http_parameters=http}
|
|
81
118
|
# declare and parse global options
|
|
82
119
|
init_global_options()
|
|
83
120
|
# the Config plugin adds the @preset parser, so declare before TransferAgent which may use it
|
|
84
|
-
@plugin_env[:config]=Plugins::Config.new(@plugin_env,PROGRAM_NAME,
|
|
121
|
+
@plugin_env[:config]=Plugins::Config.new(@plugin_env, gem: GEM_NAME, name: PROGRAM_NAME, help: DOC_URL, version: Aspera::Cli::VERSION)
|
|
85
122
|
# the TransferAgent plugin may use the @preset parser
|
|
86
123
|
@plugin_env[:transfer]=TransferAgent.new(@plugin_env[:options],@plugin_env[:config])
|
|
87
124
|
# data persistency
|
|
88
125
|
@plugin_env[:persistency]=PersistencyFolder.new(File.join(@plugin_env[:config].main_folder,'persist_store'))
|
|
89
126
|
Log.log.debug('plugin env created'.red)
|
|
90
|
-
Oauth.persist_mgr=@plugin_env[:persistency]
|
|
127
|
+
Oauth.persist_mgr=@plugin_env[:persistency] if @option_cache_tokens
|
|
91
128
|
Fasp::Parameters.file_list_folder=File.join(@plugin_env[:config].main_folder,'filelists')
|
|
92
129
|
Aspera::RestErrorAnalyzer.instance.log_file=File.join(@plugin_env[:config].main_folder,'rest_exceptions.log')
|
|
93
130
|
# register aspera REST call error handlers
|
|
94
|
-
Aspera::RestErrorsAspera.
|
|
131
|
+
Aspera::RestErrorsAspera.register_handlers
|
|
95
132
|
# set banner when all environment is created so that additional extended value modifiers are known, e.g. @preset
|
|
96
133
|
@opt_mgr.parser.banner=app_banner
|
|
97
134
|
end
|
|
98
135
|
|
|
99
136
|
def app_banner
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
137
|
+
return <<~END_OF_BANNER
|
|
138
|
+
NAME
|
|
139
|
+
\t#{PROGRAM_NAME} -- a command line tool for Aspera Applications (v#{Aspera::Cli::VERSION})
|
|
140
|
+
|
|
141
|
+
SYNOPSIS
|
|
142
|
+
\t#{PROGRAM_NAME} COMMANDS [OPTIONS] [ARGS]
|
|
143
|
+
|
|
144
|
+
DESCRIPTION
|
|
145
|
+
\tUse Aspera application to perform operations on command line.
|
|
146
|
+
\tDocumentation and examples: #{GEM_URL}
|
|
147
|
+
\texecute: #{PROGRAM_NAME} conf doc
|
|
148
|
+
\tor visit: #{DOC_URL}
|
|
149
|
+
\tsource repo: #{SRC_URL}
|
|
150
|
+
|
|
151
|
+
ENVIRONMENT VARIABLES
|
|
152
|
+
\t#{@plugin_env[:config].conf_dir_env_var} config folder, default: $HOME/#{Plugins::Config::ASPERA_HOME_FOLDER_NAME}/#{PROGRAM_NAME}
|
|
153
|
+
\tAny option can be set as an environment variable, refer to the manual
|
|
154
|
+
|
|
155
|
+
COMMANDS
|
|
156
|
+
\tTo list first level commands, execute: #{PROGRAM_NAME}
|
|
157
|
+
\tNote that commands can be written shortened (provided it is unique).
|
|
158
|
+
|
|
159
|
+
OPTIONS
|
|
160
|
+
\tOptions begin with a '-' (minus), and value is provided on command line.
|
|
161
|
+
\tSpecial values are supported beginning with special prefix @pfx:, where pfx is one of:
|
|
162
|
+
\t#{ExtendedValue.instance.modifiers.map(&:to_s).join(', ')}
|
|
163
|
+
\tDates format is 'DD-MM-YY HH:MM:SS', or 'now' or '-<num>h'
|
|
164
|
+
|
|
165
|
+
ARGS
|
|
166
|
+
\tSome commands require mandatory arguments, e.g. a path.
|
|
167
|
+
END_OF_BANNER
|
|
121
168
|
end
|
|
122
169
|
|
|
123
170
|
# define header for manual
|
|
@@ -135,7 +182,8 @@ module Aspera
|
|
|
135
182
|
@opt_mgr.set_obj_attr(:insecure,self,:option_insecure,:no)
|
|
136
183
|
@opt_mgr.set_obj_attr(:ui,self,:option_ui)
|
|
137
184
|
@opt_mgr.set_obj_attr(:http_options,self,:option_http_options)
|
|
138
|
-
@opt_mgr.set_obj_attr(:
|
|
185
|
+
@opt_mgr.set_obj_attr(:log_secrets,Log.instance,:log_secrets)
|
|
186
|
+
@opt_mgr.set_obj_attr(:cache_tokens,self,:option_cache_tokens)
|
|
139
187
|
@opt_mgr.add_opt_list(:ui,OpenApplication.user_interfaces,'method to start browser')
|
|
140
188
|
@opt_mgr.add_opt_list(:log_level,Log.levels,'Log level')
|
|
141
189
|
@opt_mgr.add_opt_list(:logger,Log.logtypes,'log method')
|
|
@@ -144,9 +192,10 @@ module Aspera
|
|
|
144
192
|
@opt_mgr.add_opt_simple(:http_options,'options for http socket (extended value)')
|
|
145
193
|
@opt_mgr.add_opt_boolean(:insecure,'do not validate HTTPS certificate')
|
|
146
194
|
@opt_mgr.add_opt_boolean(:once_only,'process only new items (some commands)')
|
|
147
|
-
@opt_mgr.add_opt_boolean(:
|
|
195
|
+
@opt_mgr.add_opt_boolean(:log_secrets,'show passwords in logs')
|
|
196
|
+
@opt_mgr.add_opt_boolean(:cache_tokens,'save and reuse Oauth tokens')
|
|
148
197
|
@opt_mgr.set_option(:ui,OpenApplication.default_gui_mode)
|
|
149
|
-
@opt_mgr.set_option(:once_only
|
|
198
|
+
@opt_mgr.set_option(:once_only,false)
|
|
150
199
|
# parse declared options
|
|
151
200
|
@opt_mgr.parse_options!
|
|
152
201
|
end
|
|
@@ -175,16 +224,6 @@ module Aspera
|
|
|
175
224
|
Process.exit(0)
|
|
176
225
|
end
|
|
177
226
|
|
|
178
|
-
# expect some list, but nothing to display
|
|
179
|
-
def self.result_empty; return {:type => :empty, :data => :nil }; end
|
|
180
|
-
|
|
181
|
-
# nothing expected
|
|
182
|
-
def self.result_nothing; return {:type => :nothing, :data => :nil }; end
|
|
183
|
-
|
|
184
|
-
def self.result_status(status); return {:type => :status, :data => status }; end
|
|
185
|
-
|
|
186
|
-
def self.result_success; return result_status('complete'); end
|
|
187
|
-
|
|
188
227
|
def exit_with_usage(all_plugins)
|
|
189
228
|
Log.log.debug('exit_with_usage'.bg_red)
|
|
190
229
|
# display main plugin options
|
|
@@ -208,67 +247,21 @@ module Aspera
|
|
|
208
247
|
|
|
209
248
|
protected
|
|
210
249
|
|
|
211
|
-
# env var name to override the app's main folder
|
|
212
|
-
# default main folder is $HOME/<vendor main app folder>/<program name>
|
|
213
|
-
def conf_dir_env_var
|
|
214
|
-
return "#{PROGRAM_NAME}_home".upcase
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
def app_main_folder
|
|
218
|
-
# find out application main folder
|
|
219
|
-
app_folder=ENV[conf_dir_env_var]
|
|
220
|
-
# if env var undefined or empty
|
|
221
|
-
if app_folder.nil? or app_folder.empty?
|
|
222
|
-
user_home_folder=Dir.home
|
|
223
|
-
raise CliError,"Home folder does not exist: #{user_home_folder}. Check your user environment or use #{conf_dir_env_var}." unless Dir.exist?(user_home_folder)
|
|
224
|
-
app_folder=File.join(user_home_folder,Plugins::Config::ASPERA_HOME_FOLDER_NAME,PROGRAM_NAME)
|
|
225
|
-
end
|
|
226
|
-
return app_folder
|
|
227
|
-
end
|
|
228
|
-
|
|
229
250
|
# early debug for parser
|
|
230
251
|
# Note: does not accept shortcuts
|
|
231
252
|
def early_debug_setup(argv)
|
|
232
253
|
Log.instance.program_name=PROGRAM_NAME
|
|
233
254
|
argv.each do |arg|
|
|
234
255
|
case arg
|
|
235
|
-
when '--'
|
|
236
|
-
|
|
237
|
-
when /^--
|
|
238
|
-
Log.instance.level = $1.to_sym
|
|
239
|
-
when /^--logger=(.*)/
|
|
240
|
-
Log.instance.logger_type=$1.to_sym
|
|
256
|
+
when '--' then break
|
|
257
|
+
when /^--log-level=(.*)/ then Log.instance.level = Regexp.last_match(1).to_sym
|
|
258
|
+
when /^--logger=(.*)/ then Log.instance.logger_type=Regexp.last_match(1).to_sym
|
|
241
259
|
end
|
|
242
260
|
end
|
|
243
261
|
end
|
|
244
262
|
|
|
245
263
|
public
|
|
246
264
|
|
|
247
|
-
# Process statuses of finished transfer sessions
|
|
248
|
-
# raise exception if there is one error
|
|
249
|
-
# else returns an empty status
|
|
250
|
-
def self.result_transfer(statuses)
|
|
251
|
-
worst=TransferAgent.session_status(statuses)
|
|
252
|
-
raise worst unless worst.eql?(:success)
|
|
253
|
-
return Main.result_nothing
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
# used when one command executes several transfer jobs (each job being possibly multi session)
|
|
257
|
-
# @param status_table [Array] [{STATUS_FIELD=>[status array],...},...]
|
|
258
|
-
# @return a status object suitable as command result
|
|
259
|
-
# each element has a key STATUS_FIELD which contains the result of possibly multiple sessions
|
|
260
|
-
def self.result_transfer_multiple(status_table)
|
|
261
|
-
global_status=:success
|
|
262
|
-
# transform status array into string and find if there was problem
|
|
263
|
-
status_table.each do |item|
|
|
264
|
-
worst=TransferAgent.session_status(item[STATUS_FIELD])
|
|
265
|
-
global_status=worst unless worst.eql?(:success)
|
|
266
|
-
item[STATUS_FIELD]=item[STATUS_FIELD].map{|i|i.to_s}.join(',')
|
|
267
|
-
end
|
|
268
|
-
raise global_status unless global_status.eql?(:success)
|
|
269
|
-
return {:type=>:object_list,:data=>status_table}
|
|
270
|
-
end
|
|
271
|
-
|
|
272
265
|
# this is the main function called by initial script just after constructor
|
|
273
266
|
def process_command_line
|
|
274
267
|
Log.log.debug('process_command_line')
|
|
@@ -280,16 +273,17 @@ module Aspera
|
|
|
280
273
|
# find plugins, shall be after parse! ?
|
|
281
274
|
@plugin_env[:config].add_plugins_from_lookup_folders
|
|
282
275
|
# help requested without command ? (plugins must be known here)
|
|
283
|
-
exit_with_usage(true) if @option_help
|
|
276
|
+
exit_with_usage(true) if @option_help && @opt_mgr.command_or_arg_empty?
|
|
284
277
|
generate_bash_completion if @bash_completion
|
|
285
278
|
@plugin_env[:config].periodic_check_newer_gem_version
|
|
286
|
-
|
|
287
|
-
|
|
279
|
+
command_sym=
|
|
280
|
+
if @option_show_config && @opt_mgr.command_or_arg_empty?
|
|
281
|
+
Plugins::Config::CONF_PLUGIN_SYM
|
|
288
282
|
else
|
|
289
|
-
|
|
283
|
+
@opt_mgr.get_next_command(@plugin_env[:config].plugins.keys.dup.unshift(:help))
|
|
290
284
|
end
|
|
291
285
|
# command will not be executed, but we need manual
|
|
292
|
-
@opt_mgr.fail_on_missing_mandatory=false if @option_help
|
|
286
|
+
@opt_mgr.fail_on_missing_mandatory=false if @option_help || @option_show_config
|
|
293
287
|
# main plugin is not dynamically instanciated
|
|
294
288
|
case command_sym
|
|
295
289
|
when :help
|
|
@@ -305,8 +299,8 @@ module Aspera
|
|
|
305
299
|
# help requested for current plugin
|
|
306
300
|
exit_with_usage(false) if @option_help
|
|
307
301
|
if @option_show_config
|
|
308
|
-
@plugin_env[:formater].display_results({:
|
|
309
|
-
|
|
302
|
+
@plugin_env[:formater].display_results({type: :single_object,data: @opt_mgr.declared_options(only_defined: true)})
|
|
303
|
+
execute_command=false
|
|
310
304
|
end
|
|
311
305
|
# locking for single execution (only after "per plugin" option, in case lock port is there)
|
|
312
306
|
lock_port=@opt_mgr.get_option(:lock_port,:optional)
|
|
@@ -315,7 +309,7 @@ module Aspera
|
|
|
315
309
|
# no need to close later, will be freed on process exit. must save in member else it is garbage collected
|
|
316
310
|
Log.log.debug("Opening lock port #{lock_port.to_i}")
|
|
317
311
|
@tcp_server=TCPServer.new('127.0.0.1',lock_port.to_i)
|
|
318
|
-
rescue => e
|
|
312
|
+
rescue StandardError => e
|
|
319
313
|
execute_command=false
|
|
320
314
|
Log.log.warn("Another instance is already running (#{e.message}).")
|
|
321
315
|
end
|
|
@@ -324,42 +318,40 @@ module Aspera
|
|
|
324
318
|
@plugin_env[:formater].display_results(command_plugin.execute_action) if execute_command
|
|
325
319
|
# finish
|
|
326
320
|
@plugin_env[:transfer].shutdown
|
|
327
|
-
rescue CliBadArgument => e; exception_info=
|
|
328
|
-
rescue CliNoSuchId => e; exception_info=
|
|
329
|
-
rescue CliError => e; exception_info=
|
|
330
|
-
rescue Fasp::Error => e; exception_info=
|
|
331
|
-
rescue Aspera::RestCallError => e; exception_info=
|
|
332
|
-
rescue SocketError => e; exception_info=
|
|
333
|
-
rescue StandardError => e; exception_info=
|
|
334
|
-
rescue Interrupt => e; exception_info=
|
|
321
|
+
rescue CliBadArgument => e; exception_info={e: e,t: 'Argument',usage: true}
|
|
322
|
+
rescue CliNoSuchId => e; exception_info={e: e,t: 'Identifier'}
|
|
323
|
+
rescue CliError => e; exception_info={e: e,t: 'Tool',usage: true}
|
|
324
|
+
rescue Fasp::Error => e; exception_info={e: e,t: 'FASP(ascp)'}
|
|
325
|
+
rescue Aspera::RestCallError => e; exception_info={e: e,t: 'Rest'}
|
|
326
|
+
rescue SocketError => e; exception_info={e: e,t: 'Network'}
|
|
327
|
+
rescue StandardError => e; exception_info={e: e,t: 'Other',debug: true}
|
|
328
|
+
rescue Interrupt => e; exception_info={e: e,t: 'Interruption',debug: true}
|
|
335
329
|
end
|
|
336
330
|
# cleanup file list files
|
|
337
331
|
TempFileManager.instance.cleanup
|
|
338
332
|
# 1- processing of error condition
|
|
339
333
|
unless exception_info.nil?
|
|
340
|
-
@plugin_env[:formater].display_message(:error,"#{
|
|
341
|
-
@plugin_env[:formater].display_message(:error,'Use option -h to get help.') if exception_info[
|
|
342
|
-
if exception_info.
|
|
334
|
+
@plugin_env[:formater].display_message(:error,"#{ERROR_FLASH} #{exception_info[:t]}: #{exception_info[:e].message}")
|
|
335
|
+
@plugin_env[:formater].display_message(:error,'Use option -h to get help.') if exception_info[:usage]
|
|
336
|
+
if exception_info[:e].is_a?(Fasp::Error) && exception_info[:e].message.eql?('Remote host is not who we expected')
|
|
343
337
|
@plugin_env[:formater].display_message(:error,"For this specific error, refer to:\n#{SRC_URL}#error-remote-host-is-not-who-we-expected\nAdd this to arguments:\n--ts=@json:'{\"sshfp\":null}'")
|
|
344
338
|
end
|
|
345
339
|
end
|
|
346
340
|
# 2- processing of command not processed (due to exception or bad command line)
|
|
347
|
-
if execute_command
|
|
341
|
+
if execute_command || @option_show_config
|
|
348
342
|
@opt_mgr.final_errors.each do |msg|
|
|
349
|
-
@plugin_env[:formater].display_message(:error,"#{
|
|
343
|
+
@plugin_env[:formater].display_message(:error,"#{ERROR_FLASH} Argument: #{msg}")
|
|
350
344
|
# add code as exception if there is not already an error
|
|
351
|
-
exception_info=
|
|
345
|
+
exception_info={e: Exception.new(msg),t: 'UnusedArg'} if exception_info.nil?
|
|
352
346
|
end
|
|
353
347
|
end
|
|
354
348
|
# 3- in case of error, fail the process status
|
|
355
349
|
unless exception_info.nil?
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
Process.exit(1)
|
|
362
|
-
end
|
|
350
|
+
# show stack trace in debug mode
|
|
351
|
+
raise exception_info[:e] if Log.instance.level.eql?(:debug)
|
|
352
|
+
# else give hint and exit
|
|
353
|
+
@plugin_env[:formater].display_message(:error,'Use --log-level=debug to get more details.') if exception_info[:debug]
|
|
354
|
+
Process.exit(1)
|
|
363
355
|
end
|
|
364
356
|
return nil
|
|
365
357
|
end # process_command_line
|