def ProcessRepliesWithOutputPlugins(self, replies): if not self.runner_args.output_plugins or not replies: return for output_plugin_state in self.context.output_plugins_states: plugin_descriptor = output_plugin_state.plugin_descriptor plugin_state = output_plugin_state.plugin_state output_plugin = plugin_descriptor.GetPluginForState(plugin_state) # Extend our lease if needed. self.flow_obj.HeartBeat() try: output_plugin.ProcessResponses(replies) output_plugin.Flush() log_item = output_plugin_lib.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_descriptor, status="SUCCESS", batch_size=len(replies)) # Cannot append to lists in AttributedDicts. plugin_state["logs"] += [log_item] self.Log("Plugin %s sucessfully processed %d flow replies.", plugin_descriptor, len(replies)) except Exception as e: # pylint: disable=broad-except error = output_plugin_lib.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_descriptor, status="ERROR", summary=utils.SmartStr(e), batch_size=len(replies)) # Cannot append to lists in AttributedDicts. plugin_state["errors"] += [error] self.Log("Plugin %s failed to process %d replies due to: %s", plugin_descriptor, len(replies), e)
def RunPlugins(self, hunt_urn, plugins, results, exceptions_by_plugin): for plugin_def, plugin in plugins: try: plugin.ProcessResponses(results) plugin.Flush() plugin_status = output_plugin.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_def, status="SUCCESS", batch_size=len(results)) stats.STATS.IncrementCounter("hunt_results_ran_through_plugin", delta=len(results), fields=[plugin_def.plugin_name]) except Exception as e: # pylint: disable=broad-except logging.exception( "Error processing hunt results: hunt %s, " "plugin %s", hunt_urn, utils.SmartStr(plugin)) self.Log("Error processing hunt results (hunt %s, " "plugin %s): %s" % (hunt_urn, utils.SmartStr(plugin), e)) stats.STATS.IncrementCounter("hunt_output_plugin_errors", fields=[plugin_def.plugin_name]) plugin_status = output_plugin.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_def, status="ERROR", summary=utils.SmartStr(e), batch_size=len(results)) exceptions_by_plugin.setdefault(plugin_def, []).append(e) with data_store.DB.GetMutationPool(token=self.token) as pool: implementation.GRRHunt.PluginStatusCollectionForHID( hunt_urn, token=self.token).Add(plugin_status, mutation_pool=pool) if plugin_status.status == plugin_status.Status.ERROR: implementation.GRRHunt.PluginErrorCollectionForHID( hunt_urn, token=self.token).Add(plugin_status, mutation_pool=pool)