Class: Aspera::Cli::Wizard
- Inherits:
-
Object
- Object
- Aspera::Cli::Wizard
- Defined in:
- lib/aspera/cli/wizard.rb
Instance Method Summary collapse
- #config ⇒ Object
-
#find(apps) ⇒ Object
Wizard function, creates configuration.
- #formatter ⇒ Object
-
#identify_plugins_for_url ⇒ Hash
Find a plugin, and issue the “require”.
-
#initialize(parent, main_folder) ⇒ Wizard
constructor
A new instance of Wizard.
- #options ⇒ Object
Constructor Details
#initialize(parent, main_folder) ⇒ Wizard
Returns a new instance of Wizard.
13 14 15 16 17 18 19 20 21 |
# File 'lib/aspera/cli/wizard.rb', line 13 def initialize(parent, main_folder) @parent = parent @main_folder = main_folder # wizard options .declare(:override, 'Wizard: override existing value', values: :bool, default: :no) .declare(:default, 'Wizard: set as default configuration for specified plugin (also: update)', values: :bool, default: true) .declare(:test_mode, 'Wizard: skip private key check step', values: :bool, default: false) .declare(:key_path, 'Wizard: path to private key for JWT') end |
Instance Method Details
#config ⇒ Object
31 32 33 |
# File 'lib/aspera/cli/wizard.rb', line 31 def config @parent.config end |
#find(apps) ⇒ Object
Wizard function, creates configuration
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/aspera/cli/wizard.rb', line 77 def find(apps) identification = if apps.length.eql?(1) Log.log.debug{"Detected: #{identification}"} apps.first else formatter.display_status('Multiple applications detected, please select from:') formatter.display_results(type: :object_list, data: apps, fields: %w[product url version]) answer = .prompt_user_input_in_list('product', apps.map{ |a| a[:product]}) apps.find{ |a| a[:product].eql?(answer)} end wiz_preset_name = .get_next_argument('preset name', default: '') Log.dump(:identification, identification) wiz_url = identification[:url] formatter.display_status("Using: #{identification[:name]} at #{wiz_url}".bold) # set url for instantiation of plugin .add_option_preset({url: wiz_url}, 'wizard') # instantiate plugin: command line options will be known and wizard can be called wiz_plugin_class = PluginFactory.instance.plugin_class(identification[:product]) Aspera.assert(wiz_plugin_class.respond_to?(:wizard), type: Cli::BadArgument) do "Detected: #{identification[:product]}, but this application has no wizard" end # instantiate plugin: command line options will be known, e.g. private_key plugin_instance = wiz_plugin_class.new(context: @parent.context) wiz_params = { object: plugin_instance } # is private key needed ? if ..key?(:private_key) && (!wiz_plugin_class.respond_to?(:private_key_required?) || wiz_plugin_class.private_key_required?(wiz_url)) # lets see if path to priv key is provided private_key_path = .get_option(:key_path) # give a chance to provide if private_key_path.nil? formatter.display_status('Path to private RSA key (leave empty to generate):') private_key_path = .get_option(:key_path, mandatory: true).to_s end # else generate path private_key_path = File.join(@main_folder, DEFAULT_PRIV_KEY_FILENAME) if private_key_path.empty? if File.exist?(private_key_path) formatter.display_status('Using existing key:') else formatter.display_status("Generating #{OAuth::Jwt::DEFAULT_PRIV_KEY_LENGTH} bit RSA key...") OAuth::Jwt.generate_rsa_private_key(path: private_key_path) formatter.display_status('Created key:') end formatter.display_status(private_key_path) private_key_pem = File.read(private_key_path) .set_option(:private_key, private_key_pem) wiz_params[:private_key_path] = private_key_path wiz_params[:pub_key_pem] = OpenSSL::PKey::RSA.new(private_key_pem).public_key.to_s end Log.dump(:wiz_params, wiz_params) # finally, call the wizard wizard_result = wiz_plugin_class.wizard(**wiz_params) Log.log.debug{"wizard result: #{wizard_result}"} Aspera.assert(WIZARD_RESULT_KEYS.eql?(wizard_result.keys.sort)){"missing or extra keys in wizard result: #{wizard_result.keys}"} # get preset name from user or default if wiz_preset_name.empty? elements = [ identification[:product], URI.parse(wiz_url).host ] elements.push(.get_option(:username, mandatory: true)) unless wizard_result[:preset_value].key?(:link) rescue nil wiz_preset_name = elements.join('_').strip.downcase.gsub(/[^a-z0-9]/, '_').squeeze('_') end # test mode does not change conf file return Main.result_single_object(wizard_result) if .get_option(:test_mode) # Write configuration file formatter.display_status("Preparing preset: #{wiz_preset_name}") # init defaults if necessary option_override = .get_option(:override, mandatory: true) option_default = .get_option(:default, mandatory: true) config.defaults_set(identification[:product], wiz_preset_name, wizard_result[:preset_value].stringify_keys, option_default, option_override) test_args = wizard_result[:test_args] test_args = "-P#{wiz_preset_name} #{test_args}" unless option_default # TODO: actually test the command return Main.result_status("You can test with:\n#{Info::CMD_NAME} #{identification[:product]} #{test_args}") end |
#formatter ⇒ Object
27 28 29 |
# File 'lib/aspera/cli/wizard.rb', line 27 def formatter @parent.formatter end |
#identify_plugins_for_url ⇒ Hash
Find a plugin, and issue the “require”
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/aspera/cli/wizard.rb', line 37 def identify_plugins_for_url app_url = .get_next_argument('url', mandatory: true) check_only = .get_next_argument('plugin name', mandatory: false) check_only = check_only.to_sym unless check_only.nil? found_apps = [] my_self_plugin_sym = self.class.name.split('::').last.downcase.to_sym PluginFactory.instance.plugin_list.each do |plugin_name_sym| # no detection for internal plugin next if plugin_name_sym.eql?(my_self_plugin_sym) next if check_only && !check_only.eql?(plugin_name_sym) # load plugin class detect_plugin_class = PluginFactory.instance.plugin_class(plugin_name_sym) # requires detection method next unless detect_plugin_class.respond_to?(:detect) detection_info = nil begin Log.log.debug{"detecting #{plugin_name_sym} at #{app_url}"} formatter.long_operation_running("#{plugin_name_sym}\r") detection_info = detect_plugin_class.detect(app_url) rescue OpenSSL::SSL::SSLError => e Log.log.warn(e.) Log.log.warn('Use option --insecure=yes to allow unchecked certificate') if e..include?('cert') rescue StandardError => e Log.log.debug{"detect error: [#{e.class}] #{e}"} next end next if detection_info.nil? Aspera.assert_type(detection_info, Hash) Aspera.assert_type(detection_info[:url], String) if detection_info.key?(:url) app_name = detect_plugin_class.respond_to?(:application_name) ? detect_plugin_class.application_name : detect_plugin_class.name.split('::').last # if there is a redirect, then the detector can override the url. found_apps.push({product: plugin_name_sym, name: app_name, url: app_url, version: 'unknown'}.merge(detection_info)) end raise "No known application found at #{app_url}" if found_apps.empty? Aspera.assert(found_apps.all?{ |a| a.keys.all?(Symbol)}) return found_apps end |
#options ⇒ Object
23 24 25 |
# File 'lib/aspera/cli/wizard.rb', line 23 def @parent. end |