aboutsummaryrefslogtreecommitdiff
path: root/utils/supportbot-mauve
diff options
context:
space:
mode:
authorPatrick J Cherry <patrick@bytemark.co.uk>2011-04-13 17:03:16 +0100
committerPatrick J Cherry <patrick@bytemark.co.uk>2011-04-13 17:03:16 +0100
commit89a67770e66d11740948e90a41db6cee0482cf8e (patch)
treebe858515fb789a89d68f94975690ab019813726c /utils/supportbot-mauve
new version.
Diffstat (limited to 'utils/supportbot-mauve')
-rwxr-xr-xutils/supportbot-mauve73
1 files changed, 73 insertions, 0 deletions
diff --git a/utils/supportbot-mauve b/utils/supportbot-mauve
new file mode 100755
index 0000000..614c5f5
--- /dev/null
+++ b/utils/supportbot-mauve
@@ -0,0 +1,73 @@
+#!/usr/bin/ruby
+require 'fileutils'
+require 'yaml'
+require 'timeout'
+require 'rubygems'
+require 'cgi'
+
+class RT
+ class Ticket < Struct.new(:id, :subject, :content)
+ end
+
+ def initialize(cli, ticket_query)
+ @cli = cli
+ @ticket_query = ticket_query
+ end
+
+ def query(args)
+ IO.popen("#{@cli} #{args}", "r") do |io|
+ io.read
+ end
+ end
+
+ def tickets
+ query(@ticket_query).split("\n").map do |line|
+ if /^(\d+): (.*)$/.match(line)
+ t = Ticket.new($1.to_i, $2, "")
+ query("show ticket/#{t.id}/attachments").split("\n")[-5..-1].each do |line2|
+ next unless /\s(\d+):\s+\(text\/(plain|html)/.match(line2)
+ is_html = $2 == "html"
+
+ attachment = query("show -f Content ticket/#{t.id}/attachments/#{$1}").
+ split("Content: ")[1].
+ split("\n").
+ map { |line3| line3.gsub(/^\s+/,"") }.
+ join("\n")
+ next unless attachment.match(/Action=Take/)
+ if is_html
+ t.content += attachment + "<hr/>"
+ else
+ t.content += "<pre>"+attachment+"</pre><hr/>"
+ end
+ end
+ t
+ else
+ nil
+ end
+ end.compact
+ end
+end
+
+class String; def escape; gsub(/[^A-Za-z0-9]/) { |x| "\\#{x}" }; end end
+
+config = File.open("supportbot.config") { |fh|
+ YAML::parse(fh.read).transform }
+
+system("mauvesend -o supportbot -i heartbeat -r +10m -c now -s \"heartbeat not received\" -d \"Headtbeat send from supportbot-mauve code. It maybe down.\"")
+
+rt = RT.new(config['rt']['bin'], config['rt']['ticket_query2'])
+
+if 0 < rt.tickets.size
+ args = %w( mauvesend alert.bytemark.co.uk -o supportbot )
+ args += rt.tickets.map do |ticket|
+ ["-i", ticket.id.to_s,
+ "-u", ticket.id.to_s,
+ "-s", ticket.subject,
+ "-d", ticket.content
+ ]
+ end.flatten
+ exec(*args)
+else
+ args = %w( mauvesend alert.bytemark.co.uk --id supportbot -o supportbot -p -c now )
+ exec(*args)
+end