2005-07-15 22:30:04 +00:00
|
|
|
require 'fileutils'
|
|
|
|
|
|
|
|
module Msf
|
|
|
|
|
|
|
|
###
|
|
|
|
#
|
|
|
|
# This class wraps interaction with global configuration that can be used as a
|
|
|
|
# persistent storage point for configuration, logs, and other such fun things.
|
|
|
|
#
|
|
|
|
###
|
|
|
|
class Config < Hash
|
|
|
|
|
|
|
|
#
|
|
|
|
# The installation root directory for the distribution
|
|
|
|
#
|
|
|
|
InstallRoot = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
|
|
|
2005-11-04 00:55:46 +00:00
|
|
|
#
|
|
|
|
# Determines the base configuration directory.
|
|
|
|
#
|
|
|
|
def self.get_config_root
|
|
|
|
begin
|
|
|
|
File.expand_path("~#{FileSep}.msf3")
|
|
|
|
rescue ArgumentError
|
|
|
|
InstallRoot + ".msf3"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
#
|
|
|
|
# Default values
|
|
|
|
#
|
|
|
|
FileSep = File::SEPARATOR
|
|
|
|
Defaults =
|
|
|
|
{
|
2005-11-04 00:55:46 +00:00
|
|
|
'ConfigDirectory' => get_config_root,
|
2005-10-01 06:35:16 +00:00
|
|
|
'ConfigFile' => "config",
|
2005-10-01 09:10:41 +00:00
|
|
|
'ModuleDirectory' => "modules",
|
2005-10-01 06:35:16 +00:00
|
|
|
'LogDirectory' => "logs",
|
|
|
|
'SessionLogDirectory' => "logs/sessions",
|
2005-07-15 22:30:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
##
|
|
|
|
#
|
|
|
|
# Class methods
|
|
|
|
#
|
|
|
|
##
|
|
|
|
|
|
|
|
def self.install_root
|
|
|
|
InstallRoot
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.config_directory
|
|
|
|
self.new.config_directory
|
|
|
|
end
|
|
|
|
|
2005-10-01 09:10:41 +00:00
|
|
|
def self.module_directory
|
|
|
|
self.new.module_directory
|
|
|
|
end
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.log_directory
|
|
|
|
self.new.log_directory
|
|
|
|
end
|
|
|
|
|
2005-10-01 06:35:16 +00:00
|
|
|
def self.session_log_directory
|
|
|
|
self.new.session_log_directory
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.user_module_directory
|
|
|
|
self.new.user_module_directory
|
|
|
|
end
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.config_file
|
|
|
|
self.new.config_file
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.init
|
|
|
|
self.new.init
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.load(path = nil)
|
|
|
|
self.new.load(path)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.save(opts)
|
|
|
|
self.new.save(opts)
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Updates the config class' self with the default hash.
|
|
|
|
#
|
|
|
|
def initialize
|
|
|
|
update(Defaults)
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the installation root directory
|
|
|
|
#
|
|
|
|
def install_root
|
|
|
|
InstallRoot
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the configuration directory default.
|
|
|
|
#
|
|
|
|
def config_directory
|
|
|
|
self['ConfigDirectory']
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the full path to the configuration file.
|
|
|
|
#
|
|
|
|
def config_file
|
|
|
|
config_directory + FileSep + self['ConfigFile']
|
|
|
|
end
|
|
|
|
|
2005-10-01 09:10:41 +00:00
|
|
|
#
|
|
|
|
# Returns the global module directory.
|
|
|
|
#
|
|
|
|
def module_directory
|
|
|
|
install_root + FileSep + self['ModuleDirectory']
|
|
|
|
end
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
#
|
|
|
|
# Returns the directory that log files should be stored in.
|
|
|
|
#
|
|
|
|
def log_directory
|
2005-10-01 06:35:16 +00:00
|
|
|
config_directory + FileSep + self['LogDirectory']
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the directory in which session log files are to reside.
|
|
|
|
#
|
|
|
|
def session_log_directory
|
|
|
|
config_directory + FileSep + self['SessionLogDirectory']
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the user-specific module base path
|
|
|
|
#
|
|
|
|
def user_module_directory
|
|
|
|
config_directory + FileSep + "modules"
|
2005-07-15 22:30:04 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Initializes configuration, creating directories as necessary.
|
|
|
|
#
|
|
|
|
def init
|
|
|
|
FileUtils.mkdir_p(config_directory)
|
|
|
|
FileUtils.mkdir_p(log_directory)
|
2005-10-01 06:35:16 +00:00
|
|
|
FileUtils.mkdir_p(session_log_directory)
|
|
|
|
FileUtils.mkdir_p(user_module_directory)
|
2005-07-15 22:30:04 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Loads configuration from the supplied file path, or the default one if
|
|
|
|
# none is specified.
|
|
|
|
#
|
|
|
|
def load(path = nil)
|
|
|
|
path = config_file if (!path)
|
|
|
|
|
|
|
|
return Rex::Parser::Ini.new(path)
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Saves configuration to the path specified in the ConfigFile hash key or
|
|
|
|
# the default path is one isn't specified. The options should be group
|
|
|
|
# references that have named value pairs. Example:
|
|
|
|
#
|
|
|
|
# save(
|
|
|
|
# 'ExampleGroup' =>
|
|
|
|
# {
|
|
|
|
# 'Foo' => 'Cat'
|
|
|
|
# })
|
|
|
|
#
|
|
|
|
def save(opts)
|
|
|
|
ini = Rex::Parser::Ini.new(opts['ConfigFile'] || config_file)
|
|
|
|
|
|
|
|
ini.update(opts)
|
|
|
|
|
|
|
|
ini.to_file
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|