aspera-cli 4.0.0.pre3 → 4.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +695 -205
- data/bin/dascli +13 -0
- data/docs/README.erb.md +615 -157
- data/docs/test_env.conf +23 -5
- data/docs/transfer_spec.html +1 -1
- data/examples/aoc.rb +14 -3
- data/examples/faspex4.rb +78 -0
- data/lib/aspera/aoc.rb +87 -108
- data/lib/aspera/cli/formater.rb +2 -0
- data/lib/aspera/cli/main.rb +46 -34
- data/lib/aspera/cli/plugin.rb +9 -4
- data/lib/aspera/cli/plugins/alee.rb +1 -1
- data/lib/aspera/cli/plugins/aoc.rb +207 -182
- data/lib/aspera/cli/plugins/ats.rb +2 -2
- data/lib/aspera/cli/plugins/config.rb +173 -117
- data/lib/aspera/cli/plugins/console.rb +2 -2
- data/lib/aspera/cli/plugins/faspex.rb +51 -36
- data/lib/aspera/cli/plugins/faspex5.rb +82 -41
- data/lib/aspera/cli/plugins/node.rb +3 -3
- data/lib/aspera/cli/plugins/preview.rb +35 -25
- data/lib/aspera/cli/plugins/server.rb +23 -8
- data/lib/aspera/cli/transfer_agent.rb +7 -6
- data/lib/aspera/cli/version.rb +1 -1
- data/lib/aspera/cos_node.rb +33 -28
- data/lib/aspera/environment.rb +2 -2
- data/lib/aspera/fasp/connect.rb +28 -21
- data/lib/aspera/fasp/http_gw.rb +140 -28
- data/lib/aspera/fasp/installation.rb +101 -53
- data/lib/aspera/fasp/local.rb +88 -45
- data/lib/aspera/fasp/manager.rb +15 -0
- data/lib/aspera/fasp/node.rb +4 -4
- data/lib/aspera/fasp/parameters.rb +6 -18
- data/lib/aspera/fasp/resume_policy.rb +13 -12
- data/lib/aspera/log.rb +1 -1
- data/lib/aspera/node.rb +61 -1
- data/lib/aspera/oauth.rb +49 -46
- data/lib/aspera/persistency_folder.rb +9 -4
- data/lib/aspera/preview/file_types.rb +53 -21
- data/lib/aspera/preview/generator.rb +3 -3
- data/lib/aspera/rest.rb +29 -18
- data/lib/aspera/secrets.rb +20 -0
- data/lib/aspera/temp_file_manager.rb +19 -0
- data/lib/aspera/web_auth.rb +105 -0
- metadata +42 -22
@@ -107,7 +107,7 @@ module Aspera
|
|
107
107
|
:auth => {
|
108
108
|
:type => :basic,
|
109
109
|
:username => access_key_id,
|
110
|
-
:password =>
|
110
|
+
:password => @agents[:secret].get_secret(access_key_id)}})
|
111
111
|
command=self.options.get_next_command(Node::COMMON_ACTIONS)
|
112
112
|
return Node.new(@agents.merge(skip_basic_auth_options: true, node_api: api_node)).execute_action(command)
|
113
113
|
when :cluster
|
@@ -116,7 +116,7 @@ module Aspera
|
|
116
116
|
:auth => {
|
117
117
|
:type => :basic,
|
118
118
|
:username => access_key_id,
|
119
|
-
:password =>
|
119
|
+
:password => @agents[:secret].get_secret(access_key_id)
|
120
120
|
}}
|
121
121
|
api_ak_auth=Rest.new(rest_params)
|
122
122
|
return {:type=>:single_object, :data=>api_ak_auth.read("servers")[:data]}
|
@@ -7,10 +7,12 @@ require 'aspera/aoc'
|
|
7
7
|
require 'aspera/proxy_auto_config'
|
8
8
|
require 'aspera/uri_reader'
|
9
9
|
require 'aspera/rest'
|
10
|
+
require 'aspera/persistency_action_once'
|
10
11
|
require 'xmlsimple'
|
11
12
|
require 'base64'
|
12
13
|
require 'net/smtp'
|
13
14
|
require 'open3'
|
15
|
+
require 'date'
|
14
16
|
|
15
17
|
module Aspera
|
16
18
|
module Cli
|
@@ -25,6 +27,7 @@ module Aspera
|
|
25
27
|
CONF_PRESET_CONFIG='config'
|
26
28
|
CONF_PRESET_VERSION='version'
|
27
29
|
CONF_PRESET_DEFAULT='default'
|
30
|
+
CONF_PRESET_GLOBAL='global_common_defaults'
|
28
31
|
CONF_PLUGIN_SYM = :config # Plugins::Config.name.split('::').last.downcase.to_sym
|
29
32
|
CONF_GLOBAL_SYM = :config
|
30
33
|
# old tool name
|
@@ -41,20 +44,21 @@ module Aspera
|
|
41
44
|
AOC_COMMAND_CURRENT=AOC_COMMAND_V3
|
42
45
|
CONNECT_WEB_URL = 'https://d3gcli72yxqn2z.cloudfront.net/connect'
|
43
46
|
CONNECT_VERSIONS = 'connectversions.js'
|
47
|
+
TRANSFER_SDK_ARCHIVE_URL = 'https://ibm.biz/aspera_sdk'
|
44
48
|
DEMO='demo'
|
49
|
+
DEMO_SERVER_PRESET='demoserver'
|
50
|
+
AOC_PATH_API_CLIENTS='admin/api-clients'
|
45
51
|
def option_preset; nil; end
|
46
52
|
|
47
53
|
def option_preset=(value)
|
48
54
|
self.options.add_option_preset(preset_by_name(value))
|
49
55
|
end
|
50
56
|
|
51
|
-
private_constant :
|
52
|
-
attr_accessor :option_ak_secret,:option_secrets
|
57
|
+
private_constant :DEFAULT_CONFIG_FILENAME,:CONF_PRESET_CONFIG,:CONF_PRESET_VERSION,:CONF_PRESET_DEFAULT,:CONF_PRESET_GLOBAL,:PROGRAM_NAME_V1,:PROGRAM_NAME_V2,:DEFAULT_REDIRECT,:ASPERA_PLUGINS_FOLDERNAME,:RUBY_FILE_EXT,:AOC_COMMAND_V1,:AOC_COMMAND_V2,:AOC_COMMAND_V3,:AOC_COMMAND_CURRENT,:DEMO,:TRANSFER_SDK_ARCHIVE_URL,:AOC_PATH_API_CLIENTS,:DEMO_SERVER_PRESET
|
53
58
|
|
54
|
-
def initialize(env,tool_name,help_url,version)
|
59
|
+
def initialize(env,tool_name,help_url,version,main_folder)
|
55
60
|
super(env)
|
56
|
-
@
|
57
|
-
@option_secrets={}
|
61
|
+
raise 'missing secret manager' if @agents[:secret].nil?
|
58
62
|
@plugins={}
|
59
63
|
@plugin_lookup_folders=[]
|
60
64
|
@use_plugin_defaults=true
|
@@ -63,19 +67,11 @@ module Aspera
|
|
63
67
|
@program_version=version
|
64
68
|
@tool_name=tool_name
|
65
69
|
@help_url=help_url
|
66
|
-
|
67
|
-
if ENV.has_key?(tool_main_env_var)
|
68
|
-
@main_folder=ENV[tool_main_env_var]
|
69
|
-
else
|
70
|
-
user_home_folder=Dir.home
|
71
|
-
raise CliError,"Home folder does not exist: #{user_home_folder}. Check your user environment or use #{tool_main_env_var}." unless Dir.exist?(user_home_folder)
|
72
|
-
@main_folder=File.join(user_home_folder,ASPERA_HOME_FOLDER_NAME,tool_name)
|
73
|
-
end
|
70
|
+
@main_folder=main_folder
|
74
71
|
@conf_file_default=File.join(@main_folder,DEFAULT_CONFIG_FILENAME)
|
75
72
|
@option_config_file=@conf_file_default
|
76
73
|
Log.log.debug("#{tool_name} folder: #{@main_folder}")
|
77
74
|
# set folder for FASP SDK
|
78
|
-
Fasp::Installation.instance.folder=File.join(@main_folder,'sdk')
|
79
75
|
add_plugin_lookup_folder(File.join(@main_folder,ASPERA_PLUGINS_FOLDERNAME))
|
80
76
|
add_plugin_lookup_folder(self.class.gem_plugins_folder)
|
81
77
|
# do file parameter first
|
@@ -91,35 +87,74 @@ module Aspera
|
|
91
87
|
self.options.set_obj_attr(:ascp_path,self,:option_ascp_path)
|
92
88
|
self.options.set_obj_attr(:use_product,self,:option_use_product)
|
93
89
|
self.options.set_obj_attr(:preset,self,:option_preset)
|
94
|
-
self.options.set_obj_attr(:secret
|
95
|
-
self.options.set_obj_attr(:secrets
|
96
|
-
self.options.add_opt_boolean(:override,
|
97
|
-
self.options.add_opt_switch(:no_default,
|
90
|
+
self.options.set_obj_attr(:secret,@agents[:secret],:default_secret)
|
91
|
+
self.options.set_obj_attr(:secrets,@agents[:secret],:all_secrets)
|
92
|
+
self.options.add_opt_boolean(:override,'override existing value')
|
93
|
+
self.options.add_opt_switch(:no_default,'-N','do not load default configuration for plugin') { @use_plugin_defaults=false }
|
98
94
|
self.options.add_opt_boolean(:use_generic_client,'wizard: AoC: use global or org specific jwt client id')
|
99
|
-
self.options.add_opt_simple(:pkeypath,
|
100
|
-
self.options.add_opt_simple(:ascp_path,
|
101
|
-
self.options.add_opt_simple(:use_product,
|
102
|
-
self.options.add_opt_simple(:smtp,
|
103
|
-
self.options.add_opt_simple(:fpac,
|
104
|
-
self.options.add_opt_simple(:preset,
|
105
|
-
self.options.add_opt_simple(:default,
|
106
|
-
self.options.add_opt_simple(:secret,
|
107
|
-
self.options.add_opt_simple(:secrets,
|
108
|
-
self.options.
|
95
|
+
self.options.add_opt_simple(:pkeypath,'path to private key for JWT (wizard)')
|
96
|
+
self.options.add_opt_simple(:ascp_path,'path to ascp')
|
97
|
+
self.options.add_opt_simple(:use_product,'use ascp from specified product')
|
98
|
+
self.options.add_opt_simple(:smtp,'smtp configuration (extended value: hash)')
|
99
|
+
self.options.add_opt_simple(:fpac,'proxy auto configuration URL')
|
100
|
+
self.options.add_opt_simple(:preset,'-PVALUE','load the named option preset from current config file')
|
101
|
+
self.options.add_opt_simple(:default,'set as default configuration for specified plugin')
|
102
|
+
self.options.add_opt_simple(:secret,'default secret')
|
103
|
+
self.options.add_opt_simple(:secrets,'secret repository (Hash)')
|
104
|
+
self.options.add_opt_simple(:sdk_url,'URL to get SDK')
|
105
|
+
self.options.add_opt_simple(:sdk_folder,'SDK folder location')
|
106
|
+
self.options.add_opt_boolean(:test_mode,'skip user validation in wizard mode')
|
107
|
+
self.options.add_opt_simple(:version_check_days,Integer,'period to check neew version in days (zero to disable)')
|
109
108
|
self.options.set_option(:use_generic_client,true)
|
110
109
|
self.options.set_option(:test_mode,false)
|
110
|
+
self.options.set_option(:version_check_days,7)
|
111
|
+
self.options.set_option(:sdk_url,TRANSFER_SDK_ARCHIVE_URL)
|
112
|
+
self.options.set_option(:sdk_folder,File.join(@main_folder,'sdk'))
|
111
113
|
self.options.parse_options!
|
112
|
-
raise CliBadArgument,
|
114
|
+
raise CliBadArgument,'secrets shall be Hash' unless @agents[:secret].all_secrets.is_a?(Hash)
|
115
|
+
Fasp::Installation.instance.folder=self.options.get_option(:sdk_folder,:mandatory)
|
113
116
|
end
|
114
117
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
118
|
-
|
118
|
+
def check_gem_version
|
119
|
+
this_gem_name=File.basename(File.dirname(self.class.gem_root)).gsub(/-[0-9].*$/,'')
|
120
|
+
latest_version=begin
|
121
|
+
Rest.new(base_url: 'https://rubygems.org/api/v1').read("versions/#{this_gem_name}/latest.json")[:data]['version']
|
122
|
+
rescue
|
123
|
+
Log.log.warn('Could not retrieve latest gem version on rubygems.')
|
124
|
+
'0'
|
125
|
+
end
|
126
|
+
return {name: this_gem_name, current: Aspera::Cli::VERSION, latest: latest_version, need_update: Gem::Version.new(Aspera::Cli::VERSION) < Gem::Version.new(latest_version)}
|
119
127
|
end
|
120
128
|
|
121
|
-
def
|
122
|
-
|
129
|
+
def periodic_check_newer_gem_version
|
130
|
+
# get verification period
|
131
|
+
delay_days=options.get_option(:version_check_days,:mandatory)
|
132
|
+
Log.log.info("check days: #{delay_days}")
|
133
|
+
# check only if not zero day
|
134
|
+
if !delay_days.eql?(0)
|
135
|
+
# get last date from persistency
|
136
|
+
last_check_array=[]
|
137
|
+
check_date_persist=PersistencyActionOnce.new(
|
138
|
+
manager: persistency,
|
139
|
+
data: last_check_array,
|
140
|
+
ids: ['version_last_check'])
|
141
|
+
# get persisted date or nil
|
142
|
+
last_check_date = begin
|
143
|
+
Date.strptime(last_check_array.first, '%Y/%m/%d')
|
144
|
+
rescue
|
145
|
+
nil
|
146
|
+
end
|
147
|
+
current_date=Date.today
|
148
|
+
Log.log.debug("days elapsed: #{last_check_date.is_a?(Date) ? current_date - last_check_date : last_check_date.class.name}")
|
149
|
+
if last_check_date.nil? or (current_date - last_check_date) > delay_days
|
150
|
+
last_check_array[0]=current_date.strftime('%Y/%m/%d')
|
151
|
+
check_date_persist.save
|
152
|
+
check_data=check_gem_version
|
153
|
+
if check_data[:need_update]
|
154
|
+
Log.log.warn("A new version is available: #{check_data[:latest]}. You have #{check_data[:current]}. Upgrade with: gem update #{check_data[:name]}")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
123
158
|
end
|
124
159
|
|
125
160
|
# retrieve structure from cloud (CDN) with all versions available
|
@@ -155,7 +190,7 @@ module Aspera
|
|
155
190
|
require 'openssl'
|
156
191
|
priv_key = OpenSSL::PKey::RSA.new(4096)
|
157
192
|
File.write(private_key_path,priv_key.to_s)
|
158
|
-
File.write(private_key_path+
|
193
|
+
File.write(private_key_path+'.pub',priv_key.public_key.to_s)
|
159
194
|
nil
|
160
195
|
end
|
161
196
|
|
@@ -181,7 +216,7 @@ module Aspera
|
|
181
216
|
r=[]
|
182
217
|
t.each do |k,v|
|
183
218
|
v.each do |kk,vv|
|
184
|
-
r.push({
|
219
|
+
r.push({'config'=>k,'parameter'=>kk,'value'=>vv})
|
185
220
|
end
|
186
221
|
end
|
187
222
|
return r
|
@@ -191,12 +226,12 @@ module Aspera
|
|
191
226
|
# creates one if none already created
|
192
227
|
# @return preset that contains global default
|
193
228
|
def set_global_default(key,value)
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
@config_presets[global_default_preset_name]={}
|
198
|
-
end
|
229
|
+
# get default preset if it exists
|
230
|
+
global_default_preset_name=get_plugin_default_config_name(CONF_GLOBAL_SYM) || CONF_PRESET_GLOBAL
|
231
|
+
@config_presets[global_default_preset_name]||={}
|
199
232
|
@config_presets[global_default_preset_name][key.to_s]=value
|
233
|
+
self.format.display_status("Updated: #{global_default_preset_name}: #{key} <- #{value}")
|
234
|
+
save_presets_to_config_file
|
200
235
|
return global_default_preset_name
|
201
236
|
end
|
202
237
|
|
@@ -215,7 +250,7 @@ module Aspera
|
|
215
250
|
# @return the hash from name (also expands possible includes)
|
216
251
|
def preset_by_name(config_name, include_path=[])
|
217
252
|
raise CliError,"no such config preset: #{config_name}" unless @config_presets.has_key?(config_name)
|
218
|
-
raise CliError,
|
253
|
+
raise CliError,'loop in include' if include_path.include?(config_name)
|
219
254
|
return expanded_with_preset_includes(@config_presets[config_name],include_path.clone.push(config_name))
|
220
255
|
end
|
221
256
|
|
@@ -250,7 +285,7 @@ module Aspera
|
|
250
285
|
end
|
251
286
|
|
252
287
|
def option_use_product
|
253
|
-
|
288
|
+
'write-only value'
|
254
289
|
end
|
255
290
|
|
256
291
|
def convert_preset_path(old_name,new_name,files_to_copy)
|
@@ -294,22 +329,21 @@ module Aspera
|
|
294
329
|
# if no file found, create default config
|
295
330
|
if conf_file_to_load.nil?
|
296
331
|
Log.log.warn("No config file found. Creating empty configuration file: #{@option_config_file}")
|
297
|
-
@config_presets={CONF_PRESET_CONFIG=>{CONF_PRESET_VERSION=>@program_version}
|
298
|
-
'demoserver'=>{'url'=>'ssh://'+DEMO+'.asperasoft.com:33001','username'=>AOC_COMMAND_V2,'ssAP'.downcase.reverse+'drow'.reverse=>DEMO+AOC_COMMAND_V2}}
|
332
|
+
@config_presets={CONF_PRESET_CONFIG=>{CONF_PRESET_VERSION=>@program_version}}
|
299
333
|
else
|
300
334
|
Log.log.debug "loading #{@option_config_file}"
|
301
335
|
@config_presets=YAML.load_file(conf_file_to_load)
|
302
336
|
end
|
303
337
|
files_to_copy=[]
|
304
338
|
Log.log.debug "Available_presets: #{@config_presets}"
|
305
|
-
raise
|
339
|
+
raise 'Expecting YAML Hash' unless @config_presets.is_a?(Hash)
|
306
340
|
# check there is at least the config section
|
307
341
|
if !@config_presets.has_key?(CONF_PRESET_CONFIG)
|
308
342
|
raise "Cannot find key: #{CONF_PRESET_CONFIG}"
|
309
343
|
end
|
310
344
|
version=@config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION]
|
311
345
|
if version.nil?
|
312
|
-
raise
|
346
|
+
raise 'No version found in config section.'
|
313
347
|
end
|
314
348
|
# oldest compatible conf file format, update to latest version when an incompatible change is made
|
315
349
|
# check compatibility of version of conf file
|
@@ -338,24 +372,24 @@ module Aspera
|
|
338
372
|
end
|
339
373
|
# Place new compatibility code here
|
340
374
|
if save_required
|
341
|
-
Log.log.warn(
|
375
|
+
Log.log.warn('Saving automatic conversion.')
|
342
376
|
@config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION]=@program_version
|
343
377
|
save_presets_to_config_file
|
344
|
-
Log.log.warn(
|
378
|
+
Log.log.warn('Copying referenced files')
|
345
379
|
files_to_copy.each do |file|
|
346
380
|
FileUtils.cp(file,@main_folder)
|
347
381
|
Log.log.warn("..#{file} -> #{@main_folder}")
|
348
382
|
end
|
349
383
|
end
|
350
384
|
rescue Psych::SyntaxError => e
|
351
|
-
Log.log.error(
|
385
|
+
Log.log.error('YAML error in config file')
|
352
386
|
raise e
|
353
387
|
rescue => e
|
354
388
|
Log.log.debug("-> #{e}")
|
355
389
|
new_name="#{@option_config_file}.pre#{@program_version}.manual_conversion_needed"
|
356
390
|
File.rename(@option_config_file,new_name)
|
357
391
|
Log.log.warn("Renamed config file to #{new_name}.")
|
358
|
-
Log.log.warn(
|
392
|
+
Log.log.warn('Manual Conversion is required. Next time, a new empty file will be created.')
|
359
393
|
raise CliError,e.to_s
|
360
394
|
end
|
361
395
|
end
|
@@ -420,10 +454,10 @@ module Aspera
|
|
420
454
|
fileurl = one_link['href']
|
421
455
|
filename=fileurl.gsub(%r{.*/},'')
|
422
456
|
api_connect_cdn.call({:operation=>'GET',:subpath=>fileurl,:save_to_file=>File.join(folder_dest,filename)})
|
423
|
-
return Main.result_status("
|
457
|
+
return Main.result_status("Downloaded: #{filename}")
|
424
458
|
when :open #
|
425
459
|
OpenApplication.instance.uri(one_link['href'])
|
426
|
-
return Main.result_status("
|
460
|
+
return Main.result_status("Opened: #{one_link['href']}")
|
427
461
|
end
|
428
462
|
end
|
429
463
|
end
|
@@ -436,24 +470,24 @@ module Aspera
|
|
436
470
|
when :connect
|
437
471
|
return execute_connect_action
|
438
472
|
when :use
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
preset_name
|
444
|
-
save_presets_to_config_file
|
445
|
-
return {:type=>:status, :data=>"saved to default global preset #{preset_name}"}
|
473
|
+
ascp_path=self.options.get_next_argument('path to ascp')
|
474
|
+
ascp_version=Fasp::Installation.instance.get_ascp_version(ascp_path)
|
475
|
+
self.format.display_status("ascp version: #{ascp_version}")
|
476
|
+
preset_name=set_global_default(:ascp_path,ascp_path)
|
477
|
+
return Main.result_status("Saved to default global preset #{preset_name}")
|
446
478
|
when :show # shows files used
|
447
479
|
return {:type=>:status, :data=>Fasp::Installation.instance.path(:ascp)}
|
448
480
|
when :info # shows files used
|
449
481
|
data=Fasp::Installation::FILES.inject({}) do |m,v|
|
450
|
-
m[v.to_s]=Fasp::Installation.instance.path(v) rescue
|
482
|
+
m[v.to_s]=Fasp::Installation.instance.path(v) rescue 'Not Found'
|
451
483
|
m
|
452
484
|
end
|
453
485
|
# read PATHs from ascp directly, and pvcl modules as well
|
454
486
|
Open3.popen3(Fasp::Installation.instance.path(:ascp),'-DDL-') do |stdin, stdout, stderr, thread|
|
487
|
+
last_line=''
|
455
488
|
while line=stderr.gets do
|
456
489
|
line.chomp!
|
490
|
+
last_line=line
|
457
491
|
case line
|
458
492
|
when %r{^DBG Path ([^ ]+) (dir|file) +: (.*)$};data[$1]=$3
|
459
493
|
when %r{^DBG Added module group:"([^"]+)" name:"([^"]+)", version:"([^"]+)" interface:"([^"]+)"$};data[$2]=$4
|
@@ -462,6 +496,9 @@ module Aspera
|
|
462
496
|
when %r{^LOG Initializing FASP version ([^,]+),};data['ascp_version']=$1
|
463
497
|
end
|
464
498
|
end
|
499
|
+
if !thread.value.exitstatus.eql?(1) and !data.has_key?('root')
|
500
|
+
raise last_line
|
501
|
+
end
|
465
502
|
end
|
466
503
|
data['keypass']=Fasp::Installation.instance.bypass_pass
|
467
504
|
return {:type=>:single_object, :data=>data}
|
@@ -474,17 +511,16 @@ module Aspera
|
|
474
511
|
default_product=self.options.get_next_argument('product name')
|
475
512
|
Fasp::Installation.instance.use_ascp_from_product(default_product)
|
476
513
|
preset_name=set_global_default(:ascp_path,Fasp::Installation.instance.path(:ascp))
|
477
|
-
|
478
|
-
return {:type=>:status, :data=>"saved to default global preset #{preset_name}"}
|
514
|
+
return Main.result_status("Saved to default global preset #{preset_name}")
|
479
515
|
end
|
480
516
|
when :install
|
481
|
-
v=Fasp::Installation.instance.install_sdk
|
482
|
-
return
|
517
|
+
v=Fasp::Installation.instance.install_sdk(self.options.get_option(:sdk_url,:mandatory))
|
518
|
+
return Main.result_status("Installed version #{v}")
|
483
519
|
end
|
484
520
|
raise "unexpected case: #{command}"
|
485
521
|
end
|
486
522
|
|
487
|
-
ACTIONS=[:gem_path, :genkey,:plugins,:flush_tokens,:list,:overview,:open,:echo,:id,:documentation,:wizard,:export_to_cli,:detect,:coffee,:ascp,:email_test,:smtp_settings,:proxy_check,:folder,:file]
|
523
|
+
ACTIONS=[:gem_path, :genkey,:plugins,:flush_tokens,:list,:overview,:open,:echo,:id,:documentation,:wizard,:export_to_cli,:detect,:coffee,:ascp,:email_test,:smtp_settings,:proxy_check,:folder,:file,:check_update,:initdemo]
|
488
524
|
|
489
525
|
# "config" plugin
|
490
526
|
def execute_action
|
@@ -503,7 +539,7 @@ module Aspera
|
|
503
539
|
when :delete
|
504
540
|
@config_presets.delete(config_name)
|
505
541
|
save_presets_to_config_file
|
506
|
-
return Main.result_status("
|
542
|
+
return Main.result_status("Deleted: #{config_name}")
|
507
543
|
when :get
|
508
544
|
param_name=self.options.get_next_argument('parameter name')
|
509
545
|
value=selected_preset[param_name]
|
@@ -516,7 +552,7 @@ module Aspera
|
|
516
552
|
param_name=self.options.get_next_argument('parameter name')
|
517
553
|
selected_preset.delete(param_name)
|
518
554
|
save_presets_to_config_file
|
519
|
-
return Main.result_status("
|
555
|
+
return Main.result_status("Removed: #{config_name}: #{param_name}")
|
520
556
|
when :set
|
521
557
|
param_name=self.options.get_next_argument('parameter name')
|
522
558
|
param_value=self.options.get_next_argument('parameter value')
|
@@ -529,7 +565,7 @@ module Aspera
|
|
529
565
|
end
|
530
566
|
selected_preset[param_name]=param_value
|
531
567
|
save_presets_to_config_file
|
532
|
-
return Main.result_status("
|
568
|
+
return Main.result_status("Updated: #{config_name}: #{param_name} <- #{param_value}")
|
533
569
|
when :initialize
|
534
570
|
config_value=self.options.get_next_argument('extended value (Hash)')
|
535
571
|
if @config_presets.has_key?(config_name)
|
@@ -537,7 +573,7 @@ module Aspera
|
|
537
573
|
end
|
538
574
|
@config_presets[config_name]=config_value
|
539
575
|
save_presets_to_config_file
|
540
|
-
return Main.result_status("
|
576
|
+
return Main.result_status("Modified: #{@option_config_file}")
|
541
577
|
when :update
|
542
578
|
default_for_plugin=self.options.get_option(:default,:optional)
|
543
579
|
# get unprocessed options
|
@@ -550,7 +586,7 @@ module Aspera
|
|
550
586
|
@config_presets[CONF_PRESET_DEFAULT][default_for_plugin]=config_name
|
551
587
|
end
|
552
588
|
save_presets_to_config_file
|
553
|
-
return Main.result_status("
|
589
|
+
return Main.result_status("Updated: #{config_name}")
|
554
590
|
when :ask
|
555
591
|
self.options.ask_missing_mandatory=:yes
|
556
592
|
@config_presets[config_name]||={}
|
@@ -559,10 +595,12 @@ module Aspera
|
|
559
595
|
@config_presets[config_name][optionname]=option_value
|
560
596
|
end
|
561
597
|
save_presets_to_config_file
|
562
|
-
return Main.result_status("
|
598
|
+
return Main.result_status("Updated: #{config_name}")
|
563
599
|
end
|
564
600
|
when :documentation
|
565
|
-
|
601
|
+
section=options.get_next_argument('private key file path',:single,:optional)
|
602
|
+
section='#'+section unless section.nil?
|
603
|
+
OpenApplication.instance.uri("#{@help_url}#{section}")
|
566
604
|
return Main.result_nothing
|
567
605
|
when :open
|
568
606
|
OpenApplication.instance.uri("#{@option_config_file}") #file://
|
@@ -570,9 +608,9 @@ module Aspera
|
|
570
608
|
when :genkey # generate new rsa key
|
571
609
|
private_key_path=self.options.get_next_argument('private key file path')
|
572
610
|
generate_new_key(private_key_path)
|
573
|
-
return Main.result_status('
|
611
|
+
return Main.result_status('Generated key: '+private_key_path)
|
574
612
|
when :echo # display the content of a value given on command line
|
575
|
-
result={:type=>:other_struct, :data=>self.options.get_next_argument(
|
613
|
+
result={:type=>:other_struct, :data=>self.options.get_next_argument('value')}
|
576
614
|
# special for csv
|
577
615
|
result[:type]=:object_list if result[:data].is_a?(Array) and result[:data].first.is_a?(Hash)
|
578
616
|
return result
|
@@ -587,14 +625,13 @@ module Aspera
|
|
587
625
|
return {:type=>:object_list,:data=>self.class.flatten_all_config(@config_presets)}
|
588
626
|
when :wizard
|
589
627
|
self.options.ask_missing_mandatory=true
|
590
|
-
#self.options.set_option(:interactive,:yes)
|
591
628
|
# register url option
|
592
629
|
BasicAuthPlugin.new(@agents.merge(skip_option_header: true))
|
593
630
|
instance_url=self.options.get_option(:url,:mandatory)
|
594
631
|
appli=ApiDetector.discover_product(instance_url)
|
595
632
|
case appli[:product]
|
596
633
|
when :aoc
|
597
|
-
self.format.display_status(
|
634
|
+
self.format.display_status('Detected: Aspera on Cloud'.bold)
|
598
635
|
organization,instance_domain=AoC.parse_url(instance_url)
|
599
636
|
aspera_preset_name='aoc_'+organization
|
600
637
|
self.format.display_status("Preparing preset: #{aspera_preset_name}")
|
@@ -608,7 +645,7 @@ module Aspera
|
|
608
645
|
private_key_path=self.options.get_option(:pkeypath,:optional)
|
609
646
|
# give a chance to provide
|
610
647
|
if private_key_path.nil?
|
611
|
-
self.format.display_status(
|
648
|
+
self.format.display_status('Please provide path to your private RSA key, or empty to generate one:')
|
612
649
|
private_key_path=self.options.get_option(:pkeypath,:mandatory).to_s
|
613
650
|
end
|
614
651
|
# else generate path
|
@@ -616,69 +653,69 @@ module Aspera
|
|
616
653
|
private_key_path=File.join(@main_folder,'aspera_aoc_key')
|
617
654
|
end
|
618
655
|
if File.exist?(private_key_path)
|
619
|
-
self.format.display_status(
|
656
|
+
self.format.display_status('Using existing key:')
|
620
657
|
else
|
621
|
-
self.format.display_status(
|
658
|
+
self.format.display_status('Generating key...')
|
622
659
|
generate_new_key(private_key_path)
|
623
|
-
self.format.display_status(
|
660
|
+
self.format.display_status('Created:')
|
624
661
|
end
|
625
662
|
self.format.display_status("#{private_key_path}")
|
626
663
|
pub_key_pem=OpenSSL::PKey::RSA.new(File.read(private_key_path)).public_key.to_s
|
627
|
-
#
|
664
|
+
# declare command line options for AoC
|
628
665
|
require 'aspera/cli/plugins/aoc'
|
629
666
|
# make username mandatory for jwt, this triggers interactive input
|
630
667
|
self.options.get_option(:username,:mandatory)
|
631
|
-
# instanciate AoC plugin
|
668
|
+
# instanciate AoC plugin, so that command line options are known
|
632
669
|
files_plugin=self.class.plugin_new(AOC_COMMAND_CURRENT,@agents.merge({skip_basic_auth_options: true, private_key_path: private_key_path}))
|
670
|
+
aoc_api=files_plugin.get_api
|
633
671
|
auto_set_pub_key=false
|
634
672
|
auto_set_jwt=false
|
635
673
|
use_browser_authentication=false
|
636
674
|
if self.options.get_option(:use_generic_client)
|
637
|
-
self.format.display_status(
|
638
|
-
self.format.display_status(
|
639
|
-
self.format.display_status(
|
640
|
-
self.format.display_status(
|
675
|
+
self.format.display_status('Using global client_id.')
|
676
|
+
self.format.display_status('Please Login to your Aspera on Cloud instance.'.red)
|
677
|
+
self.format.display_status('Navigate to your "Account Settings"'.red)
|
678
|
+
self.format.display_status('Check or update the value of "Public Key" to be:'.red.blink)
|
641
679
|
self.format.display_status("#{pub_key_pem}")
|
642
680
|
if ! self.options.get_option(:test_mode)
|
643
|
-
self.format.display_status(
|
681
|
+
self.format.display_status('Once updated or validated, press enter.')
|
644
682
|
OpenApplication.instance.uri(instance_url)
|
645
683
|
STDIN.gets
|
646
684
|
end
|
647
685
|
else
|
648
|
-
self.format.display_status(
|
686
|
+
self.format.display_status('Using organization specific client_id.')
|
649
687
|
if self.options.get_option(:client_id,:optional).nil? or self.options.get_option(:client_secret,:optional).nil?
|
650
|
-
self.format.display_status(
|
651
|
-
self.format.display_status(
|
652
|
-
self.format.display_status(
|
688
|
+
self.format.display_status('Please login to your Aspera on Cloud instance.'.red)
|
689
|
+
self.format.display_status('Go to: Apps->Admin->Organization->Integrations')
|
690
|
+
self.format.display_status('Create or check if there is an existing integration named:')
|
653
691
|
self.format.display_status("- name: #{@tool_name}")
|
654
692
|
self.format.display_status("- redirect uri: #{DEFAULT_REDIRECT}")
|
655
|
-
self.format.display_status(
|
656
|
-
self.format.display_status(
|
657
|
-
self.format.display_status(
|
693
|
+
self.format.display_status('- origin: localhost')
|
694
|
+
self.format.display_status('Once created or identified,')
|
695
|
+
self.format.display_status('Please enter:'.red)
|
658
696
|
end
|
659
|
-
OpenApplication.instance.uri(instance_url
|
697
|
+
OpenApplication.instance.uri("#{instance_url}/#{AOC_PATH_API_CLIENTS}")
|
660
698
|
self.options.get_option(:client_id,:mandatory)
|
661
699
|
self.options.get_option(:client_secret,:mandatory)
|
662
700
|
use_browser_authentication=true
|
663
701
|
end
|
664
702
|
if use_browser_authentication
|
665
|
-
self.format.display_status(
|
666
|
-
self.options.set_option(:auth,:web)
|
667
|
-
self.options.set_option(:redirect_uri,DEFAULT_REDIRECT)
|
703
|
+
self.format.display_status('We will use web authentication to bootstrap.')
|
668
704
|
auto_set_pub_key=true
|
669
705
|
auto_set_jwt=true
|
670
|
-
|
706
|
+
@api_aoc.oauth.params[:auth]=:web
|
707
|
+
@api_aoc.oauth.params[:redirect_uri]=DEFAULT_REDIRECT
|
708
|
+
@api_aoc.oauth.params[:scope]=AoC::SCOPE_FILES_ADMIN
|
671
709
|
end
|
672
|
-
|
673
|
-
myself=files_plugin.api_aoc.read('self')[:data]
|
710
|
+
myself=aoc_api.read('self')[:data]
|
674
711
|
if auto_set_pub_key
|
675
|
-
raise CliError,
|
676
|
-
self.format.display_status(
|
677
|
-
|
712
|
+
raise CliError,'public key is already set in profile (use --override=yes)' unless myself['public_key'].empty? or option_override
|
713
|
+
self.format.display_status('Updating profile with new key')
|
714
|
+
aoc_api.update("users/#{myself['id']}",{'public_key'=>pub_key_pem})
|
678
715
|
end
|
679
716
|
if auto_set_jwt
|
680
|
-
self.format.display_status(
|
681
|
-
|
717
|
+
self.format.display_status('Enabling JWT for client')
|
718
|
+
aoc_api.update("clients/#{self.options.get_option(:client_id)}",{'jwt_grant_enabled'=>true,'explicit_authorization_required'=>false})
|
682
719
|
end
|
683
720
|
self.format.display_status("creating new config preset: #{aspera_preset_name}")
|
684
721
|
@config_presets[aspera_preset_name]={
|
@@ -694,14 +731,14 @@ module Aspera
|
|
694
731
|
end
|
695
732
|
self.format.display_status("Setting config preset as default for #{AOC_COMMAND_CURRENT}")
|
696
733
|
@config_presets[CONF_PRESET_DEFAULT][AOC_COMMAND_CURRENT]=aspera_preset_name
|
697
|
-
self.format.display_status(
|
734
|
+
self.format.display_status('saving config file')
|
698
735
|
save_presets_to_config_file
|
699
736
|
return Main.result_status("Done.\nYou can test with:\n#{@tool_name} #{AOC_COMMAND_CURRENT} user info show")
|
700
737
|
else
|
701
738
|
raise CliBadArgument,"Supports only: aoc. Detected: #{appli}"
|
702
739
|
end
|
703
740
|
when :export_to_cli
|
704
|
-
self.format.display_status(
|
741
|
+
self.format.display_status('Exporting: Aspera on Cloud')
|
705
742
|
require 'aspera/cli/plugins/aoc'
|
706
743
|
# need url / username
|
707
744
|
add_plugin_default_preset(AOC_COMMAND_V3.to_sym)
|
@@ -734,11 +771,11 @@ module Aspera
|
|
734
771
|
entry.merge!(new_conf)
|
735
772
|
end
|
736
773
|
File.write(cli_conf_file,JSON.pretty_generate(data))
|
737
|
-
return Main.result_status("
|
774
|
+
return Main.result_status("Updated: #{cli_conf_file}")
|
738
775
|
when :detect
|
739
776
|
# need url / username
|
740
777
|
BasicAuthPlugin.new(@agents)
|
741
|
-
return Main.result_status("
|
778
|
+
return Main.result_status("Found: #{ApiDetector.discover_product(self.options.get_option(:url,:mandatory))}")
|
742
779
|
when :coffee
|
743
780
|
OpenApplication.instance.uri('https://enjoyjava.com/wp-content/uploads/2018/01/How-to-make-strong-coffee.jpg')
|
744
781
|
return Main.result_nothing
|
@@ -751,7 +788,7 @@ module Aspera
|
|
751
788
|
when :file
|
752
789
|
return Main.result_status(@option_config_file)
|
753
790
|
when :email_test
|
754
|
-
dest_email=self.options.get_next_argument(
|
791
|
+
dest_email=self.options.get_next_argument('destination email')
|
755
792
|
send_email({
|
756
793
|
to: dest_email,
|
757
794
|
subject: 'Amelia email test',
|
@@ -762,9 +799,28 @@ module Aspera
|
|
762
799
|
return {:type=>:single_object,:data=>email_settings}
|
763
800
|
when :proxy_check
|
764
801
|
pac_url=self.options.get_option(:fpac,:mandatory)
|
765
|
-
server_url=self.options.get_next_argument(
|
802
|
+
server_url=self.options.get_next_argument('server url')
|
766
803
|
return Main.result_status(Aspera::ProxyAutoConfig.new(UriReader.read(pac_url)).get_proxy(server_url))
|
767
|
-
|
804
|
+
when :check_update
|
805
|
+
return {:type=>:single_object, :data=>check_gem_version}
|
806
|
+
when :initdemo
|
807
|
+
if @config_presets.has_key?(DEMO_SERVER_PRESET)
|
808
|
+
Log.log.warn("Demo server preset already present: #{DEMO_SERVER_PRESET}")
|
809
|
+
else
|
810
|
+
Log.log.info("Creating Demo server preset: #{DEMO_SERVER_PRESET}")
|
811
|
+
@config_presets[DEMO_SERVER_PRESET]={'url'=>'ssh://'+DEMO+'.asperasoft.com:33001','username'=>AOC_COMMAND_V2,'ssAP'.downcase.reverse+'drow'.reverse=>DEMO+AOC_COMMAND_V2}
|
812
|
+
end
|
813
|
+
@config_presets[CONF_PRESET_DEFAULT]||={}
|
814
|
+
if @config_presets[CONF_PRESET_DEFAULT].has_key?('server')
|
815
|
+
Log.log.warn("server default preset already set to: #{@config_presets[CONF_PRESET_DEFAULT]['server']}")
|
816
|
+
Log.log.warn("use #{DEMO_SERVER_PRESET} for demo: -P#{DEMO_SERVER_PRESET}") unless DEMO_SERVER_PRESET.eql?(@config_presets[CONF_PRESET_DEFAULT]['server'])
|
817
|
+
else
|
818
|
+
@config_presets[CONF_PRESET_DEFAULT]['server']=DEMO_SERVER_PRESET
|
819
|
+
Log.log.info("setting server default preset to : #{DEMO_SERVER_PRESET}")
|
820
|
+
end
|
821
|
+
save_presets_to_config_file
|
822
|
+
return Main.result_status("Done")
|
823
|
+
else raise 'error'
|
768
824
|
end
|
769
825
|
end
|
770
826
|
|
@@ -812,7 +868,7 @@ END_OF_MESSAGE
|
|
812
868
|
end
|
813
869
|
|
814
870
|
def save_presets_to_config_file
|
815
|
-
raise
|
871
|
+
raise 'no configuration loaded' if @config_presets.nil?
|
816
872
|
FileUtils.mkdir_p(@main_folder) unless Dir.exist?(@main_folder)
|
817
873
|
Log.log.debug "writing #{@option_config_file}"
|
818
874
|
File.write(@option_config_file,@config_presets.to_yaml)
|
@@ -823,7 +879,7 @@ END_OF_MESSAGE
|
|
823
879
|
def get_plugin_default_config_name(plugin_sym)
|
824
880
|
raise "internal error: config_presets shall be defined" if @config_presets.nil?
|
825
881
|
if !@use_plugin_defaults
|
826
|
-
Log.log.debug(
|
882
|
+
Log.log.debug('skip default config')
|
827
883
|
return nil
|
828
884
|
end
|
829
885
|
if @config_presets.has_key?(CONF_PRESET_DEFAULT) and
|