From 24c251b405c54911dbb69d8d29d1719cb6cb380d Mon Sep 17 00:00:00 2001 From: lelonek1 Date: Sun, 1 Jan 2017 12:18:59 -0500 Subject: [PATCH] Improve handling of ImportErrors to notify users that they need to install new dependencies (#389) * Improve handling of ImportErrors to notify users that they need to install new dependencies Also added missing dependency to requirements.txt * Mention installing dependencies in virtualenv if used * Move requirements used only by output modules to a separate file * Using a virtualenv is now the only officially supported method * Handle ImportErrors when loading output plugins so different install instructions can be given * Cleanup requirements-output.txt --- requirements-output.txt | 20 ++++++++++++++++++++ requirements.txt | 1 - twisted/plugins/cowrie_plugin.py | 18 ++++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 requirements-output.txt diff --git a/requirements-output.txt b/requirements-output.txt new file mode 100644 index 0000000..5016dcb --- /dev/null +++ b/requirements-output.txt @@ -0,0 +1,20 @@ +# csirtg +csirtgsdk>=0.0.0a6 # Specify version because pip won't install pre-release versions by default + +# dshield +requests + +# elasticsearch +pyes + +# mysql +MySQL-python + +# rethinkdblog +rethinkdb + +# slack +slackclient + +# splunklegacy +splunk-sdk diff --git a/requirements.txt b/requirements.txt index e83f1ab..c91af61 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,3 @@ service_identity pycrypto python-dateutil tftpy -csirtgsdk diff --git a/twisted/plugins/cowrie_plugin.py b/twisted/plugins/cowrie_plugin.py index 3d37a3b..96402f3 100644 --- a/twisted/plugins/cowrie_plugin.py +++ b/twisted/plugins/cowrie_plugin.py @@ -32,7 +32,7 @@ FIXME: This module contains ... from __future__ import print_function -from zope.interface import implementer +from zope.interface import implementer, provider import os import sys @@ -42,6 +42,7 @@ from twisted.plugin import IPlugin from twisted.application.service import IServiceMaker from twisted.application import internet, service from twisted.cred import portal +from twisted.logger import ILogObserver, globalLogPublisher from cowrie.core.config import readConfigFile from cowrie import core @@ -61,6 +62,16 @@ class Options(usage.Options): ] +@provider(ILogObserver) +def importFailureObserver(event): + if 'failure' in event and event['failure'].type is ImportError: + log.err("ERROR: %s. Please run `pip install -U -r requirements.txt` " + "from Cowrie's install directory and virtualenv to install " + "the new dependency" % event['failure'].value.message) + + +globalLogPublisher.addObserver(importFailureObserver) + @implementer(IServiceMaker, IPlugin) class CowrieServiceMaker(object): @@ -132,7 +143,10 @@ class CowrieServiceMaker(object): log.addObserver(output.emit) self.output_plugins.append(output) log.msg("Loaded output engine: {}".format(engine)) - except: + except ImportError as e: + log.err("Failed to load output engine: {} due to ImportError: {}".format(engine, e)) + log.msg("Please install the dependencies for {} listed in requirements-output.txt".format(engine)) + except Exception: log.err() log.msg("Failed to load output engine: {}".format(engine))