#!/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 + "
" else t.content += "
"+attachment+"

" 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