Skip to content

Instantly share code, notes, and snippets.

@sheldonh
Created June 3, 2009 13:28
Show Gist options
  • Select an option

  • Save sheldonh/122981 to your computer and use it in GitHub Desktop.

Select an option

Save sheldonh/122981 to your computer and use it in GitHub Desktop.
# muppet/app/models/log.rb:
class Log < ActiveRecord::Base
belongs_to :report
end
# muppet/app/models/report.rb:
class Report < ActiveRecord::Base
belongs_to :host
has_many :logs, :dependent => :destroy
end
# muppet/lib/puppet/rails/log.rb:
class Puppet::Rails::Log < ActiveRecord::Base
belongs_to :report
end
# muppet/lib/puppet/rails/report.rb:
class Puppet::Rails::Report < ActiveRecord::Base
belongs_to :host
has_many :logs
end
# muppet/lib/puppet/reports/storereports.rb:
require 'puppet'
require 'puppet/rails'
require 'puppet/rails/host'
$: << Puppet[:libdir]
require 'puppet/rails/log'
require 'puppet/rails/report'
Puppet::Reports.register_report(:storereports) do
desc "Send all received logs to the storedconfigs database."
def process
if Puppet.features.rails?
Puppet::Rails.connect
host = Puppet::Rails::Host.find_or_create_by_name(self.host)
report = Puppet::Rails::Report.new({
:host_id => host.id,
:created_at => self.time,
})
report_metrics(report, :resources)
report_metrics(report, :changes)
report.save
self.logs.each do |log|
report.logs.create({
:level => log.level.to_s,
:message => log.message,
:source => log.source,
})
end
host.last_report = report.created_at
host.save
end
end
private
def report_metrics(report, category)
category = category.to_s
self.metrics[category].values.each {|tuple|
method_name = "#{category}_#{tuple[0]}="
report.send(method_name, tuple[2]) if report.respond_to?(method_name)
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment