backup 3.0.11 → 3.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -4,6 +4,7 @@ GEM
4
4
  activesupport (3.0.5)
5
5
  addressable (2.2.4)
6
6
  builder (3.0.0)
7
+ crack (0.1.8)
7
8
  diff-lcs (1.1.2)
8
9
  dropbox (1.2.3)
9
10
  json (>= 1.2.0)
@@ -32,6 +33,8 @@ GEM
32
33
  rspec-instafail (~> 0.1.4)
33
34
  ruby-progressbar (~> 0.0.9)
34
35
  hashie (1.0.0)
36
+ httparty (0.7.4)
37
+ crack (= 0.1.8)
35
38
  i18n (0.5.0)
36
39
  infinity_test (1.0.2)
37
40
  notifiers (>= 1.1.0)
@@ -90,7 +93,9 @@ DEPENDENCIES
90
93
  dropbox (~> 1.2.3)
91
94
  fog (~> 0.7.0)
92
95
  fuubar
96
+ httparty (~> 0.7.4)
93
97
  infinity_test
98
+ json (~> 1.5.1)
94
99
  mail (~> 2.2.15)
95
100
  mocha
96
101
  net-scp (~> 1.0.4)
data/backup.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
19
19
  server through FTP, SFTP, SCP and RSync), it provide Syncers (RSync, S3) for efficient backups,
20
20
  it can archive files and directories, it can cycle backups, it can do incremental backups, it
21
21
  can compress backups, it can encrypt backups (OpenSSL or GPG), it can notify you about
22
- successful and/or failed backups (Email or Twitter). It is very extensible and easy to add new
22
+ successful and/or failed backups (Email, Twitter and Campfire). It is very extensible and easy to add new
23
23
  functionality to. It\'s easy to use.'
24
24
 
25
25
  ##
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Notifier
6
+ class Campfire < Base
7
+ class << self
8
+
9
+ ##
10
+ # Campfire credentials
11
+ attr_accessor :token, :subdomain, :room_id
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -55,7 +55,19 @@ module Backup
55
55
  'twitter' => {
56
56
  :require => 'twitter',
57
57
  :version => '~> 1.1.2',
58
- :for => 'Send Twitter Updates (Twitter Notifier)'
58
+ :for => 'Sending Twitter Updates (Twitter Notifier)'
59
+ },
60
+
61
+ 'httparty' => {
62
+ :require => 'httparty',
63
+ :version => '~> 0.7.4',
64
+ :for => 'Sending Http Updates'
65
+ },
66
+
67
+ 'json' => {
68
+ :require => 'json',
69
+ :version => '~> 1.5.1',
70
+ :for => 'Parsing JSON for HTTParty'
59
71
  }
60
72
  }
61
73
  end
data/lib/backup/model.rb CHANGED
@@ -240,7 +240,7 @@ module Backup
240
240
  # becomes a single (transferrable) packaged file.
241
241
  def package!
242
242
  Logger.message "Backup started packaging everything to a single archive file."
243
- run("#{ utility(:tar) } -c -C '#{ TMP_PATH }' '#{ TRIGGER }' > '#{ File.join(TMP_PATH, "#{TIME}.#{TRIGGER}.tar") }'")
243
+ run(%|#{ utility(:tar) } -c -f '#{ File.join(TMP_PATH, "#{TIME}.#{TRIGGER}.tar") }' -C '#{ TMP_PATH }' '#{ TRIGGER }'|)
244
244
  end
245
245
 
246
246
  ##
@@ -0,0 +1,179 @@
1
+ # encoding: utf-8
2
+
3
+ ##
4
+ # If the Ruby version of this process is 1.8.x or less
5
+ # then use the JSON gem. Otherwise if the current process is running
6
+ # Ruby 1.9.x or later then it is built in and we can load it from the Ruby core lib
7
+ if RUBY_VERSION < '1.9.0'
8
+ Backup::Dependency.load('json')
9
+ else
10
+ require 'json'
11
+ end
12
+
13
+ ##
14
+ # Load the HTTParty library from the gem
15
+ Backup::Dependency.load('httparty')
16
+
17
+ module Backup
18
+ module Notifier
19
+ class Campfire < Base
20
+
21
+ ##
22
+ # Campfire credentials
23
+ attr_accessor :token, :subdomain, :room_id
24
+
25
+ ##
26
+ # Container for the Model object
27
+ attr_accessor :model
28
+
29
+ ##
30
+ # Instantiates a new Backup::Notifier::Campfire object
31
+ def initialize(&block)
32
+ load_defaults!
33
+
34
+ instance_eval(&block) if block_given?
35
+
36
+ set_defaults!
37
+ end
38
+
39
+ ##
40
+ # Performs the notification
41
+ # Takes an exception object that might've been created if an exception occurred.
42
+ # If this is the case it'll invoke notify_failure!(exception), otherwise, if no
43
+ # error was raised, it'll go ahead and notify_success!
44
+ #
45
+ # If'll only perform these if on_success is true or on_failure is true
46
+ def perform!(model, exception = false)
47
+ @model = model
48
+
49
+ if notify_on_success? and exception.eql?(false)
50
+ log!
51
+ notify_success!
52
+ elsif notify_on_failure? and not exception.eql?(false)
53
+ log!
54
+ notify_failure!(exception)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ ##
61
+ # Sends a message informing the user that the backup operation
62
+ # proceeded without any errors
63
+ def notify_success!
64
+ send_message("[Backup::Succeeded] #{model.label} (#{ File.basename(Backup::Model.file) })")
65
+ end
66
+
67
+ ##
68
+ # Sends a message informing the user that the backup operation
69
+ # raised an exception
70
+ def notify_failure!(exception)
71
+ send_message("[Backup::Failed] #{model.label} (#{ File.basename(Backup::Model.file) })")
72
+ end
73
+
74
+ ##
75
+ # Setting up credentials
76
+ def set_defaults!
77
+ @campfire_client = {
78
+ :token => @token,
79
+ :subdomain => @subdomain,
80
+ :room_id => @room_id
81
+ }
82
+ end
83
+
84
+ ##
85
+ # Creates a new Campfire::Interface object and passes in the
86
+ # campfire clients "room_id", "subdomain" and "token". Using this object
87
+ # the provided "message" will be sent to the desired Campfire chat room
88
+ def send_message(message)
89
+ room = Interface.room(
90
+ @campfire_client[:room_id],
91
+ @campfire_client[:subdomain],
92
+ @campfire_client[:token]
93
+ )
94
+ room.message(message)
95
+ end
96
+
97
+ ##
98
+ # The Campfire::Interface acts as the Interface for the Campfire class.
99
+ # It uses the HTTParty library and the Campfire::Room class to communicate
100
+ # with the Campfire rooms. HTTParty provides the Campfire::Interface with the methods
101
+ # necessary to communicate (inside the HTTParty module) such as the class methods:
102
+ # * post
103
+ # * base_uri
104
+ # * basic_auth
105
+ class Interface
106
+ include HTTParty
107
+
108
+ ##
109
+ # We communicate using the JSON data format
110
+ headers 'Content-Type' => 'application/json'
111
+
112
+ ##
113
+ # Instantiates a new Campfire::Room object with
114
+ # the provided arguments and returns this object
115
+ def self.room(room_id, subdomain, token)
116
+ Room.new(room_id, subdomain, token)
117
+ end
118
+ end
119
+
120
+ ##
121
+ # The Campfire::Room acts as a model for an actual room on the Campfire service.
122
+ # And it uses the Campfire::Interface's (HTTParty) class methods to communicate based
123
+ # on the provided parameters (room_id, subdomain and token)
124
+ class Room
125
+
126
+ ##
127
+ # These are the necessary attributes that Campfire requires
128
+ # in order to communicate with the correct chat rooms
129
+ attr_reader :room_id, :subdomain, :token
130
+
131
+ ##
132
+ # Instantiates a new Campfire::Room object and sets all the
133
+ # necessary arguments (@room_id, @subdomain, @token)
134
+ def initialize(room_id, subdomain, token)
135
+ @room_id = room_id
136
+ @subdomain = subdomain
137
+ @token = token
138
+ end
139
+
140
+ ##
141
+ # Wrapper method for the #send_message (private) method
142
+ def message(message)
143
+ send_message(message)
144
+ end
145
+
146
+ private
147
+
148
+ ##
149
+ # Takes a "message" as argument, the "type" defaults to "Textmessage".
150
+ # This method builds up a POST request with the necessary params (serialized to JSON format)
151
+ # and sends it to the Campfire service in order to submit the message
152
+ def send_message(message, type = 'Textmessage')
153
+ post 'speak', :body => {
154
+ :message => {
155
+ :body => message,
156
+ :type => type
157
+ }
158
+ }.to_json
159
+ end
160
+
161
+ ##
162
+ # Builds/sets up the Campfire::Interface attributes and submits
163
+ # the POST request that was built in the #send_message (private) method
164
+ def post(action, options = {})
165
+ Interface.base_uri("https://#{subdomain}.campfirenow.com")
166
+ Interface.basic_auth(token, 'x')
167
+ Interface.post(room_url_for(action), options)
168
+ end
169
+
170
+ ##
171
+ # Returns the url for the specified room (in JSON format)
172
+ def room_url_for(action)
173
+ "/room/#{room_id}/#{action}.json"
174
+ end
175
+ end
176
+
177
+ end
178
+ end
179
+ end
@@ -13,7 +13,7 @@ module Backup
13
13
  # Defines the minor version
14
14
  # PATCH:
15
15
  # Defines the patch version
16
- MAJOR, MINOR, PATCH = 3, 0, 11
16
+ MAJOR, MINOR, PATCH = 3, 0, 12
17
17
 
18
18
  ##
19
19
  # Returns the major version ( big release based off of multiple minor releases )
data/lib/backup.rb CHANGED
@@ -21,7 +21,7 @@ module Backup
21
21
  COMPRESSORS = ['Gzip']
22
22
  ENCRYPTORS = ['OpenSSL', 'GPG']
23
23
  SYNCERS = ['RSync', 'S3']
24
- NOTIFIERS = ['Mail', 'Twitter']
24
+ NOTIFIERS = ['Mail', 'Twitter', 'Campfire']
25
25
 
26
26
  ##
27
27
  # Backup's internal paths
@@ -62,6 +62,7 @@ module Backup
62
62
  autoload :Base, File.join(CONFIGURATION_PATH, 'notifier', 'base')
63
63
  autoload :Mail, File.join(CONFIGURATION_PATH, 'notifier', 'mail')
64
64
  autoload :Twitter, File.join(CONFIGURATION_PATH, 'notifier', 'twitter')
65
+ autoload :Campfire, File.join(CONFIGURATION_PATH, 'notifier', 'campfire')
65
66
  end
66
67
 
67
68
  module Encryptor
@@ -150,10 +151,11 @@ module Backup
150
151
  ##
151
152
  # Autoload notification files
152
153
  module Notifier
153
- autoload :Base, File.join(NOTIFIER_PATH, 'base')
154
- autoload :Binder, File.join(NOTIFIER_PATH, 'binder')
155
- autoload :Mail, File.join(NOTIFIER_PATH, 'mail')
156
- autoload :Twitter, File.join(NOTIFIER_PATH, 'twitter')
154
+ autoload :Base, File.join(NOTIFIER_PATH, 'base')
155
+ autoload :Binder, File.join(NOTIFIER_PATH, 'binder')
156
+ autoload :Mail, File.join(NOTIFIER_PATH, 'mail')
157
+ autoload :Twitter, File.join(NOTIFIER_PATH, 'twitter')
158
+ autoload :Campfire, File.join(NOTIFIER_PATH, 'campfire')
157
159
  end
158
160
 
159
161
  ##
data/spec/model_spec.rb CHANGED
@@ -205,7 +205,7 @@ describe Backup::Model do
205
205
 
206
206
  it 'should package the folder' do
207
207
  model.expects(:utility).with(:tar).returns(:tar)
208
- model.expects(:run).with("tar -c -C '#{ Backup::TMP_PATH }' '#{ Backup::TRIGGER }' > '#{ File.join( Backup::TMP_PATH, "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar" ) }'")
208
+ model.expects(:run).with(%|tar -c -f '#{ File.join( Backup::TMP_PATH, "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar" ) }' -C '#{ Backup::TMP_PATH }' '#{ Backup::TRIGGER }'|)
209
209
  model.send(:package!)
210
210
  end
211
211
 
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ describe Backup::Notifier::Campfire do
6
+ let(:notifier) do
7
+ Backup::Notifier::Campfire.new do |campfire|
8
+ campfire.token = 'token'
9
+ campfire.subdomain = 'subdomain'
10
+ campfire.room_id = 'room_id'
11
+ end
12
+ end
13
+
14
+ it do
15
+ notifier.token.should == 'token'
16
+ notifier.subdomain.should == 'subdomain'
17
+ notifier.room_id.should == 'room_id'
18
+
19
+ notifier.on_success.should == true
20
+ notifier.on_failure.should == true
21
+ end
22
+
23
+ describe 'defaults' do
24
+ it do
25
+ Backup::Configuration::Notifier::Campfire.defaults do |twitter|
26
+ twitter.token = 'old_token'
27
+ twitter.on_success = false
28
+ twitter.on_failure = true
29
+ end
30
+ notifier = Backup::Notifier::Campfire.new do |twitter|
31
+ twitter.token = 'new_token'
32
+ end
33
+
34
+ notifier.token.should == 'new_token'
35
+ notifier.on_success.should == false
36
+ notifier.on_failure.should == true
37
+ end
38
+ end
39
+
40
+ describe '#initialize' do
41
+ it do
42
+ Backup::Notifier::Campfire.any_instance.expects(:set_defaults!)
43
+ Backup::Notifier::Campfire.new
44
+ end
45
+ end
46
+
47
+ describe '#perform!' do
48
+ let(:model) { Backup::Model.new('blah', 'blah') {} }
49
+ before do
50
+ notifier.on_success = false
51
+ notifier.on_failure = false
52
+ end
53
+
54
+ context "when successful" do
55
+ it do
56
+ Backup::Logger.expects(:message).with("Backup::Notifier::Campfire started notifying about the process.")
57
+ notifier.expects("notify_success!")
58
+ notifier.on_success = true
59
+ notifier.perform!(model)
60
+ end
61
+
62
+ it do
63
+ notifier.expects("notify_success!").never
64
+ notifier.on_success = false
65
+ notifier.perform!(model)
66
+ end
67
+ end
68
+
69
+ context "when failed" do
70
+ it do
71
+ Backup::Logger.expects(:message).with("Backup::Notifier::Campfire started notifying about the process.")
72
+ notifier.expects("notify_failure!")
73
+ notifier.on_failure = true
74
+ notifier.perform!(model, Exception.new)
75
+ end
76
+
77
+ it do
78
+ notifier.expects("notify_failure!").never
79
+ notifier.on_failure = false
80
+ notifier.perform!(model, Exception.new)
81
+ end
82
+ end
83
+ end
84
+
85
+ describe Backup::Notifier::Campfire::Interface do
86
+ let(:room) do
87
+ Backup::Notifier::Campfire::Room.new('room_id', 'subdomain', 'token')
88
+ end
89
+
90
+ it do
91
+ room.token.should == 'token'
92
+ room.subdomain.should == 'subdomain'
93
+ room.room_id.should == 'room_id'
94
+ end
95
+ end
96
+ end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backup
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 31
4
5
  prerelease:
5
- version: 3.0.11
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 12
10
+ version: 3.0.12
6
11
  platform: ruby
7
12
  authors:
8
13
  - Michael van Rooijen
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-03-28 00:00:00 +02:00
18
+ date: 2011-03-29 00:00:00 +02:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
@@ -21,6 +26,11 @@ dependencies:
21
26
  requirements:
22
27
  - - ~>
23
28
  - !ruby/object:Gem::Version
29
+ hash: 43
30
+ segments:
31
+ - 0
32
+ - 14
33
+ - 6
24
34
  version: 0.14.6
25
35
  type: :runtime
26
36
  version_requirements: *id001
@@ -60,6 +70,7 @@ files:
60
70
  - lib/backup/configuration/encryptor/open_ssl.rb
61
71
  - lib/backup/configuration/helpers.rb
62
72
  - lib/backup/configuration/notifier/base.rb
73
+ - lib/backup/configuration/notifier/campfire.rb
63
74
  - lib/backup/configuration/notifier/mail.rb
64
75
  - lib/backup/configuration/notifier/twitter.rb
65
76
  - lib/backup/configuration/storage/base.rb
@@ -86,6 +97,7 @@ files:
86
97
  - lib/backup/model.rb
87
98
  - lib/backup/notifier/base.rb
88
99
  - lib/backup/notifier/binder.rb
100
+ - lib/backup/notifier/campfire.rb
89
101
  - lib/backup/notifier/mail.rb
90
102
  - lib/backup/notifier/templates/notify_failure.erb
91
103
  - lib/backup/notifier/templates/notify_success.erb
@@ -154,6 +166,7 @@ files:
154
166
  - spec/encryptor/open_ssl_spec.rb
155
167
  - spec/logger_spec.rb
156
168
  - spec/model_spec.rb
169
+ - spec/notifier/campfire_spec.rb
157
170
  - spec/notifier/mail_spec.rb
158
171
  - spec/notifier/twitter_spec.rb
159
172
  - spec/spec_helper.rb
@@ -183,12 +196,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
196
  requirements:
184
197
  - - ">="
185
198
  - !ruby/object:Gem::Version
199
+ hash: 3
200
+ segments:
201
+ - 0
186
202
  version: "0"
187
203
  required_rubygems_version: !ruby/object:Gem::Requirement
188
204
  none: false
189
205
  requirements:
190
206
  - - ">="
191
207
  - !ruby/object:Gem::Version
208
+ hash: 3
209
+ segments:
210
+ - 0
192
211
  version: "0"
193
212
  requirements: []
194
213
 
@@ -196,6 +215,6 @@ rubyforge_project:
196
215
  rubygems_version: 1.6.1
197
216
  signing_key:
198
217
  specification_version: 3
199
- summary: "Backup is a RubyGem (for UNIX-like operating systems: Linux, Mac OSX) that allows you to configure and perform backups in a simple manner using an elegant Ruby DSL. It supports various databases (MySQL, PostgreSQL, MongoDB and Redis), it supports various storage locations (Amazon S3, Rackspace Cloud Files, Dropbox, any remote server through FTP, SFTP, SCP and RSync), it provide Syncers (RSync, S3) for efficient backups, it can archive files and directories, it can cycle backups, it can do incremental backups, it can compress backups, it can encrypt backups (OpenSSL or GPG), it can notify you about successful and/or failed backups (Email or Twitter). It is very extensible and easy to add new functionality to. It's easy to use."
218
+ summary: "Backup is a RubyGem (for UNIX-like operating systems: Linux, Mac OSX) that allows you to configure and perform backups in a simple manner using an elegant Ruby DSL. It supports various databases (MySQL, PostgreSQL, MongoDB and Redis), it supports various storage locations (Amazon S3, Rackspace Cloud Files, Dropbox, any remote server through FTP, SFTP, SCP and RSync), it provide Syncers (RSync, S3) for efficient backups, it can archive files and directories, it can cycle backups, it can do incremental backups, it can compress backups, it can encrypt backups (OpenSSL or GPG), it can notify you about successful and/or failed backups (Email, Twitter and Campfire). It is very extensible and easy to add new functionality to. It's easy to use."
200
219
  test_files: []
201
220