aspera-cli 4.10.0 → 4.12.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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/BUGS.md +19 -0
  4. data/CHANGELOG.md +528 -0
  5. data/CONTRIBUTING.md +143 -0
  6. data/README.md +977 -589
  7. data/bin/ascli +4 -4
  8. data/bin/asession +12 -12
  9. data/docs/test_env.conf +29 -19
  10. data/examples/aoc.rb +6 -6
  11. data/examples/dascli +18 -16
  12. data/examples/faspex4.rb +15 -15
  13. data/examples/node.rb +12 -12
  14. data/examples/proxy.pac +2 -2
  15. data/examples/server.rb +12 -12
  16. data/lib/aspera/aoc.rb +344 -272
  17. data/lib/aspera/ascmd.rb +56 -54
  18. data/lib/aspera/ats_api.rb +4 -4
  19. data/lib/aspera/cli/basic_auth_plugin.rb +15 -12
  20. data/lib/aspera/cli/extended_value.rb +9 -9
  21. data/lib/aspera/cli/{formater.rb → formatter.rb} +69 -69
  22. data/lib/aspera/cli/listener/line_dump.rb +1 -1
  23. data/lib/aspera/cli/listener/logger.rb +1 -1
  24. data/lib/aspera/cli/listener/progress.rb +5 -6
  25. data/lib/aspera/cli/listener/progress_multi.rb +16 -21
  26. data/lib/aspera/cli/main.rb +72 -73
  27. data/lib/aspera/cli/manager.rb +112 -112
  28. data/lib/aspera/cli/plugin.rb +68 -48
  29. data/lib/aspera/cli/plugins/alee.rb +4 -4
  30. data/lib/aspera/cli/plugins/aoc.rb +322 -720
  31. data/lib/aspera/cli/plugins/ats.rb +50 -52
  32. data/lib/aspera/cli/plugins/bss.rb +10 -10
  33. data/lib/aspera/cli/plugins/config.rb +514 -410
  34. data/lib/aspera/cli/plugins/console.rb +12 -12
  35. data/lib/aspera/cli/plugins/cos.rb +18 -20
  36. data/lib/aspera/cli/plugins/faspex.rb +134 -136
  37. data/lib/aspera/cli/plugins/faspex5.rb +235 -70
  38. data/lib/aspera/cli/plugins/node.rb +378 -309
  39. data/lib/aspera/cli/plugins/orchestrator.rb +52 -49
  40. data/lib/aspera/cli/plugins/preview.rb +129 -120
  41. data/lib/aspera/cli/plugins/server.rb +137 -83
  42. data/lib/aspera/cli/plugins/shares.rb +77 -52
  43. data/lib/aspera/cli/plugins/sync.rb +13 -33
  44. data/lib/aspera/cli/transfer_agent.rb +61 -61
  45. data/lib/aspera/cli/version.rb +2 -1
  46. data/lib/aspera/colors.rb +3 -3
  47. data/lib/aspera/command_line_builder.rb +78 -74
  48. data/lib/aspera/cos_node.rb +31 -29
  49. data/lib/aspera/data_repository.rb +1 -1
  50. data/lib/aspera/environment.rb +30 -28
  51. data/lib/aspera/fasp/agent_base.rb +17 -15
  52. data/lib/aspera/fasp/agent_connect.rb +34 -32
  53. data/lib/aspera/fasp/agent_direct.rb +70 -73
  54. data/lib/aspera/fasp/agent_httpgw.rb +79 -74
  55. data/lib/aspera/fasp/agent_node.rb +26 -26
  56. data/lib/aspera/fasp/agent_trsdk.rb +20 -20
  57. data/lib/aspera/fasp/error.rb +3 -2
  58. data/lib/aspera/fasp/error_info.rb +11 -8
  59. data/lib/aspera/fasp/installation.rb +80 -80
  60. data/lib/aspera/fasp/listener.rb +2 -2
  61. data/lib/aspera/fasp/parameters.rb +103 -92
  62. data/lib/aspera/fasp/parameters.yaml +313 -214
  63. data/lib/aspera/fasp/resume_policy.rb +10 -10
  64. data/lib/aspera/fasp/transfer_spec.rb +22 -2
  65. data/lib/aspera/fasp/uri.rb +7 -7
  66. data/lib/aspera/faspex_gw.rb +80 -159
  67. data/lib/aspera/faspex_postproc.rb +77 -0
  68. data/lib/aspera/hash_ext.rb +3 -3
  69. data/lib/aspera/id_generator.rb +5 -5
  70. data/lib/aspera/keychain/encrypted_hash.rb +23 -28
  71. data/lib/aspera/keychain/macos_security.rb +21 -20
  72. data/lib/aspera/log.rb +13 -13
  73. data/lib/aspera/nagios.rb +24 -23
  74. data/lib/aspera/node.rb +217 -38
  75. data/lib/aspera/oauth.rb +78 -74
  76. data/lib/aspera/open_application.rb +19 -11
  77. data/lib/aspera/persistency_action_once.rb +4 -4
  78. data/lib/aspera/persistency_folder.rb +13 -13
  79. data/lib/aspera/preview/file_types.rb +8 -8
  80. data/lib/aspera/preview/generator.rb +67 -67
  81. data/lib/aspera/preview/utils.rb +27 -27
  82. data/lib/aspera/proxy_auto_config.js +63 -63
  83. data/lib/aspera/proxy_auto_config.rb +19 -19
  84. data/lib/aspera/rest.rb +65 -67
  85. data/lib/aspera/rest_call_error.rb +2 -1
  86. data/lib/aspera/rest_error_analyzer.rb +22 -21
  87. data/lib/aspera/rest_errors_aspera.rb +16 -16
  88. data/lib/aspera/secret_hider.rb +17 -14
  89. data/lib/aspera/ssh.rb +15 -14
  90. data/lib/aspera/sync.rb +177 -62
  91. data/lib/aspera/temp_file_manager.rb +2 -2
  92. data/lib/aspera/uri_reader.rb +4 -4
  93. data/lib/aspera/web_auth.rb +13 -64
  94. data/lib/aspera/web_server_simple.rb +76 -0
  95. data.tar.gz.sig +0 -0
  96. metadata +11 -6
  97. metadata.gz.sig +0 -0
@@ -3,7 +3,7 @@
3
3
  require 'aspera/cli/basic_auth_plugin'
4
4
  require 'aspera/cli/extended_value'
5
5
  require 'aspera/cli/version'
6
- require 'aspera/cli/formater'
6
+ require 'aspera/cli/formatter'
7
7
  require 'aspera/cli/info'
8
8
  require 'aspera/fasp/installation'
9
9
  require 'aspera/fasp/parameters'
@@ -28,7 +28,7 @@ module Aspera
28
28
  module Cli
29
29
  module Plugins
30
30
  # manage the CLI config file
31
- class Config < Plugin
31
+ class Config < Aspera::Cli::Plugin
32
32
  # folder in $HOME for application files (config, cache)
33
33
  ASPERA_HOME_FOLDER_NAME = '.aspera'
34
34
  # default config file
@@ -74,13 +74,33 @@ module Aspera
74
74
  DEFAULT_CHECK_NEW_VERSION_DAYS = 7
75
75
  DEFAULT_PRIV_KEY_FILENAME = 'aspera_aoc_key' # pragma: allowlist secret
76
76
  DEFAULT_PRIVKEY_LENGTH = 4096
77
- private_constant :DEFAULT_CONFIG_FILENAME,:CONF_PRESET_CONFIG,:CONF_PRESET_VERSION,:CONF_PRESET_DEFAULT,
78
- :CONF_PRESET_GLOBAL,:PROGRAM_NAME_V1,:PROGRAM_NAME_V2,:DEFAULT_REDIRECT,:ASPERA_PLUGINS_FOLDERNAME,
79
- :RUBY_FILE_EXT,:AOC_COMMAND_V1,:AOC_COMMAND_V2,:AOC_COMMAND_V3,:AOC_COMMAND_CURRENT,:DEMO,
80
- :TRANSFER_SDK_ARCHIVE_URL,:AOC_PATH_API_CLIENTS,:DEMO_SERVER_PRESET,:EMAIL_TEST_TEMPLATE,:EXTV_INCLUDE_PRESETS,
81
- :EXTV_PRESET,:EXTV_VAULT,:DEFAULT_CHECK_NEW_VERSION_DAYS,:DEFAULT_PRIV_KEY_FILENAME,:SERVER_COMMAND,
77
+ private_constant :DEFAULT_CONFIG_FILENAME,
78
+ :CONF_PRESET_CONFIG,
79
+ :CONF_PRESET_VERSION,
80
+ :CONF_PRESET_DEFAULT,
81
+ :CONF_PRESET_GLOBAL,
82
+ :PROGRAM_NAME_V1,
83
+ :PROGRAM_NAME_V2,
84
+ :DEFAULT_REDIRECT,
85
+ :ASPERA_PLUGINS_FOLDERNAME,
86
+ :RUBY_FILE_EXT,
87
+ :AOC_COMMAND_V1,
88
+ :AOC_COMMAND_V2,
89
+ :AOC_COMMAND_V3,
90
+ :AOC_COMMAND_CURRENT,
91
+ :DEMO,
92
+ :TRANSFER_SDK_ARCHIVE_URL,
93
+ :AOC_PATH_API_CLIENTS,
94
+ :DEMO_SERVER_PRESET,
95
+ :EMAIL_TEST_TEMPLATE,
96
+ :EXTV_INCLUDE_PRESETS,
97
+ :EXTV_PRESET,
98
+ :EXTV_VAULT,
99
+ :DEFAULT_CHECK_NEW_VERSION_DAYS,
100
+ :DEFAULT_PRIV_KEY_FILENAME,
101
+ :SERVER_COMMAND,
82
102
  :PRESET_DIG_SEPARATOR
83
- def initialize(env,params)
103
+ def initialize(env, params)
84
104
  raise 'env and params must be Hash' unless env.is_a?(Hash) && params.is_a?(Hash)
85
105
  raise 'missing param' unless %i[name help version gem].sort.eql?(params.keys.sort)
86
106
  super(env)
@@ -92,69 +112,69 @@ module Aspera
92
112
  @config_presets = nil
93
113
  @connect_versions = nil
94
114
  @vault = nil
95
- @conf_file_default = File.join(@main_folder,DEFAULT_CONFIG_FILENAME)
115
+ @conf_file_default = File.join(@main_folder, DEFAULT_CONFIG_FILENAME)
96
116
  @option_config_file = @conf_file_default
97
117
  @pac_exec = nil
98
- Log.log.debug("#{@info[:name]} folder: #{@main_folder}")
118
+ Log.log.debug{"#{@info[:name]} folder: #{@main_folder}"}
99
119
  # set folder for FASP SDK
100
120
  add_plugin_lookup_folder(self.class.gem_plugins_folder)
101
- add_plugin_lookup_folder(File.join(@main_folder,ASPERA_PLUGINS_FOLDERNAME))
121
+ add_plugin_lookup_folder(File.join(@main_folder, ASPERA_PLUGINS_FOLDERNAME))
102
122
  # do file parameter first
103
- options.set_obj_attr(:config_file,self,:option_config_file)
104
- options.add_opt_simple(:config_file,"read parameters from file in YAML format, current=#{@option_config_file}")
123
+ options.set_obj_attr(:config_file, self, :option_config_file)
124
+ options.add_opt_simple(:config_file, "read parameters from file in YAML format, current=#{@option_config_file}")
105
125
  options.parse_options!
106
- # read correct file
126
+ # read correct file (set @config_presets)
107
127
  read_config_file
108
128
  # add preset handler (needed for smtp)
109
- ExtendedValue.instance.set_handler(EXTV_PRESET,:reader,lambda{|v|preset_by_name(v)})
110
- ExtendedValue.instance.set_handler(EXTV_INCLUDE_PRESETS,:decoder,lambda{|v|expanded_with_preset_includes(v)})
111
- ExtendedValue.instance.set_handler(EXTV_VAULT,:decoder,lambda{|v|vault_value(v)})
112
- # load defaults before it can be overriden
129
+ ExtendedValue.instance.set_handler(EXTV_PRESET, :reader, lambda{|v|preset_by_name(v)})
130
+ ExtendedValue.instance.set_handler(EXTV_INCLUDE_PRESETS, :decoder, lambda{|v|expanded_with_preset_includes(v)})
131
+ ExtendedValue.instance.set_handler(EXTV_VAULT, :decoder, lambda{|v|vault_value(v)})
132
+ # load defaults before it can be overridden
113
133
  add_plugin_default_preset(CONF_GLOBAL_SYM)
114
134
  options.parse_options!
115
- options.set_obj_attr(:ascp_path,Fasp::Installation.instance,:ascp_path)
116
- options.set_obj_attr(:sdk_folder,Fasp::Installation.instance,:sdk_folder)
117
- options.set_obj_attr(:use_product,self,:option_use_product)
118
- options.set_obj_attr(:preset,self,:option_preset)
119
- options.set_obj_attr(:plugin_folder,self,:option_plugin_folder)
120
- options.add_opt_switch(:no_default,'-N','do not load default configuration for plugin') { @use_plugin_defaults = false }
121
- options.add_opt_boolean(:override,'Wizard: override existing value')
122
- options.add_opt_boolean(:use_generic_client,'Wizard: AoC: use global or org specific jwt client id')
123
- options.add_opt_boolean(:default,'Wizard: set as default configuration for specified plugin (also: update)')
124
- options.add_opt_boolean(:test_mode,'Wizard: skip private key check step')
125
- options.add_opt_simple(:preset,'-PVALUE','load the named option preset from current config file')
126
- options.add_opt_simple(:pkeypath,'Wizard: path to private key for JWT')
127
- options.add_opt_simple(:ascp_path,'Path to ascp')
128
- options.add_opt_simple(:use_product,'Use ascp from specified product')
129
- options.add_opt_simple(:smtp,'SMTP configuration (extended value: hash)')
130
- options.add_opt_simple(:fpac,'Proxy auto configuration script')
131
- options.add_opt_simple(:proxy_credentials,'HTTP proxy credentials (Array with user and password)')
132
- options.add_opt_simple(:secret,'Secret for access keys')
133
- options.add_opt_simple(:vault,'Vault for secrets')
134
- options.add_opt_simple(:vault_password,'Vault password')
135
- options.add_opt_simple(:sdk_url,'URL to get SDK')
136
- options.add_opt_simple(:sdk_folder,'SDK folder path')
137
- options.add_opt_simple(:notif_to,'Email recipient for notification of transfers')
138
- options.add_opt_simple(:notif_template,'Email ERB template for notification of transfers')
139
- options.add_opt_simple(:version_check_days,Integer,'Period in days to check new version (zero to disable)')
140
- options.add_opt_simple(:plugin_folder,'Folder where to find additional plugins')
141
- options.set_option(:use_generic_client,true)
142
- options.set_option(:test_mode,false)
143
- options.set_option(:default,true)
144
- options.set_option(:version_check_days,DEFAULT_CHECK_NEW_VERSION_DAYS)
145
- options.set_option(:sdk_url,TRANSFER_SDK_ARCHIVE_URL)
146
- options.set_option(:sdk_folder,File.join(@main_folder,'sdk'))
147
- options.set_option(:override,:no)
135
+ options.set_obj_attr(:ascp_path, Fasp::Installation.instance, :ascp_path)
136
+ options.set_obj_attr(:sdk_folder, Fasp::Installation.instance, :sdk_folder)
137
+ options.set_obj_attr(:use_product, self, :option_use_product)
138
+ options.set_obj_attr(:preset, self, :option_preset)
139
+ options.set_obj_attr(:plugin_folder, self, :option_plugin_folder)
140
+ options.add_opt_switch(:no_default, '-N', 'do not load default configuration for plugin') { @use_plugin_defaults = false }
141
+ options.add_opt_boolean(:override, 'Wizard: override existing value')
142
+ options.add_opt_boolean(:use_generic_client, 'Wizard: AoC: use global or org specific jwt client id')
143
+ options.add_opt_boolean(:default, 'Wizard: set as default configuration for specified plugin (also: update)')
144
+ options.add_opt_boolean(:test_mode, 'Wizard: skip private key check step')
145
+ options.add_opt_simple(:preset, '-PVALUE', 'load the named option preset from current config file')
146
+ options.add_opt_simple(:pkeypath, 'Wizard: path to private key for JWT')
147
+ options.add_opt_simple(:ascp_path, 'Path to ascp')
148
+ options.add_opt_simple(:use_product, 'Use ascp from specified product')
149
+ options.add_opt_simple(:smtp, 'SMTP configuration (extended value: hash)')
150
+ options.add_opt_simple(:fpac, 'Proxy auto configuration script')
151
+ options.add_opt_simple(:proxy_credentials, 'HTTP proxy credentials (Array with user and password)')
152
+ options.add_opt_simple(:secret, 'Secret for access keys')
153
+ options.add_opt_simple(:vault, 'Vault for secrets')
154
+ options.add_opt_simple(:vault_password, 'Vault password')
155
+ options.add_opt_simple(:sdk_url, 'URL to get SDK')
156
+ options.add_opt_simple(:sdk_folder, 'SDK folder path')
157
+ options.add_opt_simple(:notif_to, 'Email recipient for notification of transfers')
158
+ options.add_opt_simple(:notif_template, 'Email ERB template for notification of transfers')
159
+ options.add_opt_simple(:version_check_days, Integer, 'Period in days to check new version (zero to disable)')
160
+ options.add_opt_simple(:plugin_folder, 'Folder where to find additional plugins')
161
+ options.set_option(:use_generic_client, true)
162
+ options.set_option(:test_mode, false)
163
+ options.set_option(:default, true)
164
+ options.set_option(:version_check_days, DEFAULT_CHECK_NEW_VERSION_DAYS)
165
+ options.set_option(:sdk_url, TRANSFER_SDK_ARCHIVE_URL)
166
+ options.set_option(:sdk_folder, File.join(@main_folder, 'sdk'))
167
+ options.set_option(:override, :no)
148
168
  options.parse_options!
149
169
  pac_script = options.get_option(:fpac)
150
170
  # create PAC executor
151
171
  @pac_exec = Aspera::ProxyAutoConfig.new(pac_script).register_uri_generic unless pac_script.nil?
152
- proxy_creds=options.get_option(:proxy_credentials)
172
+ proxy_creds = options.get_option(:proxy_credentials)
153
173
  if !proxy_creds.nil?
154
- raise CliBadArgument,'proxy credentials shall be an array (#{proxy_creds.class})' unless proxy_creds.is_a?(Array)
155
- raise CliBadArgument,'proxy credentials shall have two elements (#{proxy_creds.length})' unless proxy_creds.length.eql?(2)
156
- @pac_exec.proxy_user=Rest.proxy_user=proxy_creds[0]
157
- @pac_exec.proxy_pass=Rest.proxy_pass=proxy_creds[1]
174
+ raise CliBadArgument, 'proxy credentials shall be an array (#{proxy_creds.class})' unless proxy_creds.is_a?(Array)
175
+ raise CliBadArgument, 'proxy credentials shall have two elements (#{proxy_creds.length})' unless proxy_creds.length.eql?(2)
176
+ @pac_exec.proxy_user = Rest.proxy_user = proxy_creds[0]
177
+ @pac_exec.proxy_pass = Rest.proxy_pass = proxy_creds[1]
158
178
  end
159
179
  end
160
180
 
@@ -170,8 +190,8 @@ module Aspera
170
190
  # if env var undefined or empty
171
191
  if app_folder.nil? || app_folder.empty?
172
192
  user_home_folder = Dir.home
173
- 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)
174
- app_folder = File.join(user_home_folder,ASPERA_HOME_FOLDER_NAME,@info[:name])
193
+ 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)
194
+ app_folder = File.join(user_home_folder, ASPERA_HOME_FOLDER_NAME, @info[:name])
175
195
  end
176
196
  return app_folder
177
197
  end
@@ -185,8 +205,10 @@ module Aspera
185
205
  '0'
186
206
  end
187
207
  if Gem::Version.new(Environment.ruby_version) < Gem::Version.new(RUBY_FUTURE_MINIMUM_VERSION)
188
- Log.log.warn("Note that a future version will require Ruby version #{RUBY_FUTURE_MINIMUM_VERSION} at minimum, "\
189
- "you are using #{Environment.ruby_version}")
208
+ Log.log.warn do
209
+ "Note that a future version will require Ruby version #{RUBY_FUTURE_MINIMUM_VERSION} at minimum, "\
210
+ "you are using #{Environment.ruby_version}"
211
+ end
190
212
  end
191
213
  return {
192
214
  name: @info[:gem],
@@ -198,8 +220,8 @@ module Aspera
198
220
 
199
221
  def periodic_check_newer_gem_version
200
222
  # get verification period
201
- delay_days = options.get_option(:version_check_days,is_type: :mandatory)
202
- Log.log.info("check days: #{delay_days}")
223
+ delay_days = options.get_option(:version_check_days, is_type: :mandatory)
224
+ Log.log.info{"check days: #{delay_days}"}
203
225
  # check only if not zero day
204
226
  return if delay_days.eql?(0)
205
227
  # get last date from persistency
@@ -217,52 +239,53 @@ module Aspera
217
239
  # negative value will force check
218
240
  -1
219
241
  end
220
- Log.log.debug("days elapsed: #{last_check_days}")
242
+ Log.log.debug{"days elapsed: #{last_check_days}"}
221
243
  return if last_check_days < delay_days
222
244
  # generate timestamp
223
245
  last_check_array[0] = current_date.strftime('%Y/%m/%d')
224
246
  check_date_persist.save
225
247
  # compare this version and the one on internet
226
248
  check_data = check_gem_version
227
- Log.log.warn("A new version is available: #{check_data[:latest]}. "\
228
- "You have #{check_data[:current]}. Upgrade with: gem update #{check_data[:name]}") if check_data[:need_update]
249
+ Log.log.warn do
250
+ "A new version is available: #{check_data[:latest]}. You have #{check_data[:current]}. Upgrade with: gem update #{check_data[:name]}"
251
+ end if check_data[:need_update]
229
252
  end
230
253
 
231
254
  # retrieve structure from cloud (CDN) with all versions available
232
255
  def connect_versions
233
256
  if @connect_versions.nil?
234
257
  api_connect_cdn = Rest.new({base_url: CONNECT_WEB_URL})
235
- javascript = api_connect_cdn.call({operation: 'GET',subpath: CONNECT_VERSIONS})
258
+ javascript = api_connect_cdn.call({operation: 'GET', subpath: CONNECT_VERSIONS})
236
259
  # get result on one line
237
- connect_versions_javascript = javascript[:http].body.gsub(/\r?\n\s*/,'')
238
- Log.log.debug("javascript=[\n#{connect_versions_javascript}\n]")
260
+ connect_versions_javascript = javascript[:http].body.gsub(/\r?\n\s*/, '')
261
+ Log.log.debug{"javascript=[\n#{connect_versions_javascript}\n]"}
239
262
  # get javascript object only
240
263
  found = connect_versions_javascript.match(/^.*? = (.*);/)
241
- raise CliError,'Problen when getting connect versions from internet' if found.nil?
242
- alldata = JSON.parse(found[1])
243
- @connect_versions = alldata['entries']
264
+ raise CliError, 'Problem when getting connect versions from internet' if found.nil?
265
+ all_data = JSON.parse(found[1])
266
+ @connect_versions = all_data['entries']
244
267
  end
245
268
  return @connect_versions
246
269
  end
247
270
 
248
271
  # loads default parameters of plugin if no -P parameter
249
272
  # and if there is a section defined for the plugin in the "default" section
250
- # try to find: conffile[conffile["default"][plugin_str]]
273
+ # try to find: conf[conf["default"][plugin_str]]
251
274
  # @param plugin_name_sym : symbol for plugin name
252
275
  def add_plugin_default_preset(plugin_name_sym)
253
276
  default_config_name = get_plugin_default_config_name(plugin_name_sym)
254
- Log.log.debug("add_plugin_default_preset:#{plugin_name_sym}:#{default_config_name}")
255
- options.add_option_preset(preset_by_name(default_config_name),op: :unshift) unless default_config_name.nil?
277
+ Log.log.debug{"add_plugin_default_preset:#{plugin_name_sym}:#{default_config_name}"}
278
+ options.add_option_preset(preset_by_name(default_config_name), op: :unshift) unless default_config_name.nil?
256
279
  return nil
257
280
  end
258
281
 
259
282
  private
260
283
 
261
- def generate_rsa_private_key(private_key_path,length)
284
+ def generate_rsa_private_key(private_key_path, length)
262
285
  require 'openssl'
263
286
  priv_key = OpenSSL::PKey::RSA.new(length)
264
- File.write(private_key_path,priv_key.to_s)
265
- File.write(private_key_path + '.pub',priv_key.public_key.to_s)
287
+ File.write(private_key_path, priv_key.to_s)
288
+ File.write(private_key_path + '.pub', priv_key.public_key.to_s)
266
289
  Environment.restrict_file_access(private_key_path)
267
290
  Environment.restrict_file_access(private_key_path + '.pub')
268
291
  nil
@@ -274,7 +297,7 @@ module Aspera
274
297
  File.dirname(File.expand_path(__FILE__))
275
298
  end
276
299
 
277
- # name of englobin module
300
+ # name of englobing module
278
301
  # @return "Aspera::Cli::Plugins"
279
302
  def module_full_name
280
303
  return Module.nesting[2].to_s
@@ -283,10 +306,10 @@ module Aspera
283
306
  # @return main folder where code is, i.e. .../lib
284
307
  # go up as many times as englobing modules (not counting class, as it is a file)
285
308
  def gem_src_root
286
- File.expand_path(module_full_name.gsub('::','/').gsub(%r{[^/]+},'..'),gem_plugins_folder)
309
+ File.expand_path(module_full_name.gsub('::', '/').gsub(%r{[^/]+}, '..'), gem_plugins_folder)
287
310
  end
288
311
 
289
- # instanciate a plugin
312
+ # instantiate a plugin
290
313
  # plugins must be Capitalized
291
314
  def plugin_class(plugin_name_sym)
292
315
  # Module.nesting[2] is Aspera::Cli::Plugins
@@ -297,7 +320,7 @@ module Aspera
297
320
  # set parameter and value in global config
298
321
  # creates one if none already created
299
322
  # @return preset name that contains global default
300
- def set_global_default(key,value)
323
+ def set_global_default(key, value)
301
324
  # get default preset if it exists
302
325
  global_default_preset_name = get_plugin_default_config_name(CONF_GLOBAL_SYM)
303
326
  if global_default_preset_name.nil?
@@ -307,7 +330,7 @@ module Aspera
307
330
  end
308
331
  @config_presets[global_default_preset_name] ||= {}
309
332
  @config_presets[global_default_preset_name][key.to_s] = value
310
- self.format.display_status("Updated: #{global_default_preset_name}: #{key} <- #{value}")
333
+ formatter.display_status("Updated: #{global_default_preset_name}: #{key} <- #{value}")
311
334
  save_presets_to_config_file
312
335
  return global_default_preset_name
313
336
  end
@@ -323,28 +346,28 @@ module Aspera
323
346
  # @param config_name name of the preset in config file
324
347
  # @param include_path used to detect and avoid include loops
325
348
  def preset_by_name(config_name, include_path=[])
326
- raise CliError,'loop in include' if include_path.include?(config_name)
349
+ raise CliError, 'loop in include' if include_path.include?(config_name)
327
350
  include_path = include_path.clone # avoid messing up if there are multiple branches
328
351
  current = @config_presets
329
352
  config_name.split(PRESET_DIG_SEPARATOR).each do |name|
330
- raise CliError,"not a Hash: #{include_path} (#{current.class})" unless current.is_a?(Hash)
353
+ raise CliError, "Expecting Hash for subkey: #{include_path} (#{current.class})" unless current.is_a?(Hash)
331
354
  include_path.push(name)
332
355
  current = current[name]
333
- raise CliError,"no such config preset: #{include_path}" if nil?
356
+ raise CliError, "No such config preset: #{include_path}" if current.nil?
334
357
  end
335
358
  case current
336
- when Hash then return expanded_with_preset_includes(current,include_path)
359
+ when Hash then return expanded_with_preset_includes(current, include_path)
337
360
  when String then return ExtendedValue.instance.evaluate(current)
338
361
  else return current
339
362
  end
340
363
  end
341
364
 
342
- # @return the hash value with 'incps' keys expanced to include other presets
365
+ # @return the hash value with 'incps' keys expanded to include other presets
343
366
  # @param hash_val
344
367
  # @param include_path to avoid inclusion loop
345
368
  def expanded_with_preset_includes(hash_val, include_path=[])
346
- raise CliError,"#{EXTV_INCLUDE_PRESETS} requires a Hash, have #{hash_val.class}" unless hash_val.is_a?(Hash)
347
- if hash_val.has_key?(EXTV_INCLUDE_PRESETS)
369
+ raise CliError, "#{EXTV_INCLUDE_PRESETS} requires a Hash, have #{hash_val.class}" unless hash_val.is_a?(Hash)
370
+ if hash_val.key?(EXTV_INCLUDE_PRESETS)
348
371
  memory = hash_val.clone
349
372
  includes = memory[EXTV_INCLUDE_PRESETS]
350
373
  memory.delete(EXTV_INCLUDE_PRESETS)
@@ -352,7 +375,7 @@ module Aspera
352
375
  raise "#{EXTV_INCLUDE_PRESETS} must be an Array" unless includes.is_a?(Array)
353
376
  raise "#{EXTV_INCLUDE_PRESETS} must contain names" unless includes.map(&:class).uniq.eql?([String])
354
377
  includes.each do |preset_name|
355
- hash_val.merge!(preset_by_name(preset_name,include_path))
378
+ hash_val.merge!(preset_by_name(preset_name, include_path))
356
379
  end
357
380
  hash_val.merge!(memory)
358
381
  end
@@ -392,124 +415,122 @@ module Aspera
392
415
  end
393
416
  end
394
417
 
395
- def convert_preset_path(old_name,new_name,files_to_copy)
396
- old_subpath = File.join('',ASPERA_HOME_FOLDER_NAME,old_name,'')
397
- new_subpath = File.join('',ASPERA_HOME_FOLDER_NAME,new_name,'')
418
+ def convert_preset_path(old_name, new_name, files_to_copy)
419
+ old_subpath = File.join('', ASPERA_HOME_FOLDER_NAME, old_name, '')
420
+ new_subpath = File.join('', ASPERA_HOME_FOLDER_NAME, new_name, '')
398
421
  # convert possible keys located in config folder
399
422
  @config_presets.values.select{|p|p.is_a?(Hash)}.each do |preset|
400
423
  preset.values.select{|v|v.is_a?(String) && v.include?(old_subpath)}.each do |value|
401
424
  old_val = value.clone
402
- included_path = File.expand_path(old_val.gsub(/^@file:/,''))
425
+ included_path = File.expand_path(old_val.gsub(/^@file:/, ''))
403
426
  files_to_copy.push(included_path) unless files_to_copy.include?(included_path) || !File.exist?(included_path)
404
- value.gsub!(old_subpath,new_subpath)
405
- Log.log.warn("Converted config value: #{old_val} -> #{value}")
427
+ value.gsub!(old_subpath, new_subpath)
428
+ Log.log.warn{"Converted config value: #{old_val} -> #{value}"}
406
429
  end
407
430
  end
408
431
  end
409
432
 
410
- def convert_preset_plugin_name(old_name,new_name)
433
+ def convert_preset_plugin_name(old_name, new_name)
411
434
  default_preset = @config_presets[CONF_PRESET_DEFAULT]
412
- return unless default_preset.is_a?(Hash) && default_preset.has_key?(old_name)
435
+ return unless default_preset.is_a?(Hash) && default_preset.key?(old_name)
413
436
  default_preset[new_name] = default_preset[old_name]
414
437
  default_preset.delete(old_name)
415
- Log.log.warn("Converted plugin default: #{old_name} -> #{new_name}")
438
+ Log.log.warn{"Converted plugin default: #{old_name} -> #{new_name}"}
416
439
  end
417
440
 
418
441
  # read config file and validate format
419
442
  # tries to convert from older version if possible and required
420
443
  def read_config_file
421
- begin
422
- Log.log.debug("config file is: #{@option_config_file}".red)
423
- conf_file_v1 = File.join(Dir.home,ASPERA_HOME_FOLDER_NAME,PROGRAM_NAME_V1,DEFAULT_CONFIG_FILENAME)
424
- conf_file_v2 = File.join(Dir.home,ASPERA_HOME_FOLDER_NAME,PROGRAM_NAME_V2,DEFAULT_CONFIG_FILENAME)
425
- # files search for configuration, by default the one given by user
426
- search_files = [@option_config_file]
427
- # if default file, then also look for older versions
428
- search_files.push(conf_file_v2,conf_file_v1) if @option_config_file.eql?(@conf_file_default)
429
- # find first existing file (or nil)
430
- conf_file_to_load = search_files.find{|f| File.exist?(f)}
431
- # require save if old version of file
432
- save_required = !@option_config_file.eql?(conf_file_to_load)
433
- # if no file found, create default config
434
- if conf_file_to_load.nil?
435
- Log.log.warn("No config file found. Creating empty configuration file: #{@option_config_file}")
436
- @config_presets = {CONF_PRESET_CONFIG => {CONF_PRESET_VERSION => @info[:version]}}
437
- else
438
- Log.log.debug("loading #{@option_config_file}")
439
- @config_presets = YAML.load_file(conf_file_to_load)
440
- end
441
- files_to_copy = []
442
- Log.log.debug("Available_presets: #{@config_presets}")
443
- raise 'Expecting YAML Hash' unless @config_presets.is_a?(Hash)
444
- # check there is at least the config section
445
- if !@config_presets.has_key?(CONF_PRESET_CONFIG)
446
- raise "Cannot find key: #{CONF_PRESET_CONFIG}"
447
- end
448
- version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION]
449
- if version.nil?
450
- raise 'No version found in config section.'
451
- end
452
- # oldest compatible conf file format, update to latest version when an incompatible change is made
453
- # check compatibility of version of conf file
454
- config_tested_version = '0.4.5'
455
- if Gem::Version.new(version) < Gem::Version.new(config_tested_version)
456
- raise "Unsupported config file version #{version}. Expecting min version #{config_tested_version}"
457
- end
458
- config_tested_version = '0.6.15'
459
- if Gem::Version.new(version) < Gem::Version.new(config_tested_version)
460
- convert_preset_plugin_name(AOC_COMMAND_V1,AOC_COMMAND_V2)
461
- version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
462
- save_required = true
463
- end
464
- config_tested_version = '0.8.10'
465
- if Gem::Version.new(version) <= Gem::Version.new(config_tested_version)
466
- convert_preset_path(PROGRAM_NAME_V1,PROGRAM_NAME_V2,files_to_copy)
467
- version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
468
- save_required = true
469
- end
470
- config_tested_version = '1.0'
471
- if Gem::Version.new(version) <= Gem::Version.new(config_tested_version)
472
- convert_preset_plugin_name(AOC_COMMAND_V2,AOC_COMMAND_V3)
473
- convert_preset_path(PROGRAM_NAME_V2,@info[:name],files_to_copy)
474
- version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
475
- save_required = true
476
- end
477
- Log.log.debug("conf version: #{version}")
478
- # Place new compatibility code here
479
- if save_required
480
- Log.log.warn('Saving automatic conversion.')
481
- @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = @info[:version]
482
- save_presets_to_config_file
483
- Log.log.warn('Copying referenced files')
484
- files_to_copy.each do |file|
485
- FileUtils.cp(file,@main_folder)
486
- Log.log.warn("..#{file} -> #{@main_folder}")
487
- end
488
- end
489
- rescue Psych::SyntaxError => e
490
- Log.log.error('YAML error in config file')
491
- raise e
492
- rescue StandardError => e
493
- Log.log.debug("-> #{e.class.name} : #{e}")
494
- if File.exist?(@option_config_file)
495
- # then there is a problem with that file.
496
- new_name = "#{@option_config_file}.pre#{@info[:version]}.manual_conversion_needed"
497
- File.rename(@option_config_file,new_name)
498
- Log.log.warn("Renamed config file to #{new_name}.")
499
- Log.log.warn('Manual Conversion is required. Next time, a new empty file will be created.')
444
+ Log.log.debug{"config file is: #{@option_config_file}".red}
445
+ conf_file_v1 = File.join(Dir.home, ASPERA_HOME_FOLDER_NAME, PROGRAM_NAME_V1, DEFAULT_CONFIG_FILENAME)
446
+ conf_file_v2 = File.join(Dir.home, ASPERA_HOME_FOLDER_NAME, PROGRAM_NAME_V2, DEFAULT_CONFIG_FILENAME)
447
+ # files search for configuration, by default the one given by user
448
+ search_files = [@option_config_file]
449
+ # if default file, then also look for older versions
450
+ search_files.push(conf_file_v2, conf_file_v1) if @option_config_file.eql?(@conf_file_default)
451
+ # find first existing file (or nil)
452
+ conf_file_to_load = search_files.find{|f| File.exist?(f)}
453
+ # require save if old version of file
454
+ save_required = !@option_config_file.eql?(conf_file_to_load)
455
+ # if no file found, create default config
456
+ if conf_file_to_load.nil?
457
+ Log.log.warn{"No config file found. Creating empty configuration file: #{@option_config_file}"}
458
+ @config_presets = {CONF_PRESET_CONFIG => {CONF_PRESET_VERSION => @info[:version]}}
459
+ else
460
+ Log.log.debug{"loading #{@option_config_file}"}
461
+ @config_presets = YAML.load_file(conf_file_to_load)
462
+ end
463
+ files_to_copy = []
464
+ Log.log.debug{"Available_presets: #{@config_presets}"}
465
+ raise 'Expecting YAML Hash' unless @config_presets.is_a?(Hash)
466
+ # check there is at least the config section
467
+ if !@config_presets.key?(CONF_PRESET_CONFIG)
468
+ raise "Cannot find key: #{CONF_PRESET_CONFIG}"
469
+ end
470
+ version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION]
471
+ if version.nil?
472
+ raise 'No version found in config section.'
473
+ end
474
+ # oldest compatible conf file format, update to latest version when an incompatible change is made
475
+ # check compatibility of version of conf file
476
+ config_tested_version = '0.4.5'
477
+ if Gem::Version.new(version) < Gem::Version.new(config_tested_version)
478
+ raise "Unsupported config file version #{version}. Expecting min version #{config_tested_version}"
479
+ end
480
+ config_tested_version = '0.6.15'
481
+ if Gem::Version.new(version) < Gem::Version.new(config_tested_version)
482
+ convert_preset_plugin_name(AOC_COMMAND_V1, AOC_COMMAND_V2)
483
+ version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
484
+ save_required = true
485
+ end
486
+ config_tested_version = '0.8.10'
487
+ if Gem::Version.new(version) <= Gem::Version.new(config_tested_version)
488
+ convert_preset_path(PROGRAM_NAME_V1, PROGRAM_NAME_V2, files_to_copy)
489
+ version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
490
+ save_required = true
491
+ end
492
+ config_tested_version = '1.0'
493
+ if Gem::Version.new(version) <= Gem::Version.new(config_tested_version)
494
+ convert_preset_plugin_name(AOC_COMMAND_V2, AOC_COMMAND_V3)
495
+ convert_preset_path(PROGRAM_NAME_V2, @info[:name], files_to_copy)
496
+ version = @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = config_tested_version
497
+ save_required = true
498
+ end
499
+ Log.log.debug{"conf version: #{version}"}
500
+ # Place new compatibility code here
501
+ if save_required
502
+ Log.log.warn('Saving automatic conversion.')
503
+ @config_presets[CONF_PRESET_CONFIG][CONF_PRESET_VERSION] = @info[:version]
504
+ save_presets_to_config_file
505
+ Log.log.warn('Copying referenced files')
506
+ files_to_copy.each do |file|
507
+ FileUtils.cp(file, @main_folder)
508
+ Log.log.warn{"..#{file} -> #{@main_folder}"}
500
509
  end
501
- raise CliError,e.to_s
502
510
  end
511
+ rescue Psych::SyntaxError => e
512
+ Log.log.error('YAML error in config file')
513
+ raise e
514
+ rescue StandardError => e
515
+ Log.log.debug{"-> #{e.class.name} : #{e}"}
516
+ if File.exist?(@option_config_file)
517
+ # then there is a problem with that file.
518
+ new_name = "#{@option_config_file}.pre#{@info[:version]}.manual_conversion_needed"
519
+ File.rename(@option_config_file, new_name)
520
+ Log.log.warn{"Renamed config file to #{new_name}."}
521
+ Log.log.warn('Manual Conversion is required. Next time, a new empty file will be created.')
522
+ end
523
+ raise CliError, e.to_s
503
524
  end
504
525
 
505
526
  # find plugins in defined paths
506
527
  def add_plugins_from_lookup_folders
507
528
  @plugin_lookup_folders.each do |folder|
508
529
  next unless File.directory?(folder)
509
- #TODO: add gem root to load path ? and require short folder ?
510
- #$LOAD_PATH.push(folder) if i[:add_path]
530
+ # TODO: add gem root to load path ? and require short folder ?
531
+ # $LOAD_PATH.push(folder) if i[:add_path]
511
532
  Dir.entries(folder).select{|file|file.end_with?(RUBY_FILE_EXT)}.each do |source|
512
- add_plugin_info(File.join(folder,source))
533
+ add_plugin_info(File.join(folder, source))
513
534
  end
514
535
  end
515
536
  end
@@ -520,17 +541,17 @@ module Aspera
520
541
 
521
542
  def add_plugin_info(path)
522
543
  raise "ERROR: plugin path must end with #{RUBY_FILE_EXT}" if !path.end_with?(RUBY_FILE_EXT)
523
- plugin_symbol = File.basename(path,RUBY_FILE_EXT).to_sym
524
- req = path.gsub(/#{RUBY_FILE_EXT}$/o,'')
525
- if @plugins.has_key?(plugin_symbol)
526
- Log.log.warn("skipping plugin already registered: #{plugin_symbol}")
544
+ plugin_symbol = File.basename(path, RUBY_FILE_EXT).to_sym
545
+ req = path.gsub(/#{RUBY_FILE_EXT}$/o, '')
546
+ if @plugins.key?(plugin_symbol)
547
+ Log.log.warn{"skipping plugin already registered: #{plugin_symbol}"}
527
548
  return
528
549
  end
529
- @plugins[plugin_symbol] = {source: path,require_stanza: req}
550
+ @plugins[plugin_symbol] = {source: path, require_stanza: req}
530
551
  end
531
552
 
532
553
  def identify_plugin_for_url(url)
533
- plugins.each do |plugin_name_sym,plugin_info|
554
+ plugins.each do |plugin_name_sym, plugin_info|
534
555
  # no detection for internal plugin
535
556
  next if plugin_name_sym.eql?(CONF_PLUGIN_SYM)
536
557
  # load plugin class
@@ -546,22 +567,23 @@ module Aspera
546
567
  Log.log.warn(e.message)
547
568
  Log.log.warn('Use option --insecure=yes to ignore certificate') if e.message.include?('cert')
548
569
  rescue StandardError => e
549
- Log.log.debug("Cannot detect #{plugin_name_sym} : #{e.class}/#{e.message}")
570
+ Log.log.debug{"Cannot detect #{plugin_name_sym} : #{e.class}/#{e.message}"}
550
571
  end
551
572
  # second try : is there a redirect ?
552
573
  if detection_info.nil?
553
574
  begin
554
575
  # TODO: check if redirect ?
555
- new_url = Rest.new(base_url: url).call(operation: 'GET',subpath: '',redirect_max: 1)[:http].uri.to_s
576
+ new_url = Rest.new(base_url: url).call(operation: 'GET', subpath: '', redirect_max: 1)[:http].uri.to_s
556
577
  unless url.eql?(new_url)
557
578
  detection_info = c.detect(new_url)
558
579
  current_url = new_url
559
580
  end
560
581
  rescue StandardError => e
561
- Log.log.debug("Cannot detect #{plugin_name_sym} : #{e.message}")
582
+ Log.log.debug{"Cannot detect #{plugin_name_sym} : #{e.message}"}
562
583
  end
563
584
  end
564
- return detection_info.merge(product: plugin_name_sym, url: current_url) unless detection_info.nil?
585
+ # if there is a redirect, then the detector can override the url.
586
+ return {product: plugin_name_sym, url: current_url}.merge(detection_info) unless detection_info.nil?
565
587
  end # loop
566
588
  raise "No known application found at #{url}"
567
589
  end
@@ -571,7 +593,7 @@ module Aspera
571
593
  if %i[info version].include?(command)
572
594
  connect_id = options.get_next_argument('id or title')
573
595
  one_res = connect_versions.find{|i|i['id'].eql?(connect_id) || i['title'].eql?(connect_id)}
574
- raise CliNoSuchId.new(:connect,connect_id) if one_res.nil?
596
+ raise CliNoSuchId.new(:connect, connect_id) if one_res.nil?
575
597
  end
576
598
  case command
577
599
  when :list
@@ -592,11 +614,11 @@ module Aspera
592
614
  return {type: :object_list, data: all_links}
593
615
  when :download
594
616
  folder_dest = transfer.destination_folder(Fasp::TransferSpec::DIRECTION_RECEIVE)
595
- #folder_dest=self.options.get_next_argument('destination folder')
617
+ # folder_dest=self.options.get_next_argument('destination folder')
596
618
  api_connect_cdn = Rest.new({base_url: CONNECT_WEB_URL})
597
- fileurl = one_link['href']
598
- filename = fileurl.gsub(%r{.*/},'')
599
- api_connect_cdn.call({operation: 'GET',subpath: fileurl,save_to_file: File.join(folder_dest,filename)})
619
+ file_url = one_link['href']
620
+ filename = file_url.gsub(%r{.*/}, '')
621
+ api_connect_cdn.call({operation: 'GET', subpath: file_url, save_to_file: File.join(folder_dest, filename)})
600
622
  return Main.result_status("Downloaded: #{filename}")
601
623
  when :open
602
624
  OpenApplication.instance.uri(one_link['href'])
@@ -613,13 +635,13 @@ module Aspera
613
635
  when :use
614
636
  ascp_path = options.get_next_argument('path to ascp')
615
637
  ascp_version = Fasp::Installation.instance.get_ascp_version(ascp_path)
616
- self.format.display_status("ascp version: #{ascp_version}")
617
- preset_name = set_global_default(:ascp_path,ascp_path)
638
+ formatter.display_status("ascp version: #{ascp_version}")
639
+ preset_name = set_global_default(:ascp_path, ascp_path)
618
640
  return Main.result_status("Saved to default global preset #{preset_name}")
619
641
  when :show # shows files used
620
642
  return {type: :status, data: Fasp::Installation.instance.path(:ascp)}
621
643
  when :info # shows files used
622
- data = Fasp::Installation::FILES.each_with_object({}) do |v,m|
644
+ data = Fasp::Installation::FILES.each_with_object({}) do |v, m|
623
645
  m[v.to_s] =
624
646
  begin
625
647
  Fasp::Installation.instance.path(v)
@@ -628,21 +650,26 @@ module Aspera
628
650
  end
629
651
  end
630
652
  # read PATHs from ascp directly, and pvcl modules as well
631
- Open3.popen3(Fasp::Installation.instance.path(:ascp),'-DDL-') do |_stdin, _stdout, stderr, thread|
653
+ Open3.popen3(Fasp::Installation.instance.path(:ascp), '-DDL-') do |_stdin, _stdout, stderr, thread|
632
654
  last_line = ''
633
655
  while (line = stderr.gets)
634
656
  line.chomp!
635
657
  last_line = line
636
658
  case line
637
- when %r{^DBG Path ([^ ]+) (dir|file) +: (.*)$} then data[Regexp.last_match(1)] = Regexp.last_match(3)
638
- when %r{^DBG Added module group:"([^"]+)" name:"([^"]+)", version:"([^"]+)" interface:"([^"]+)"$}
659
+ when /^DBG Path ([^ ]+) (dir|file) +: (.*)$/
660
+ data[Regexp.last_match(1)] = Regexp.last_match(3)
661
+ when /^DBG Added module group:"([^"]+)" name:"([^"]+)", version:"([^"]+)" interface:"([^"]+)"$/
639
662
  data[Regexp.last_match(2)] = "#{Regexp.last_match(4)} #{Regexp.last_match(1)} v#{Regexp.last_match(3)}"
640
- when %r{^DBG License result \(/license/(\S+)\): (.+)$} then data[Regexp.last_match(1)] = Regexp.last_match(2)
641
- when %r{^LOG (.+) version ([0-9.]+)$} then data['product_name'] = Regexp.last_match(1);data['product_version'] = Regexp.last_match(2)
642
- when %r{^LOG Initializing FASP version ([^,]+),} then data['ascp_version'] = Regexp.last_match(1)
663
+ when %r{^DBG License result \(/license/(\S+)\): (.+)$}
664
+ data[Regexp.last_match(1)] = Regexp.last_match(2)
665
+ when /^LOG (.+) version ([0-9.]+)$/
666
+ data['product_name'] = Regexp.last_match(1)
667
+ data['product_version'] = Regexp.last_match(2)
668
+ when /^LOG Initializing FASP version ([^,]+),/
669
+ data['ascp_version'] = Regexp.last_match(1)
643
670
  end
644
671
  end
645
- if !thread.value.exitstatus.eql?(1) && !data.has_key?('root')
672
+ if !thread.value.exitstatus.eql?(1) && !data.key?('root')
646
673
  raise last_line
647
674
  end
648
675
  end
@@ -656,21 +683,21 @@ module Aspera
656
683
  when :use
657
684
  default_product = options.get_next_argument('product name')
658
685
  Fasp::Installation.instance.use_ascp_from_product(default_product)
659
- preset_name = set_global_default(:ascp_path,Fasp::Installation.instance.path(:ascp))
686
+ preset_name = set_global_default(:ascp_path, Fasp::Installation.instance.path(:ascp))
660
687
  return Main.result_status("Saved to default global preset #{preset_name}")
661
688
  end
662
689
  when :install
663
- v = Fasp::Installation.instance.install_sdk(options.get_option(:sdk_url,is_type: :mandatory))
690
+ v = Fasp::Installation.instance.install_sdk(options.get_option(:sdk_url, is_type: :mandatory))
664
691
  return Main.result_status("Installed version #{v}")
665
692
  when :spec
666
693
  return {
667
694
  type: :object_list,
668
695
  data: Fasp::Parameters.man_table,
669
- fields: ['name','type',Fasp::Parameters::SUPPORTED_AGENTS_SHORT.map(&:to_s),'description'].flatten
696
+ fields: [%w[name type], Fasp::Parameters::SUPPORTED_AGENTS_SHORT.map(&:to_s), %w[description]].flatten.freeze
670
697
  }
671
698
  when :errors
672
699
  error_data = []
673
- Fasp::ERROR_INFO.each_pair do |code,prop|
700
+ Fasp::ERROR_INFO.each_pair do |code, prop|
674
701
  error_data.push(code: code, mnemonic: prop[:c], retry: prop[:r], info: prop[:a])
675
702
  end
676
703
  return {type: :object_list, data: error_data}
@@ -679,112 +706,168 @@ module Aspera
679
706
  end
680
707
 
681
708
  # legacy actions available globally
682
- PRESET_GBL_ACTIONS = %i[list overview].freeze
683
- # require existing preset
684
- PRESET_EXST_ACTIONS = %i[show delete get unset].freeze
709
+ PRESET_GBL_ACTIONS = %i[list overview lookup secure].freeze
710
+ # operations requiring that preset exists
711
+ PRESET_EXIST_ACTIONS = %i[show delete get unset].freeze
685
712
  # require id
686
- PRESET_INSTANCE_ACTIONS = [PRESET_EXST_ACTIONS,%i[initialize update ask set]].flatten.freeze
687
- PRESET_ALL_ACTIONS = [PRESET_GBL_ACTIONS,PRESET_INSTANCE_ACTIONS].flatten.freeze
713
+ PRESET_INSTANCE_ACTIONS = %i[initialize update ask set].concat(PRESET_EXIST_ACTIONS).freeze
714
+ PRESET_ALL_ACTIONS = [PRESET_GBL_ACTIONS, PRESET_INSTANCE_ACTIONS].flatten.freeze
688
715
 
689
- def execute_file_action(action,config_name)
716
+ def execute_preset(action: nil, name: nil)
690
717
  action = options.get_next_command(PRESET_ALL_ACTIONS) if action.nil?
691
- config_name = instance_identifier if config_name.nil? && PRESET_INSTANCE_ACTIONS.include?(action)
718
+ name = instance_identifier if name.nil? && PRESET_INSTANCE_ACTIONS.include?(action)
692
719
  # those operations require existing option
693
- raise "no such preset: #{config_name}" if PRESET_EXST_ACTIONS.include?(action) && !@config_presets.has_key?(config_name)
694
- selected_preset = @config_presets[config_name]
720
+ raise "no such preset: #{name}" if PRESET_EXIST_ACTIONS.include?(action) && !@config_presets.key?(name)
721
+ selected_preset = @config_presets[name]
695
722
  case action
696
723
  when :list
697
724
  return {type: :value_list, data: @config_presets.keys, name: 'name'}
698
725
  when :overview
699
- return {type: :object_list, data: Formater.flatten_config_overview(@config_presets)}
726
+ return {type: :object_list, data: Formatter.flatten_config_overview(@config_presets)}
700
727
  when :show
701
- raise "no such config: #{config_name}" if selected_preset.nil?
728
+ raise "no such config: #{name}" if selected_preset.nil?
702
729
  return {type: :single_object, data: selected_preset}
703
730
  when :delete
704
- @config_presets.delete(config_name)
731
+ @config_presets.delete(name)
705
732
  save_presets_to_config_file
706
- return Main.result_status("Deleted: #{config_name}")
733
+ return Main.result_status("Deleted: #{name}")
707
734
  when :get
708
735
  param_name = options.get_next_argument('parameter name')
709
736
  value = selected_preset[param_name]
710
- raise "no such option in preset #{config_name} : #{param_name}" if value.nil?
737
+ raise "no such option in preset #{name} : #{param_name}" if value.nil?
711
738
  case value
712
- when Numeric,String then return {type: :text, data: ExtendedValue.instance.evaluate(value.to_s)}
739
+ when Numeric, String then return {type: :text, data: ExtendedValue.instance.evaluate(value.to_s)}
713
740
  end
714
741
  return {type: :single_object, data: value}
715
742
  when :unset
716
743
  param_name = options.get_next_argument('parameter name')
717
744
  selected_preset.delete(param_name)
718
745
  save_presets_to_config_file
719
- return Main.result_status("Removed: #{config_name}: #{param_name}")
746
+ return Main.result_status("Removed: #{name}: #{param_name}")
720
747
  when :set
721
748
  param_name = options.get_next_argument('parameter name')
722
749
  param_value = options.get_next_argument('parameter value')
723
- if !@config_presets.has_key?(config_name)
724
- Log.log.debug("no such config name: #{config_name}, initializing")
725
- selected_preset = @config_presets[config_name] = {}
750
+ if !@config_presets.key?(name)
751
+ Log.log.debug{"no such config name: #{name}, initializing"}
752
+ selected_preset = @config_presets[name] = {}
726
753
  end
727
- if selected_preset.has_key?(param_name)
728
- Log.log.warn("overwriting value: #{selected_preset[param_name]}")
754
+ if selected_preset.key?(param_name)
755
+ Log.log.warn{"overwriting value: #{selected_preset[param_name]}"}
729
756
  end
730
757
  selected_preset[param_name] = param_value
731
758
  save_presets_to_config_file
732
- return Main.result_status("Updated: #{config_name}: #{param_name} <- #{param_value}")
759
+ return Main.result_status("Updated: #{name}: #{param_name} <- #{param_value}")
733
760
  when :initialize
734
- config_value = options.get_next_argument('extended value (Hash)')
735
- if @config_presets.has_key?(config_name)
736
- Log.log.warn("configuration already exists: #{config_name}, overwriting")
761
+ config_value = options.get_next_argument('extended value', type: Hash)
762
+ if @config_presets.key?(name)
763
+ Log.log.warn{"configuration already exists: #{name}, overwriting"}
737
764
  end
738
- @config_presets[config_name] = config_value
765
+ @config_presets[name] = config_value
739
766
  save_presets_to_config_file
740
767
  return Main.result_status("Modified: #{@option_config_file}")
741
768
  when :update
742
769
  # get unprocessed options
743
- theopts = options.get_options_table
744
- Log.log.debug("opts=#{theopts}")
745
- @config_presets[config_name] ||= {}
746
- @config_presets[config_name].merge!(theopts)
770
+ unprocessed_options = options.get_options_table
771
+ Log.log.debug{"opts=#{unprocessed_options}"}
772
+ @config_presets[name] ||= {}
773
+ @config_presets[name].merge!(unprocessed_options)
747
774
  # fix bug in 4.4 (creating key "true" in "default" preset)
748
775
  @config_presets[CONF_PRESET_DEFAULT].delete(true) if @config_presets[CONF_PRESET_DEFAULT].is_a?(Hash)
749
776
  save_presets_to_config_file
750
- return Main.result_status("Updated: #{config_name}")
777
+ return Main.result_status("Updated: #{name}")
751
778
  when :ask
752
779
  options.ask_missing_mandatory = :yes
753
- @config_presets[config_name] ||= {}
754
- options.get_next_argument('option names',expected: :multiple).each do |optionname|
755
- option_value = options.get_interactive(:option,optionname)
756
- @config_presets[config_name][optionname] = option_value
780
+ @config_presets[name] ||= {}
781
+ options.get_next_argument('option names', expected: :multiple).each do |option_name|
782
+ option_value = options.get_interactive(:option, option_name)
783
+ @config_presets[name][option_name] = option_value
757
784
  end
758
785
  save_presets_to_config_file
759
- return Main.result_status("Updated: #{config_name}")
786
+ return Main.result_status("Updated: #{name}")
787
+ when :lookup
788
+ BasicAuthPlugin.register_options(@agents)
789
+ url = options.get_option(:url, is_type: :mandatory)
790
+ user = options.get_option(:username, is_type: :mandatory)
791
+ result = lookup_preset(url: url, username: user)
792
+ raise 'no such config found' if result.nil?
793
+ return {type: :single_object, data: result}
794
+ when :secure
795
+ identifier = options.get_next_argument('config name', mandatory: false)
796
+ preset_names = identifier.nil? ? @config_presets.keys : [identifier]
797
+ secret_keywords = %w[password secret].freeze
798
+ preset_names.each do |preset_name|
799
+ preset = @config_presets[preset_name]
800
+ next unless preset.is_a?(Hash)
801
+ preset.each_key do |option_name|
802
+ secret_keywords.each do |keyword|
803
+ next unless option_name.end_with?(keyword)
804
+ vault_label = preset_name
805
+ incr = 0
806
+ until vault.get(label: vault_label, exception: false).nil?
807
+ vault_label = "#{preset_name}#{incr}"
808
+ incr += 1
809
+ end
810
+ to_set = {label: vault_label, password: preset[option_name]}
811
+ puts "need to encode #{preset_name}.#{option_name} -> #{vault_label} -> #{to_set}"
812
+ # to_copy=%i[]
813
+ vault.set(to_set)
814
+ preset[option_name] = "@vault:#{vault_label}.password"
815
+ end
816
+ end
817
+ end
818
+ return Main.result_status('Secrets secured in vault: Make sure to save the vault password securely.')
760
819
  end
761
820
  end
762
821
 
763
- ACTIONS = [PRESET_GBL_ACTIONS,%i[id preset open documentation genkey gem plugin flush_tokens echo wizard export_to_cli detect coffee
764
- ascp email_test smtp_settings proxy_check folder file check_update initdemo vault]].flatten.freeze
822
+ ACTIONS = %i[
823
+ id
824
+ preset
825
+ open
826
+ documentation
827
+ genkey
828
+ gem
829
+ plugin
830
+ flush_tokens
831
+ echo
832
+ wizard
833
+ export_to_cli
834
+ detect
835
+ coffee
836
+ ascp
837
+ email_test
838
+ smtp_settings
839
+ proxy_check
840
+ folder
841
+ file
842
+ check_update
843
+ initdemo
844
+ vault].concat(PRESET_GBL_ACTIONS).freeze
765
845
 
766
846
  # "config" plugin
767
847
  def execute_action
768
848
  action = options.get_next_command(ACTIONS)
769
849
  case action
770
850
  when *PRESET_GBL_ACTIONS # older syntax
771
- return execute_file_action(action,nil)
851
+ Log.log.warn{"This syntax is deprecated, use command: preset #{action}"}
852
+ return execute_preset(action: action)
772
853
  when :id # older syntax
773
- return execute_file_action(nil,options.get_next_argument('config name'))
854
+ identifier = options.get_next_argument('config name')
855
+ Log.log.warn{"This syntax is deprecated, use command: preset <verb> #{identifier}"}
856
+ return execute_preset(name: identifier)
774
857
  when :preset # newer syntax
775
- return execute_file_action(nil,nil)
858
+ return execute_preset
776
859
  when :open
777
- OpenApplication.instance.uri(@option_config_file.to_s) #file://
860
+ OpenApplication.editor(@option_config_file.to_s)
778
861
  return Main.result_nothing
779
862
  when :documentation
780
- section = options.get_next_argument('private key file path',mandatory: false)
863
+ section = options.get_next_argument('private key file path', mandatory: false)
781
864
  section = '#' + section unless section.nil?
782
865
  OpenApplication.instance.uri("#{@info[:help]}#{section}")
783
866
  return Main.result_nothing
784
867
  when :genkey # generate new rsa key
785
868
  private_key_path = options.get_next_argument('private key file path')
786
- private_key_length = options.get_next_argument('size in bits',mandatory: false) || DEFAULT_PRIVKEY_LENGTH
787
- generate_rsa_private_key(private_key_path,private_key_length)
869
+ private_key_length = options.get_next_argument('size in bits', mandatory: false) || DEFAULT_PRIVKEY_LENGTH
870
+ generate_rsa_private_key(private_key_path, private_key_length)
788
871
  return Main.result_status('Generated key: ' + private_key_path)
789
872
  when :echo # display the content of a value given on command line
790
873
  result = {type: :other_struct, data: options.get_next_argument('value')}
@@ -800,9 +883,9 @@ module Aspera
800
883
  when :list
801
884
  return {type: :object_list, data: @plugins.keys.map { |i| { 'plugin' => i.to_s, 'path' => @plugins[i][:source] } }, fields: %w[plugin path]}
802
885
  when :create
803
- plugin_name = options.get_next_argument('name',expected: :single).downcase
804
- plugin_folder = options.get_next_argument('folder',expected: :single,mandatory: false) || File.join(@main_folder,ASPERA_PLUGINS_FOLDERNAME)
805
- plugin_file = File.join(plugin_folder,"#{plugin_name}.rb")
886
+ plugin_name = options.get_next_argument('name', expected: :single).downcase
887
+ plugin_folder = options.get_next_argument('folder', expected: :single, mandatory: false) || File.join(@main_folder, ASPERA_PLUGINS_FOLDERNAME)
888
+ plugin_file = File.join(plugin_folder, "#{plugin_name}.rb")
806
889
  content = <<~END_OF_PLUGIN_CODE
807
890
  require 'aspera/cli/plugin'
808
891
  module Aspera
@@ -816,7 +899,7 @@ module Aspera
816
899
  end # Cli
817
900
  end # Aspera
818
901
  END_OF_PLUGIN_CODE
819
- File.write(plugin_file,content)
902
+ File.write(plugin_file, content)
820
903
  return Main.result_status("Created #{plugin_file}")
821
904
  end
822
905
  when :wizard
@@ -824,15 +907,15 @@ module Aspera
824
907
  options.ask_missing_mandatory = true
825
908
  # register url option
826
909
  BasicAuthPlugin.register_options(@agents)
827
- params={}
910
+ params = {}
828
911
  # get from option, or ask
829
- params[:instance_url] = options.get_option(:url,is_type: :mandatory)
912
+ params[:instance_url] = options.get_option(:url, is_type: :mandatory)
830
913
  # allow user to tell the preset name
831
914
  params[:preset_name] = options.get_option(:id)
832
915
  # allow user to specify type of application
833
916
  params[:application] = options.get_option(:value)
834
917
  params[:application] = params[:application].nil? ? identify_plugin_for_url(params[:instance_url])[:product] : params[:application].to_sym
835
- params[:plugin_name]=params[:application]
918
+ params[:plugin_name] = params[:application]
836
919
  params[:test_args] = '<replace per app>'
837
920
  case params[:application]
838
921
  when :faspex5
@@ -840,56 +923,56 @@ module Aspera
840
923
  when :aoc
841
924
  wizard_aoc(params)
842
925
  else
843
- raise CliBadArgument,"Supports only: aoc. Detected: #{params[:application]}"
926
+ raise CliBadArgument, "Supports only: aoc. Detected: #{params[:application]}"
844
927
  end # product
845
928
  if params[:option_default]
846
- self.format.display_status("Setting config preset as default for #{params[:plugin_name]}")
929
+ formatter.display_status("Setting config preset as default for #{params[:plugin_name]}")
847
930
  @config_presets[CONF_PRESET_DEFAULT][params[:plugin_name]] = params[:preset_name]
848
931
  else
849
932
  params[:test_args] = "-P#{params[:preset_name]} #{params[:test_args]}"
850
933
  end
851
- self.format.display_status('Saving config file.')
934
+ formatter.display_status('Saving config file.')
852
935
  save_presets_to_config_file
853
936
  return Main.result_status("Done.\nYou can test with:\n#{@info[:name]} #{params[:test_args]}")
854
937
  when :export_to_cli # this method shall be deprecated in the future: it was used to export configuration to "aspera.exe" CLI
855
- self.format.display_status('Exporting: Aspera on Cloud')
938
+ formatter.display_status('Exporting: Aspera on Cloud')
856
939
  require 'aspera/cli/plugins/aoc'
857
940
  # need url / username
858
941
  add_plugin_default_preset(AOC_COMMAND_V3.to_sym)
859
- # instanciate AoC plugin
942
+ # instantiate AoC plugin
860
943
  self.class.plugin_class(AOC_COMMAND_CURRENT).new(@agents) # TODO: is this line needed ? get options ?
861
- url = options.get_option(:url,is_type: :mandatory)
944
+ url = options.get_option(:url, is_type: :mandatory)
862
945
  cli_conf_file = Fasp::Installation.instance.cli_conf_file
863
946
  data = JSON.parse(File.read(cli_conf_file))
864
- organization,instance_domain = AoC.parse_url(url)
947
+ organization, instance_domain = AoC.parse_url(url)
865
948
  key_basename = 'org_' + organization + '.pem'
866
- key_file = File.join(File.dirname(File.dirname(cli_conf_file)),'etc',key_basename)
867
- File.write(key_file,options.get_option(:private_key,is_type: :mandatory))
949
+ key_file = File.join(File.dirname(File.dirname(cli_conf_file)), 'etc', key_basename)
950
+ File.write(key_file, options.get_option(:private_key, is_type: :mandatory))
868
951
  new_conf = {
869
952
  'organization' => organization,
870
- 'hostname' => [organization,instance_domain].join('.'),
953
+ 'hostname' => [organization, instance_domain].join('.'),
871
954
  'privateKeyFilename' => key_basename,
872
- 'username' => options.get_option(:username,is_type: :mandatory)
955
+ 'username' => options.get_option(:username, is_type: :mandatory)
873
956
  }
874
957
  new_conf['clientId'] = options.get_option(:client_id)
875
958
  new_conf['clientSecret'] = options.get_option(:client_secret)
876
959
  if new_conf['clientId'].nil?
877
- new_conf['clientId'],new_conf['clientSecret'] = AoC.get_client_info
960
+ new_conf['clientId'], new_conf['clientSecret'] = AoC.get_client_info
878
961
  end
879
962
  entry = data['AoCAccounts'].find{|i|i['organization'].eql?(organization)}
880
963
  if entry.nil?
881
964
  data['AoCAccounts'].push(new_conf)
882
- self.format.display_status("Creating new aoc entry: #{organization}")
965
+ formatter.display_status("Creating new aoc entry: #{organization}")
883
966
  else
884
- self.format.display_status("Updating existing aoc entry: #{organization}")
967
+ formatter.display_status("Updating existing aoc entry: #{organization}")
885
968
  entry.merge!(new_conf)
886
969
  end
887
- File.write(cli_conf_file,JSON.pretty_generate(data))
970
+ File.write(cli_conf_file, JSON.pretty_generate(data))
888
971
  return Main.result_status("Updated: #{cli_conf_file}")
889
972
  when :detect
890
973
  # need url / username
891
974
  BasicAuthPlugin.register_options(@agents)
892
- return {type: :single_object, data: identify_plugin_for_url(options.get_option(:url,is_type: :mandatory))}
975
+ return {type: :single_object, data: identify_plugin_for_url(options.get_option(:url, is_type: :mandatory))}
893
976
  when :coffee
894
977
  OpenApplication.instance.uri('https://enjoyjava.com/wp-content/uploads/2018/01/How-to-make-strong-coffee.jpg')
895
978
  return Main.result_nothing
@@ -912,16 +995,16 @@ module Aspera
912
995
  return {type: :single_object, data: email_settings}
913
996
  when :proxy_check
914
997
  # ensure fpac was provided
915
- options.get_option(:fpac,is_type: :mandatory)
998
+ options.get_option(:fpac, is_type: :mandatory)
916
999
  server_url = options.get_next_argument('server url')
917
1000
  return Main.result_status(@pac_exec.find_proxy_for_url(server_url))
918
1001
  when :check_update
919
1002
  return {type: :single_object, data: check_gem_version}
920
1003
  when :initdemo
921
- if @config_presets.has_key?(DEMO_SERVER_PRESET)
922
- Log.log.warn("Demo server preset already present: #{DEMO_SERVER_PRESET}")
1004
+ if @config_presets.key?(DEMO_SERVER_PRESET)
1005
+ Log.log.warn{"Demo server preset already present: #{DEMO_SERVER_PRESET}"}
923
1006
  else
924
- Log.log.info("Creating Demo server preset: #{DEMO_SERVER_PRESET}")
1007
+ Log.log.info{"Creating Demo server preset: #{DEMO_SERVER_PRESET}"}
925
1008
  @config_presets[DEMO_SERVER_PRESET] = {
926
1009
  'url' => 'ssh://' + DEMO + '.asperasoft.com:33001',
927
1010
  'username' => AOC_COMMAND_V2,
@@ -929,13 +1012,13 @@ module Aspera
929
1012
  }
930
1013
  end
931
1014
  @config_presets[CONF_PRESET_DEFAULT] ||= {}
932
- if @config_presets[CONF_PRESET_DEFAULT].has_key?(SERVER_COMMAND)
933
- Log.log.warn("Server default preset already set to: #{@config_presets[CONF_PRESET_DEFAULT][SERVER_COMMAND]}")
934
- Log.log.warn("Use #{DEMO_SERVER_PRESET} for demo: -P#{DEMO_SERVER_PRESET}") unless
1015
+ if @config_presets[CONF_PRESET_DEFAULT].key?(SERVER_COMMAND)
1016
+ Log.log.warn{"Server default preset already set to: #{@config_presets[CONF_PRESET_DEFAULT][SERVER_COMMAND]}"}
1017
+ Log.log.warn{"Use #{DEMO_SERVER_PRESET} for demo: -P#{DEMO_SERVER_PRESET}"} unless
935
1018
  DEMO_SERVER_PRESET.eql?(@config_presets[CONF_PRESET_DEFAULT][SERVER_COMMAND])
936
1019
  else
937
1020
  @config_presets[CONF_PRESET_DEFAULT][SERVER_COMMAND] = DEMO_SERVER_PRESET
938
- Log.log.info("Setting server default preset to : #{DEMO_SERVER_PRESET}")
1021
+ Log.log.info{"Setting server default preset to : #{DEMO_SERVER_PRESET}"}
939
1022
  end
940
1023
  save_presets_to_config_file
941
1024
  return Main.result_status('Done')
@@ -946,20 +1029,20 @@ module Aspera
946
1029
 
947
1030
  # @return email server setting with defaults if not defined
948
1031
  def email_settings
949
- smtp = options.get_option(:smtp,is_type: :mandatory)
1032
+ smtp = options.get_option(:smtp, is_type: :mandatory)
950
1033
  # change string keys into symbol keys
951
- smtp = smtp.keys.each_with_object({}){|v,m|m[v.to_sym] = smtp[v];}
1034
+ smtp = smtp.keys.each_with_object({}){|v, m|m[v.to_sym] = smtp[v]; }
952
1035
  # defaults
953
1036
  smtp[:tls] ||= true
954
1037
  smtp[:port] ||= smtp[:tls] ? 587 : 25
955
- smtp[:from_email] ||= smtp[:username] if smtp.has_key?(:username)
956
- smtp[:from_name] ||= smtp[:from_email].gsub(/@.*$/,'').gsub(/[^a-zA-Z]/,' ').capitalize if smtp.has_key?(:username)
957
- smtp[:domain] ||= smtp[:from_email].gsub(/^.*@/,'') if smtp.has_key?(:from_email)
1038
+ smtp[:from_email] ||= smtp[:username] if smtp.key?(:username)
1039
+ smtp[:from_name] ||= smtp[:from_email].gsub(/@.*$/, '').gsub(/[^a-zA-Z]/, ' ').capitalize if smtp.key?(:username)
1040
+ smtp[:domain] ||= smtp[:from_email].gsub(/^.*@/, '') if smtp.key?(:from_email)
958
1041
  # check minimum required
959
1042
  %i[server port domain].each do |n|
960
- raise "Missing smtp parameter: #{n}" unless smtp.has_key?(n)
1043
+ raise "Missing smtp parameter: #{n}" unless smtp.key?(n)
961
1044
  end
962
- Log.log.debug("smtp=#{smtp}")
1045
+ Log.log.debug{"smtp=#{smtp}"}
963
1046
  return smtp
964
1047
  end
965
1048
 
@@ -969,26 +1052,26 @@ module Aspera
969
1052
  end
970
1053
 
971
1054
  def send_email_template(email_template_default: nil, values: {})
972
- values[:to] ||= options.get_option(:notif_to,is_type: :mandatory)
973
- notif_template = options.get_option(:notif_template,is_type: email_template_default.nil? ? :mandatory : :optional) || email_template_default
1055
+ values[:to] ||= options.get_option(:notif_to, is_type: :mandatory)
1056
+ notif_template = options.get_option(:notif_template, is_type: email_template_default.nil? ? :mandatory : :optional) || email_template_default
974
1057
  mail_conf = email_settings
975
1058
  values[:from_name] ||= mail_conf[:from_name]
976
1059
  values[:from_email] ||= mail_conf[:from_email]
977
1060
  %i[from_name from_email].each do |n|
978
- raise "Missing email parameter: #{n}" unless values.has_key?(n)
1061
+ raise "Missing email parameter: #{n}" unless values.key?(n)
979
1062
  end
980
1063
  start_options = [mail_conf[:domain]]
981
- start_options.push(mail_conf[:username],mail_conf[:password],:login) if mail_conf.has_key?(:username) && mail_conf.has_key?(:password)
1064
+ start_options.push(mail_conf[:username], mail_conf[:password], :login) if mail_conf.key?(:username) && mail_conf.key?(:password)
982
1065
  # create a binding with only variables defined in values
983
1066
  template_binding = empty_binding
984
1067
  # add variables to binding
985
- values.each do |k,v|
1068
+ values.each do |k, v|
986
1069
  raise "key (#{k.class}) must be Symbol" unless k.is_a?(Symbol)
987
- template_binding.local_variable_set(k,v)
1070
+ template_binding.local_variable_set(k, v)
988
1071
  end
989
1072
  # execute template
990
1073
  msg_with_headers = ERB.new(notif_template).result(template_binding)
991
- Log.dump(:msg_with_headers,msg_with_headers)
1074
+ Log.dump(:msg_with_headers, msg_with_headers)
992
1075
  smtp = Net::SMTP.new(mail_conf[:server], mail_conf[:port])
993
1076
  smtp.enable_starttls if mail_conf[:tls]
994
1077
  smtp.start(*start_options) do |smtp_session|
@@ -999,8 +1082,8 @@ module Aspera
999
1082
  def save_presets_to_config_file
1000
1083
  raise 'no configuration loaded' if @config_presets.nil?
1001
1084
  FileUtils.mkdir_p(@main_folder) unless Dir.exist?(@main_folder)
1002
- Log.log.debug("Writing #{@option_config_file}")
1003
- File.write(@option_config_file,@config_presets.to_yaml)
1085
+ Log.log.debug{"Writing #{@option_config_file}"}
1086
+ File.write(@option_config_file, @config_presets.to_yaml)
1004
1087
  Environment.restrict_file_access(@main_folder)
1005
1088
  Environment.restrict_file_access(@option_config_file)
1006
1089
  end
@@ -1013,21 +1096,23 @@ module Aspera
1013
1096
  Log.log.debug('skip default config')
1014
1097
  return nil
1015
1098
  end
1016
- if @config_presets.has_key?(CONF_PRESET_DEFAULT) &&
1017
- @config_presets[CONF_PRESET_DEFAULT].has_key?(plugin_sym.to_s)
1099
+ if @config_presets.key?(CONF_PRESET_DEFAULT) &&
1100
+ @config_presets[CONF_PRESET_DEFAULT].key?(plugin_sym.to_s)
1018
1101
  default_config_name = @config_presets[CONF_PRESET_DEFAULT][plugin_sym.to_s]
1019
- if !@config_presets.has_key?(default_config_name)
1020
- Log.log.error("Default config name [#{default_config_name}] specified for plugin [#{plugin_sym}], but it does not exist in config file.\n"\
1021
- 'Please fix the issue: either create preset with one parameter: '\
1022
- "(#{@info[:name]} config id #{default_config_name} init @json:'{}') or remove default (#{@info[:name]} config id default remove #{plugin_sym}).")
1102
+ if !@config_presets.key?(default_config_name)
1103
+ Log.log.error do
1104
+ "Default config name [#{default_config_name}] specified for plugin [#{plugin_sym}], but it does not exist in config file.\n"\
1105
+ 'Please fix the issue: either create preset with one parameter: '\
1106
+ "(#{@info[:name]} config id #{default_config_name} init @json:'{}') or remove default (#{@info[:name]} config id default remove #{plugin_sym})."
1107
+ end
1023
1108
  end
1024
- raise CliError,"Config name [#{default_config_name}] must be a hash, check config file." if !@config_presets[default_config_name].is_a?(Hash)
1109
+ raise CliError, "Config name [#{default_config_name}] must be a hash, check config file." if !@config_presets[default_config_name].is_a?(Hash)
1025
1110
  return default_config_name
1026
1111
  end
1027
1112
  return nil
1028
1113
  end # get_plugin_default_config_name
1029
1114
 
1030
- ALLOWED_KEYS=%i[password username description].freeze
1115
+ ALLOWED_KEYS = %i[password username description].freeze
1031
1116
  def execute_vault
1032
1117
  command = options.get_next_command(%i[list show create delete password])
1033
1118
  case command
@@ -1036,11 +1121,11 @@ module Aspera
1036
1121
  when :show
1037
1122
  return {type: :single_object, data: vault.get(label: options.get_next_argument('label'))}
1038
1123
  when :create
1039
- label=options.get_next_argument('label')
1040
- info=options.get_next_argument('info Hash')
1124
+ label = options.get_next_argument('label')
1125
+ info = options.get_next_argument('info Hash')
1041
1126
  raise 'info must be Hash' unless info.is_a?(Hash)
1042
- info=info.symbolize_keys
1043
- info[:label]=label
1127
+ info = info.symbolize_keys
1128
+ info[:label] = label
1044
1129
  vault.set(info)
1045
1130
  return Main.result_status('Password added')
1046
1131
  when :delete
@@ -1048,154 +1133,173 @@ module Aspera
1048
1133
  return Main.result_status('Password deleted')
1049
1134
  when :password
1050
1135
  raise 'Vault does not support password change' unless vault.respond_to?(:password=)
1051
- new_password=options.get_next_argument('new_password')
1052
- vault.password=new_password
1136
+ new_password = options.get_next_argument('new_password')
1137
+ vault.password = new_password
1053
1138
  vault.save
1054
1139
  return Main.result_status('Password updated')
1055
1140
  end
1056
1141
  end
1057
1142
 
1058
1143
  def vault_value(name)
1059
- m=name.match(/^(.+)\.(.+)$/)
1144
+ m = name.match(/^(.+)\.(.+)$/)
1060
1145
  raise 'vault name shall match <name>.<param>' if m.nil?
1061
- info=vault.get(label: m[1])
1062
- #raise "no such vault entry: #{m[1]}" if info.nil?
1063
- value=info[m[2].to_sym]
1146
+ info = vault.get(label: m[1])
1147
+ # raise "no such vault entry: #{m[1]}" if info.nil?
1148
+ value = info[m[2].to_sym]
1064
1149
  raise "no such entry value: #{m[2]}" if value.nil?
1065
1150
  return value
1066
1151
  end
1067
1152
 
1068
1153
  def vault
1069
1154
  if @vault.nil?
1070
- vault_info = options.get_option(:vault) || {'type'=>'file','name'=>'vault.bin'}
1071
- vault_password = options.get_option(:vault_password,is_type: :mandatory)
1155
+ vault_info = options.get_option(:vault) || {'type' => 'file', 'name' => 'vault.bin'}
1156
+ vault_password = options.get_option(:vault_password, is_type: :mandatory)
1072
1157
  raise 'vault must be Hash' unless vault_info.is_a?(Hash)
1073
1158
  vault_type = vault_info['type'] || 'file'
1074
1159
  vault_name = vault_info['name'] || (vault_type.eql?('file') ? 'vault.bin' : PROGRAM_NAME)
1075
1160
  case vault_type
1076
1161
  when 'file'
1077
- vault_path=vault_name
1078
- @vault = Keychain::EncryptedHash.new(vault_path,vault_password)
1162
+ # absolute_path? introduced in ruby 2.7
1163
+ vault_path = vault_name.eql?(File.absolute_path(vault_name)) ? vault_name : File.join(@main_folder, vault_name)
1164
+ @vault = Keychain::EncryptedHash.new(vault_path, vault_password)
1079
1165
  when 'system'
1080
1166
  case Environment.os
1081
1167
  when Environment::OS_X
1082
- @vault = Keychain::MacosSystem.new(vault_name,vault_password)
1083
- when Environment::OS_WINDOWS,Environment::OS_LINUX,Environment::OS_AIX
1168
+ @vault = Keychain::MacosSystem.new(vault_name, vault_password)
1169
+ when Environment::OS_WINDOWS, Environment::OS_LINUX, Environment::OS_AIX
1084
1170
  raise 'not implemented'
1085
1171
  else raise 'Error, OS not supported'
1086
1172
  end
1087
1173
  else
1088
- raise CliBadArgument,"Unknown vault type: #{vault_type}"
1174
+ raise CliBadArgument, "Unknown vault type: #{vault_type}"
1089
1175
  end
1090
1176
  end
1091
1177
  raise 'No vault defined' if @vault.nil?
1092
1178
  @vault
1093
1179
  end
1094
1180
 
1095
- def get_secret(options)
1096
- raise 'options shall be Hash' unless options.is_a?(Hash)
1097
- raise 'options shall have username' unless options.has_key?(:username)
1098
- secret = self.options.get_option(:secret)
1181
+ # version of URL without trailing "/" and removing default port
1182
+ def canonical_url(url)
1183
+ url.gsub(%r{/+$}, '').gsub(%r{^(https://[^/]+):443$}, '\1')
1184
+ end
1185
+
1186
+ def lookup_preset(url:, username:)
1187
+ # remove extra info to maximize match
1188
+ url = canonical_url(url)
1189
+ Log.log.debug{"Lookup preset for #{username}@#{url}"}
1190
+ @config_presets.each do |_k, v|
1191
+ next unless v.is_a?(Hash)
1192
+ conf_url = v['url'].is_a?(String) ? canonical_url(v['url']) : nil
1193
+ return v if conf_url.eql?(url) && v['username'].eql?(username)
1194
+ end
1195
+ nil
1196
+ end
1197
+
1198
+ def lookup_secret(url:, username:, mandatory: false)
1199
+ secret = options.get_option(:secret)
1099
1200
  if secret.nil?
1100
- secret = vault.get(options) rescue nil
1101
- # mandatory by default
1102
- raise "please provide secret for #{options[:username]}" if secret.nil? && (options[:mandatory].nil? || options[:mandatory])
1201
+ conf = lookup_preset(url: url, username: username)
1202
+ if conf.is_a?(Hash)
1203
+ Log.log.debug{"Found preset #{conf} with URL and username"}
1204
+ secret = conf['password']
1205
+ end
1206
+ raise "Please provide secret for #{username} using option: secret or by setting a preset for #{username}@#{url}." if secret.nil? && mandatory
1103
1207
  end
1104
1208
  return secret
1105
1209
  end
1106
1210
 
1107
1211
  def wizard_aoc(params)
1108
- self.format.display_status('Detected: Aspera on Cloud'.bold)
1212
+ formatter.display_status('Detected: Aspera on Cloud'.bold)
1109
1213
  params[:plugin_name] = AOC_COMMAND_CURRENT
1110
1214
  organization = AoC.parse_url(params[:instance_url]).first
1111
1215
  # if not defined by user, generate name
1112
- params[:preset_name] = [params[:application],organization].join('_') if params[:preset_name].nil?
1113
- self.format.display_status("Preparing preset: #{params[:preset_name]}")
1216
+ params[:preset_name] = [params[:application], organization].join('_') if params[:preset_name].nil?
1217
+ formatter.display_status("Preparing preset: #{params[:preset_name]}")
1114
1218
  # init defaults if necessary
1115
1219
  @config_presets[CONF_PRESET_DEFAULT] ||= {}
1116
- option_override = options.get_option(:override,is_type: :mandatory)
1117
- params[:option_default] = options.get_option(:default,is_type: :mandatory)
1118
- Log.log.error("override=#{option_override} -> #{option_override.class}")
1119
- raise CliError,"A default configuration already exists for plugin '#{params[:plugin_name]}' (use --override=yes or --default=no)" \
1120
- if !option_override && params[:option_default] && @config_presets[CONF_PRESET_DEFAULT].has_key?(params[:plugin_name])
1121
- raise CliError,"Preset already exists: #{params[:preset_name]} (use --override=yes or --id=<name>)" \
1122
- if !option_override && @config_presets.has_key?(params[:preset_name])
1220
+ option_override = options.get_option(:override, is_type: :mandatory)
1221
+ params[:option_default] = options.get_option(:default, is_type: :mandatory)
1222
+ Log.log.error{"override=#{option_override} -> #{option_override.class}"}
1223
+ raise CliError, "A default configuration already exists for plugin '#{params[:plugin_name]}' (use --override=yes or --default=no)" \
1224
+ if !option_override && params[:option_default] && @config_presets[CONF_PRESET_DEFAULT].key?(params[:plugin_name])
1225
+ raise CliError, "Preset already exists: #{params[:preset_name]} (use --override=yes or --id=<name>)" \
1226
+ if !option_override && @config_presets.key?(params[:preset_name])
1123
1227
  # lets see if path to priv key is provided
1124
1228
  private_key_path = options.get_option(:pkeypath)
1125
1229
  # give a chance to provide
1126
1230
  if private_key_path.nil?
1127
- self.format.display_status('Please provide path to your private RSA key, or empty to generate one:')
1128
- private_key_path = options.get_option(:pkeypath,is_type: :mandatory).to_s
1231
+ formatter.display_status('Please provide path to your private RSA key, or empty to generate one:')
1232
+ private_key_path = options.get_option(:pkeypath, is_type: :mandatory).to_s
1129
1233
  end
1130
1234
  # else generate path
1131
1235
  if private_key_path.empty?
1132
- private_key_path = File.join(@main_folder,DEFAULT_PRIV_KEY_FILENAME)
1236
+ private_key_path = File.join(@main_folder, DEFAULT_PRIV_KEY_FILENAME)
1133
1237
  end
1134
1238
  if File.exist?(private_key_path)
1135
- self.format.display_status('Using existing key:')
1239
+ formatter.display_status('Using existing key:')
1136
1240
  else
1137
- self.format.display_status("Generating #{DEFAULT_PRIVKEY_LENGTH} bit RSA key...")
1138
- generate_rsa_private_key(private_key_path,DEFAULT_PRIVKEY_LENGTH)
1139
- self.format.display_status('Created:')
1241
+ formatter.display_status("Generating #{DEFAULT_PRIVKEY_LENGTH} bit RSA key...")
1242
+ generate_rsa_private_key(private_key_path, DEFAULT_PRIVKEY_LENGTH)
1243
+ formatter.display_status('Created:')
1140
1244
  end
1141
- self.format.display_status(private_key_path)
1245
+ formatter.display_status(private_key_path)
1142
1246
  pub_key_pem = OpenSSL::PKey::RSA.new(File.read(private_key_path)).public_key.to_s
1143
1247
  # declare command line options for AoC
1144
1248
  require 'aspera/cli/plugins/aoc'
1145
1249
  # make username mandatory for jwt, this triggers interactive input
1146
- options.get_option(:username,is_type: :mandatory)
1147
- # instanciate AoC plugin, so that command line options are known
1250
+ options.get_option(:username, is_type: :mandatory)
1251
+ # instantiate AoC plugin, so that command line options are known
1148
1252
  aoc_api = self.class.plugin_class(params[:plugin_name]).new(@agents.merge({skip_basic_auth_options: true, private_key_path: private_key_path})).aoc_api
1149
1253
  auto_set_pub_key = false
1150
1254
  auto_set_jwt = false
1151
1255
  use_browser_authentication = false
1152
1256
  if options.get_option(:use_generic_client)
1153
- self.format.display_status('Using global client_id.')
1154
- self.format.display_status('Please Login to your Aspera on Cloud instance.'.red)
1155
- self.format.display_status('Navigate to your "Account Settings"'.red)
1156
- self.format.display_status('Check or update the value of "Public Key" to be:'.red.blink)
1157
- self.format.display_status(pub_key_pem.to_s)
1257
+ formatter.display_status('Using global client_id.')
1258
+ formatter.display_status('Please Login to your Aspera on Cloud instance.'.red)
1259
+ formatter.display_status('Navigate to your "Account Settings"'.red)
1260
+ formatter.display_status('Check or update the value of "Public Key" to be:'.red.blink)
1261
+ formatter.display_status(pub_key_pem.to_s)
1158
1262
  if !options.get_option(:test_mode)
1159
- self.format.display_status('Once updated or validated, press enter.')
1263
+ formatter.display_status('Once updated or validated, press enter.')
1160
1264
  OpenApplication.instance.uri(params[:instance_url])
1161
1265
  $stdin.gets
1162
1266
  end
1163
1267
  else
1164
- self.format.display_status('Using organization specific client_id.')
1165
- if options.get_option(:client_id).nil? || options.get_option(:client_secret,is_type: :optional).nil?
1166
- self.format.display_status('Please login to your Aspera on Cloud instance.'.red)
1167
- self.format.display_status('Go to: Apps->Admin->Organization->Integrations')
1168
- self.format.display_status('Create or check if there is an existing integration named:')
1169
- self.format.display_status("- name: #{@info[:name]}")
1170
- self.format.display_status("- redirect uri: #{DEFAULT_REDIRECT}")
1171
- self.format.display_status('- origin: localhost')
1172
- self.format.display_status('Once created or identified,')
1173
- self.format.display_status('Please enter:'.red)
1268
+ formatter.display_status('Using organization specific client_id.')
1269
+ if options.get_option(:client_id).nil? || options.get_option(:client_secret, is_type: :optional).nil?
1270
+ formatter.display_status('Please login to your Aspera on Cloud instance.'.red)
1271
+ formatter.display_status('Go to: Apps->Admin->Organization->Integrations')
1272
+ formatter.display_status('Create or check if there is an existing integration named:')
1273
+ formatter.display_status("- name: #{@info[:name]}")
1274
+ formatter.display_status("- redirect uri: #{DEFAULT_REDIRECT}")
1275
+ formatter.display_status('- origin: localhost')
1276
+ formatter.display_status('Once created or identified,')
1277
+ formatter.display_status('Please enter:'.red)
1174
1278
  end
1175
1279
  OpenApplication.instance.uri("#{params[:instance_url]}/#{AOC_PATH_API_CLIENTS}")
1176
- options.get_option(:client_id,is_type: :mandatory)
1177
- options.get_option(:client_secret,is_type: :mandatory)
1280
+ options.get_option(:client_id, is_type: :mandatory)
1281
+ options.get_option(:client_secret, is_type: :mandatory)
1178
1282
  use_browser_authentication = true
1179
1283
  end
1180
1284
  if use_browser_authentication
1181
- self.format.display_status('We will use web authentication to bootstrap.')
1285
+ formatter.display_status('We will use web authentication to bootstrap.')
1182
1286
  auto_set_pub_key = true
1183
1287
  auto_set_jwt = true
1184
- aoc_api.oauth.gparams[:crtype] = :web
1185
- aoc_api.oauth.gparams[:scope] = AoC::SCOPE_FILES_ADMIN
1186
- aoc_api.oauth.sparams[:redirect_uri] = DEFAULT_REDIRECT
1288
+ aoc_api.oauth.generic_parameters[:grant_method] = :web
1289
+ aoc_api.oauth.generic_parameters[:scope] = AoC::SCOPE_FILES_ADMIN
1290
+ aoc_api.oauth.specific_parameters[:redirect_uri] = DEFAULT_REDIRECT
1187
1291
  end
1188
1292
  myself = aoc_api.read('self')[:data]
1189
1293
  if auto_set_pub_key
1190
- raise CliError,'Public key is already set in profile (use --override=yes)' unless myself['public_key'].empty? || option_override
1191
- self.format.display_status('Updating profile with new key')
1192
- aoc_api.update("users/#{myself['id']}",{'public_key' => pub_key_pem})
1294
+ raise CliError, 'Public key is already set in profile (use --override=yes)' unless myself['public_key'].empty? || option_override
1295
+ formatter.display_status('Updating profile with new key')
1296
+ aoc_api.update("users/#{myself['id']}", {'public_key' => pub_key_pem})
1193
1297
  end
1194
1298
  if auto_set_jwt
1195
- self.format.display_status('Enabling JWT for client')
1196
- aoc_api.update("clients/#{options.get_option(:client_id)}",{'jwt_grant_enabled' => true,'explicit_authorization_required' => false})
1299
+ formatter.display_status('Enabling JWT for client')
1300
+ aoc_api.update("clients/#{options.get_option(:client_id)}", {'jwt_grant_enabled' => true, 'explicit_authorization_required' => false})
1197
1301
  end
1198
- self.format.display_status("Creating new config preset: #{params[:preset_name]}")
1302
+ formatter.display_status("Creating new config preset: #{params[:preset_name]}")
1199
1303
  @config_presets[params[:preset_name]] = {
1200
1304
  :url.to_s => options.get_option(:url),
1201
1305
  :username.to_s => myself['email'],
@@ -1211,58 +1315,58 @@ module Aspera
1211
1315
  end
1212
1316
 
1213
1317
  def wizard_faspex5(params)
1214
- self.format.display_status('Detected: Faspex v5'.bold)
1318
+ formatter.display_status('Detected: Faspex v5'.bold)
1215
1319
  # if not defined by user, generate unique name
1216
- params[:preset_name] = [params[:application],URI.parse(params[:instance_url]).host.gsub(/[^a-z0-9.]/,'').split('.')].flatten.join('_') \
1320
+ params[:preset_name] = [params[:application]].concat(URI.parse(params[:instance_url]).host.gsub(/[^a-z0-9.]/, '').split('.')).join('_') \
1217
1321
  if params[:preset_name].nil?
1218
- self.format.display_status("Preparing preset: #{params[:preset_name]}")
1322
+ formatter.display_status("Preparing preset: #{params[:preset_name]}")
1219
1323
  # init defaults if necessary
1220
1324
  @config_presets[CONF_PRESET_DEFAULT] ||= {}
1221
- option_override = options.get_option(:override,is_type: :mandatory)
1222
- params[:option_default] = options.get_option(:default,is_type: :mandatory)
1223
- Log.log.error("override=#{option_override} -> #{option_override.class}")
1224
- raise CliError,"A default configuration already exists for plugin '#{params[:plugin_name]}' (use --override=yes or --default=no)" \
1225
- if !option_override && params[:option_default] && @config_presets[CONF_PRESET_DEFAULT].has_key?(params[:plugin_name])
1226
- raise CliError,"Preset already exists: #{params[:preset_name]} (use --override=yes or --id=<name>)" \
1227
- if !option_override && @config_presets.has_key?(params[:preset_name])
1325
+ option_override = options.get_option(:override, is_type: :mandatory)
1326
+ params[:option_default] = options.get_option(:default, is_type: :mandatory)
1327
+ Log.log.error{"override=#{option_override} -> #{option_override.class}"}
1328
+ raise CliError, "A default configuration already exists for plugin '#{params[:plugin_name]}' (use --override=yes or --default=no)" \
1329
+ if !option_override && params[:option_default] && @config_presets[CONF_PRESET_DEFAULT].key?(params[:plugin_name])
1330
+ raise CliError, "Preset already exists: #{params[:preset_name]} (use --override=yes or --id=<name>)" \
1331
+ if !option_override && @config_presets.key?(params[:preset_name])
1228
1332
  # lets see if path to priv key is provided
1229
1333
  private_key_path = options.get_option(:pkeypath)
1230
1334
  # give a chance to provide
1231
1335
  if private_key_path.nil?
1232
- self.format.display_status('Please provide path to your private RSA key, or empty to generate one:')
1233
- private_key_path = options.get_option(:pkeypath,is_type: :mandatory).to_s
1336
+ formatter.display_status('Please provide path to your private RSA key, or empty to generate one:')
1337
+ private_key_path = options.get_option(:pkeypath, is_type: :mandatory).to_s
1234
1338
  end
1235
1339
  # else generate path
1236
1340
  if private_key_path.empty?
1237
- private_key_path = File.join(@main_folder,DEFAULT_PRIV_KEY_FILENAME)
1341
+ private_key_path = File.join(@main_folder, DEFAULT_PRIV_KEY_FILENAME)
1238
1342
  end
1239
1343
  if File.exist?(private_key_path)
1240
- self.format.display_status('Using existing key:')
1344
+ formatter.display_status('Using existing key:')
1241
1345
  else
1242
- self.format.display_status("Generating #{DEFAULT_PRIVKEY_LENGTH} bit RSA key...")
1243
- generate_rsa_private_key(private_key_path,DEFAULT_PRIVKEY_LENGTH)
1244
- self.format.display_status('Created:')
1346
+ formatter.display_status("Generating #{DEFAULT_PRIVKEY_LENGTH} bit RSA key...")
1347
+ generate_rsa_private_key(private_key_path, DEFAULT_PRIVKEY_LENGTH)
1348
+ formatter.display_status('Created:')
1245
1349
  end
1246
- self.format.display_status(private_key_path)
1350
+ formatter.display_status(private_key_path)
1247
1351
  pub_key_pem = OpenSSL::PKey::RSA.new(File.read(private_key_path)).public_key.to_s
1248
1352
  # declare command line options for AoC
1249
1353
  require 'aspera/cli/plugins/faspex5'
1250
1354
  self.class.plugin_class(params[:plugin_name]).new(@agents.merge({skip_basic_auth_options: true}))
1251
- self.format.display_status('Please login to Faspex 5.'.red)
1355
+ formatter.display_status('Please login to Faspex 5.'.red)
1252
1356
  OpenApplication.instance.uri(params[:instance_url])
1253
- self.format.display_status('Navigate to: 𓃑 → Admin → Configurations → API clients')
1254
- self.format.display_status('Create a client with:')
1255
- self.format.display_status('- JWT enabled')
1256
- self.format.display_status('- The following public key:')
1257
- self.format.display_status(pub_key_pem.to_s)
1258
- self.format.display_status('Once created, copy the following parameters:')
1357
+ formatter.display_status('Navigate to: 𓃑 → Admin → Configurations → API clients')
1358
+ formatter.display_status('Create a client with:')
1359
+ formatter.display_status('- JWT enabled')
1360
+ formatter.display_status('- The following public key:')
1361
+ formatter.display_status(pub_key_pem.to_s)
1362
+ formatter.display_status('Once created, copy the following parameters:')
1259
1363
  @config_presets[params[:preset_name]] = {
1260
1364
  :url.to_s => options.get_option(:url),
1261
1365
  :username.to_s => options.get_option(:username),
1262
1366
  :auth.to_s => :jwt.to_s,
1263
1367
  :private_key.to_s => '@file:' + private_key_path,
1264
- :client_id.to_s => options.get_option(:client_id,is_type: :mandatory),
1265
- :client_secret.to_s => options.get_option(:client_secret,is_type: :mandatory)
1368
+ :client_id.to_s => options.get_option(:client_id, is_type: :mandatory),
1369
+ :client_secret.to_s => options.get_option(:client_secret, is_type: :mandatory)
1266
1370
  }
1267
1371
  params[:test_args] = "#{params[:plugin_name]} user profile show"
1268
1372
  end