Rework importing of interfaces, a little more verbose in the code, but a little less complex to import and name.

This commit is contained in:
Mike Auty
2016-08-16 10:54:57 +01:00
parent ca61cf10b9
commit db21d4628c
7 changed files with 32 additions and 32 deletions
+2 -3
View File
@@ -4,8 +4,7 @@ import sys
import volatility.framework
import volatility.plugins
from volatility.framework import automagic, contexts
from volatility.framework.interfaces import configuration as config_interface
from volatility.framework import automagic, contexts, interfaces
from volatility.framework.renderers.text import TextRenderer
__author__ = 'mike'
@@ -44,7 +43,7 @@ class CommandLine(object):
# Run the argparser
parser.parse_args()
config_path = config_interface.path_join("plugins", plugin.__name__.lower())
config_path = interfaces.configuration.path_join("plugins", plugin.__name__.lower())
###
# PASS TO UI
+6 -7
View File
@@ -1,15 +1,13 @@
import sys
from volatility.framework import class_subclasses, import_files
from volatility.framework import class_subclasses, import_files, interfaces
from volatility.framework.configuration import MultiRequirement
from volatility.framework.interfaces import automagic as automagic_interface
from volatility.framework.interfaces.configuration import ConfigurableInterface
def available():
"""Determine all the available automagic classes"""
import_files(sys.modules[__name__])
return sorted([clazz() for clazz in class_subclasses(automagic_interface.AutomagicInterface)],
return sorted([clazz() for clazz in class_subclasses(interfaces.automagic.AutomagicInterface)],
key = lambda x: x.priority)
@@ -19,16 +17,17 @@ def run(automagics, context, configurable, config_path = ""):
This is where any automagic is allowed to run, and alter the context in order to satisfy/improve all requirements
"""
for automagic in automagics:
if not isinstance(automagic, automagic_interface.AutomagicInterface):
if not isinstance(automagic, interfaces.automagic.AutomagicInterface):
raise TypeError("Automagics must only contain AutomagicInterface subclasses")
if not isinstance(configurable, ConfigurableInterface) and not issubclass(configurable, ConfigurableInterface):
if (not isinstance(configurable, interfaces.configuration.ConfigurableInterface)
and not issubclass(configurable, interfaces.configuration.ConfigurableInterface)):
raise TypeError("Automagic operates on configurables only")
# TODO: Fix need for top level config element just because we're using a MultiRequirement to group the
# configurable's config requirements
configurable_class = configurable
if isinstance(configurable, ConfigurableInterface):
if isinstance(configurable, interfaces.configuration.ConfigurableInterface):
configurable_class = configurable.__class__
requirement = MultiRequirement(name = configurable_class.__name__.lower())
for req in configurable.get_requirements():
@@ -1,11 +1,11 @@
import logging
from volatility.framework.interfaces import automagic as automagic_interface, configuration as config_interface
from volatility.framework import interfaces
vollog = logging.getLogger(__name__)
class ConstructionMagic(automagic_interface.AutomagicInterface):
class ConstructionMagic(interfaces.automagic.AutomagicInterface):
"""Runs through the requirement tree and from the bottom up attempts to construct all TranslationLayerRequirements"""
priority = 10
@@ -15,7 +15,7 @@ class ConstructionMagic(automagic_interface.AutomagicInterface):
# but also ensures that TranslationLayerRequirements have got the correct subrequirements if their class is populated
success = True
subreq_config_path = config_interface.path_join(config_path, requirement.name)
subreq_config_path = interfaces.configuration.path_join(config_path, requirement.name)
for subreq in requirement.requirements.values():
self(context, subreq, subreq_config_path)
valid = subreq.validate(context, subreq_config_path)
@@ -25,7 +25,7 @@ class ConstructionMagic(automagic_interface.AutomagicInterface):
success = False
if not success:
return False
elif isinstance(requirement, config_interface.ConstructableRequirementInterface):
elif isinstance(requirement, interfaces.configuration.ConstructableRequirementInterface):
# We know all the subrequirements are filled, so let's populate
requirement.construct(context, config_path)
return True
+4 -5
View File
@@ -8,7 +8,6 @@ import struct
from volatility.framework import automagic, interfaces, layers, validity
from volatility.framework.configuration import requirements
from volatility.framework.interfaces import automagic as automagic_interface, configuration as config_interface
PAGE_SIZE = 0x1000
@@ -112,7 +111,7 @@ class PageMapScanner(interfaces.layers.ScannerInterface):
yield (test, result)
class PageMapOffsetHelper(automagic_interface.AutomagicInterface):
class PageMapOffsetHelper(interfaces.automagic.AutomagicInterface):
priority = 20
def __init__(self):
@@ -126,14 +125,14 @@ class PageMapOffsetHelper(automagic_interface.AutomagicInterface):
def __call__(self, context, requirement, config_path):
useful = []
sub_config_path = config_interface.path_join(config_path, requirement.name)
sub_config_path = interfaces.configuration.path_join(config_path, requirement.name)
if isinstance(requirement, requirements.TranslationLayerRequirement):
class_req = requirement.requirements["class"]
if not class_req.validate(context, sub_config_path):
# All the intel spaces require the same kind of parameters, so pick one for the requirements
context.config.branch(config_path)
automagic.run(context, layers.intel.Intel,
config_interface.path_join(config_path, requirement.name))
interfaces.configuration.path_join(config_path, requirement.name))
# If a class hasn't been chosen, look through the underlying config for appropriate parameters
# If possible run scan and choose an appropriate class
@@ -152,7 +151,7 @@ class PageMapOffsetHelper(automagic_interface.AutomagicInterface):
# TODO: Convert to scanner framework
hits = context.memory[physical_layer].scan(context, PageMapScanner(useful))
for test, dtb in hits:
context.config[config_interface.path_join(sub_config_path, "page_map_offset")] = dtb
context.config[interfaces.configuration.path_join(sub_config_path, "page_map_offset")] = dtb
requirement.construct(context, config_path)
break
else:
@@ -1,11 +1,11 @@
import logging
from volatility.framework.interfaces import configuration as config_interface
from volatility.framework import interfaces
vollog = logging.getLogger(__name__)
class MultiRequirement(config_interface.RequirementInterface):
class MultiRequirement(interfaces.configuration.RequirementInterface):
"""Class to hold multiple requirements
Technically the Interface could handle this, but it's an interface, so this is a concrete implementation
@@ -15,7 +15,7 @@ class MultiRequirement(config_interface.RequirementInterface):
return self.validate_children(context, config_path)
class InstanceRequirement(config_interface.RequirementInterface):
class InstanceRequirement(interfaces.configuration.RequirementInterface):
instance_type = bool
def add_requirement(self, requirement):
@@ -45,7 +45,7 @@ class BytesRequirement(InstanceRequirement):
instance_type = bytes
class TranslationLayerRequirement(config_interface.ConstructableRequirementInterface):
class TranslationLayerRequirement(interfaces.configuration.ConstructableRequirementInterface):
"""Class maintaining the limitations on what sort of address spaces are acceptable"""
def __init__(self, name, description = None, default = None, optional = False):
@@ -96,7 +96,7 @@ class TranslationLayerRequirement(config_interface.ConstructableRequirementInter
"config_path": config_path,
"name": name}
config_path = config_interface.path_join(config_path, self.name)
config_path = interfaces.configuration.path_join(config_path, self.name)
if not all([subreq.validate(context, config_path) for subreq in self.requirements.values() if
not subreq.optional]):
return False
@@ -108,7 +108,7 @@ class TranslationLayerRequirement(config_interface.ConstructableRequirementInter
return True
class SymbolRequirement(config_interface.ConstructableRequirementInterface):
class SymbolRequirement(interfaces.configuration.ConstructableRequirementInterface):
"""Class maintaining the limitations on what sort of symbol spaces are acceptable"""
def validate(self, context, config_path):
@@ -134,7 +134,7 @@ class SymbolRequirement(config_interface.ConstructableRequirementInterface):
"config_path": config_path,
"name": name}
config_path = config_interface.path_join(config_path, self.name)
config_path = interfaces.configuration.path_join(config_path, self.name)
if not all([subreq.validate(context, config_path) for subreq in self.requirements.values() if
not subreq.optional]):
return False
@@ -146,7 +146,7 @@ class SymbolRequirement(config_interface.ConstructableRequirementInterface):
return True
class ChoiceRequirement(config_interface.RequirementInterface):
class ChoiceRequirement(interfaces.configuration.RequirementInterface):
"""Allows one from a choice of strings"""
def __init__(self, choices, *args, **kwargs):
@@ -164,12 +164,12 @@ class ChoiceRequirement(config_interface.RequirementInterface):
return True
class ListRequirement(config_interface.RequirementInterface):
class ListRequirement(interfaces.configuration.RequirementInterface):
def __init__(self, element_type, max_elements, min_elements, *args, **kwargs):
super().__init__(*args, **kwargs)
if isinstance(element_type, ListRequirement):
raise TypeError("ListRequirements cannot contain ListRequirements")
self.element_type = self._check_type(element_type, config_interface.RequirementInterface)
self.element_type = self._check_type(element_type, interfaces.configuration.RequirementInterface)
self.min_elements = min_elements
self.max_elements = max_elements
+2 -1
View File
@@ -7,4 +7,5 @@ Created on 12 Apr 2013
# Import the submodules we want people to be able to use without importing them themselves
# This will also avoid namespace issues, because people can use interfaces.layers to
# avoid clashing with the layers package
from volatility.framework.interfaces import configuration, context, layers, objects, plugins, renderers, symbols
from volatility.framework.interfaces import configuration, context, layers, objects, \
plugins, renderers, symbols, automagic
+4 -2
View File
@@ -3,10 +3,12 @@ Created on 6 May 2013
@author: mike
"""
# Configuration interfaces must be imported separately, since we're part of interfaces and can't import ourselves
from abc import ABCMeta, abstractmethod
from volatility.framework import validity
from volatility.framework.interfaces import configuration as configuration_interface, context as context_interface
from volatility.framework.interfaces import configuration as interfaces_configuration
#
@@ -22,7 +24,7 @@ from volatility.framework.interfaces import configuration as configuration_inter
# The plugin accepts the context and modifies as necessary
# The plugin runs and produces a TreeGrid output
class PluginInterface(configuration_interface.ConfigurableInterface, validity.ValidityRoutines, metaclass = ABCMeta):
class PluginInterface(interfaces_configuration.ConfigurableInterface, validity.ValidityRoutines, metaclass = ABCMeta):
"""Class that defines the interface all Plugins must maintain"""
def __init__(self, context, config_path):