Commit 59ed91d3 by devttys0

Updated module exception/error handling

parent d0e410af
...@@ -99,11 +99,6 @@ class Error(Result): ...@@ -99,11 +99,6 @@ class Error(Result):
self.exception = None self.exception = None
Result.__init__(self, **kwargs) Result.__init__(self, **kwargs)
if self.exception:
sys.stderr.write("Exception: " + str(self.exception) + "\n")
elif self.description:
sys.stderr.write("Error: " + self.description + "\n")
class Module(object): class Module(object):
''' '''
All module classes must be subclassed from this. All module classes must be subclassed from this.
...@@ -247,8 +242,15 @@ class Module(object): ...@@ -247,8 +242,15 @@ class Module(object):
Returns None. Returns None.
''' '''
e = Error(**kwargs) e = Error(**kwargs)
e.module = self
self.errors.append(e) self.errors.append(e)
if e.exception:
sys.stderr.write(e.module.__class__.__name__ + " Exception: " + str(e.exception) + "\n")
elif e.description:
sys.stderr.write(e.module.__class__.__name__ + " Error: " + e.description + "\n")
def header(self): def header(self):
self.config.display.format_strings(self.HEADER_FORMAT, self.RESULT_FORMAT) self.config.display.format_strings(self.HEADER_FORMAT, self.RESULT_FORMAT)
if type(self.HEADER) == type([]): if type(self.HEADER) == type([]):
...@@ -273,7 +275,13 @@ class Module(object): ...@@ -273,7 +275,13 @@ class Module(object):
self.error(exception=e) self.error(exception=e)
return False return False
try:
self.config.display.format_strings(self.HEADER_FORMAT, self.RESULT_FORMAT) self.config.display.format_strings(self.HEADER_FORMAT, self.RESULT_FORMAT)
except KeyboardInterrupt as e:
raise e
except Exception as e:
self.error(exception=e)
return False
self._plugins_pre_scan() self._plugins_pre_scan()
...@@ -303,7 +311,7 @@ class Modules(object): ...@@ -303,7 +311,7 @@ class Modules(object):
Returns None. Returns None.
''' '''
self.arguments = argv self.arguments = argv
self.dependency_results = {} self.loaded_modules = {}
def list(self, attribute="run"): def list(self, attribute="run"):
''' '''
...@@ -358,12 +366,12 @@ class Modules(object): ...@@ -358,12 +366,12 @@ class Modules(object):
obj = self.load(module) obj = self.load(module)
if isinstance(obj, binwalk.module.Module) and obj.enabled: if isinstance(obj, binwalk.module.Module) and obj.enabled:
try:
obj.main() obj.main()
except AttributeError as e:
sys.stderr.write("WARNING: " + str(e) + "\n")
obj = None
# Add object to loaded_modules here, that way if a module has already been
# loaded directly and is subsequently also listed as a dependency we don't waste
# time loading it twice.
self.loaded_modules[module] = obj
return obj return obj
def load(self, module): def load(self, module):
...@@ -375,14 +383,15 @@ class Modules(object): ...@@ -375,14 +383,15 @@ class Modules(object):
kwargs = {} kwargs = {}
if hasattr(module, "DEPENDS"): if hasattr(module, "DEPENDS"):
for (kwarg, mod) in iterator(module.DEPENDS): for (kwarg, dependency) in iterator(module.DEPENDS):
if mod == module: # No recursive dependencies, thanks
if dependency == module:
continue continue
if not has_key(self.dependency_results, mod): if not has_key(self.loaded_modules, dependency):
# TODO: What to do if a dependency fails? # TODO: What to do if a dependency fails? Anything?
self.dependency_results[mod] = self.run(mod) self.run(dependency)
kwargs[kwarg] = self.dependency_results[mod] kwargs[kwarg] = self.loaded_modules[dependency]
return kwargs return kwargs
......
...@@ -11,10 +11,13 @@ class Signature(binwalk.module.Module): ...@@ -11,10 +11,13 @@ class Signature(binwalk.module.Module):
DEPENDS = {'config' : Configuration} DEPENDS = {'config' : Configuration}
NAME = "Signature Scan"
CLI = [ CLI = [
binwalk.module.ModuleOption(short='B', binwalk.module.ModuleOption(short='B',
long='signature', long='signature',
kwargs={'enabled' : True}), kwargs={'enabled' : True},
description='Scan target file(s) for file signatures'),
] ]
KWARGS = [ KWARGS = [
...@@ -32,6 +35,7 @@ class Signature(binwalk.module.Module): ...@@ -32,6 +35,7 @@ class Signature(binwalk.module.Module):
def init(self): def init(self):
# Instantiate the config class so we can access file/directory paths # Instantiate the config class so we can access file/directory paths
self.conf = binwalk.config.Config() self.conf = binwalk.config.Config()
self.config = None
# Create SmartSignature and MagicParser class instances. These are mostly for internal use. # Create SmartSignature and MagicParser class instances. These are mostly for internal use.
self.filter = binwalk.filter.MagicFilter() self.filter = binwalk.filter.MagicFilter()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment