class LogStash::Inputs::PuppetFacter

Connects to a puppet server and requests facts

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/logstash/inputs/puppet_facter.rb, line 31
def initialize(*args)
  super(*args)
end

Public Instance Methods

register() click to toggle source
# File lib/logstash/inputs/puppet_facter.rb, line 35
def register()
  if @ssl
    require "net/https"
    begin
      @pub = File.read(@public_key)
      @priv = File.read(@private_key)
    rescue
      logger.error("Unable to open keys. Public key " + @public_key + ", private key " + @private_key)
      raise
    end
  else
    require "net/http"
  end
end
run(output_queue) click to toggle source
# File lib/logstash/inputs/puppet_facter.rb, line 50
def run(output_queue)
  while true
    startTime = Time.now
    if @ssl
      http = Net::HTTP.new(@host, @port)
      http.use_ssl = true
      http.cert = OpenSSL::X509::Certificate.new(@pub)
      http.key = OpenSSL::PKey::RSA.new(@priv)
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    else
      http = Net::HTTP.new(@host, @port)
    end
    uri = "/" + @environment + "/certificate_statuses/no_key"
    begin
      request = Net::HTTP::Get.new(uri)
      response = http.request(request)
    rescue
      logger.error("Unable to retrieve from host " + @host + " port " + @port.to_s() + " at uri " + uri)
      raise
    end
    begin
      data = LogStash::Json.load(response.body)
    rescue
      logger.error("Unable to parse cert status response")
      raise
    end
    hostList = []
    for item in data
      hostList.push(item["name"])
    end
    for host in hostList
      uri = "/" + @environment + "/facts/" + host
      begin
        request = Net::HTTP::Get.new(uri)
        response = http.request(request)
      rescue
        logger.warn("Unable to retrieve from host " + @host + " port " + @port.to_s() + " at uri " + uri)
        next
      end
      begin
        data = LogStash::Json.load(response.body)["values"]
      rescue
        logger.warn("Unable to parse response from facts for node " + host)
        next
      end
      for key, value in data
        event = LogStash::Event.new("host" => host)
        event.set("fact_name", key)
        event.set("fact_value", value)
        decorate(event)
        output_queue << event
      end
    end
    endTime = Time.now
    diffTime = endTime - startTime
    waitTime = @interval - diffTime
    if waitTime > 0
      sleep(@interval)
      logger.debug("Sleeping for " + @waitTime)
    else
      logger.warn("Took longer than " + @interval.to_s() + " to process puppetmaster " + @host + " on port " + @port.to_s() + " with env " + @environment)
    end
  end
end