Permalink
Browse files

Notifier::HttpPost

Adds a generic HTTP POST notifier.

closes #371, closes #406
  • Loading branch information...
Brian D. Burns
Brian D. Burns committed May 26, 2013
1 parent f6a8408 commit 68caf46e433bb6ea4fa317b3c9587117ef1c315c
Showing with 470 additions and 2 deletions.
  1. +1 −0 README.md
  2. +1 −0 lib/backup.rb
  3. +2 −1 lib/backup/config.rb
  4. +122 −0 lib/backup/notifier/http_post.rb
  5. +1 −1 spec/cli_spec.rb
  6. +308 −0 spec/notifier/http_post_spec.rb
  7. +35 −0 templates/cli/notifier/http_post
View
@@ -125,6 +125,7 @@ Supported notification services include:
- Prowl
- Hipchat
- Pushover
+- POST Request
## Generators
View
@@ -107,6 +107,7 @@ module Notifier
autoload :Prowl, File.join(NOTIFIER_PATH, 'prowl')
autoload :Hipchat, File.join(NOTIFIER_PATH, 'hipchat')
autoload :Pushover, File.join(NOTIFIER_PATH, 'pushover')
+ autoload :HttpPost, File.join(NOTIFIER_PATH, 'http_post')
end
##
View
@@ -116,7 +116,8 @@ def add_dsl_constants!
{ 'RSync' => ['Push', 'Pull', 'Local'] }
],
# Notifiers
- ['Mail', 'Twitter', 'Campfire', 'Prowl', 'Hipchat', 'Pushover']
+ ['Mail', 'Twitter', 'Campfire', 'Prowl',
+ 'Hipchat', 'Pushover', 'HttpPost']
]
)
end
@@ -0,0 +1,122 @@
+# encoding: utf-8
+require 'uri'
+
+module Backup
+ module Notifier
+ class HttpPost < Base
+
+ ##
+ # URI to post notification to.
+ #
+ # URI scheme may be `http` or `https`.
+ #
+ # If Basic Authentication is needed, supply the `user:password` in the URI.
+ # e.g. 'https://user:pass@www.example.com/path'
+ #
+ # Port may also be supplied.
+ # e.g. 'http://www.example.com:8080/path'
+ attr_accessor :uri
+
+ ##
+ # Hash of additional HTTP headers to send.
+ #
+ # This notifier sets the following headers:
+ # { 'User-Agent' => "Backup/#{ Backup::VERSION }",
+ # 'Content-Type' => 'x-www-form-urlencoded' }
+ #
+ # 'Content-Type' may not be changed.
+ # 'User-Agent' may be overridden or omitted by setting it to +nil+.
+ # e.g. { 'Authorization' => 'my_auth_info', 'User-Agent' => nil }
+ attr_accessor :headers
+
+ ##
+ # Hash of additional POST parameters to send.
+ #
+ # This notifier will set two parameters:
+ # { 'status' => 'success|warning|failure',
+ # 'message' => '[Backup::(Success|Warning|Failure)] label (trigger)' }
+ #
+ # 'status' may not be changed.
+ # 'message' may be overridden or omitted by setting a +nil+ value.
+ # e.g. { 'auth_token' => 'my_token', 'message' => nil }
+ attr_accessor :params
+
+ ##
+ # Successful HTTP Status Code(s) that should be returned.
+ #
+ # This may be a single code or an Array of acceptable codes.
+ # e.g. [200, 201, 204]
+ #
+ # If any other response code is returned, the request will be retried
+ # using `max_retries` and `retry_waitsec`.
+ #
+ # Default: 200
+ attr_accessor :success_codes
+
+ ##
+ # Verify the server's certificate when using SSL.
+ #
+ # This will default to +true+ for most systems.
+ # It may be forced by setting to +true+, or disabled by setting to +false+.
+ attr_accessor :ssl_verify_peer
+
+ ##
+ # Path to a +cacert.pem+ file to use for +ssl_verify_peer+.
+ #
+ # This is provided (via Excon), but may be specified if needed.
+ attr_accessor :ssl_ca_file
+
+ def initialize(model, &block)
+ super
+ instance_eval(&block) if block_given?
+
+ @headers ||= {}
+ @params ||= {}
+ @success_codes ||= 200
+ end
+
+ private
+
+ ##
+ # Notify the user of the backup operation results.
+ #
+ # `status` indicates one of the following:
+ #
+ # `:success`
+ # : The backup completed successfully.
+ # : Notification will be sent if `on_success` is `true`.
+ #
+ # `:warning`
+ # : The backup completed successfully, but warnings were logged.
+ # : Notification will be sent if `on_warning` or `on_success` is `true`.
+ #
+ # `:failure`
+ # : The backup operation failed.
+ # : Notification will be sent if `on_warning` or `on_success` is `true`.
+ #
+ def notify!(status)
+ tag = case status
+ when :success then '[Backup::Success]'
+ when :failure then '[Backup::Failure]'
+ when :warning then '[Backup::Warning]'
+ end
+ message = "#{ tag } #{ model.label } (#{ model.trigger })"
+
+ opts = {
+ :headers => { 'User-Agent' => "Backup/#{ VERSION }" }.
+ merge(headers).reject {|k,v| v.nil? }.
+ merge('Content-Type' => 'application/x-www-form-urlencoded'),
+ :body => encode_www_form({ 'message' => message }.
+ merge(params).reject {|k,v| v.nil? }.
+ merge('status' => status.to_s)),
+ :expects => success_codes # raise error if unsuccessful
+ }
+ opts.merge!(:ssl_verify_peer => ssl_verify_peer) unless ssl_verify_peer.nil?
+ opts.merge!(:ssl_ca_file => ssl_ca_file) if ssl_ca_file
+
+ Excon.post(uri, opts)
+ end
+
+ end
+ end
+end
View
@@ -584,7 +584,7 @@
syncers (cloud_files, rsync_local, rsync_pull, rsync_push, s3)
encryptors (gpg, openssl)
compressors (bzip2, custom, gzip, lzma, pbzip2)
- notifiers (campfire, hipchat, mail, prowl, pushover, twitter)
+ notifiers (campfire, hipchat, http_post, mail, prowl, pushover, twitter)
EOS
out, err = capture_io do
Oops, something went wrong.

0 comments on commit 68caf46

Please sign in to comment.