aspera-cli 4.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +3592 -0
- data/bin/ascli +7 -0
- data/bin/asession +89 -0
- data/docs/Makefile +59 -0
- data/docs/README.erb.md +3012 -0
- data/docs/README.md +13 -0
- data/docs/diagrams.txt +49 -0
- data/docs/secrets.make +38 -0
- data/docs/test_env.conf +117 -0
- data/docs/transfer_spec.html +99 -0
- data/examples/aoc.rb +17 -0
- data/examples/proxy.pac +60 -0
- data/examples/transfer.rb +115 -0
- data/lib/aspera/api_detector.rb +60 -0
- data/lib/aspera/ascmd.rb +151 -0
- data/lib/aspera/ats_api.rb +43 -0
- data/lib/aspera/cli/basic_auth_plugin.rb +38 -0
- data/lib/aspera/cli/extended_value.rb +88 -0
- data/lib/aspera/cli/formater.rb +238 -0
- data/lib/aspera/cli/listener/line_dump.rb +17 -0
- data/lib/aspera/cli/listener/logger.rb +20 -0
- data/lib/aspera/cli/listener/progress.rb +52 -0
- data/lib/aspera/cli/listener/progress_multi.rb +91 -0
- data/lib/aspera/cli/main.rb +304 -0
- data/lib/aspera/cli/manager.rb +440 -0
- data/lib/aspera/cli/plugin.rb +90 -0
- data/lib/aspera/cli/plugins/alee.rb +24 -0
- data/lib/aspera/cli/plugins/ats.rb +231 -0
- data/lib/aspera/cli/plugins/bss.rb +71 -0
- data/lib/aspera/cli/plugins/config.rb +806 -0
- data/lib/aspera/cli/plugins/console.rb +62 -0
- data/lib/aspera/cli/plugins/cos.rb +106 -0
- data/lib/aspera/cli/plugins/faspex.rb +377 -0
- data/lib/aspera/cli/plugins/faspex5.rb +93 -0
- data/lib/aspera/cli/plugins/node.rb +438 -0
- data/lib/aspera/cli/plugins/oncloud.rb +937 -0
- data/lib/aspera/cli/plugins/orchestrator.rb +169 -0
- data/lib/aspera/cli/plugins/preview.rb +464 -0
- data/lib/aspera/cli/plugins/server.rb +216 -0
- data/lib/aspera/cli/plugins/shares.rb +63 -0
- data/lib/aspera/cli/plugins/shares2.rb +114 -0
- data/lib/aspera/cli/plugins/sync.rb +65 -0
- data/lib/aspera/cli/plugins/xnode.rb +115 -0
- data/lib/aspera/cli/transfer_agent.rb +251 -0
- data/lib/aspera/cli/version.rb +5 -0
- data/lib/aspera/colors.rb +39 -0
- data/lib/aspera/command_line_builder.rb +137 -0
- data/lib/aspera/fasp/aoc.rb +24 -0
- data/lib/aspera/fasp/connect.rb +99 -0
- data/lib/aspera/fasp/error.rb +21 -0
- data/lib/aspera/fasp/error_info.rb +60 -0
- data/lib/aspera/fasp/http_gw.rb +81 -0
- data/lib/aspera/fasp/installation.rb +240 -0
- data/lib/aspera/fasp/listener.rb +11 -0
- data/lib/aspera/fasp/local.rb +377 -0
- data/lib/aspera/fasp/manager.rb +69 -0
- data/lib/aspera/fasp/node.rb +88 -0
- data/lib/aspera/fasp/parameters.rb +235 -0
- data/lib/aspera/fasp/resume_policy.rb +76 -0
- data/lib/aspera/fasp/uri.rb +51 -0
- data/lib/aspera/faspex_gw.rb +196 -0
- data/lib/aspera/hash_ext.rb +28 -0
- data/lib/aspera/log.rb +80 -0
- data/lib/aspera/nagios.rb +71 -0
- data/lib/aspera/node.rb +14 -0
- data/lib/aspera/oauth.rb +319 -0
- data/lib/aspera/on_cloud.rb +421 -0
- data/lib/aspera/open_application.rb +72 -0
- data/lib/aspera/persistency_action_once.rb +42 -0
- data/lib/aspera/persistency_folder.rb +91 -0
- data/lib/aspera/preview/file_types.rb +300 -0
- data/lib/aspera/preview/generator.rb +258 -0
- data/lib/aspera/preview/image_error.png +0 -0
- data/lib/aspera/preview/options.rb +35 -0
- data/lib/aspera/preview/utils.rb +131 -0
- data/lib/aspera/preview/video_error.png +0 -0
- data/lib/aspera/proxy_auto_config.erb.js +287 -0
- data/lib/aspera/proxy_auto_config.rb +34 -0
- data/lib/aspera/rest.rb +296 -0
- data/lib/aspera/rest_call_error.rb +13 -0
- data/lib/aspera/rest_error_analyzer.rb +98 -0
- data/lib/aspera/rest_errors_aspera.rb +58 -0
- data/lib/aspera/ssh.rb +53 -0
- data/lib/aspera/sync.rb +82 -0
- data/lib/aspera/temp_file_manager.rb +37 -0
- data/lib/aspera/uri_reader.rb +25 -0
- metadata +288 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'aspera/fasp/listener'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Aspera
|
5
|
+
module Cli
|
6
|
+
module Listener
|
7
|
+
# listener for FASP transfers (debug)
|
8
|
+
# FASP event listener display management events as JSON
|
9
|
+
class LineDump < Fasp::Listener
|
10
|
+
def event_enhanced(data)
|
11
|
+
STDOUT.puts(JSON.generate(data))
|
12
|
+
STDOUT.flush
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'aspera/fasp/listener'
|
2
|
+
require 'aspera/log'
|
3
|
+
|
4
|
+
module Aspera
|
5
|
+
module Cli
|
6
|
+
module Listener
|
7
|
+
# listener for FASP transfers (debug)
|
8
|
+
class Logger < Fasp::Listener
|
9
|
+
def event_struct(data)
|
10
|
+
Log.log.debug(data.to_s)
|
11
|
+
Log.log.error("#{data['Description']}") if data['Type'].eql?('FILEERROR')
|
12
|
+
end
|
13
|
+
|
14
|
+
def event_enhanced(data)
|
15
|
+
Log.log.debug(JSON.generate(data))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'aspera/fasp/listener'
|
2
|
+
require 'ruby-progressbar'
|
3
|
+
|
4
|
+
module Aspera
|
5
|
+
module Cli
|
6
|
+
module Listener
|
7
|
+
# a listener to FASP event that displays a progress bar
|
8
|
+
class Progress < Fasp::Listener
|
9
|
+
def initialize
|
10
|
+
@progress=nil
|
11
|
+
@cumulative=0
|
12
|
+
end
|
13
|
+
|
14
|
+
BYTE_PER_MEGABIT=1024*1024/8
|
15
|
+
|
16
|
+
def event_struct(data)
|
17
|
+
case data['Type']
|
18
|
+
when 'NOTIFICATION'
|
19
|
+
if data.has_key?('PreTransferBytes') then
|
20
|
+
@progress=ProgressBar.create(
|
21
|
+
:format => '%a %B %p%% %r Mbps %e',
|
22
|
+
:rate_scale => lambda{|rate|rate/BYTE_PER_MEGABIT},
|
23
|
+
:title => 'progress',
|
24
|
+
:total => data['PreTransferBytes'].to_i)
|
25
|
+
end
|
26
|
+
when 'STOP'
|
27
|
+
# stop event when one file is completed
|
28
|
+
@cumulative=@cumulative+data['Size'].to_i
|
29
|
+
when 'STATS'
|
30
|
+
if !@progress.nil? then
|
31
|
+
if data.has_key?('Bytescont')
|
32
|
+
@progress.progress=@cumulative+data['Bytescont'].to_i
|
33
|
+
else
|
34
|
+
@progress.progress=data['TransferBytes'].to_i
|
35
|
+
end
|
36
|
+
else
|
37
|
+
puts '.'
|
38
|
+
end
|
39
|
+
when 'DONE'
|
40
|
+
if !@progress.nil? then
|
41
|
+
@progress.progress=@progress.total
|
42
|
+
@progress=nil
|
43
|
+
else
|
44
|
+
# terminate progress by going to next line
|
45
|
+
puts "\n"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'aspera/fasp/listener'
|
2
|
+
require 'aspera/fasp/manager'
|
3
|
+
require 'ruby-progressbar'
|
4
|
+
|
5
|
+
module Aspera
|
6
|
+
module Cli
|
7
|
+
module Listener
|
8
|
+
# a listener to FASP event that displays a progress bar
|
9
|
+
class ProgressMulti < Fasp::Listener
|
10
|
+
def initialize
|
11
|
+
@progress_bar=nil
|
12
|
+
@sessions={}
|
13
|
+
end
|
14
|
+
|
15
|
+
def reset
|
16
|
+
@progress_bar=nil
|
17
|
+
@sessions={}
|
18
|
+
end
|
19
|
+
|
20
|
+
BYTE_PER_MEGABIT=1024*1024/8
|
21
|
+
|
22
|
+
def update_total
|
23
|
+
begin
|
24
|
+
@progress_bar.total=@sessions.values.inject(0){|m,s|m+=s[:job_size].to_i;m;}
|
25
|
+
rescue
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update_progress
|
31
|
+
begin
|
32
|
+
@progress_bar.progress=@sessions.values.inject(0){|m,s|m+=s[:current].to_i;m;}
|
33
|
+
rescue
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def event_enhanced(data)
|
39
|
+
if @progress_bar.nil?
|
40
|
+
@progress_bar=ProgressBar.create(
|
41
|
+
:format => '%t %a %B %p%% %r Mbps %e',
|
42
|
+
:rate_scale => lambda{|rate|rate/BYTE_PER_MEGABIT},
|
43
|
+
:title => '',
|
44
|
+
:total => nil)
|
45
|
+
end
|
46
|
+
if !data.has_key?(Fasp::Manager::LISTENER_SESSION_ID_S)
|
47
|
+
Log.log.error("Internal error: no #{Fasp::Manager::LISTENER_SESSION_ID_S} in event: #{data}")
|
48
|
+
return
|
49
|
+
end
|
50
|
+
newtitle=@sessions.length < 2 ? '' : "multi=#{@sessions.length}"
|
51
|
+
@progress_bar.title=newtitle unless @progress_bar.title.eql?(newtitle)
|
52
|
+
session=@sessions[data[Fasp::Manager::LISTENER_SESSION_ID_S]]||={
|
53
|
+
cumulative: 0,
|
54
|
+
job_size: 0,
|
55
|
+
current: 0
|
56
|
+
}
|
57
|
+
case data['type']
|
58
|
+
when 'INIT' # connection to ascp (get id)
|
59
|
+
when 'SESSION' # session information
|
60
|
+
when 'NOTIFICATION' # sent from remote
|
61
|
+
if data.has_key?('pre_transfer_bytes') then
|
62
|
+
session[:job_size]=data['pre_transfer_bytes']
|
63
|
+
update_total
|
64
|
+
end
|
65
|
+
when 'STATS' # during transfer
|
66
|
+
if !@progress_bar.total.nil? then
|
67
|
+
if data.has_key?('bytescont')
|
68
|
+
session[:current]=session[:cumulative]+data['bytescont'].to_i
|
69
|
+
update_progress
|
70
|
+
else
|
71
|
+
session[:current]=data['transfer_bytes'].to_i
|
72
|
+
update_progress
|
73
|
+
end
|
74
|
+
else
|
75
|
+
@progress_bar.increment
|
76
|
+
end
|
77
|
+
when 'STOP'
|
78
|
+
# stop event when one file is completed
|
79
|
+
session[:cumulative]=session[:cumulative]+data['size'].to_i
|
80
|
+
when 'DONE' # end of session
|
81
|
+
@sessions.delete(data[Fasp::Manager::LISTENER_SESSION_ID_S])
|
82
|
+
update_progress
|
83
|
+
update_total
|
84
|
+
else
|
85
|
+
Log.log.debug("ignore: #{data['type']}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'aspera/cli/manager'
|
2
|
+
require 'aspera/cli/formater'
|
3
|
+
require 'aspera/cli/plugins/config'
|
4
|
+
require 'aspera/cli/extended_value'
|
5
|
+
require 'aspera/cli/transfer_agent'
|
6
|
+
require 'aspera/cli/version'
|
7
|
+
require 'aspera/open_application'
|
8
|
+
require 'aspera/temp_file_manager'
|
9
|
+
require 'aspera/persistency_folder'
|
10
|
+
require 'aspera/log'
|
11
|
+
require 'aspera/rest'
|
12
|
+
require 'aspera/nagios'
|
13
|
+
|
14
|
+
module Aspera
|
15
|
+
module Cli
|
16
|
+
# The main CLI class
|
17
|
+
class Main
|
18
|
+
|
19
|
+
attr_reader :plugin_env
|
20
|
+
private
|
21
|
+
# name of application, also foldername where config is stored
|
22
|
+
PROGRAM_NAME = 'ascli'
|
23
|
+
GEM_NAME = 'aspera-cli'
|
24
|
+
# Container module of current class : Aspera::Cli
|
25
|
+
CLI_MODULE=Module.nesting[1].to_s
|
26
|
+
# Path to Plugin classes: Aspera::Cli::Plugins
|
27
|
+
PLUGINS_MODULE=CLI_MODULE+'::Plugins'
|
28
|
+
VERBOSE_LEVELS=[:normal,:minimal,:quiet]
|
29
|
+
|
30
|
+
private_constant :PROGRAM_NAME,:GEM_NAME,:CLI_MODULE,:PLUGINS_MODULE,:VERBOSE_LEVELS
|
31
|
+
|
32
|
+
# find the root folder of gem where this class is
|
33
|
+
def self.gem_root
|
34
|
+
File.expand_path(CLI_MODULE.to_s.gsub('::','/').gsub(%r([^/]+),'..'),File.dirname(__FILE__))
|
35
|
+
end
|
36
|
+
|
37
|
+
# =============================================================
|
38
|
+
# Parameter handlers
|
39
|
+
#
|
40
|
+
|
41
|
+
def option_insecure; Rest.insecure ; end
|
42
|
+
|
43
|
+
def option_insecure=(value); Rest.insecure = value; end
|
44
|
+
|
45
|
+
def option_ui; OpenApplication.instance.url_method; end
|
46
|
+
|
47
|
+
def option_ui=(value); OpenApplication.instance.url_method=value; end
|
48
|
+
|
49
|
+
# minimum initialization
|
50
|
+
def initialize(argv)
|
51
|
+
# first thing : manage debug level (allows debugging or option parser)
|
52
|
+
early_debug_setup(argv)
|
53
|
+
current_prog_name=File.basename($PROGRAM_NAME)
|
54
|
+
unless current_prog_name.eql?(PROGRAM_NAME)
|
55
|
+
@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")
|
56
|
+
end
|
57
|
+
# overriding parameters on transfer spec
|
58
|
+
@option_help=false
|
59
|
+
@bash_completion=false
|
60
|
+
@option_show_config=false
|
61
|
+
@plugin_env={}
|
62
|
+
@help_url='http://www.rubydoc.info/gems/'+GEM_NAME
|
63
|
+
@gem_url='https://rubygems.org/gems/'+GEM_NAME
|
64
|
+
# give command line arguments to option manager (no parsing)
|
65
|
+
@plugin_env[:options]=@opt_mgr=Manager.new(self.program_name,argv,app_banner())
|
66
|
+
@plugin_env[:formater]=Formater.new(@plugin_env[:options])
|
67
|
+
Rest.user_agent=self.program_name
|
68
|
+
# must override help methods before parser called (in other constructors)
|
69
|
+
init_global_options()
|
70
|
+
# the Config plugin adds the @preset parser
|
71
|
+
@plugin_env[:config]=Plugins::Config.new(@plugin_env,self.program_name,@help_url,Aspera::Cli::VERSION)
|
72
|
+
# the TransferAgent plugin may use the @preset parser
|
73
|
+
@plugin_env[:transfer]=TransferAgent.new(@plugin_env)
|
74
|
+
Log.log.debug('created plugin env'.red)
|
75
|
+
# set application folder for modules
|
76
|
+
@plugin_env[:persistency]=PersistencyFolder.new(File.join(@plugin_env[:config].main_folder,'persist_store'))
|
77
|
+
Oauth.persist_mgr=@plugin_env[:persistency]
|
78
|
+
Fasp::Parameters.file_list_folder=File.join(@plugin_env[:config].main_folder,'filelists')
|
79
|
+
# register aspera REST call error handlers
|
80
|
+
Aspera::RestErrorsAspera.registerHandlers
|
81
|
+
end
|
82
|
+
|
83
|
+
def app_banner
|
84
|
+
banner = "NAME\n\t#{self.program_name} -- a command line tool for Aspera Applications (v#{Aspera::Cli::VERSION})\n\n"
|
85
|
+
banner << "SYNOPSIS\n"
|
86
|
+
banner << "\t#{self.program_name} COMMANDS [OPTIONS] [ARGS]\n"
|
87
|
+
banner << "\n"
|
88
|
+
banner << "DESCRIPTION\n"
|
89
|
+
banner << "\tUse Aspera application to perform operations on command line.\n"
|
90
|
+
banner << "\tDocumentation and examples: #{@gem_url}\n"
|
91
|
+
banner << "\texecute: #{self.program_name} conf doc\n"
|
92
|
+
banner << "\tor visit: #{@help_url}\n"
|
93
|
+
banner << "\n"
|
94
|
+
banner << "COMMANDS\n"
|
95
|
+
banner << "\tTo list first level commands, execute: #{self.program_name}\n"
|
96
|
+
banner << "\tNote that commands can be written shortened (provided it is unique).\n"
|
97
|
+
banner << "\n"
|
98
|
+
banner << "OPTIONS\n"
|
99
|
+
banner << "\tOptions begin with a '-' (minus), and value is provided on command line.\n"
|
100
|
+
banner << "\tSpecial values are supported beginning with special prefix, like: #{ExtendedValue.instance.modifiers.map{|m|"@#{m}:"}.join(' ')}.\n"
|
101
|
+
banner << "\tDates format is 'DD-MM-YY HH:MM:SS', or 'now' or '-<num>h'\n\n"
|
102
|
+
banner << "ARGS\n"
|
103
|
+
banner << "\tSome commands require mandatory arguments, e.g. a path.\n"
|
104
|
+
end
|
105
|
+
|
106
|
+
# define header for manual
|
107
|
+
def init_global_options
|
108
|
+
Log.log.debug("init_global_options")
|
109
|
+
@opt_mgr.add_opt_switch(:help,"-h","Show this message.") { @option_help=true }
|
110
|
+
@opt_mgr.add_opt_switch(:bash_comp,"generate bash completion for command") { @bash_completion=true }
|
111
|
+
@opt_mgr.add_opt_switch(:show_config, "Display parameters used for the provided action.") { @option_show_config=true }
|
112
|
+
@opt_mgr.add_opt_switch(:rest_debug,"-r","more debug for HTTP calls") { Rest.debug=true }
|
113
|
+
@opt_mgr.add_opt_switch(:version,'-v','display version') { @plugin_env[:formater].display_message(:data,Aspera::Cli::VERSION);Process.exit(0) }
|
114
|
+
@opt_mgr.add_opt_switch(:warnings,'-w','check for language warnings') { $VERBOSE=true }
|
115
|
+
# handler must be set before declaration
|
116
|
+
@opt_mgr.set_obj_attr(:log_level,Log.instance,:level)
|
117
|
+
@opt_mgr.set_obj_attr(:logger,Log.instance,:logger_type)
|
118
|
+
@opt_mgr.set_obj_attr(:insecure,self,:option_insecure,:no)
|
119
|
+
@opt_mgr.set_obj_attr(:ui,self,:option_ui)
|
120
|
+
@opt_mgr.add_opt_list(:ui,OpenApplication.user_interfaces,'method to start browser')
|
121
|
+
@opt_mgr.add_opt_list(:log_level,Log.levels,"Log level")
|
122
|
+
@opt_mgr.add_opt_list(:logger,Log.logtypes,"log method")
|
123
|
+
@opt_mgr.add_opt_simple(:lock_port,"prevent dual execution of a command, e.g. in cron")
|
124
|
+
@opt_mgr.add_opt_simple(:query,"additional filter for API calls (extended value) (some commands)")
|
125
|
+
@opt_mgr.add_opt_boolean(:insecure,"do not validate HTTPS certificate")
|
126
|
+
@opt_mgr.add_opt_boolean(:once_only,"process only new items (some commands)")
|
127
|
+
@opt_mgr.set_option(:ui,OpenApplication.default_gui_mode)
|
128
|
+
@opt_mgr.set_option(:once_only,:false)
|
129
|
+
# parse declared options
|
130
|
+
@opt_mgr.parse_options!
|
131
|
+
end
|
132
|
+
|
133
|
+
# @return the plugin instance, based on name
|
134
|
+
# also loads the plugin options, and default values from conf file
|
135
|
+
# @param plugin_name_sym : symbol for plugin name
|
136
|
+
def get_plugin_instance_with_options(plugin_name_sym,env=nil)
|
137
|
+
env||=@plugin_env
|
138
|
+
Log.log.debug("get_plugin_instance_with_options(#{plugin_name_sym})")
|
139
|
+
require @plugin_env[:config].plugins[plugin_name_sym][:require_stanza]
|
140
|
+
# load default params only if no param already loaded before plugin instanciation
|
141
|
+
env[:config].add_plugin_default_preset(plugin_name_sym)
|
142
|
+
command_plugin=Object::const_get(PLUGINS_MODULE+'::'+plugin_name_sym.to_s.capitalize).new(env)
|
143
|
+
Log.log.debug("got #{command_plugin.class}")
|
144
|
+
# TODO: check that ancestor is Plugin?
|
145
|
+
return command_plugin
|
146
|
+
end
|
147
|
+
|
148
|
+
def generate_bash_completion
|
149
|
+
if @opt_mgr.get_next_argument("",:multiple,:optional).nil?
|
150
|
+
@plugin_env[:config].plugins.keys.each{|p|puts p.to_s}
|
151
|
+
else
|
152
|
+
Log.log.warn("only first level completion so far")
|
153
|
+
end
|
154
|
+
Process.exit(0)
|
155
|
+
end
|
156
|
+
|
157
|
+
# expect some list, but nothing to display
|
158
|
+
def self.result_empty; return {:type => :empty, :data => :nil }; end
|
159
|
+
|
160
|
+
# nothing expected
|
161
|
+
def self.result_nothing; return {:type => :nothing, :data => :nil }; end
|
162
|
+
|
163
|
+
def self.result_status(status); return {:type => :status, :data => status }; end
|
164
|
+
|
165
|
+
def self.result_success; return result_status('complete'); end
|
166
|
+
|
167
|
+
def exit_with_usage(all_plugins)
|
168
|
+
Log.log.debug("exit_with_usage".bg_red)
|
169
|
+
# display main plugin options
|
170
|
+
@plugin_env[:formater].display_message(:error,@opt_mgr.parser)
|
171
|
+
if all_plugins
|
172
|
+
# list plugins that have a "require" field, i.e. all but main plugin
|
173
|
+
@plugin_env[:config].plugins.keys.each do |plugin_name_sym|
|
174
|
+
next if plugin_name_sym.eql?(Plugins::Config::CONF_PLUGIN_SYM)
|
175
|
+
# override main option parser with a brand new, to avoid having global options
|
176
|
+
plugin_env=@plugin_env.clone
|
177
|
+
plugin_env[:man_only]=true
|
178
|
+
plugin_env[:options]=Manager.new(self.program_name,[],'')
|
179
|
+
get_plugin_instance_with_options(plugin_name_sym,plugin_env)
|
180
|
+
# display generated help for plugin options
|
181
|
+
@plugin_env[:formater].display_message(:error,plugin_env[:options].parser.to_s)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
Process.exit(0)
|
185
|
+
end
|
186
|
+
|
187
|
+
protected
|
188
|
+
|
189
|
+
# early debug for parser
|
190
|
+
# Note: does not accept shortcuts
|
191
|
+
def early_debug_setup(argv)
|
192
|
+
Log.instance.program_name=self.program_name
|
193
|
+
argv.each do |arg|
|
194
|
+
case arg
|
195
|
+
when '--'
|
196
|
+
return
|
197
|
+
when /^--log-level=(.*)/
|
198
|
+
Log.instance.level = $1.to_sym
|
199
|
+
when /^--logger=(.*)/
|
200
|
+
Log.instance.logger_type=$1.to_sym
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
public
|
206
|
+
|
207
|
+
# Process statuses of finished transfer sessions
|
208
|
+
# raise exception if there is one error
|
209
|
+
# else returns an empty status
|
210
|
+
def self.result_transfer(statuses)
|
211
|
+
worst=TransferAgent.session_status(statuses)
|
212
|
+
raise worst unless worst.eql?(:success)
|
213
|
+
return Main.result_nothing
|
214
|
+
end
|
215
|
+
|
216
|
+
def options;@opt_mgr;end
|
217
|
+
|
218
|
+
def program_name;PROGRAM_NAME;end
|
219
|
+
|
220
|
+
# this is the main function called by initial script just after constructor
|
221
|
+
def process_command_line
|
222
|
+
Log.log.debug('process_command_line')
|
223
|
+
exception_info=nil
|
224
|
+
begin
|
225
|
+
# find plugins, shall be after parse! ?
|
226
|
+
@plugin_env[:config].add_plugins_from_lookup_folders
|
227
|
+
# help requested without command ? (plugins must be known here)
|
228
|
+
exit_with_usage(true) if @option_help and @opt_mgr.command_or_arg_empty?
|
229
|
+
generate_bash_completion if @bash_completion
|
230
|
+
# load global default options and process
|
231
|
+
@plugin_env[:config].add_plugin_default_preset(Plugins::Config::CONF_GLOBAL_SYM)
|
232
|
+
@opt_mgr.parse_options!
|
233
|
+
# dual execution locking
|
234
|
+
lock_port=@opt_mgr.get_option(:lock_port,:optional)
|
235
|
+
if !lock_port.nil?
|
236
|
+
begin
|
237
|
+
# no need to close later, will be freed on process exit. must save in member else it is garbage collected
|
238
|
+
@tcp_server=TCPServer.new('127.0.0.1',lock_port.to_i)
|
239
|
+
rescue => e
|
240
|
+
raise CliError,"Another instance is already running (lock port=#{lock_port})."
|
241
|
+
end
|
242
|
+
end
|
243
|
+
if @option_show_config and @opt_mgr.command_or_arg_empty?
|
244
|
+
command_sym=Plugins::Config::CONF_PLUGIN_SYM
|
245
|
+
else
|
246
|
+
command_sym=@opt_mgr.get_next_command(@plugin_env[:config].plugins.keys.dup.unshift(:help))
|
247
|
+
end
|
248
|
+
# main plugin is not dynamically instanciated
|
249
|
+
case command_sym
|
250
|
+
when :help
|
251
|
+
exit_with_usage(true)
|
252
|
+
when Plugins::Config::CONF_PLUGIN_SYM
|
253
|
+
command_plugin=@plugin_env[:config]
|
254
|
+
else
|
255
|
+
# get plugin, set options, etc
|
256
|
+
command_plugin=get_plugin_instance_with_options(command_sym)
|
257
|
+
# parse plugin specific options
|
258
|
+
@opt_mgr.parse_options!
|
259
|
+
end
|
260
|
+
# help requested for current plugin
|
261
|
+
exit_with_usage(false) if @option_help
|
262
|
+
if @option_show_config
|
263
|
+
@plugin_env[:formater].display_results({:type=>:single_object,:data=>@opt_mgr.declared_options(false)})
|
264
|
+
Process.exit(0)
|
265
|
+
end
|
266
|
+
# execute and display
|
267
|
+
@plugin_env[:formater].display_results(command_plugin.execute_action)
|
268
|
+
# finish
|
269
|
+
@plugin_env[:transfer].shutdown
|
270
|
+
rescue CliBadArgument => e; exception_info=[e,'Argument',:usage]
|
271
|
+
rescue CliNoSuchId => e; exception_info=[e,'Identifier']
|
272
|
+
rescue CliError => e; exception_info=[e,'Tool',:usage]
|
273
|
+
rescue Fasp::Error => e; exception_info=[e,"FASP(ascp]"]
|
274
|
+
rescue Aspera::RestCallError => e; exception_info=[e,"Rest"]
|
275
|
+
rescue SocketError => e; exception_info=[e,"Network"]
|
276
|
+
rescue StandardError => e; exception_info=[e,"Other",:debug]
|
277
|
+
rescue Interrupt => e; exception_info=[e,"Interruption",:debug]
|
278
|
+
end
|
279
|
+
# cleanup file list files
|
280
|
+
TempFileManager.instance.cleanup
|
281
|
+
# 1- processing of error condition
|
282
|
+
unless exception_info.nil?
|
283
|
+
@plugin_env[:formater].display_message(:error,"ERROR:".bg_red.gray.blink+" "+exception_info[1]+": "+exception_info[0].message)
|
284
|
+
@plugin_env[:formater].display_message(:error,"Use '-h' option to get help.") if exception_info[2].eql?(:usage)
|
285
|
+
end
|
286
|
+
# 2- processing of command not processed (due to exception or bad command line)
|
287
|
+
@opt_mgr.final_errors.each do |msg|
|
288
|
+
@plugin_env[:formater].display_message(:error,"ERROR:".bg_red.gray.blink+" Argument: "+msg)
|
289
|
+
end
|
290
|
+
# 3- in case of error, fail the process status
|
291
|
+
unless exception_info.nil?
|
292
|
+
if Log.instance.level.eql?(:debug)
|
293
|
+
# will force to show stack trace
|
294
|
+
raise exception_info[0]
|
295
|
+
else
|
296
|
+
@plugin_env[:formater].display_message(:error,"Use '--log-level=debug' to get more details.") if exception_info[2].eql?(:debug)
|
297
|
+
Process.exit(1)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
return nil
|
301
|
+
end # process_command_line
|
302
|
+
end # Main
|
303
|
+
end # Cli
|
304
|
+
end # Aspera
|