Esempio n. 1
0
  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)
Esempio n. 2
0
  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)
Esempio n. 3
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)
Esempio n. 4
0
  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)
Esempio n. 5
0
    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)