summaryrefslogtreecommitdiffstats
path: root/lib/puppet/reports
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-10-07 20:52:19 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-10-07 20:52:19 +0000
commit34f8337c68ff6f4b8ff57e604bae77529eb0d16e (patch)
treed7188575a0ec20c4082990afbf6b907146da364e /lib/puppet/reports
parent5b6ee8c823a78f26cd1a1ad957da3d234910b9c2 (diff)
Refactoring reporting. Reports are now modules instead of simple methods.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1746 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/reports')
-rw-r--r--lib/puppet/reports/rrdgraph.rb46
-rw-r--r--lib/puppet/reports/store.rb67
-rw-r--r--lib/puppet/reports/tagmail.rb185
3 files changed, 186 insertions, 112 deletions
diff --git a/lib/puppet/reports/rrdgraph.rb b/lib/puppet/reports/rrdgraph.rb
index 0fb7e2ea7..2c405c051 100644
--- a/lib/puppet/reports/rrdgraph.rb
+++ b/lib/puppet/reports/rrdgraph.rb
@@ -1,34 +1,38 @@
require 'puppet'
-Puppet::Server::Report.newreport(:rrdgraph) do |report|
- time = Time.now.to_i
+Puppet::Server::Report.newreport(:rrdgraph) do
+ desc "Graph some data about hosts."
- host = report.host
+ def process
+ time = Time.now.to_i
- hostdir = File.join(Puppet[:rrddir], host)
+ host = self.host
- unless File.directory?(hostdir)
- # Some hackishness to create the dir
- config = Puppet::Config.new
- config.setdefaults(:reports, :hostdir => [hostdir, "eh"])
+ hostdir = File.join(Puppet[:rrddir], host)
- # This creates the dir.
- config.use(:reports)
- end
+ unless File.directory?(hostdir)
+ # Some hackishness to create the dir
+ config = Puppet::Config.new
+ config.setdefaults(:reports, :hostdir => [hostdir, "eh"])
- File.open(File.join(hostdir, "index.html"),"w") { |of|
- of.puts "<html><body>"
- report.metrics.each do |name, metric|
- metric.basedir = hostdir
- metric.store(time)
+ # This creates the dir.
+ config.use(:reports)
+ end
- metric.graph
+ File.open(File.join(hostdir, "index.html"),"w") { |of|
+ of.puts "<html><body>"
+ self.metrics.each do |name, metric|
+ metric.basedir = hostdir
+ metric.store(time)
- of.puts "<img src=%s.png><br>" % name
- end
+ metric.graph
- of.puts "</body></html>"
- }
+ of.puts "<img src=%s.png><br>" % name
+ end
+
+ of.puts "</body></html>"
+ }
+ end
end
# $Id$
diff --git a/lib/puppet/reports/store.rb b/lib/puppet/reports/store.rb
new file mode 100644
index 000000000..82eebff39
--- /dev/null
+++ b/lib/puppet/reports/store.rb
@@ -0,0 +1,67 @@
+require 'puppet'
+
+Puppet::Server::Report.newreport(:store, :useyaml => true) do
+ Puppet.setdefaults(:reporting,
+ :reportdir => {:default => "$vardir/reports",
+ :mode => 0750,
+ :owner => "$user",
+ :group => "$group",
+ :desc => "The directory in which to store reports received from the
+ client. Each client gets a separate subdirectory."}
+ )
+
+ Puppet.config.use(:reporting)
+
+ desc "Store the yaml report on disk"
+
+ def mkclientdir(client, dir)
+ config = Puppet::Config.new
+ config.setdefaults("reportclient-#{client}",
+ "clientdir-#{client}" => { :default => dir,
+ :mode => 0750,
+ :owner => "$user",
+ :group => "$group"
+ }
+ )
+
+ config.use("reportclient-#{client}")
+ end
+
+ def process(yaml)
+ # We don't want any tracking back in the fs. Unlikely, but there
+ # you go.
+ client = self.host.gsub("..",".")
+
+ dir = File.join(Puppet[:reportdir], client)
+
+ unless FileTest.exists?(dir)
+ mkclientdir(client, dir)
+ end
+
+ # Now store the report.
+ now = Time.now.gmtime
+ name = %w{year month day hour min}.collect do |method|
+ # Make sure we're at least two digits everywhere
+ "%02d" % now.send(method).to_s
+ end.join("") + ".yaml"
+
+ file = File.join(dir, name)
+
+ begin
+ File.open(file, "w", 0640) do |f|
+ f.puts yaml
+ end
+ rescue => detail
+ if Puppet[:trace]
+ puts detail.backtrace
+ end
+ Puppet.warning "Could not write report for %s at %s: %s" %
+ [client, file, detail]
+ end
+
+ # Only testing cares about the return value
+ return file
+ end
+end
+
+# $Id$
diff --git a/lib/puppet/reports/tagmail.rb b/lib/puppet/reports/tagmail.rb
index b7025802d..e842b17ac 100644
--- a/lib/puppet/reports/tagmail.rb
+++ b/lib/puppet/reports/tagmail.rb
@@ -14,116 +14,119 @@ Puppet.config.setdefaults(:reporting,
require 'net/smtp'
-Puppet::Server::Report.newreport(:tagmail) do |report|
- unless FileTest.exists?(Puppet[:tagmap])
- Puppet.notice "Cannot send tagmail report; no tagmap file %s" %
- Puppet[:tagmap]
- return
- end
-
- # Load the config file
- taglists = {}
- File.readlines(Puppet[:tagmap]).each do |line|
- taglist = emails = nil
- case line.chomp
- when /^\s*#/: next
- when /^\s*$/: next
- when /^\s*(.+)\s*:\s*(.+)\s*$/:
- taglist = $1
- emails = $2
- else
- raise ArgumentError, "Invalid tagmail config file"
+Puppet::Server::Report.newreport(:tagmail) do
+ desc "Send email reports."
+ def process
+ unless FileTest.exists?(Puppet[:tagmap])
+ Puppet.notice "Cannot send tagmail report; no tagmap file %s" %
+ Puppet[:tagmap]
+ return
end
- pos = []
- neg = []
- taglist.split(/\s*,\s*/).each do |tag|
- case tag
- when /^\w+/: pos << tag
- when /^!\w+/: neg << tag.sub("!", '')
+ # Load the config file
+ taglists = {}
+ File.readlines(Puppet[:tagmap]).each do |line|
+ taglist = emails = nil
+ case line.chomp
+ when /^\s*#/: next
+ when /^\s*$/: next
+ when /^\s*(.+)\s*:\s*(.+)\s*$/:
+ taglist = $1
+ emails = $2
else
- raise Puppet::Error, "Invalid tag '%s'" % tag
+ raise ArgumentError, "Invalid tagmail config file"
end
- end
- # Now split the emails
- emails = emails.split(/\s*,\s*/)
- taglists[emails] = [pos, neg]
- end
+ pos = []
+ neg = []
+ taglist.split(/\s*,\s*/).each do |tag|
+ case tag
+ when /^\w+/: pos << tag
+ when /^!\w+/: neg << tag.sub("!", '')
+ else
+ raise Puppet::Error, "Invalid tag '%s'" % tag
+ end
+ end
- # Now find any appropriately tagged messages.
- reports = {}
- taglists.each do |emails, tags|
- pos, neg = tags
+ # Now split the emails
+ emails = emails.split(/\s*,\s*/)
+ taglists[emails] = [pos, neg]
+ end
- # First find all of the messages matched by our positive tags
- messages = nil
- if pos.include?("all")
- messages = report.logs
- else
- # Find all of the messages that are tagged with any of our
- # tags.
- messages = report.logs.find_all do |log|
- pos.detect { |tag| log.tagged?(tag) }
+ # Now find any appropriately tagged messages.
+ reports = {}
+ taglists.each do |emails, tags|
+ pos, neg = tags
+
+ # First find all of the messages matched by our positive tags
+ messages = nil
+ if pos.include?("all")
+ messages = self.logs
+ else
+ # Find all of the messages that are tagged with any of our
+ # tags.
+ messages = self.logs.find_all do |log|
+ pos.detect { |tag| log.tagged?(tag) }
+ end
end
- end
- # Now go through and remove any messages that match our negative tags
- messages.reject! do |log|
- if neg.detect do |tag| log.tagged?(tag) end
- true
+ # Now go through and remove any messages that match our negative tags
+ messages.reject! do |log|
+ if neg.detect do |tag| log.tagged?(tag) end
+ true
+ end
end
- end
- if messages.empty?
- Puppet.info "No messages to report to %s" % emails.join(",")
- next
- else
- reports[emails] = messages.collect { |m| m.to_report }.join("\n")
+ if messages.empty?
+ Puppet.info "No messages to report to %s" % emails.join(",")
+ next
+ else
+ reports[emails] = messages.collect { |m| m.to_report }.join("\n")
+ end
end
- end
- # Let's fork for the sending of the email, since you never know what might
- # happen.
- fork do
- if Puppet[:smtpserver] != "none"
- begin
- Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
- reports.each do |emails, messages|
- Puppet.info "Sending report to %s" % emails.join(", ")
- smtp.send_message(messages, Puppet[:reportfrom], *emails)
+ # Let's fork for the sending of the email, since you never know what might
+ # happen.
+ fork do
+ if Puppet[:smtpserver] != "none"
+ begin
+ Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
+ reports.each do |emails, messages|
+ Puppet.info "Sending report to %s" % emails.join(", ")
+ smtp.send_message(messages, Puppet[:reportfrom], *emails)
+ end
end
+ rescue => detail
+ if Puppet[:debug]
+ puts detail.backtrace
+ end
+ raise Puppet::Error,
+ "Could not send report emails through smtp: %s" % detail
end
- rescue => detail
- if Puppet[:debug]
- puts detail.backtrace
- end
- raise Puppet::Error,
- "Could not send report emails through smtp: %s" % detail
- end
- elsif Puppet[:sendmail] != ""
- begin
- reports.each do |emails, messages|
- Puppet.info "Sending report to %s" % emails.join(", ")
- # We need to open a separate process for every set of email addresses
- IO.popen(Puppet[:sendmail] + " " + emails.join(" "), "w") do |p|
- p.puts "From: #{Puppet[:reportfrom]}"
- p.puts "To: %s" % emails.join(', ')
- p.puts "Subject: Puppet Report for %s" % report.host
- p.puts "To: " + emails.join(", ")
+ elsif Puppet[:sendmail] != ""
+ begin
+ reports.each do |emails, messages|
+ Puppet.info "Sending report to %s" % emails.join(", ")
+ # We need to open a separate process for every set of email addresses
+ IO.popen(Puppet[:sendmail] + " " + emails.join(" "), "w") do |p|
+ p.puts "From: #{Puppet[:reportfrom]}"
+ p.puts "To: %s" % emails.join(', ')
+ p.puts "Subject: Puppet Report for %s" % self.host
+ p.puts "To: " + emails.join(", ")
- p.puts messages
+ p.puts messages
+ end
end
+ rescue => detail
+ if Puppet[:debug]
+ puts detail.backtrace
+ end
+ raise Puppet::Error,
+ "Could not send report emails via sendmail: %s" % detail
end
- rescue => detail
- if Puppet[:debug]
- puts detail.backtrace
- end
- raise Puppet::Error,
- "Could not send report emails via sendmail: %s" % detail
+ else
+ raise Puppet::Error, "SMTP server is unset and could not find sendmail"
end
- else
- raise Puppet::Error, "SMTP server is unset and could not find sendmail"
end
end
end