f696a5ab0e
MSP-11671 Add command line option --defer-module-loads to msfconsole. It will stop `Msf::Ui::Console::Driver` from calling `framework.modules.init_module_paths` AND `framework.modules.refresh_cache_from_database`. This flag is only meant to speed up msfconsole boot when modules do not need to accessed, such as during cucumber testing of command help or command line options.
186 lines
4.5 KiB
Ruby
186 lines
4.5 KiB
Ruby
#
|
|
# Standard Library
|
|
#
|
|
|
|
require 'optparse'
|
|
|
|
#
|
|
# Gems
|
|
#
|
|
|
|
require 'active_support/ordered_options'
|
|
|
|
#
|
|
# Project
|
|
#
|
|
|
|
require 'metasploit/framework/database'
|
|
require 'metasploit/framework/parsed_options'
|
|
|
|
# Options parsed from the command line that can be used to change the
|
|
# `Metasploit::Framework::Application.config` and `Rails.env`
|
|
class Metasploit::Framework::ParsedOptions::Base
|
|
#
|
|
# CONSTANTS
|
|
#
|
|
|
|
# msfconsole boots in production mode instead of the normal rails default of
|
|
# development.
|
|
DEFAULT_ENVIRONMENT = 'production'
|
|
|
|
#
|
|
# Attributes
|
|
#
|
|
|
|
attr_reader :positional
|
|
|
|
#
|
|
# Instance Methods
|
|
#
|
|
|
|
def initialize(arguments=ARGV)
|
|
@positional = option_parser.parse(arguments)
|
|
end
|
|
|
|
# Translates {#options} to the `application`'s config
|
|
#
|
|
# @param application [Rails::Application]
|
|
# @return [void]
|
|
def configure(application)
|
|
application.config['config/database'] = options.database.config
|
|
end
|
|
|
|
# Sets the `RAILS_ENV` environment variable.
|
|
#
|
|
# 1. If the -E/--environment option is given, then its value is used.
|
|
# 2. The default value, 'production', is used.
|
|
#
|
|
# @return [void]
|
|
def environment!
|
|
if defined?(Rails) && Rails.instance_variable_defined?(:@_env) && Rails.env != options.environment
|
|
raise "#{self.class}##{__method__} called too late to set RAILS_ENV: Rails.env already memoized"
|
|
end
|
|
|
|
ENV['RAILS_ENV'] = options.environment
|
|
end
|
|
|
|
# Options parsed from
|
|
#
|
|
# @return [ActiveSupport::OrderedOptions]
|
|
def options
|
|
unless @options
|
|
options = ActiveSupport::OrderedOptions.new
|
|
|
|
options.database = ActiveSupport::OrderedOptions.new
|
|
|
|
options.database.config = Metasploit::Framework::Database.configurations_pathname.try(:to_path)
|
|
options.database.disable = false
|
|
options.database.migrations_paths = []
|
|
|
|
# If RAILS_ENV is set, then it will be used, but if RAILS_ENV is set and the --environment option is given, then
|
|
# --environment value will be used to reset ENV[RAILS_ENV].
|
|
options.environment = ENV['RAILS_ENV'] || DEFAULT_ENVIRONMENT
|
|
|
|
options.framework = ActiveSupport::OrderedOptions.new
|
|
options.framework.config = nil
|
|
|
|
options.modules = ActiveSupport::OrderedOptions.new
|
|
options.modules.defer_loads = false
|
|
options.modules.path = nil
|
|
|
|
@options = options
|
|
end
|
|
|
|
@options
|
|
end
|
|
|
|
private
|
|
|
|
# Parses arguments into {#options}.
|
|
#
|
|
# @return [OptionParser]
|
|
def option_parser
|
|
@option_parser ||= OptionParser.new { |option_parser|
|
|
option_parser.separator ''
|
|
option_parser.separator 'Common options'
|
|
|
|
option_parser.on(
|
|
'-E',
|
|
'--environment ENVIRONMENT',
|
|
%w{development production test},
|
|
"The Rails environment. Will use RAIL_ENV environment variable if that is set. " \
|
|
"Defaults to production if neither option not RAILS_ENV environment variable is set."
|
|
) do |environment|
|
|
options.environment = environment
|
|
end
|
|
|
|
option_parser.separator ''
|
|
option_parser.separator 'Database options'
|
|
|
|
option_parser.on(
|
|
'-M',
|
|
'--migration-path DIRECTORY',
|
|
'Specify a directory containing additional DB migrations'
|
|
) do |directory|
|
|
options.database.migrations_paths << directory
|
|
end
|
|
|
|
option_parser.on('-n', '--no-database', 'Disable database support') do
|
|
options.database.disable = true
|
|
end
|
|
|
|
option_parser.on(
|
|
'-y',
|
|
'--yaml PATH',
|
|
'Specify a YAML file containing database settings'
|
|
) do |path|
|
|
options.database.config = path
|
|
end
|
|
|
|
option_parser.separator ''
|
|
option_parser.separator 'Framework options'
|
|
|
|
|
|
option_parser.on('-c', '-c FILE', 'Load the specified configuration file') do |file|
|
|
options.framework.config = file
|
|
end
|
|
|
|
option_parser.on(
|
|
'-v',
|
|
'--version',
|
|
'Show version'
|
|
) do
|
|
options.subcommand = :version
|
|
end
|
|
|
|
option_parser.separator ''
|
|
option_parser.separator 'Module options'
|
|
|
|
option_parser.on(
|
|
'--defer-module-loads',
|
|
'Defer module loading unless explicitly asked.'
|
|
) do
|
|
options.modules.defer_loads = true
|
|
end
|
|
|
|
option_parser.on(
|
|
'-m',
|
|
'--module-path DIRECTORY',
|
|
'An additional module path'
|
|
) do |directory|
|
|
options.modules.path = directory
|
|
end
|
|
|
|
#
|
|
# Tail
|
|
#
|
|
|
|
option_parser.separator ''
|
|
option_parser.on_tail('-h', '--help', 'Show this message') do
|
|
puts option_parser
|
|
exit
|
|
end
|
|
}
|
|
end
|
|
end
|