@@ -10,6 +10,7 @@ gem "rufus-scheduler", :require => false |
||
| 10 | 10 |
gem 'json', '>= 1.7.7' |
| 11 | 11 |
gem 'jsonpath' |
| 12 | 12 |
gem 'twilio-ruby' |
| 13 |
+gem 'ruby-growl' |
|
| 13 | 14 |
|
| 14 | 15 |
gem 'delayed_job' |
| 15 | 16 |
gem 'delayed_job_active_record'#, "~> 0.3.3" # newer was giving a strange MySQL error |
@@ -0,0 +1,61 @@ |
||
| 1 |
+require 'ruby-growl' |
|
| 2 |
+ |
|
| 3 |
+module Agents |
|
| 4 |
+ class GrowlAgent < Agent |
|
| 5 |
+ |
|
| 6 |
+ cannot_be_scheduled! |
|
| 7 |
+ cannot_create_events! |
|
| 8 |
+ |
|
| 9 |
+ description <<-MD |
|
| 10 |
+ The GrowlAgent sends any events it receives to a Growl GNTP server immediately. |
|
| 11 |
+ |
|
| 12 |
+ It is assumed that events have a `message` or `text` key, which will hold the body of the growl notification, and a `subject` key, which will have the headline of the Growl notification. You can use Event Formatting Agent if your event does not provide these keys. |
|
| 13 |
+ |
|
| 14 |
+ Set `expected_receive_period_in_days` to the maximum amount of time that you'd expect to pass between Events being received by this Agent. |
|
| 15 |
+ MD |
|
| 16 |
+ |
|
| 17 |
+ def default_options |
|
| 18 |
+ {
|
|
| 19 |
+ 'growlserver' => 'localhost', |
|
| 20 |
+ 'growlpassword' => '', |
|
| 21 |
+ 'growlappname' => 'HuginnGrowl', |
|
| 22 |
+ 'growlnotificationname' => 'Notification', |
|
| 23 |
+ 'expected_receive_period_in_days' => "2" |
|
| 24 |
+ } |
|
| 25 |
+ end |
|
| 26 |
+ |
|
| 27 |
+ def working? |
|
| 28 |
+ last_receive_at && last_receive_at > options['expected_receive_period_in_days'].to_i.days.ago && !recent_error_logs? |
|
| 29 |
+ end |
|
| 30 |
+ |
|
| 31 |
+ def validate_options |
|
| 32 |
+ unless options['growlserver'].present? && options['expected_receive_period_in_days'].present? |
|
| 33 |
+ errors.add(:base, "growlserver and expected_receive_period_in_days are required fields") |
|
| 34 |
+ end |
|
| 35 |
+ end |
|
| 36 |
+ |
|
| 37 |
+ def register_growl |
|
| 38 |
+ @growler = Growl.new options['growlserver'], options['growlappname'], "GNTP" |
|
| 39 |
+ @growler.password = options['growlpassword'] |
|
| 40 |
+ @growler.add_notification options['growlnotificationname'] |
|
| 41 |
+ end |
|
| 42 |
+ |
|
| 43 |
+ def notify_growl(subject, message) |
|
| 44 |
+ @growler.notify(options['growlnotificationname'],subject,message) |
|
| 45 |
+ end |
|
| 46 |
+ |
|
| 47 |
+ def receive(incoming_events) |
|
| 48 |
+ incoming_events.each do |event| |
|
| 49 |
+ register_growl |
|
| 50 |
+ message = (event.payload['message'] || event.payload['text']).to_s |
|
| 51 |
+ subject = event.payload['subject'].to_s |
|
| 52 |
+ if message != "" && subject != "" |
|
| 53 |
+ log "Sending Growl notification '#{subject}': '#{message}' to #{options['growlserver']} with event #{event.id}"
|
|
| 54 |
+ notify_growl(subject,message) |
|
| 55 |
+ else |
|
| 56 |
+ log "Event #{event.id} not sent, message and subject expected"
|
|
| 57 |
+ end |
|
| 58 |
+ end |
|
| 59 |
+ end |
|
| 60 |
+ end |
|
| 61 |
+end |