def ProcessRepliesWithOutputPlugins(self, replies): """Processes replies with output plugins.""" for output_plugin_state in self.context.output_plugins_states: plugin_descriptor = output_plugin_state.plugin_descriptor output_plugin = output_plugin_state.GetPlugin() # 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)) output_plugin_state.Log(log_item) self.Log("Plugin %s successfully 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.SmartUnicode(e), batch_size=len(replies)) output_plugin_state.Error(error) self.Log("Plugin %s failed to process %d replies due to: %s", plugin_descriptor, len(replies), e)
def _ProcessRepliesWithOutputPlugins(self, replies): """Processes replies with output plugins.""" for output_plugin_state in self.rdf_flow.output_plugins_states: plugin_descriptor = output_plugin_state.plugin_descriptor output_plugin_cls = plugin_descriptor.GetPluginClass() output_plugin = output_plugin_cls( source_urn=self.rdf_flow.long_flow_id, args=plugin_descriptor.plugin_args, token=access_control.ACLToken(username=self.rdf_flow.creator)) try: output_plugin.ProcessResponses(output_plugin_state.plugin_state, [r.payload for r in replies]) output_plugin.Flush(output_plugin_state.plugin_state) output_plugin.UpdateState(output_plugin_state.plugin_state) log_item = output_plugin_lib.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_descriptor, status="SUCCESS", batch_size=len(replies)) output_plugin_state.Log(log_item) self.Log("Plugin %s successfully 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.SmartUnicode(e), batch_size=len(replies)) output_plugin_state.Error(error) self.Log("Plugin %s failed to process %d replies due to: %s", plugin_descriptor, len(replies), e)
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 ToOutputPluginBatchProcessingStatus(self): if self.log_entry_type == self.LogEntryType.LOG: status = output_plugin.OutputPluginBatchProcessingStatus.Status.SUCCESS elif self.log_entry_type == self.LogEntryType.ERROR: status = output_plugin.OutputPluginBatchProcessingStatus.Status.ERROR else: raise ValueError("Unexpected log_entry_type: %r" % self.log_entry_type) return output_plugin.OutputPluginBatchProcessingStatus( summary=self.message, batch_index=0, batch_size=0, status=status)
def RunPlugins(self, hunt_urn, plugins, results, exceptions_by_plugin): """Runs given plugins on a given hunt.""" for plugin_def, plugin, plugin_state in plugins: try: plugin.ProcessResponses(plugin_state, results) plugin.Flush(plugin_state) plugin.UpdateState(plugin_state) plugin_status = output_plugin.OutputPluginBatchProcessingStatus( plugin_descriptor=plugin_def, status="SUCCESS", batch_size=len(results)) stats_collector_instance.Get().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_collector_instance.Get().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() as pool: implementation.GRRHunt.PluginStatusCollectionForHID( hunt_urn).Add(plugin_status, mutation_pool=pool) if plugin_status.status == plugin_status.Status.ERROR: implementation.GRRHunt.PluginErrorCollectionForHID( hunt_urn).Add(plugin_status, mutation_pool=pool)