Codebase list ruby-god / 3fa2a85
Imported Upstream version 0.13.4 Sébastien Delafond 10 years ago
13 changed file(s) with 347 addition(s) and 108 deletion(s). Raw diff Collapse all Expand all
00 source 'https://rubygems.org'
11 gemspec
2
3 gem 'redcarpet', '< 3.0.0'
4 gem 'sanitize', '2.0.3'
0 == 0.13.4 / 2014-03-05
1 * Minor Enhancements
2 * Hipchat reporter (#162)
3 * Re-open log files on SIGUSR1 (#103)
4 * Bug fixes
5 * Send query params on webhook reporter (#160)
6 * Don't thow an exception when there are problems reading pid file (#164)
7
08 == 0.13.3 / 2013-09-25
19 * Minor Enhancements
210 * Invoke commands for all watchers
998998 (default: false).
999999 ```
10001000
1001 Hipchat
1002 ~~~~~~~~
1003
1004 Send a notice to a Hipchat room (http://hipchat.com).
1005
1006 ```ruby
1007 God::Contacts::Hipchat.defaults do |d|
1008 ...
1009 end
1010
1011 God.contact(:hipchat) do |c|
1012 ...
1013 end
1014 ```
1015
1016 ```
1017 token - The String token used for authentication.
1018 room - The String room name to which the message should be sent.
1019 ssl - A Boolean determining whether or not to use SSL
1020 (default: false).
1021 from - The String representing who the message should be sent as.
1022 ```
1023
10011024 Email
10021025 ~~~~~
10031026
22 s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
33
44 s.name = 'god'
5 s.version = '0.13.3'
6 s.date = '2013-09-25'
5 s.version = '0.13.4'
6 s.date = '2014-03-05'
77
88 s.summary = "Process monitoring framework."
99 s.description = "An easy to configure, easy to extend monitoring framework written in Ruby."
8282 lib/god/contacts/airbrake.rb
8383 lib/god/contacts/campfire.rb
8484 lib/god/contacts/email.rb
85 lib/god/contacts/hipchat.rb
8586 lib/god/contacts/jabber.rb
8687 lib/god/contacts/prowl.rb
8788 lib/god/contacts/scout.rb
153154 test/test_event_handler.rb
154155 test/test_god.rb
155156 test/test_handlers_kqueue_handler.rb
157 test/test_hipchat.rb
156158 test/test_jabber.rb
157159 test/test_logger.rb
158160 test/test_metric.rb
8282 def run_daemonized
8383 # trap and ignore SIGHUP
8484 Signal.trap('HUP') {}
85 # trap and log-reopen SIGUSR1
86 Signal.trap('USR1') { setup_logging }
8587
8688 pid = fork do
8789 begin
0 # Send a notice to a Hipchat room (http://hipchat.com).
1 #
2 # token - The String token used for authentication.
3 # room - The String room name to which the message should be sent.
4 # ssl - A Boolean determining whether or not to use SSL
5 # (default: false).
6 # from - The String representing who the message should be sent as.
7
8 require 'net/http'
9 require 'net/https'
10
11 CONTACT_DEPS[:hipchat] = ['json']
12 CONTACT_DEPS[:hipchat].each do |d|
13 require d
14 end
15
16 module Marshmallow
17 class Connection
18 def initialize(options)
19 raise "Required option :token not set." unless options[:token]
20 @options = options
21 end
22
23 def base_url
24 scheme = @options[:ssl] ? 'https' : 'http'
25 "#{scheme}://api.hipchat.com/v1/rooms"
26 end
27
28 def find_room_id_by_name(room_name)
29 url = URI.parse("#{base_url}/list?format=json&auth_token=#{@options[:token]}")
30 http = Net::HTTP.new(url.host, url.port)
31 http.use_ssl = true if @options[:ssl]
32
33 req = Net::HTTP::Get.new(url.request_uri)
34 req.set_content_type('application/json')
35
36 res = http.request(req)
37 case res
38 when Net::HTTPSuccess
39 rooms = JSON.parse(res.body)
40 room = rooms['rooms'].select { |x| x['name'] == room_name }
41 rooms.empty? ? nil : room.first['room_id'].to_i
42 else
43 raise res.error!
44 end
45 end
46
47 def speak(room, message)
48 room_id = find_room_id_by_name(room)
49 puts "in spark: room_id = #{room_id}"
50 raise "No such room: #{room}." unless room_id
51
52 escaped_message = URI.escape(message)
53
54 url = URI.parse("#{base_url}/message?message_format=text&format=json&auth_token=#{@options[:token]}&from=#{@options[:from]}&room_id=#{room}&message=#{escaped_message}")
55
56 http = Net::HTTP.new(url.host, url.port)
57 http.use_ssl = true if @options[:ssl]
58
59 req = Net::HTTP::Post.new(url.request_uri)
60 req.set_content_type('application/json')
61 res = http.request(req)
62 case res
63 when Net::HTTPSuccess
64 true
65 else
66 raise res.error!
67 end
68 end
69 end
70 end
71
72 module God
73 module Contacts
74
75 class Hipchat < Contact
76 class << self
77 attr_accessor :token, :room, :ssl, :from
78 attr_accessor :format
79 end
80
81 self.ssl = false
82
83 self.format = lambda do |message, time, priority, category, host|
84 "[#{time.strftime('%H:%M:%S')}] #{host} - #{message}"
85 end
86
87 attr_accessor :token, :room, :ssl, :from
88
89 def valid?
90 valid = true
91 valid &= complain("Attribute 'token' must be specified", self) unless arg(:token)
92 valid &= complain("Attribute 'room' must be specified", self) unless arg(:room)
93 valid &= complain("Attribute 'from' must be specified", self) unless arg(:from)
94 valid
95 end
96
97 def notify(message, time, priority, category, host)
98 body = Hipchat.format.call(message, time, priority, category, host)
99
100 conn = Marshmallow::Connection.new(
101 :token => arg(:token),
102 :ssl => arg(:ssl),
103 :from => arg(:from)
104 )
105
106 conn.speak(arg(:room), body)
107
108 self.info = "notified hipchat: #{arg(:room)}"
109 rescue Object => e
110 applog(nil, :info, "failed to notify hipchat: #{e.message}")
111 applog(nil, :debug, e.backtrace.join("\n"))
112 end
113 end
114
115 end
116 end
4646
4747 case arg(:format)
4848 when :form
49 req = Net::HTTP::Post.new(uri.path)
49 req = Net::HTTP::Post.new(uri.request_uri)
5050 req.set_form_data(data)
5151 when :json
52 req = Net::HTTP::Post.new(uri.path)
52 req = Net::HTTP::Post.new(uri.request_uri)
5353 req.body = data.to_json
5454 end
5555
6262 self.info = "failed to send webhook to #{arg(:url)}: #{res.error!}"
6363 end
6464 rescue Object => e
65 applog(nil, :info, "failed to send email to #{arg(:url)}: #{e.message}")
65 applog(nil, :info, "failed to send webhook to #{arg(:url)}: #{e.message}")
6666 applog(nil, :debug, e.backtrace.join("\n"))
6767 end
6868
209209 applog(self, :info, "#{self.name} sent SIG#{@stop_signal}")
210210
211211 # Poll to see if it's dead
212 pid_not_found = false
212213 @stop_timeout.times do
213 begin
214 ::Process.kill(0, pid)
215 rescue Errno::ESRCH
216 # It died. Good.
217 applog(self, :info, "#{self.name} process stopped")
218 return
214 if pid
215 begin
216 ::Process.kill(0, pid)
217 rescue Errno::ESRCH
218 # It died. Good.
219 applog(self, :info, "#{self.name} process stopped")
220 return
221 end
222 else
223 applog(self, :warn, "#{self.name} pid not found in #{self.pid_file}") unless pid_not_found
224 pid_not_found = true
219225 end
220226
221227 sleep 1
8484
8585 require 'god/contact'
8686 load_contact(:campfire)
87 load_contact(:hipchat)
8788 load_contact(:email)
8889 load_contact(:jabber)
8990 load_contact(:prowl)
156157
157158 module God
158159 # The String version number for this package.
159 VERSION = '0.13.3'
160 VERSION = '0.13.4'
160161
161162 # The Integer number of lines of backlog to keep for the logger.
162163 LOG_BUFFER_SIZE_DEFAULT = 100
00 --- !ruby/object:Gem::Specification
11 name: god
22 version: !ruby/object:Gem::Version
3 prerelease: false
3 hash: 35
4 prerelease:
45 segments:
56 - 0
67 - 13
7 - 3
8 version: 0.13.3
8 - 4
9 version: 0.13.4
910 platform: ruby
1011 authors:
1112 - Tom Preston-Werner
1516 bindir: bin
1617 cert_chain: []
1718
18 date: 2013-09-25 00:00:00 -07:00
19 date: 2014-03-05 00:00:00 -08:00
1920 default_executable:
2021 dependencies:
2122 - !ruby/object:Gem::Dependency
22 type: :development
2323 version_requirements: &id001 !ruby/object:Gem::Requirement
24 requirements:
25 - - ~>
26 - !ruby/object:Gem::Version
24 none: false
25 requirements:
26 - - ~>
27 - !ruby/object:Gem::Version
28 hash: 3
2729 segments:
2830 - 1
2931 - 6
3032 version: "1.6"
33 prerelease: false
34 requirement: *id001
3135 name: json
32 requirement: *id001
33 prerelease: false
34 - !ruby/object:Gem::Dependency
35 type: :development
36 type: :development
37 - !ruby/object:Gem::Dependency
3638 version_requirements: &id002 !ruby/object:Gem::Requirement
39 none: false
3740 requirements:
3841 - - ">="
3942 - !ruby/object:Gem::Version
43 hash: 3
4044 segments:
4145 - 0
4246 version: "0"
47 prerelease: false
48 requirement: *id002
4349 name: rake
44 requirement: *id002
45 prerelease: false
46 - !ruby/object:Gem::Dependency
47 type: :development
50 type: :development
51 - !ruby/object:Gem::Dependency
4852 version_requirements: &id003 !ruby/object:Gem::Requirement
49 requirements:
50 - - ~>
51 - !ruby/object:Gem::Version
53 none: false
54 requirements:
55 - - ~>
56 - !ruby/object:Gem::Version
57 hash: 19
5258 segments:
5359 - 3
5460 - 10
5561 version: "3.10"
62 prerelease: false
63 requirement: *id003
5664 name: rdoc
57 requirement: *id003
58 prerelease: false
59 - !ruby/object:Gem::Dependency
60 type: :development
65 type: :development
66 - !ruby/object:Gem::Dependency
6167 version_requirements: &id004 !ruby/object:Gem::Requirement
62 requirements:
63 - - ~>
64 - !ruby/object:Gem::Version
68 none: false
69 requirements:
70 - - ~>
71 - !ruby/object:Gem::Version
72 hash: 27
6573 segments:
6674 - 4
6775 - 0
6876 version: "4.0"
77 prerelease: false
78 requirement: *id004
6979 name: twitter
70 requirement: *id004
71 prerelease: false
72 - !ruby/object:Gem::Dependency
73 type: :development
80 type: :development
81 - !ruby/object:Gem::Dependency
7482 version_requirements: &id005 !ruby/object:Gem::Requirement
75 requirements:
76 - - ~>
77 - !ruby/object:Gem::Version
83 none: false
84 requirements:
85 - - ~>
86 - !ruby/object:Gem::Version
87 hash: 13
7888 segments:
7989 - 0
8090 - 3
8191 version: "0.3"
92 prerelease: false
93 requirement: *id005
8294 name: prowly
83 requirement: *id005
84 prerelease: false
85 - !ruby/object:Gem::Dependency
86 type: :development
95 type: :development
96 - !ruby/object:Gem::Dependency
8797 version_requirements: &id006 !ruby/object:Gem::Requirement
88 requirements:
89 - - ~>
90 - !ruby/object:Gem::Version
98 none: false
99 requirements:
100 - - ~>
101 - !ruby/object:Gem::Version
102 hash: 1
91103 segments:
92104 - 0
93105 - 5
94106 version: "0.5"
107 prerelease: false
108 requirement: *id006
95109 name: xmpp4r
96 requirement: *id006
97 prerelease: false
98 - !ruby/object:Gem::Dependency
99 type: :development
110 type: :development
111 - !ruby/object:Gem::Dependency
100112 version_requirements: &id007 !ruby/object:Gem::Requirement
101 requirements:
102 - - ~>
103 - !ruby/object:Gem::Version
113 none: false
114 requirements:
115 - - ~>
116 - !ruby/object:Gem::Version
117 hash: 25
104118 segments:
105119 - 0
106120 - 0
107121 - 3
108122 version: 0.0.3
123 prerelease: false
124 requirement: *id007
109125 name: dike
110 requirement: *id007
111 prerelease: false
112 - !ruby/object:Gem::Dependency
113 type: :development
126 type: :development
127 - !ruby/object:Gem::Dependency
114128 version_requirements: &id008 !ruby/object:Gem::Requirement
115 requirements:
116 - - ~>
117 - !ruby/object:Gem::Version
129 none: false
130 requirements:
131 - - ~>
132 - !ruby/object:Gem::Version
133 hash: 25
118134 segments:
119135 - 0
120136 - 9
121137 version: "0.9"
138 prerelease: false
139 requirement: *id008
122140 name: rcov
123 requirement: *id008
124 prerelease: false
125 - !ruby/object:Gem::Dependency
126 type: :development
141 type: :development
142 - !ruby/object:Gem::Dependency
127143 version_requirements: &id009 !ruby/object:Gem::Requirement
128 requirements:
129 - - ~>
130 - !ruby/object:Gem::Version
144 none: false
145 requirements:
146 - - ~>
147 - !ruby/object:Gem::Version
148 hash: 13
131149 segments:
132150 - 1
133151 - 1
134152 version: "1.1"
153 prerelease: false
154 requirement: *id009
135155 name: daemons
136 requirement: *id009
137 prerelease: false
138 - !ruby/object:Gem::Dependency
139 type: :development
156 type: :development
157 - !ruby/object:Gem::Dependency
140158 version_requirements: &id010 !ruby/object:Gem::Requirement
141 requirements:
142 - - ~>
143 - !ruby/object:Gem::Version
159 none: false
160 requirements:
161 - - ~>
162 - !ruby/object:Gem::Version
163 hash: 31
144164 segments:
145165 - 0
146166 - 10
147167 version: "0.10"
168 prerelease: false
169 requirement: *id010
148170 name: mocha
149 requirement: *id010
150 prerelease: false
151 - !ruby/object:Gem::Dependency
152 type: :development
171 type: :development
172 - !ruby/object:Gem::Dependency
153173 version_requirements: &id011 !ruby/object:Gem::Requirement
154 requirements:
155 - - ~>
156 - !ruby/object:Gem::Version
174 none: false
175 requirements:
176 - - ~>
177 - !ruby/object:Gem::Version
178 hash: 25
157179 segments:
158180 - 1
159181 - 3
160182 - 1
161183 version: 1.3.1
184 prerelease: false
185 requirement: *id011
162186 name: gollum
163 requirement: *id011
164 prerelease: false
165 - !ruby/object:Gem::Dependency
166 type: :development
187 type: :development
188 - !ruby/object:Gem::Dependency
167189 version_requirements: &id012 !ruby/object:Gem::Requirement
168 requirements:
169 - - ~>
170 - !ruby/object:Gem::Version
190 none: false
191 requirements:
192 - - ~>
193 - !ruby/object:Gem::Version
194 hash: 13
171195 segments:
172196 - 3
173197 - 1
174198 - 7
175199 version: 3.1.7
200 prerelease: false
201 requirement: *id012
176202 name: airbrake
177 requirement: *id012
178 prerelease: false
179 - !ruby/object:Gem::Dependency
180 type: :development
203 type: :development
204 - !ruby/object:Gem::Dependency
181205 version_requirements: &id013 !ruby/object:Gem::Requirement
182 requirements:
183 - - ~>
184 - !ruby/object:Gem::Version
206 none: false
207 requirements:
208 - - ~>
209 - !ruby/object:Gem::Version
210 hash: 3
185211 segments:
186212 - 1
187213 - 5
188214 - 0
189215 version: 1.5.0
216 prerelease: false
217 requirement: *id013
190218 name: nokogiri
191 requirement: *id013
192 prerelease: false
193 - !ruby/object:Gem::Dependency
194 type: :development
219 type: :development
220 - !ruby/object:Gem::Dependency
195221 version_requirements: &id014 !ruby/object:Gem::Requirement
222 none: false
196223 requirements:
197224 - - ">="
198225 - !ruby/object:Gem::Version
226 hash: 23
199227 segments:
200228 - 2
201229 - 3
203231 version: 2.3.10
204232 - - <
205233 - !ruby/object:Gem::Version
234 hash: 63
206235 segments:
207236 - 4
208237 - 0
209238 - 0
210239 version: 4.0.0
240 prerelease: false
241 requirement: *id014
211242 name: activesupport
212 requirement: *id014
213 prerelease: false
243 type: :development
214244 description: An easy to configure, easy to extend monitoring framework written in Ruby.
215245 email: god-rb@googlegroups.com
216246 executables:
264294 - lib/god/contacts/airbrake.rb
265295 - lib/god/contacts/campfire.rb
266296 - lib/god/contacts/email.rb
297 - lib/god/contacts/hipchat.rb
267298 - lib/god/contacts/jabber.rb
268299 - lib/god/contacts/prowl.rb
269300 - lib/god/contacts/scout.rb
335366 - test/test_event_handler.rb
336367 - test/test_god.rb
337368 - test/test_handlers_kqueue_handler.rb
369 - test/test_hipchat.rb
338370 - test/test_jabber.rb
339371 - test/test_logger.rb
340372 - test/test_metric.rb
361393 - lib
362394 - ext
363395 required_ruby_version: !ruby/object:Gem::Requirement
396 none: false
364397 requirements:
365398 - - ">="
366399 - !ruby/object:Gem::Version
400 hash: 3
367401 segments:
368402 - 0
369403 version: "0"
370404 required_rubygems_version: !ruby/object:Gem::Requirement
405 none: false
371406 requirements:
372407 - - ">="
373408 - !ruby/object:Gem::Version
409 hash: 3
374410 segments:
375411 - 0
376412 version: "0"
377413 requirements: []
378414
379415 rubyforge_project: god
380 rubygems_version: 1.3.6
416 rubygems_version: 1.6.2
381417 signing_key:
382418 specification_version: 2
383419 summary: Process monitoring framework.
397433 - test/test_event_handler.rb
398434 - test/test_god.rb
399435 - test/test_handlers_kqueue_handler.rb
436 - test/test_hipchat.rb
400437 - test/test_jabber.rb
401438 - test/test_logger.rb
402439 - test/test_metric.rb
66 #
77 # God.contact(:campfire) do |c|
88 # c.name = 'tom4'
9 # end
10
11 # God::Contacts::Hipchat.defaults do |d|
12 # d.token = '9fb768e421975cc1c6ff3f4f8306f890cb46e24f'
13 # d.room = 'Notices'
14 # d.ssl = true
15 # end
16 #
17 # God.contact(:hipchat) do |c|
18 # c.name = 'hip1'
919 # end
1020
1121 # God.contact(:email) do |c|
0 require File.dirname(__FILE__) + '/helper'
1
2 class TestHipchat < Test::Unit::TestCase
3 def setup
4 @hipchat = God::Contacts::Hipchat.new
5 end
6
7 def test_exists
8 God::Contacts::Hipchat
9 end
10
11 def test_notify
12 @hipchat.token = 'ee64d6e2337310af'
13 @hipchat.ssl = 'true'
14 @hipchat.room = 'testroom'
15 @hipchat.from = 'test'
16
17 time = Time.now
18 body = "[#{time.strftime('%H:%M:%S')}] host - msg"
19 Marshmallow::Connection.any_instance.expects(:speak).with('testroom', body)
20 @hipchat.notify('msg', time, 'prio', 'cat', 'host')
21 end
22 end
1111 @webhook.notify('msg', Time.now, 'prio', 'cat', 'host')
1212 assert_equal "sent webhook to http://example.com/switch", @webhook.info
1313 end
14
15 def test_notify_with_url_containing_query_parameters
16 @webhook.url = 'http://example.com/switch?api_key=123'
17 Net::HTTP::Post.expects(:new).with('/switch?api_key=123')
18
19 @webhook.notify('msg', Time.now, 'prio', 'cat', 'host')
20 end
1421 end