comsat 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in comsat.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 TODO: Write your name
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Comsat
2
+
3
+ Notifications gem
4
+
5
+ This is the first iteration for making notifications easy to use from all
6
+ services. This is only a stop gap with a centralized service planned to manage
7
+ credentials and to keep from duplicating efforts.
8
+
9
+ Credentials are passed in a URL structure, for example, here is what a scheme
10
+ for Campfire might look like:
11
+
12
+ campfire://<api_key>:X@blossom.campfirenow.com/Test%20Room
13
+
14
+ The schema name maps to the service name, the rest we pass to the service to
15
+ deal with.
16
+
17
+ ## Messages
18
+
19
+ Messages should be one of three types, 'notice', 'alert', 'resolve'.
20
+
21
+ Messages are datum's that contain three pieces of information:
22
+
23
+ * message
24
+ * source
25
+ * message_id
26
+
27
+ The 'source' is where this message originates, for example, "nagios". The
28
+ 'message_id' should be a unique identifier for this message, and for certain
29
+ services should be used on alert/resolve messages to easily resolve them (i.e.
30
+ PagerDuty).
31
+
32
+ ## Services
33
+
34
+ Each service should define three methods, one for each type of message:
35
+
36
+ * send_notice
37
+ * send_alert
38
+ * send_resolve
39
+
40
+ These provide the common interface between all of the services.
41
+
42
+ ## Installation
43
+
44
+ Add this line to your application's Gemfile:
45
+
46
+ gem 'comsat'
47
+
48
+ And then execute:
49
+
50
+ $ bundle
51
+
52
+ Or install it yourself as:
53
+
54
+ $ gem install comsat
55
+
56
+ ## Usage
57
+
58
+ ```
59
+ client = Comsat::Client.new(["campfire://<api_key>:X@blossom.campfirenow.com/Test%20Room"])
60
+ client.send_notice({:message => "message here", :source => "nagios", :message_id => "unique_id"})
61
+ ```
62
+
63
+ ## Contributing
64
+
65
+ 1. Fork it
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
68
+ 4. Push to the branch (`git push origin my-new-feature`)
69
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/comsat.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/comsat/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["curt@heroku.com", "gorsuch@heroku.com"]
6
+ gem.email = ["ops@heroku.com"]
7
+ gem.description = "Early notification gem"
8
+ gem.summary = "Early notification gem"
9
+ gem.homepage = ""
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "comsat"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Comsat::VERSION
17
+
18
+ gem.add_runtime_dependency('rest-client')
19
+ gem.add_runtime_dependency('tinder')
20
+ end
@@ -0,0 +1,3 @@
1
+ module Comsat
2
+ VERSION = "0.0.1"
3
+ end
data/lib/comsat.rb ADDED
@@ -0,0 +1,107 @@
1
+ require "cgi"
2
+ require "comsat/version"
3
+ require "json"
4
+ require "rest_client"
5
+ require "securerandom"
6
+ require "tinder"
7
+
8
+ module Comsat
9
+ class Client
10
+ def initialize(urls)
11
+ @urls = urls
12
+ end
13
+
14
+ def send_notice(data)
15
+ @urls.each do |url|
16
+ ServiceFactory.create(url).send_notice(data)
17
+ end
18
+ end
19
+
20
+ def send_alert(data)
21
+ @urls.each do |url|
22
+ ServiceFactory.create(url).send_alert(data)
23
+ end
24
+ end
25
+
26
+ def send_resolve(data)
27
+ @urls.each do |url|
28
+ ServiceFactory.create(url).send_resolve(data)
29
+ end
30
+ end
31
+ end
32
+
33
+ class ServiceFactory
34
+ def self.create(url)
35
+ uri = URI.parse(url)
36
+ case uri.scheme
37
+ when 'campfire'
38
+ Campfire.new(uri)
39
+ when 'pagerduty'
40
+ PagerDuty.new(uri)
41
+ end
42
+ end
43
+ end
44
+
45
+ class Campfire
46
+ def initialize(uri)
47
+ @acct = uri.host.split('.')[0]
48
+ @api_key = uri.user
49
+ @room = CGI.unescape(uri.path.gsub(/\A\//, ''))
50
+ end
51
+
52
+ def send_notice(data)
53
+ # {:messages, :source, :message_id}
54
+ messages = []
55
+ messages << "[#{data[:source]}] #{data[:message]}"
56
+ send_message(messages)
57
+ end
58
+ alias :send_alert :send_notice
59
+ alias :send_resolve :send_notice
60
+
61
+ def send_message(msgs)
62
+ unless room = find_room
63
+ raise "Unable to find room"
64
+ end
65
+ Array(msgs).each {|line| room.speak line }
66
+ end
67
+
68
+ def campfire
69
+ @campfire = ::Tinder::Campfire.new(
70
+ @acct,
71
+ :ssl => true,
72
+ :token => @api_key
73
+ )
74
+ end
75
+
76
+ def find_room
77
+ campfire.find_room_by_name(@room)
78
+ end
79
+ end
80
+
81
+ class PagerDuty
82
+ ENDPOINT = 'https://events.pagerduty.com/generic/2010-04-15/create_event.json'
83
+
84
+ def initialize(uri)
85
+ @api_key = uri.user
86
+ end
87
+
88
+ def contact_pagerduty(event_type, data)
89
+ id = data[:message_id] || SecureRandom.uuid
90
+ message = data[:message]
91
+ source = data[:source]
92
+ message = "#{source}: #{message}"
93
+
94
+ data = { :service_key => @api_key, :incident_key => id, :event_type => event_type, :description => message }
95
+ RestClient.post ENDPOINT, data.to_json, :content_type => :json
96
+ end
97
+
98
+ def send_notice(data)
99
+ contact_pagerduty(:trigger, data)
100
+ end
101
+ alias :send_alert :send_notice
102
+
103
+ def send_resolve(data)
104
+ contact_pagerduty(:resolve, data)
105
+ end
106
+ end
107
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: comsat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - curt@heroku.com
9
+ - gorsuch@heroku.com
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-04-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ requirement: &70113286660760 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70113286660760
26
+ - !ruby/object:Gem::Dependency
27
+ name: tinder
28
+ requirement: &70113286659660 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *70113286659660
37
+ description: Early notification gem
38
+ email:
39
+ - ops@heroku.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - LICENSE
47
+ - README.md
48
+ - Rakefile
49
+ - comsat.gemspec
50
+ - lib/comsat.rb
51
+ - lib/comsat/version.rb
52
+ homepage: ''
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.11
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Early notification gem
76
+ test_files: []