diff options
author | Luke Kanies <luke@madstop.com> | 2007-10-13 14:07:24 -0500 |
---|---|---|
committer | Luke Kanies <luke@madstop.com> | 2007-10-13 14:07:24 -0500 |
commit | 29feac0cecddc910b74601d0914fa2c83757b10c (patch) | |
tree | 888305ecde1e4a488304f7e2e169bf1ca38e6d19 /lib/puppet | |
parent | 74d77f76a012d523430e43f1092609a4ca584cc7 (diff) | |
download | puppet-29feac0cecddc910b74601d0914fa2c83757b10c.tar.gz puppet-29feac0cecddc910b74601d0914fa2c83757b10c.tar.xz puppet-29feac0cecddc910b74601d0914fa2c83757b10c.zip |
Translating the report handler to an indirected model.
I've provided backward compatibility with the old
handler.
The only terminus type that currently exists for reports
is the 'code' terminus, which is used to process reports
in the style of the old handler. At some point, we should
likely switch at least some of these report types (e.g., 'store')
to terminus types.
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/indirector/code/report.rb | 49 | ||||
-rwxr-xr-x | lib/puppet/network/handler/report.rb | 70 | ||||
-rwxr-xr-x | lib/puppet/reports.rb | 51 | ||||
-rw-r--r-- | lib/puppet/reports/log.rb | 4 | ||||
-rw-r--r-- | lib/puppet/reports/rrdgraph.rb | 4 | ||||
-rw-r--r-- | lib/puppet/reports/store.rb | 6 | ||||
-rw-r--r-- | lib/puppet/reports/tagmail.rb | 2 | ||||
-rw-r--r-- | lib/puppet/transaction/report.rb | 5 |
8 files changed, 118 insertions, 73 deletions
diff --git a/lib/puppet/indirector/code/report.rb b/lib/puppet/indirector/code/report.rb new file mode 100644 index 000000000..a3c3a6df5 --- /dev/null +++ b/lib/puppet/indirector/code/report.rb @@ -0,0 +1,49 @@ +require 'puppet/indirector/code' +require 'puppet/reports' + +class Puppet::Indirector::Code::Report < Puppet::Indirector::Code + desc "Puppet's report processor. Processes the report with each of + the report types listed in the 'reports' setting." + + def initialize + Puppet.settings.use(:reporting, :metrics) + end + + def save(report) + process(report) + end + + private + + # Process the report with each of the configured report types. + # LAK:NOTE This isn't necessarily the best design, but it's backward + # compatible and that's good enough for now. + def process(report) + return if Puppet[:reports] == "none" + + reports().each do |name| + if mod = Puppet::Reports.report(name) + # We have to use a dup because we're including a module in the + # report. + newrep = report.dup + begin + newrep.extend(mod) + newrep.process + rescue => detail + if Puppet[:trace] + puts detail.backtrace + end + Puppet.err "Report %s failed: %s" % + [name, detail] + end + else + Puppet.warning "No report named '%s'" % name + end + end + end + + # Handle the parsing of the reports attribute. + def reports + Puppet[:reports].gsub(/(^\s+)|(\s+$)/, '').split(/\s*,\s*/) + end +end diff --git a/lib/puppet/network/handler/report.rb b/lib/puppet/network/handler/report.rb index e202d4e2a..12abc9b15 100755 --- a/lib/puppet/network/handler/report.rb +++ b/lib/puppet/network/handler/report.rb @@ -1,78 +1,24 @@ require 'puppet/util/instance_loader' +require 'puppet/reports' # A simple server for triggering a new run on a Puppet client. class Puppet::Network::Handler class Report < Handler desc "Accepts a Puppet transaction report and processes it." - extend Puppet::Util::ClassGen - extend Puppet::Util::InstanceLoader - - module ReportBase - include Puppet::Util::Docs - attr_writer :useyaml - - def useyaml? - if defined? @useyaml - @useyaml - else - false - end - end - end - @interface = XMLRPC::Service::Interface.new("puppetreports") { |iface| iface.add_method("string report(array)") } - # Set up autoloading and retrieving of reports. - instance_load :report, 'puppet/reports' - - class << self - attr_reader :hooks - end - # Add a new report type. def self.newreport(name, options = {}, &block) - name = symbolize(name) - - mod = genmodule(name, :extend => ReportBase, :hash => instance_hash(:report), :block => block) - - if options[:useyaml] - mod.useyaml = true - end - - mod.send(:define_method, :report_name) do - name - end - end - - # Collect the docs for all of our reports. - def self.reportdocs - docs = "" - - # Use this method so they all get loaded - instance_loader(:report).loadall - loaded_instances(:report).sort { |a,b| a.to_s <=> b.to_s }.each do |name| - mod = self.report(name) - docs += "%s\n%s\n" % [name, "-" * name.to_s.length] - - docs += Puppet::Util::Docs.scrub(mod.doc) + "\n\n" - end - - docs - end - - # List each of the reports. - def self.reports - instance_loader(:report).loadall - loaded_instances(:report) + Puppet.warning "The interface for registering report types has changed; use Puppet::Reports.register_report for report type %s" % name + Puppet::Reports.register_report(name, options, &block) end def initialize(*args) super - Puppet.settings.use(:reporting) - Puppet.settings.use(:metrics) + Puppet.settings.use(:reporting, :metrics) end # Accept a report from a client. @@ -111,17 +57,13 @@ class Puppet::Network::Handler client = report.host reports().each do |name| - if mod = self.class.report(name) + if mod = Puppet::Reports.report(name) # We have to use a dup because we're including a module in the # report. newrep = report.dup begin newrep.extend(mod) - if mod.useyaml? - newrep.process(yaml) - else - newrep.process - end + newrep.process rescue => detail if Puppet[:trace] puts detail.backtrace diff --git a/lib/puppet/reports.rb b/lib/puppet/reports.rb new file mode 100755 index 000000000..df992d46c --- /dev/null +++ b/lib/puppet/reports.rb @@ -0,0 +1,51 @@ +require 'puppet/util/instance_loader' + +# A simple mechanism for loading and returning reports. +class Puppet::Reports + extend Puppet::Util::ClassGen + extend Puppet::Util::InstanceLoader + + # Set up autoloading and retrieving of reports. + instance_load :report, 'puppet/reports' + + class << self + attr_reader :hooks + end + + # Add a new report type. + def self.register_report(name, options = {}, &block) + name = symbolize(name) + + mod = genmodule(name, :extend => Puppet::Util::Docs, :hash => instance_hash(:report), :block => block) + + if options[:useyaml] + mod.useyaml = true + end + + mod.send(:define_method, :report_name) do + name + end + end + + # Collect the docs for all of our reports. + def self.reportdocs + docs = "" + + # Use this method so they all get loaded + instance_loader(:report).loadall + loaded_instances(:report).sort { |a,b| a.to_s <=> b.to_s }.each do |name| + mod = self.report(name) + docs += "%s\n%s\n" % [name, "-" * name.to_s.length] + + docs += Puppet::Util::Docs.scrub(mod.doc) + "\n\n" + end + + docs + end + + # List each of the reports. + def self.reports + instance_loader(:report).loadall + loaded_instances(:report) + end +end diff --git a/lib/puppet/reports/log.rb b/lib/puppet/reports/log.rb index 8f7b95f8b..8dfeedb07 100644 --- a/lib/puppet/reports/log.rb +++ b/lib/puppet/reports/log.rb @@ -1,6 +1,6 @@ -require 'puppet' +require 'puppet/reports' -Puppet::Network::Handler.report.newreport(:log) do +Puppet::Reports.register_report(:log) do desc "Send all received logs to the local log destinations. Usually the log destination is syslog." diff --git a/lib/puppet/reports/rrdgraph.rb b/lib/puppet/reports/rrdgraph.rb index 9ab1f4b17..2611f0369 100644 --- a/lib/puppet/reports/rrdgraph.rb +++ b/lib/puppet/reports/rrdgraph.rb @@ -1,6 +1,4 @@ -require 'puppet' - -Puppet::Network::Handler.report.newreport(:rrdgraph) do +Puppet::Reports.register_report(:rrdgraph) do desc "Graph all available data about hosts using the RRD library. You must have the Ruby RRDtool library installed to use this report, which you can get from `the RubyRRDTool RubyForge page`_. This package requires diff --git a/lib/puppet/reports/store.rb b/lib/puppet/reports/store.rb index 0c3e86f37..dfc992820 100644 --- a/lib/puppet/reports/store.rb +++ b/lib/puppet/reports/store.rb @@ -1,6 +1,6 @@ require 'puppet' -Puppet::Network::Handler.report.newreport(:store, :useyaml => true) do +Puppet::Reports.register_report(:store) do Puppet.settings.use(:reporting) desc "Store the yaml report on disk. Each host sends its report as a YAML dump @@ -24,7 +24,7 @@ Puppet::Network::Handler.report.newreport(:store, :useyaml => true) do config.use("reportclient-#{client}") end - def process(yaml) + def process # We don't want any tracking back in the fs. Unlikely, but there # you go. client = self.host.gsub("..",".") @@ -46,7 +46,7 @@ Puppet::Network::Handler.report.newreport(:store, :useyaml => true) do begin File.open(file, "w", 0640) do |f| - f.print yaml + f.print to_yaml end rescue => detail if Puppet[:trace] diff --git a/lib/puppet/reports/tagmail.rb b/lib/puppet/reports/tagmail.rb index fd9126a1a..a2c973f8f 100644 --- a/lib/puppet/reports/tagmail.rb +++ b/lib/puppet/reports/tagmail.rb @@ -3,7 +3,7 @@ require 'pp' require 'net/smtp' -Puppet::Network::Handler.report.newreport(:tagmail) do +Puppet::Reports.register_report(:tagmail) do desc "This report sends specific log messages to specific email addresses based on the tags in the log messages. See the `UsingTags tag documentation`:trac: for more information diff --git a/lib/puppet/transaction/report.rb b/lib/puppet/transaction/report.rb index 19dd1b629..f73c6a9fb 100644 --- a/lib/puppet/transaction/report.rb +++ b/lib/puppet/transaction/report.rb @@ -1,10 +1,15 @@ require 'puppet' +require 'puppet/indirector' # A class for reporting what happens on each client. Reports consist of # two types of data: Logs and Metrics. Logs are the output that each # change produces, and Metrics are all of the numerical data involved # in the transaction. class Puppet::Transaction::Report + extend Puppet::Indirector + + indirects :report, :terminus_class => :code + attr_accessor :logs, :metrics, :time, :host def <<(msg) |