summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/reports/tagmail.rb2
-rwxr-xr-xlib/puppet/server/report.rb41
-rwxr-xr-xtest/other/report.rb10
-rwxr-xr-xtest/server/report.rb3
4 files changed, 41 insertions, 15 deletions
diff --git a/lib/puppet/reports/tagmail.rb b/lib/puppet/reports/tagmail.rb
index 16096f62f..9866a8bc5 100644
--- a/lib/puppet/reports/tagmail.rb
+++ b/lib/puppet/reports/tagmail.rb
@@ -15,7 +15,7 @@ require 'net/smtp'
Puppet::Server::Report.newreport(:tagmail) do |report|
unless FileTest.exists?(Puppet[:tagmap])
- Puppet.notice "Cannot send tagmail report; not tagmap file %s" %
+ Puppet.notice "Cannot send tagmail report; no tagmap file %s" %
Puppet[:tagmap]
return
end
diff --git a/lib/puppet/server/report.rb b/lib/puppet/server/report.rb
index 28005e636..54cb71960 100755
--- a/lib/puppet/server/report.rb
+++ b/lib/puppet/server/report.rb
@@ -20,24 +20,35 @@ class Server
]
)
- @hooks = {}
+ @reports = {}
class << self
attr_reader :hooks
end
+ def self.reportmethod(report)
+ "report_" + report.to_s
+ end
+
# Add a hook for processing reports.
def self.newreport(name, &block)
name = name.intern if name.is_a? String
- @hooks[name] = block
+ method = reportmethod(name)
+
+ # We want to define a method so that reports can use 'return'.
+ define_method(method, &block)
+
+ @reports[name] = method
end
+ # Load a report.
def self.report(name)
name = name.intern if name.is_a? String
- unless @hooks.include? name
+ unless @reports.include? reportmethod(name)
begin
require "puppet/reports/#{name}"
- unless @hooks.include? name
+ unless @reports.include? name
+ p @reports
Puppet.warning(
"Loaded report file for %s but report was not defined" %
name
@@ -54,7 +65,7 @@ class Server
end
end
- @hooks[name]
+ @reports[name]
end
def initialize(*args)
@@ -63,6 +74,19 @@ class Server
Puppet.config.use(:metrics)
end
+ # Dynamically create the report methods as necessary.
+ def method_missing(name, *args)
+ if name.to_s =~ /^report_(.+)$/
+ if self.class.report($2)
+ send(name, *args)
+ else
+ super
+ end
+ else
+ super
+ end
+ end
+
def mkclientdir(client, dir)
Puppet.config.setdefaults("reportclient-#{client}",
:clientdir => { :default => dir,
@@ -138,12 +162,13 @@ class Server
end
Puppet[:reports].split(/\s*,\s*/).each do |name|
- next unless hook = self.class.report(name)
+ method = self.class.reportmethod(name)
Puppet.info "Processing report %s" % name
-
begin
- hook.call(report)
+ send(method, report)
+ rescue NoMethodError => detail
+ Puppet.warning "No report named '%s'" % name
rescue => detail
if Puppet[:debug]
puts detail.backtrace
diff --git a/test/other/report.rb b/test/other/report.rb
index 435b7790d..2aa78172c 100755
--- a/test/other/report.rb
+++ b/test/other/report.rb
@@ -88,14 +88,18 @@ class TestReports < Test::Unit::TestCase
trans.evaluate
}
- code = Puppet::Server::Report.report("rrdgraph")
+ method = Puppet::Server::Report.report("rrdgraph")
+ server = nil
+ assert_nothing_raised {
+ server = Puppet::Server::Report.new()
+ }
assert_nothing_raised {
- code.call(trans.report)
+ server.report_rrdgraph(trans.report)
}
end
else
- $stderr.puts "Install RRD for metric graphing tests"
+ $stderr.puts "Install RRD for metric reporting tests"
end
end
diff --git a/test/server/report.rb b/test/server/report.rb
index e504710e9..5ab84f919 100755
--- a/test/server/report.rb
+++ b/test/server/report.rb
@@ -71,9 +71,6 @@ class TestReportServer < Test::Unit::TestCase
end
end
end
-
- def test_rrdgraph_report
- end
end
# $Id$