Exemple #1
0
    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)