Class: Msf::FeatureManager
- Inherits:
-
Object
- Object
- Msf::FeatureManager
- Includes:
- Singleton
- Defined in:
- lib/msf/core/feature_manager.rb
Overview
The feature manager is responsible for managing feature flags that can change characteristics of framework. Each feature will have a default value. The user can choose to override this default value if they wish.
Constant Summary collapse
- CONFIG_KEY =
'framework/features'
- WRAPPED_TABLES =
'wrapped_tables'
- FULLY_INTERACTIVE_SHELLS =
'fully_interactive_shells'
- SERVICEMANAGER_COMMAND =
'servicemanager_command'
- DEFAULTS =
[ { name: WRAPPED_TABLES, description: 'When enabled Metasploit will wordwrap all tables to fit into the available terminal width', default_value: true }.freeze, { name: FULLY_INTERACTIVE_SHELLS, description: 'When enabled you will have the option to drop into a fully interactive shell from within meterpreter', default_value: false }.freeze, { name: SERVICEMANAGER_COMMAND, description: 'When enabled you will have access to the _servicemanager command', default_value: false }.freeze ].freeze
Instance Method Summary collapse
- #all ⇒ Object
- #enabled?(name) ⇒ Boolean
- #exists?(name) ⇒ Boolean
-
#initialize ⇒ FeatureManager
constructor
Initializes the feature manager.
- #load_config ⇒ Object
- #names ⇒ Object
- #save_config ⇒ Object
- #set(name, value) ⇒ Object
Constructor Details
#initialize ⇒ FeatureManager
Initializes the feature manager.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/msf/core/feature_manager.rb', line 40 def initialize @flag_lookup = DEFAULTS.each_with_object({}) do |feature, acc| if feature[:name] == WRAPPED_TABLES if feature[:default_value] == true Rex::Text::Table.wrap_tables! else Rex::Text::Table.unwrap_tables! end end key = feature[:name] acc[key] = feature.dup end end |
Instance Method Details
#all ⇒ Object
55 56 57 58 59 |
# File 'lib/msf/core/feature_manager.rb', line 55 def all @flag_lookup.values.map do |feature| feature.slice(:name, :description).merge(enabled: enabled?(feature[:name])) end end |
#enabled?(name) ⇒ Boolean
61 62 63 64 65 66 |
# File 'lib/msf/core/feature_manager.rb', line 61 def enabled?(name) return false unless @flag_lookup[name] feature = @flag_lookup[name] feature.key?(:user_preference) ? feature[:user_preference] : feature[:default_value] end |
#exists?(name) ⇒ Boolean
68 69 70 |
# File 'lib/msf/core/feature_manager.rb', line 68 def exists?(name) @flag_lookup.key?(name) end |
#load_config ⇒ Object
90 91 92 93 94 95 |
# File 'lib/msf/core/feature_manager.rb', line 90 def load_config conf = Msf::Config.load conf.fetch(CONFIG_KEY, {}).each do |name, value| set(name, value == 'true') end end |
#names ⇒ Object
72 73 74 |
# File 'lib/msf/core/feature_manager.rb', line 72 def names all.map { |feature| feature[:name] } end |
#save_config ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/msf/core/feature_manager.rb', line 97 def save_config # Note, we intentionally omit features that have not explicitly been set by the user. config = Msf::Config.load old_config = config.fetch(CONFIG_KEY, {}) new_config = @flag_lookup.values.each_with_object(old_config) do |feature, config| next unless feature.key?(:user_preference) config.merge!(feature[:name] => feature[:user_preference].to_s) end Msf::Config.save(CONFIG_KEY => new_config) end |
#set(name, value) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/msf/core/feature_manager.rb', line 76 def set(name, value) return false unless @flag_lookup[name] @flag_lookup[name][:user_preference] = value if name == WRAPPED_TABLES if value Rex::Text::Table.wrap_tables! else Rex::Text::Table.unwrap_tables! end end end |