class RediPress::CLI::Configurations

Public Instance Methods

execute() click to toggle source
# File lib/redipress/cli/configurations.rb, line 9
def execute
  # Prepare
  prepare

  # Print a hello message
  prompt.ok("Hello, let's configure a server!")

  # Get the server host
  host = prompt_for_host

  # Print a new line
  new_line

  # Get the configuration
  configurations = prompt_for_configurations

  # Create a Hash to hold the options
  options = Hash.new

  # Loop over each configuration
  configurations.each do |configuration|
    # Print a new line
    new_line

    # Get the configuration's options
    options[configuration.slug] = prompt_for_configuration_options(configuration)
  end

  # Print a new line
  new_line

  # Prompt to continue
  exit(1) unless prompt.yes?("Proceed with the above settings?")

  # Loop over each configuration
  configurations.each do |configuration|
    # Print a new line
    new_line

    begin
      # Check if the configuration is compatible with the host
      compatible = configuration.compatible?(host, options)
    rescue => e
      # Print a new line
      new_line

      # Print an error message
      prompt.error("An exception was raised whilst running a configuration:")
      prompt.error("-------------------------------------------------------")

      raise e
    end

    # Check if the configuration is not compatible
    unless compatible
      # Print a warning message
      prompt.warning("'#{configuration.name}' is not compatible with #{host.username}@#{host.hostname}")

      exit 1
    end
  end

  # Print a message
  prompt.ok("The selected configurations appear to be compatible with #{host.username}@#{host.hostname}")

  # Create a Hash to hold the results
  results = Hash.new

  # Loop over each configuration
  configurations.each do |configuration|
    # Print a new line
    new_line

    # Print a message
    prompt.ok("Configuring '#{configuration.name}' ...")
    prompt.ok("------------------------------------------------------------")

    begin
      # Perform the configuration on the server
      results[configuration.slug] = configuration.configure(host, options[configuration.slug])
    rescue RediPress::ConfigurationFailed => e
      # Print a new line
      new_line

      # Print an error message
      prompt.error("Configuration '#{configuration.name}' failed:")
      prompt.error("------------------------------------------------------------")
      prompt.error(e.error)

      exit 1
    rescue => e
      # Print a new line
      new_line

      # Print an error message
      prompt.error("Configuration '#{configuration.name}' raised an error:")
      prompt.error("------------------------------------------------------------")

      raise e
    end
  end

  # Print a new line
  new_line

  # The server has been configured
  prompt.ok("Woo hoo! Your server has been configured.")

  # Loop over each configuration
  configurations.each do |configuration|
    # Get the result
    result = results[configuration.slug]

    # Go next if there aren't any results to output
    next if result.nil? || result.empty? || false == result.is_a?(Hash)

    # Print a new line
    new_line

    # Print the configuration's name
    prompt.ok(configuration.name)
    prompt.ok("------------------------------------------------------------")

    # Print a table containing the results
    puts TTY::Table.new(rows: result.map { |k, v| [" #{k} ", " #{v} "] }).render(:ascii)
  end

  nil
end
prompt_for_configuration_options(configuration) click to toggle source

Prompt the user for all options required by the specified configuration

Example:

>> prompt_for_configuration_options(configuration)
=> { "username" => "test" }
# File lib/redipress/cli/configurations.rb, line 225
def prompt_for_configuration_options(configuration)
  return nil unless configuration.parameters && configuration.parameters.count > 0

  # Print a short message to explain why we need the following information
  prompt.ok("Options for #{configuration.name}:")

  # Create an empty hash to store the configuration's options
  options = Hash.new

  # Loop through each parameter on the configuration
  configuration.parameters.each do |parameter|
    if :text == parameter.type
      options[parameter.slug] = prompt.ask(" #{parameter.name}:") do |q|
        q.required(parameter.required)
        q.validate(parameter.validation) if parameter.validation
        q.default(parameter.default) if parameter.default
      end
    elsif :yes == parameter.type
      options[parameter.slug] = prompt.yes?(" #{parameter.name}:")
    elsif :no == parameter.type
      options[parameter.slug] = prompt.no?(" #{parameter.name}:")
    elsif :select == parameter.type
      options[parameter.slug] = prompt.select(" #{parameter.name}:", parameter.options)
    elsif :multi_select == parameter.type
      options[parameter.slug] = prompt.multi_select(" #{parameter.name}:", parameter.options)
    else
      prompt.error("'#{parameter.name}' has an unknown type of '#{parameter.type}'.")

      exit 1
    end
  end

  options
end
prompt_for_configurations() click to toggle source

Prompt the user for the configurations to use

Example:

>> prompt_for_configurations
=> [#<RediPress::Configuration::Test:0x00000000000000>]
# File lib/redipress/cli/configurations.rb, line 191
def prompt_for_configurations
  # Print a short message to explain why we need the following information
  prompt.ok("Pick the configurations you'd like to use:")

  begin
    # Load the actual configuration classes
    configurations = RediPress::Configuration.all
  rescue => e
    prompt.error("Unable to load one or more configurations.")
    prompt.error("--------------------------------------------------")

    raise e
  end

  # Ensure there is at least one configuration available
  if configurations.nil? || configurations.empty?
    prompt.error("There aren't any configurations available to use.")
    prompt.error("--------------------------------------------------")

    raise RediPress::NoConfigurationsAvailable
  end

  # Prompt for the configurations to use
  configurations = prompt.multi_select("Configurations:", configurations.values)

  configurations
end
prompt_for_host() click to toggle source

Prompt the user for the server host

Example:

>> prompt_for_host
=> #<SSHKit::Host:0x00000000000000>
# File lib/redipress/cli/configurations.rb, line 149
def prompt_for_host
  # Print a short message to explain why we need the following information
  prompt.ok("We need the following to be able to login to your server:")

  # Prompt for the server's hostname or IP address
  hostname = prompt.ask("Hostname/IP:") do |q|
    q.required(true)
    q.validate(/^(([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$/)
  end

  # Prompt for the server's username
  username = prompt.ask("Username:") do |q|
    q.required(true)
    q.validate(/^[a-z]+$/)
  end

  # Prompt for the server's password
  password = prompt.ask("Password (leave blank to use ssh keys):") do |q|
    q.required(false)
  end

  # Create an SSHKit::Host object
  host = SSHKit::Host.new("#{username}@#{hostname}")

  # Check if a password was provided
  if password
    # Set the password on the host
    host.password = password
  else
    # Load all ssh keys
    RediPress::SSHKeys.load_ssh_keys
  end

  host
end