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
|
2007-12-29 23:05:15 +00:00
|
|
|
|
|
|
|
# Windows-specific environment variables
|
2008-11-10 21:44:58 +00:00
|
|
|
['LOCALAPPDATA', 'APPDATA', 'USERPROFILE', 'HOME'].each do |dir|
|
|
|
|
val = Rex::Compat.getenv(dir)
|
|
|
|
if (val and File.directory?(val))
|
|
|
|
return File.join(val, ".msf3")
|
2007-12-29 23:05:15 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2005-11-04 00:55:46 +00:00
|
|
|
begin
|
2007-03-24 06:41:44 +00:00
|
|
|
# First we try $HOME/.msf3
|
2005-11-04 00:55:46 +00:00
|
|
|
File.expand_path("~#{FileSep}.msf3")
|
2006-10-29 17:41:19 +00:00
|
|
|
rescue ::ArgumentError
|
2007-12-29 23:05:15 +00:00
|
|
|
# Give up and install root + ".msf3"
|
|
|
|
InstallRoot + ".msf3"
|
2005-11-04 00:55:46 +00:00
|
|
|
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",
|
2006-09-19 03:15:25 +00:00
|
|
|
'ScriptDirectory' => "scripts",
|
2005-10-01 06:35:16 +00:00
|
|
|
'LogDirectory' => "logs",
|
|
|
|
'SessionLogDirectory' => "logs/sessions",
|
2005-11-24 03:31:23 +00:00
|
|
|
'PluginDirectory' => "plugins",
|
|
|
|
'DataDirectory' => "data"
|
2005-07-15 22:30:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
##
|
|
|
|
#
|
|
|
|
# Class methods
|
|
|
|
#
|
|
|
|
##
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Returns the framework installation root.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.install_root
|
|
|
|
InstallRoot
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.config_directory
|
|
|
|
self.new.config_directory
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-10-01 09:10:41 +00:00
|
|
|
def self.module_directory
|
|
|
|
self.new.module_directory
|
|
|
|
end
|
|
|
|
|
2006-09-19 03:15:25 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
|
|
|
def self.script_directory
|
|
|
|
self.new.script_directory
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.log_directory
|
|
|
|
self.new.log_directory
|
|
|
|
end
|
|
|
|
|
2005-11-19 16:25:26 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
|
|
|
def self.plugin_directory
|
|
|
|
self.new.plugin_directory
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-10-01 06:35:16 +00:00
|
|
|
def self.session_log_directory
|
|
|
|
self.new.session_log_directory
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-10-01 06:35:16 +00:00
|
|
|
def self.user_module_directory
|
|
|
|
self.new.user_module_directory
|
|
|
|
end
|
2006-09-19 03:15:25 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
|
|
|
def self.user_script_directory
|
|
|
|
self.new.user_script_directory
|
|
|
|
end
|
2005-11-24 03:31:23 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
|
|
|
def self.data_directory
|
|
|
|
self.new.data_directory
|
|
|
|
end
|
2005-10-01 06:35:16 +00:00
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.config_file
|
|
|
|
self.new.config_file
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.init
|
|
|
|
self.new.init
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
def self.load(path = nil)
|
|
|
|
self.new.load(path)
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the instance method.
|
|
|
|
#
|
2005-07-15 22:30:04 +00:00
|
|
|
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
|
|
|
|
|
2006-09-19 03:15:25 +00:00
|
|
|
#
|
|
|
|
# Returns the path that scripts can be loaded from.
|
|
|
|
#
|
|
|
|
def script_directory
|
|
|
|
install_root + FileSep + self['ScriptDirectory']
|
|
|
|
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
|
|
|
|
|
2005-11-19 16:25:26 +00:00
|
|
|
#
|
|
|
|
# Returns the directory that plugins are stored in.
|
|
|
|
#
|
|
|
|
def plugin_directory
|
|
|
|
install_root + FileSep + self['PluginDirectory']
|
|
|
|
end
|
|
|
|
|
2005-10-01 06:35:16 +00:00
|
|
|
#
|
|
|
|
# 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
|
|
|
|
|
2006-09-19 03:15:25 +00:00
|
|
|
#
|
|
|
|
# Returns the user-specific script base path
|
|
|
|
#
|
|
|
|
def user_script_directory
|
|
|
|
config_directory + FileSep + "scripts"
|
|
|
|
end
|
|
|
|
|
2005-11-24 03:31:23 +00:00
|
|
|
#
|
|
|
|
# Returns the data directory
|
|
|
|
#
|
|
|
|
def data_directory
|
|
|
|
install_root + FileSep + self['DataDirectory']
|
|
|
|
end
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
#
|
|
|
|
# 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
|
|
|
|
|
2008-11-10 21:44:58 +00:00
|
|
|
end
|