aspera-cli 4.14.0 → 4.16.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 +29 -3
- data/CHANGELOG.md +300 -185
- data/CONTRIBUTING.md +74 -23
- data/README.md +2346 -1619
- data/bin/ascli +16 -25
- data/bin/asession +15 -15
- data/examples/dascli +2 -2
- data/examples/proxy.pac +1 -1
- data/lib/aspera/aoc.rb +216 -150
- data/lib/aspera/ascmd.rb +25 -18
- data/lib/aspera/assert.rb +45 -0
- data/lib/aspera/cli/basic_auth_plugin.rb +9 -6
- data/lib/aspera/cli/error.rb +17 -0
- data/lib/aspera/cli/extended_value.rb +51 -16
- data/lib/aspera/cli/formatter.rb +276 -174
- data/lib/aspera/cli/hints.rb +81 -0
- data/lib/aspera/cli/main.rb +114 -147
- data/lib/aspera/cli/manager.rb +181 -136
- data/lib/aspera/cli/plugin.rb +82 -64
- data/lib/aspera/cli/plugins/alee.rb +0 -1
- data/lib/aspera/cli/plugins/aoc.rb +327 -331
- data/lib/aspera/cli/plugins/ats.rb +12 -8
- data/lib/aspera/cli/plugins/bss.rb +2 -2
- data/lib/aspera/cli/plugins/config.rb +575 -439
- data/lib/aspera/cli/plugins/console.rb +40 -0
- data/lib/aspera/cli/plugins/cos.rb +4 -5
- data/lib/aspera/cli/plugins/faspex.rb +111 -92
- data/lib/aspera/cli/plugins/faspex5.rb +245 -182
- data/lib/aspera/cli/plugins/node.rb +239 -160
- data/lib/aspera/cli/plugins/orchestrator.rb +56 -19
- data/lib/aspera/cli/plugins/preview.rb +54 -38
- data/lib/aspera/cli/plugins/server.rb +63 -20
- data/lib/aspera/cli/plugins/shares.rb +64 -38
- data/lib/aspera/cli/sync_actions.rb +68 -0
- data/lib/aspera/cli/transfer_agent.rb +64 -67
- data/lib/aspera/cli/transfer_progress.rb +73 -0
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/colors.rb +3 -1
- data/lib/aspera/command_line_builder.rb +27 -22
- data/lib/aspera/cos_node.rb +6 -4
- data/lib/aspera/coverage.rb +22 -0
- data/lib/aspera/data_repository.rb +33 -2
- data/lib/aspera/environment.rb +21 -8
- data/lib/aspera/fasp/agent_alpha.rb +116 -0
- data/lib/aspera/fasp/agent_base.rb +40 -76
- data/lib/aspera/fasp/agent_connect.rb +21 -22
- data/lib/aspera/fasp/agent_direct.rb +169 -179
- data/lib/aspera/fasp/agent_httpgw.rb +200 -195
- data/lib/aspera/fasp/agent_node.rb +43 -35
- data/lib/aspera/fasp/agent_trsdk.rb +124 -41
- data/lib/aspera/fasp/error_info.rb +2 -2
- data/lib/aspera/fasp/faux_file.rb +52 -0
- data/lib/aspera/fasp/installation.rb +89 -191
- data/lib/aspera/fasp/management.rb +249 -0
- data/lib/aspera/fasp/parameters.rb +86 -47
- data/lib/aspera/fasp/parameters.yaml +75 -8
- data/lib/aspera/fasp/products.rb +162 -0
- data/lib/aspera/fasp/resume_policy.rb +7 -5
- data/lib/aspera/fasp/sync.rb +273 -0
- data/lib/aspera/fasp/transfer_spec.rb +10 -8
- data/lib/aspera/fasp/uri.rb +6 -6
- data/lib/aspera/faspex_gw.rb +11 -8
- data/lib/aspera/faspex_postproc.rb +8 -7
- data/lib/aspera/hash_ext.rb +2 -2
- data/lib/aspera/id_generator.rb +3 -1
- data/lib/aspera/json_rpc.rb +51 -0
- data/lib/aspera/keychain/encrypted_hash.rb +46 -11
- data/lib/aspera/keychain/macos_security.rb +15 -13
- data/lib/aspera/line_logger.rb +23 -0
- data/lib/aspera/log.rb +61 -19
- data/lib/aspera/nagios.rb +7 -2
- data/lib/aspera/node.rb +105 -21
- data/lib/aspera/node_simulator.rb +214 -0
- data/lib/aspera/oauth.rb +57 -36
- data/lib/aspera/open_application.rb +4 -4
- data/lib/aspera/persistency_action_once.rb +13 -14
- data/lib/aspera/persistency_folder.rb +5 -4
- data/lib/aspera/preview/file_types.rb +56 -268
- data/lib/aspera/preview/generator.rb +28 -39
- data/lib/aspera/preview/options.rb +2 -0
- data/lib/aspera/preview/terminal.rb +36 -16
- data/lib/aspera/preview/utils.rb +23 -29
- data/lib/aspera/proxy_auto_config.rb +6 -3
- data/lib/aspera/rest.rb +127 -80
- data/lib/aspera/rest_call_error.rb +1 -1
- data/lib/aspera/rest_error_analyzer.rb +16 -14
- data/lib/aspera/rest_errors_aspera.rb +39 -34
- data/lib/aspera/secret_hider.rb +18 -17
- data/lib/aspera/ssh.rb +10 -5
- data/lib/aspera/temp_file_manager.rb +11 -4
- data/lib/aspera/web_auth.rb +10 -7
- data/lib/aspera/web_server_simple.rb +11 -5
- data.tar.gz.sig +0 -0
- metadata +108 -39
- metadata.gz.sig +0 -0
- data/lib/aspera/cli/listener/line_dump.rb +0 -19
- data/lib/aspera/cli/listener/logger.rb +0 -22
- data/lib/aspera/cli/listener/progress.rb +0 -50
- data/lib/aspera/cli/listener/progress_multi.rb +0 -84
- data/lib/aspera/cli/plugins/sync.rb +0 -44
- data/lib/aspera/fasp/listener.rb +0 -13
- data/lib/aspera/sync.rb +0 -213
data/lib/aspera/cli/main.rb
CHANGED
|
@@ -7,32 +7,19 @@ require 'aspera/cli/extended_value'
|
|
|
7
7
|
require 'aspera/cli/transfer_agent'
|
|
8
8
|
require 'aspera/cli/version'
|
|
9
9
|
require 'aspera/cli/info'
|
|
10
|
-
require 'aspera/
|
|
11
|
-
require 'aspera/
|
|
12
|
-
require 'aspera/temp_file_manager'
|
|
13
|
-
require 'aspera/persistency_folder'
|
|
14
|
-
require 'aspera/log'
|
|
15
|
-
require 'aspera/rest'
|
|
16
|
-
require 'aspera/nagios'
|
|
17
|
-
require 'aspera/colors'
|
|
10
|
+
require 'aspera/cli/hints'
|
|
11
|
+
require 'aspera/preview/terminal'
|
|
18
12
|
require 'aspera/secret_hider'
|
|
19
|
-
require '
|
|
13
|
+
require 'aspera/log'
|
|
14
|
+
require 'aspera/assert'
|
|
20
15
|
|
|
21
16
|
module Aspera
|
|
22
17
|
module Cli
|
|
23
18
|
# The main CLI class
|
|
24
19
|
class Main
|
|
25
|
-
#
|
|
26
|
-
ERROR_FLASH = 'ERROR:'.bg_red.gray.blink.freeze
|
|
27
|
-
WARNING_FLASH = 'WARNING:'.bg_red.gray.blink.freeze
|
|
28
|
-
private_constant :ERROR_FLASH, :WARNING_FLASH
|
|
29
|
-
|
|
30
|
-
# store transfer result using this key and use result_transfer_multiple
|
|
20
|
+
# Plugins store transfer result using this key and use result_transfer_multiple()
|
|
31
21
|
STATUS_FIELD = 'status'
|
|
32
22
|
|
|
33
|
-
# for testing only
|
|
34
|
-
SELF_SIGNED_CERT = OpenSSL::SSL.const_get(:enon_yfirev.to_s.upcase.reverse) # cspell: disable-line
|
|
35
|
-
|
|
36
23
|
class << self
|
|
37
24
|
# expect some list, but nothing to display
|
|
38
25
|
def result_empty; return {type: :empty, data: :nil}; end
|
|
@@ -68,85 +55,64 @@ module Aspera
|
|
|
68
55
|
raise global_status unless global_status.eql?(:success)
|
|
69
56
|
return {type: :object_list, data: status_table}
|
|
70
57
|
end
|
|
71
|
-
|
|
58
|
+
|
|
59
|
+
def result_picture_in_terminal(options, blob)
|
|
60
|
+
terminal_options = options.get_option(:query, default: {}).symbolize_keys
|
|
61
|
+
allowed_options = Preview::Terminal.method(:build).parameters.select{|i|i[0].eql?(:key)}.map{|i|i[1]}
|
|
62
|
+
unknown_options = terminal_options.keys - allowed_options
|
|
63
|
+
raise "invalid options: #{unknown_options.join(', ')}, use #{allowed_options.join(', ')}" unless unknown_options.empty?
|
|
64
|
+
return Main.result_status(Preview::Terminal.build(blob, **terminal_options))
|
|
65
|
+
end
|
|
66
|
+
end # self
|
|
72
67
|
|
|
73
68
|
private
|
|
74
69
|
|
|
70
|
+
# shortcuts helpers like in plugins
|
|
71
|
+
%i[options transfer config formatter persistency].each do |name|
|
|
72
|
+
define_method(name){@agents[name]}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
75
|
# =============================================================
|
|
76
76
|
# Parameter handlers
|
|
77
77
|
#
|
|
78
|
-
attr_accessor :option_insecure, :option_http_options, :option_cache_tokens
|
|
79
|
-
|
|
80
|
-
def option_ui; OpenApplication.instance.url_method; end
|
|
81
|
-
|
|
82
|
-
def option_ui=(value); OpenApplication.instance.url_method = value; end
|
|
83
|
-
|
|
84
|
-
# called every time a new REST HTTP session is opened
|
|
85
|
-
# @param http [Net::HTTP] the newly created http session object
|
|
86
|
-
def http_parameters=(http)
|
|
87
|
-
if @option_insecure
|
|
88
|
-
url = http.inspect.gsub(/^[^ ]* /, 'https://').gsub(/ [^ ]*$/, '')
|
|
89
|
-
if !@ssl_warned_urls.include?(url)
|
|
90
|
-
@formatter.display_message(:error, "#{WARNING_FLASH} ignoring certificate for: #{url}. Do not deactivate certificate verification in production.")
|
|
91
|
-
@ssl_warned_urls.push(url)
|
|
92
|
-
end
|
|
93
|
-
http.verify_mode = SELF_SIGNED_CERT
|
|
94
|
-
end
|
|
95
|
-
http.set_debug_output($stdout) if @option_rest_debug
|
|
96
|
-
raise 'http_options expects Hash' unless @option_http_options.is_a?(Hash)
|
|
97
|
-
|
|
98
|
-
@option_http_options.each do |k, v|
|
|
99
|
-
method = "#{k}=".to_sym
|
|
100
|
-
# check if accessor is a method of Net::HTTP
|
|
101
|
-
# continue_timeout= read_timeout= write_timeout=
|
|
102
|
-
if http.respond_to?(method)
|
|
103
|
-
http.send(method, v)
|
|
104
|
-
else
|
|
105
|
-
Log.log.error{"no such attribute: #{k}"}
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
78
|
|
|
110
|
-
# minimum initialization
|
|
79
|
+
# minimum initialization, no exception raised
|
|
111
80
|
def initialize(argv)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
current_prog_name = File.basename($PROGRAM_NAME)
|
|
116
|
-
@formatter.display_message(:error, "#{'WARNING'.bg_red.blink.gray} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}'") \
|
|
117
|
-
unless current_prog_name.eql?(PROGRAM_NAME)
|
|
81
|
+
@argv = argv
|
|
82
|
+
# environment provided to plugin for various capabilities
|
|
83
|
+
@agents = {}
|
|
118
84
|
@option_help = false
|
|
119
|
-
@bash_completion = false
|
|
120
85
|
@option_show_config = false
|
|
121
|
-
@
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
#
|
|
127
|
-
@
|
|
86
|
+
@bash_completion = false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# This can throw exception if there is a problem with the environment, needs to be caught by execute method
|
|
90
|
+
def init_agents_and_options
|
|
91
|
+
# create formatter, in case there is an exception, it is used to display.
|
|
92
|
+
@agents[:formatter] = Formatter.new
|
|
93
|
+
# second : manage debug level (allows debugging of option parser)
|
|
94
|
+
early_debug_setup
|
|
95
|
+
@agents[:options] = Manager.new(PROGRAM_NAME)
|
|
128
96
|
# give command line arguments to option manager
|
|
129
|
-
|
|
97
|
+
options.parse_command_line(@argv)
|
|
130
98
|
# formatter adds options
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
99
|
+
formatter.declare_options(options)
|
|
100
|
+
# compare $0 with expected name
|
|
101
|
+
current_prog_name = File.basename($PROGRAM_NAME)
|
|
102
|
+
formatter.display_message(
|
|
103
|
+
:error,
|
|
104
|
+
"#{Formatter::WARNING_FLASH} Please use '#{PROGRAM_NAME}' instead of '#{current_prog_name}'") unless current_prog_name.eql?(PROGRAM_NAME)
|
|
134
105
|
# declare and parse global options
|
|
135
|
-
|
|
106
|
+
declare_global_options
|
|
136
107
|
# the Config plugin adds the @preset parser, so declare before TransferAgent which may use it
|
|
137
|
-
@
|
|
138
|
-
# the TransferAgent plugin may use the @preset parser
|
|
139
|
-
@plugin_env[:transfer] = TransferAgent.new(@plugin_env[:options], @plugin_env[:config])
|
|
108
|
+
@agents[:config] = Plugins::Config.new(@agents, gem: GEM_NAME, name: PROGRAM_NAME, help: DOC_URL, version: Aspera::Cli::VERSION)
|
|
140
109
|
# data persistency
|
|
141
|
-
@
|
|
110
|
+
assert(@agents[:persistency]){'missing persistency object'}
|
|
111
|
+
# the TransferAgent plugin may use the @preset parser
|
|
112
|
+
@agents[:transfer] = TransferAgent.new(options, config)
|
|
142
113
|
Log.log.debug('plugin env created'.red)
|
|
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')
|
|
146
|
-
# register aspera REST call error handlers
|
|
147
|
-
Aspera::RestErrorsAspera.register_handlers
|
|
148
114
|
# set banner when all environment is created so that additional extended value modifiers are known, e.g. @preset
|
|
149
|
-
|
|
115
|
+
options.parser.banner = app_banner
|
|
150
116
|
end
|
|
151
117
|
|
|
152
118
|
def app_banner
|
|
@@ -166,7 +132,6 @@ module Aspera
|
|
|
166
132
|
#{t}source repo: #{SRC_URL}
|
|
167
133
|
|
|
168
134
|
ENVIRONMENT VARIABLES
|
|
169
|
-
#{t}#{@plugin_env[:config].conf_dir_env_var} config folder, default: $HOME/#{Plugins::Config::ASPERA_HOME_FOLDER_NAME}/#{PROGRAM_NAME}
|
|
170
135
|
#{t}Any option can be set as an environment variable, refer to the manual
|
|
171
136
|
|
|
172
137
|
COMMANDS
|
|
@@ -185,38 +150,36 @@ module Aspera
|
|
|
185
150
|
end
|
|
186
151
|
|
|
187
152
|
# define header for manual
|
|
188
|
-
def
|
|
189
|
-
Log.log.debug('
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
@opt_mgr.declare(
|
|
153
|
+
def declare_global_options
|
|
154
|
+
Log.log.debug('declare_global_options')
|
|
155
|
+
options.declare(:help, 'Show this message', values: :none, short: 'h') { @option_help = true }
|
|
156
|
+
options.declare(:bash_comp, 'Generate bash completion for command', values: :none) { @bash_completion = true }
|
|
157
|
+
options.declare(:show_config, 'Display parameters used for the provided action', values: :none) { @option_show_config = true }
|
|
158
|
+
options.declare(:version, 'Display version', values: :none, short: 'v') { formatter.display_message(:data, Aspera::Cli::VERSION); Process.exit(0) } # rubocop:disable Style/Semicolon, Layout/LineLength
|
|
159
|
+
options.declare(:warnings, 'Check for language warnings', values: :none, short: 'w') { $VERBOSE = true }
|
|
160
|
+
options.declare(
|
|
197
161
|
:ui, 'Method to start browser',
|
|
198
162
|
values: OpenApplication.user_interfaces,
|
|
199
|
-
handler: {o:
|
|
163
|
+
handler: {o: OpenApplication.instance, m: :url_method},
|
|
200
164
|
default: OpenApplication.default_gui_mode)
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
@opt_mgr.declare(:cache_tokens, 'Save and reuse Oauth tokens', values: :bool, handler: {o: self, m: :option_cache_tokens})
|
|
165
|
+
options.declare(:log_level, 'Log level', values: Log.levels, handler: {o: Log.instance, m: :level})
|
|
166
|
+
options.declare(:logger, 'Logging method', values: Log::LOG_TYPES, handler: {o: Log.instance, m: :logger_type})
|
|
167
|
+
options.declare(:lock_port, 'Prevent dual execution of a command, e.g. in cron', coerce: Integer, types: Integer)
|
|
168
|
+
options.declare(:once_only, 'Process only new items (some commands)', values: :bool, default: false)
|
|
169
|
+
options.declare(:log_secrets, 'Show passwords in logs', values: :bool, handler: {o: SecretHider, m: :log_secrets})
|
|
170
|
+
options.declare(:clean_temp, 'Cleanup temporary files on exit', values: :bool, handler: {o: TempFileManager.instance, m: :cleanup_on_exit})
|
|
171
|
+
options.declare(:pid_file, 'Write process identifier to file, delete on exit', types: String)
|
|
209
172
|
# parse declared options
|
|
210
|
-
|
|
173
|
+
options.parse_options!
|
|
211
174
|
end
|
|
212
175
|
|
|
213
176
|
# @return the plugin instance, based on name
|
|
214
177
|
# also loads the plugin options, and default values from conf file
|
|
215
178
|
# @param plugin_name_sym : symbol for plugin name
|
|
216
179
|
def get_plugin_instance_with_options(plugin_name_sym, env=nil)
|
|
217
|
-
env ||= @
|
|
180
|
+
env ||= @agents
|
|
218
181
|
Log.log.debug{"get_plugin_instance_with_options(#{plugin_name_sym})"}
|
|
219
|
-
require
|
|
182
|
+
require config.plugins[plugin_name_sym][:require_stanza]
|
|
220
183
|
# load default params only if no param already loaded before plugin instantiation
|
|
221
184
|
env[:config].add_plugin_default_preset(plugin_name_sym)
|
|
222
185
|
command_plugin = Plugins::Config.plugin_class(plugin_name_sym).new(env)
|
|
@@ -226,8 +189,8 @@ module Aspera
|
|
|
226
189
|
end
|
|
227
190
|
|
|
228
191
|
def generate_bash_completion
|
|
229
|
-
if
|
|
230
|
-
|
|
192
|
+
if options.get_next_argument('', expected: :multiple, mandatory: false).nil?
|
|
193
|
+
config.plugins.each_key{|p|puts p.to_s}
|
|
231
194
|
else
|
|
232
195
|
Log.log.warn('only first level completion so far')
|
|
233
196
|
end
|
|
@@ -237,19 +200,19 @@ module Aspera
|
|
|
237
200
|
def exit_with_usage(all_plugins)
|
|
238
201
|
Log.log.debug('exit_with_usage'.bg_red)
|
|
239
202
|
# display main plugin options
|
|
240
|
-
|
|
203
|
+
formatter.display_message(:error, options.parser)
|
|
241
204
|
if all_plugins
|
|
242
205
|
# list plugins that have a "require" field, i.e. all but main plugin
|
|
243
|
-
|
|
206
|
+
config.plugins.each_key do |plugin_name_sym|
|
|
244
207
|
next if plugin_name_sym.eql?(Plugins::Config::CONF_PLUGIN_SYM)
|
|
245
208
|
# override main option parser with a brand new, to avoid having global options
|
|
246
|
-
plugin_env = @
|
|
247
|
-
plugin_env[:
|
|
209
|
+
plugin_env = @agents.clone
|
|
210
|
+
plugin_env[:all_manuals] = true # force declaration of all options
|
|
248
211
|
plugin_env[:options] = Manager.new(PROGRAM_NAME)
|
|
249
212
|
plugin_env[:options].parser.banner = '' # remove default banner
|
|
250
213
|
get_plugin_instance_with_options(plugin_name_sym, plugin_env)
|
|
251
214
|
# display generated help for plugin options
|
|
252
|
-
|
|
215
|
+
formatter.display_message(:error, plugin_env[:options].parser.help)
|
|
253
216
|
end
|
|
254
217
|
end
|
|
255
218
|
Process.exit(0)
|
|
@@ -259,14 +222,16 @@ module Aspera
|
|
|
259
222
|
|
|
260
223
|
# early debug for parser
|
|
261
224
|
# Note: does not accept shortcuts
|
|
262
|
-
def early_debug_setup
|
|
225
|
+
def early_debug_setup
|
|
263
226
|
Aspera::Log.instance.program_name = PROGRAM_NAME
|
|
264
|
-
argv.each do |arg|
|
|
227
|
+
@argv.each do |arg|
|
|
265
228
|
case arg
|
|
266
229
|
when '--' then break
|
|
267
230
|
when /^--log-level=(.*)/ then Aspera::Log.instance.level = Regexp.last_match(1).to_sym
|
|
268
231
|
when /^--logger=(.*)/ then Aspera::Log.instance.logger_type = Regexp.last_match(1).to_sym
|
|
269
232
|
end
|
|
233
|
+
rescue => e
|
|
234
|
+
$stderr.puts("Error: #{e}")
|
|
270
235
|
end
|
|
271
236
|
end
|
|
272
237
|
|
|
@@ -274,69 +239,78 @@ module Aspera
|
|
|
274
239
|
|
|
275
240
|
# this is the main function called by initial script just after constructor
|
|
276
241
|
def process_command_line
|
|
277
|
-
Log.log.debug('process_command_line')
|
|
278
242
|
# catch exception information , if any
|
|
279
243
|
exception_info = nil
|
|
280
|
-
# false if command shall not be executed (
|
|
244
|
+
# false if command shall not be executed (e.g. --show-config)
|
|
281
245
|
execute_command = true
|
|
246
|
+
# catch exceptions
|
|
282
247
|
begin
|
|
248
|
+
init_agents_and_options
|
|
283
249
|
# find plugins, shall be after parse! ?
|
|
284
|
-
|
|
250
|
+
config.add_plugins_from_lookup_folders
|
|
285
251
|
# help requested without command ? (plugins must be known here)
|
|
286
|
-
exit_with_usage(true) if @option_help &&
|
|
252
|
+
exit_with_usage(true) if @option_help && options.command_or_arg_empty?
|
|
287
253
|
generate_bash_completion if @bash_completion
|
|
288
|
-
|
|
254
|
+
config.periodic_check_newer_gem_version
|
|
289
255
|
command_sym =
|
|
290
|
-
if @option_show_config &&
|
|
256
|
+
if @option_show_config && options.command_or_arg_empty?
|
|
291
257
|
Plugins::Config::CONF_PLUGIN_SYM
|
|
292
258
|
else
|
|
293
|
-
|
|
259
|
+
options.get_next_command(config.plugins.keys.dup.unshift(:help))
|
|
294
260
|
end
|
|
295
261
|
# command will not be executed, but we need manual
|
|
296
|
-
|
|
262
|
+
options.fail_on_missing_mandatory = false if @option_help || @option_show_config
|
|
297
263
|
# main plugin is not dynamically instantiated
|
|
298
264
|
case command_sym
|
|
299
265
|
when :help
|
|
300
266
|
exit_with_usage(true)
|
|
301
267
|
when Plugins::Config::CONF_PLUGIN_SYM
|
|
302
|
-
command_plugin =
|
|
268
|
+
command_plugin = config
|
|
303
269
|
else
|
|
304
270
|
# get plugin, set options, etc
|
|
305
271
|
command_plugin = get_plugin_instance_with_options(command_sym)
|
|
306
272
|
# parse plugin specific options
|
|
307
|
-
|
|
273
|
+
options.parse_options!
|
|
308
274
|
end
|
|
309
275
|
# help requested for current plugin
|
|
310
276
|
exit_with_usage(false) if @option_help
|
|
311
277
|
if @option_show_config
|
|
312
|
-
|
|
278
|
+
formatter.display_results({type: :single_object, data: options.known_options(only_defined: true).stringify_keys})
|
|
313
279
|
execute_command = false
|
|
314
280
|
end
|
|
315
281
|
# locking for single execution (only after "per plugin" option, in case lock port is there)
|
|
316
|
-
lock_port =
|
|
282
|
+
lock_port = options.get_option(:lock_port)
|
|
317
283
|
if !lock_port.nil?
|
|
318
284
|
begin
|
|
319
285
|
# no need to close later, will be freed on process exit. must save in member else it is garbage collected
|
|
320
|
-
Log.log.debug{"Opening lock port #{lock_port
|
|
321
|
-
@tcp_server = TCPServer.new('127.0.0.1', lock_port
|
|
286
|
+
Log.log.debug{"Opening lock port #{lock_port}"}
|
|
287
|
+
@tcp_server = TCPServer.new('127.0.0.1', lock_port)
|
|
322
288
|
rescue StandardError => e
|
|
323
289
|
execute_command = false
|
|
324
290
|
Log.log.warn{"Another instance is already running (#{e.message})."}
|
|
325
291
|
end
|
|
326
292
|
end
|
|
293
|
+
pid_file = options.get_option(:pid_file)
|
|
294
|
+
if !pid_file.nil?
|
|
295
|
+
File.write(pid_file, Process.pid)
|
|
296
|
+
Log.log.debug{"Wrote pid #{Process.pid} to #{pid_file}"}
|
|
297
|
+
at_exit{File.delete(pid_file)}
|
|
298
|
+
end
|
|
327
299
|
# execute and display (if not exclusive execution)
|
|
328
|
-
|
|
300
|
+
formatter.display_results(command_plugin.execute_action) if execute_command
|
|
301
|
+
# save config file if command modified it
|
|
302
|
+
config.save_config_file_if_needed
|
|
329
303
|
# finish
|
|
330
|
-
|
|
304
|
+
transfer.shutdown
|
|
331
305
|
rescue Net::SSH::AuthenticationFailed => e; exception_info = {e: e, t: 'SSH', security: true}
|
|
332
306
|
rescue OpenSSL::SSL::SSLError => e; exception_info = {e: e, t: 'SSL'}
|
|
333
|
-
rescue
|
|
334
|
-
rescue
|
|
335
|
-
rescue
|
|
336
|
-
rescue Fasp::Error => e; exception_info = {e: e, t: '
|
|
307
|
+
rescue Cli::BadArgument => e; exception_info = {e: e, t: 'Argument', usage: true}
|
|
308
|
+
rescue Cli::NoSuchIdentifier => e; exception_info = {e: e, t: 'Identifier'}
|
|
309
|
+
rescue Cli::Error => e; exception_info = {e: e, t: 'Tool', usage: true}
|
|
310
|
+
rescue Fasp::Error => e; exception_info = {e: e, t: 'Transfer'}
|
|
337
311
|
rescue Aspera::RestCallError => e; exception_info = {e: e, t: 'Rest'}
|
|
338
312
|
rescue SocketError => e; exception_info = {e: e, t: 'Network'}
|
|
339
|
-
rescue StandardError => e; exception_info = {e: e, t:
|
|
313
|
+
rescue StandardError => e; exception_info = {e: e, t: "Other(#{e.class.name})", debug: true}
|
|
340
314
|
rescue Interrupt => e; exception_info = {e: e, t: 'Interruption', debug: true}
|
|
341
315
|
end
|
|
342
316
|
# cleanup file list files
|
|
@@ -344,22 +318,15 @@ module Aspera
|
|
|
344
318
|
# 1- processing of error condition
|
|
345
319
|
unless exception_info.nil?
|
|
346
320
|
Log.log.warn(exception_info[:e].message) if Aspera::Log.instance.logger_type.eql?(:syslog) && exception_info[:security]
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
#
|
|
350
|
-
|
|
351
|
-
@formatter.display_message(:error, "For this specific error, refer to:\n"\
|
|
352
|
-
"#{SRC_URL}#error-remote-host-is-not-who-we-expected\nAdd this to arguments:\n--ts=@json:'{\"sshfp\":null}'")
|
|
353
|
-
end
|
|
354
|
-
# Provide hint on SSL errors
|
|
355
|
-
if exception_info[:e].is_a?(OpenSSL::SSL::SSLError) && ['does not match the server certificate'].any?{|m|exception_info[:e].message.include?(m)}
|
|
356
|
-
@formatter.display_message(:error, "You can ignore SSL errors with option:\n--insecure=yes")
|
|
357
|
-
end
|
|
321
|
+
formatter.display_message(:error, "#{Formatter::ERROR_FLASH} #{exception_info[:t]}: #{exception_info[:e].message}")
|
|
322
|
+
formatter.display_message(:error, 'Use option -h to get help.') if exception_info[:usage]
|
|
323
|
+
# Is that a known error condition with proposal for remediation ?
|
|
324
|
+
Hints.hint_for(exception_info[:e], formatter)
|
|
358
325
|
end
|
|
359
326
|
# 2- processing of command not processed (due to exception or bad command line)
|
|
360
327
|
if execute_command || @option_show_config
|
|
361
|
-
|
|
362
|
-
|
|
328
|
+
options.final_errors.each do |msg|
|
|
329
|
+
formatter.display_message(:error, "#{Formatter::ERROR_FLASH} Argument: #{msg}")
|
|
363
330
|
# add code as exception if there is not already an error
|
|
364
331
|
exception_info = {e: Exception.new(msg), t: 'UnusedArg'} if exception_info.nil?
|
|
365
332
|
end
|
|
@@ -367,9 +334,9 @@ module Aspera
|
|
|
367
334
|
# 3- in case of error, fail the process status
|
|
368
335
|
unless exception_info.nil?
|
|
369
336
|
# show stack trace in debug mode
|
|
370
|
-
raise exception_info[:e] if Log.
|
|
337
|
+
raise exception_info[:e] if Log.log.debug?
|
|
371
338
|
# else give hint and exit
|
|
372
|
-
|
|
339
|
+
formatter.display_message(:error, 'Use --log-level=debug to get more details.') if exception_info[:debug]
|
|
373
340
|
Process.exit(1)
|
|
374
341
|
end
|
|
375
342
|
return nil
|