Decorator Plugins¶
Overview¶
Decorator plugins are the last plugins run just before saving results. This plugin class allows for the analysis of all results from each plugin, the original payload, and any extracted payloads. Multiple decorator plugins can be loaded, but each plugin is only passed the results once. Decorator plugins are extremely useful when post-processing is required of the collective results from the entire stoQ workflow.
Decorator plugins can be defined multiple ways. In these examples, we will use
the test_decorator
decorator plugin.
From stoq.cfg
:
[core]
decorators = test_decorator
Note
Multiple plugins can be defined separated by a comma.
From the command line:
$ stoq run -D yara [...]
Note
Multiple plugins can be defined by simply adding the plugin name
Or, when instantiating the Stoq()
class:
>>> import stoq
>>> decorators = ['test_decorator']
>>> s = Stoq(decorators=decorators, [...])
Writing a plugin¶
A decorator plugin must be a subclass of the DecoratorPlugin
class. Results
from a decorator are appended to the final StoqResponse
object.
As with any plugin, a configuration file must also exist and be properly configured.
Example¶
from typing import Dict, Optional
from configparser import ConfigParser
from stoq.data_classes import StoqResponse, DecoratorResponse
from stoq.plugins import DecoratorPlugin
class ExampleDecorator(DecoratorPlugin):
def __init__(self, config: ConfigParser, plugin_opts: Optional[Dict]) -> None:
super().__init__(config, plugin_opts)
self.msg = config.get('options', 'msg', fallback='do_more msg')
def decorate(self, response: StoqResponse) -> Optional[DecoratorResponse]:
do_more = False
if 'yara' in response.results[0].plugins_run:
do_more = True
dr = DecoratorResponse({'do_more': do_more, 'msg': self.msg})
return dr
API¶
-
class
stoq.plugins.decorator.
DecoratorPlugin
(config, plugin_opts)[source]¶ -
decorate
(response)[source]¶ Return type: Optional
[DecoratorResponse
]
-
Response¶
-
class
stoq.data_classes.
DecoratorResponse
(results=None, errors=None)[source]¶ - Object containing response from decorator plugins
Parameters: - results (
Optional
[Dict
[~KT, ~VT]]) – Results from decorator plugin - errors (
Optional
[List
[str
]]) – Errors that occurred
>>> results = {'decorator_key': 'decorator_value'} >>> errors = ['This plugin failed for a reason'] >>> response = DecoratorResponse(results=results, errors=errors)
- results (