Sha256: 7356d03e79d89216623b377c7f6f7a933fc61407d42d45a7c94ee6ba05b1af9c

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

require 'rubygems'
require 'chef'
require 'chef/handler'
require 'net/http'
require 'uri'
require 'json'
require 'shout-bot'

class IRCSnitch < Chef::Handler

  def initialize(irc_uri, github_user, github_token, ssl = false)
    @irc_uri = irc_uri
    @github_user = github_user
    @github_token = github_token
    @ssl = ssl
  end

  def report
    Chef::Log.error("Chef run failed @ #{Time.now.getutc}, snitchin' to chefs via IRC")

    gist = "#{run_status.formatted_exception}\n"
    gist << Array(backtrace).join("\n")

    max_attempts = 2
    gist_id = nil

    begin
      timeout(8) do
        res = Net::HTTP.post_form(URI.parse("http://gist.github.com/api/v1/json/new"), {
          "files[#{node.name}-#{Time.now.to_i.to_s}]" => gist,
          "login" => @github_user,
          "token" => @github_token,
          "description" => "Chef run failed on #{node.name} @ #{Time.now.getutc}",
          "public" => false
        })
        gist_id = JSON.parse(res.body)["gists"].first["repo"]
      end
    rescue Timeout::Error
      Chef::Log.error("Timed out while attempting to create a GitHub Gist, retrying ...")
      max_attempts -= 1
      retry if max_attempts > 0
    end

    Chef::Log.info("Created a GitHub Gist @ https://gist.github.com/#{gist_id}")

    max_attempts = 2
    ip_address = (node.has_key? :ec2) ? node.ec2.public_ipv4 : node.ipaddress
    message = "Chef run failed on #{node.name} (#{ip_address}) : https://gist.github.com/#{gist_id}"

    begin
      timeout(8) do
        ShoutBot.shout(@irc_uri, nil, @ssl) do |channel|
          channel.say message
          Chef::Log.info("Informed chefs via IRC : #{message}")
        end
      end
    rescue Timeout::Error
      Chef::Log.error("Timed out while attempting to message Chefs via IRC, retrying ...")
      max_attempts -= 1
      retry if max_attempts > 0
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
chef-irc-snitch-0.0.3 lib/chef-irc-snitch.rb