diff --git a/requirements-output.txt b/requirements-output.txt new file mode 100644 index 0000000..de38023 --- /dev/null +++ b/requirements-output.txt @@ -0,0 +1,20 @@ +# output_csirtg: +csirtgsdk>=0.0.0a6 # Specify version because pip won't install pre-release versions by default + +# output_dshield: +requests + +# output_elasticsearch +pyes + +# output_mysql +MySQL-python + +# output_rethinkdblog +rethinkdb + +# output_slack +slackclient + +# output_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 8e8c19d..ffed87c 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): @@ -125,7 +136,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))