Sha256: 68a2d78e15abe1aae55aafb9dfe894b50e434e4b2e3da8b64e577d5a84622e4d

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require "shellwords"
require "childprocess"
require "tempfile"
require "bundler"

ChildProcess.posix_spawn = true

class LogStash::Filters::Exec < LogStash::Filters::Base
  config_name "exec"

  config :message, :validate => :string, :default => "Hello World!", :required => true
  config :cmd, :validate => :string
  config :timeout, :validate => :number, :default => 60 * 60 * 60 # 1 hr
  config :target, :validate => :string, :default => "[@metadata][cmd_response]", :required => true
  config :directory, :validate => :string

  public
  def register
  end

  public
  def filter(event)
    directory = event.sprintf(@directory) if @directory
    cmd = Shellwords.split(event.sprintf(@cmd))

    process = ChildProcess.build(*cmd)

    stderr = Tempfile.new("stderr")
    stdout = Tempfile.new("stdout")

    process.io.stdout = stdout
    process.io.stderr = stderr

    process.cwd = directory if @directory

    Bundler.with_clean_env do
      process.start
      process.poll_for_exit(timeout)
    end

    stderr.rewind
    stdout.rewind

    response = {
      "exit_code" => process.exit_code,
      "stderr" => stderr.read,
      "stdout" => stdout.read,
      "directory" => directory,
      "cmd" => @cmd
    }

    @logger.debug("Command ran successfully", :cmd => @cmd, :directory => directory)

    event.set(@target, response)
    filter_matched(event)
  rescue => e
    response = {
      "exit_code" => 1,
      "stderr" => stderr.read,
      "directory" => directory,
      "cmd" => @cmd,
      "stdout" => stdout.read,
      "exception" => {
        "name" => e.class.name,
        "message" => e.message
      }
    }

    @logger.debug("Command failed", :cmd => cmd, :directory => directory, :message => e.message, :class => e.class.name)

    event.set(@target, response)
    filter_matched(event)
  ensure
    stdout.close if stdout
    stderr.close if stderr
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
logstash-filter-exec-0.0.1 lib/logstash/filters/exec.rb