backupgem 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/Rakefile +2 -2
  2. data/doc/{LICENSE-GPL → LICENSE-GPL.txt} +0 -0
  3. metadata +3 -86
  4. data/bin/commands.sh +0 -2
  5. data/doc/Backup of backupgem.key/Contents/PkgInfo +0 -1
  6. data/doc/Backup of backupgem.key/droppedImage-2.pdf +0 -0
  7. data/doc/Backup of backupgem.key/droppedImage-3.pdf +0 -0
  8. data/doc/Backup of backupgem.key/droppedImage-5.pdf +0 -0
  9. data/doc/Backup of backupgem.key/droppedImage-6.pdf +0 -0
  10. data/doc/Backup of backupgem.key/index.apxl.gz +0 -0
  11. data/doc/Backup of backupgem.key/thumbs/st0.tiff +0 -0
  12. data/doc/Backup of backupgem.key/thumbs/st1.tiff +0 -0
  13. data/doc/Backup of backupgem.key/thumbs/st15.tiff +0 -0
  14. data/doc/Backup of backupgem.key/thumbs/st2.tiff +0 -0
  15. data/doc/Backup of backupgem.key/thumbs/st3-1.tiff +0 -0
  16. data/doc/Backup of backupgem.key/thumbs/st3-2.tiff +0 -0
  17. data/doc/Backup of backupgem.key/thumbs/st3-3.tiff +0 -0
  18. data/doc/Backup of backupgem.key/thumbs/st3-4.tiff +0 -0
  19. data/doc/Backup of backupgem.key/thumbs/st3-5.tiff +0 -0
  20. data/doc/Backup of backupgem.key/thumbs/st3-6.tiff +0 -0
  21. data/doc/Backup of backupgem.key/thumbs/st3-7.tiff +0 -0
  22. data/doc/Backup of backupgem.key/thumbs/st3.tiff +0 -0
  23. data/doc/Backup of backupgem.key/thumbs/st4.tiff +0 -0
  24. data/doc/Backup of backupgem.key/thumbs/st5.tiff +0 -0
  25. data/doc/Backup of backupgem.key/thumbs/st6-1.tiff +0 -0
  26. data/doc/Backup of backupgem.key/thumbs/st6.tiff +0 -0
  27. data/doc/backup_flow.graffle/Icon/r +0 -0
  28. data/doc/backup_flow.graffle/data.plist +0 -320
  29. data/doc/backup_flow.graffle/image1.ai +2 -602
  30. data/doc/backup_flow.graffle/image2.pict +0 -0
  31. data/doc/backupgem.key/Contents/PkgInfo +0 -1
  32. data/doc/backupgem.key/droppedImage-2.pdf +0 -0
  33. data/doc/backupgem.key/droppedImage-3.pdf +0 -0
  34. data/doc/backupgem.key/droppedImage-5.pdf +0 -0
  35. data/doc/backupgem.key/droppedImage-6.pdf +0 -0
  36. data/doc/backupgem.key/index.apxl.gz +0 -0
  37. data/doc/backupgem.key/thumbs/st0.tiff +0 -0
  38. data/doc/backupgem.key/thumbs/st1.tiff +0 -0
  39. data/doc/backupgem.key/thumbs/st15.tiff +0 -0
  40. data/doc/backupgem.key/thumbs/st2.tiff +0 -0
  41. data/doc/backupgem.key/thumbs/st3-1.tiff +0 -0
  42. data/doc/backupgem.key/thumbs/st3-2.tiff +0 -0
  43. data/doc/backupgem.key/thumbs/st3-3.tiff +0 -0
  44. data/doc/backupgem.key/thumbs/st3-4.tiff +0 -0
  45. data/doc/backupgem.key/thumbs/st3-5.tiff +0 -0
  46. data/doc/backupgem.key/thumbs/st3-6.tiff +0 -0
  47. data/doc/backupgem.key/thumbs/st3-7.tiff +0 -0
  48. data/doc/backupgem.key/thumbs/st3.tiff +0 -0
  49. data/doc/backupgem.key/thumbs/st4.tiff +0 -0
  50. data/doc/backupgem.key/thumbs/st5.tiff +0 -0
  51. data/doc/backupgem.key/thumbs/st6-1.tiff +0 -0
  52. data/doc/backupgem.key/thumbs/st6.tiff +0 -0
  53. data/examples/global.rb +0 -28
  54. data/examples/mediawiki.rb +0 -24
  55. data/examples/mediawiki_numeric.rb +0 -19
  56. data/examples/s3.rb +0 -35
  57. data/lib/backup.rb +0 -24
  58. data/lib/backup/actor.rb +0 -208
  59. data/lib/backup/actor.rb.orig +0 -200
  60. data/lib/backup/cli.rb +0 -144
  61. data/lib/backup/configuration.rb +0 -137
  62. data/lib/backup/date_parser.rb +0 -37
  63. data/lib/backup/extensions.rb +0 -17
  64. data/lib/backup/recipes/standard.rb +0 -111
  65. data/lib/backup/rotator.rb +0 -219
  66. data/lib/backup/s3_helpers.rb +0 -95
  67. data/lib/backup/ssh_helpers.rb +0 -139
  68. data/lib/backup/state_recorder.rb +0 -21
  69. data/tests/cleanup.sh +0 -2
  70. data/tests/tests_helper.rb +0 -5
@@ -1 +0,0 @@
1
- ????????
@@ -1,28 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # Global Settings for Backup
3
- # This file sets the global settings for all recipes in the same directory
4
- # @author: Nate Murray <nate@natemurray.com>
5
- #------------------------------------------------------------------------------
6
-
7
- # This file specifies many, but not all, of the setting you can change for Backup.
8
- # Any setting that is set to the default is commented out. Uncomment and
9
- # change any to your liking.
10
-
11
- # A single or array of servers to execute the backup tasks on
12
- # set :servers, %w{ localhost someotherhost } # default: localhost
13
-
14
- # The directory to place the backup on the backup server
15
- set :backup_path, "/var/local/backups/mediawiki"
16
-
17
- # Name of the SSH user
18
- # set :ssh_user, ENV['USER']
19
-
20
- # Path to your SSH key
21
- # set :identity_key, ENV['HOME'] + "/.ssh/id_rsa"
22
-
23
- # Set global actions
24
- # action :compress, :method => :tar_bz2 # tar_bz2 is the default
25
- # action :deliver, :method => :mv # mv is the default
26
- # action :encrypt, :method => :gpg # gpg is the default
27
-
28
- set :tmp_dir, File.dirname(__FILE__) + "/../tmp"
@@ -1,24 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # Mediawiki Backup script
3
- # @author: Nate Murray <nate@natemurray.com>
4
- #------------------------------------------------------------------------------
5
- action(:content) do
6
- dump = c[:tmp_dir] + "/test.sql"
7
- sh "mysqldump -uroot test > #{dump}"
8
- # should something happen here to cleanup the last task? maybe something
9
- # should happen to the stack. like if the next task goes through then you
10
- # remove he last file from the stack. Ah. if everything goes well you clean
11
- # up everything from the stack.
12
- dump
13
- end
14
-
15
- # action :compress, :method => :tar_bz2 # could be set in global
16
- # action :deliver, :method => :scp # could be set in global
17
-
18
- # settings for backup servers are global unless specified otherwise
19
- # rotate settings are global unless specified herer
20
-
21
-
22
-
23
-
24
-
@@ -1,19 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # Mediawiki Backup script
3
- # Uses numeric rotation instead of temporal
4
- # @author: Nate Murray <nate@natemurray.com>
5
- #------------------------------------------------------------------------------
6
- action(:content) do
7
- dump = c[:tmp_dir] + "/test.sql"
8
- sh "mysqldump -uroot test > #{dump}"
9
- dump
10
- end
11
-
12
- set :rotation_mode, :numeric # base our rotation on numbers not dates
13
- set :sons_promoted_after, 3 # upgrade to father after 3 sons
14
- set :fathers_promoted_after, 1
15
-
16
-
17
-
18
-
19
-
@@ -1,35 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # Example S3 Backup script
3
- # @author: Jason L. Perry <jasper@ambethia.com>
4
- #------------------------------------------------------------------------------
5
-
6
- # Set the name of the s3 bucket you want to store your backups in.
7
- # Your Access ID is prepended to this to avoid naming conflicts.
8
- set :backup_path, "database_backup"
9
-
10
- # You can specify your keys here, or set them as environment variables:
11
- # AMAZON_ACCESS_KEY_ID
12
- # AMAZON_SECRET_ACCESS_KEY
13
- set :aws_access, '123'
14
- set :aws_secret, 'ABC'
15
-
16
- # S3 does not support renaming objects, so rotation data is stored in an
17
- # index. You can specify a different key for index here, if you need to.
18
- #
19
- # set :rotation_object_key, 'backup_rotation_index.yml'
20
-
21
- action(:content) do
22
- dump = c[:tmp_dir] + "/databases.sql"
23
- sh "mysqldump -uroot --all-databases > #{dump}"
24
- dump
25
- end
26
-
27
- action :deliver, :method => :s3
28
- action :rotate, :method => :via_s3
29
-
30
- set :son_promoted_on, :fri
31
- set :father_promoted_on, :last_fri_of_the_month
32
-
33
- set :sons_to_keep, 7
34
- set :fathers_to_keep, 5
35
- set :grandfathers_to_keep, 12
@@ -1,24 +0,0 @@
1
- require 'rubygems'
2
- require 'runt'
3
- require 'date'
4
- require 'backup/configuration'
5
- require 'backup/extensions'
6
- require 'backup/ssh_helpers'
7
- require 'backup/date_parser'
8
- require 'backup/state_recorder'
9
-
10
- begin
11
- require 'aws/s3'
12
- require 'backup/s3_helpers'
13
- rescue LoadError
14
- # If AWS::S3 is not installed, no worries, we just
15
- # wont have access to s3 methods. It's worth noting
16
- # at least version 1.8.4 of ruby is required for s3.
17
- end
18
-
19
- begin
20
- require 'madeleine'
21
- rescue LoadError
22
- # If you don't have madeleine then you just cant use numeric rotation mode
23
- ::NO_NUMERIC_ROTATION = true
24
- end
@@ -1,208 +0,0 @@
1
- require 'rake'
2
-
3
- module Backup
4
- include FileUtils
5
- # An Actor is the entity that actually does the work of determining which
6
- # servers should be the target of a particular task, and of executing the
7
- # task on each of them in parallel. An Actor is never instantiated
8
- # directly--rather, you create a new Configuration instance, and access the
9
- # new actor via Configuration#actor.
10
- class Actor
11
- # The configuration instance associated with this actor.
12
- attr_reader :configuration
13
-
14
- # Alias for #configuration
15
- alias_method :c, :configuration
16
-
17
- # A hash of the tasks known to this actor, keyed by name. The values are
18
- # instances of Actor::Action.
19
- attr_reader :action
20
-
21
- # A stack of the results of the actions called
22
- attr_reader :result_history
23
-
24
- # the rotator instance
25
- attr_reader :rotator
26
-
27
- # Returns an Array of Strings specifying dirty files. These files will be
28
- # +rm -rf+ when the +cleanup+ task is called.
29
- attr_reader :dirty_files
30
-
31
- class Action #:nodoc:
32
- attr_reader :name, :actor, :options
33
-
34
- def initialize(name, actor, options)
35
- @name, @actor, @options = name, actor, options
36
- end
37
- end
38
-
39
- def initialize(config) #:nodoc:
40
- @configuration = config
41
- @action = {}
42
- @result_history = []
43
- @dirty_files = []
44
- @rotator = Backup::Rotator.new(self)
45
- end
46
-
47
- # each action in the action_order is part of the chain. so you start by
48
- # setting the output as 'nil' then you try to call before_ action, then
49
- # store the output, then cal action with the args if action takes the args
50
- # you are sending. if it doesnt give an intelligent error message. do this
51
- # for all actions. then call after_action with the output if it exists.
52
- # each time out are calilng the method with the arguemtns f the method
53
- # exists and the method takes the arguments.
54
- def start_process!
55
- configuration[:action_order].each do |a|
56
- self.send_and_store("before_" + a)
57
- self.send_and_store(a)
58
- self.send_and_store("after_" + a)
59
- end
60
- last_result
61
- end
62
-
63
- def send_and_store(name)
64
- store_result self.send(name) if self.respond_to? name
65
- end
66
-
67
- # Define a new task for this actor. The block will be invoked when this
68
- # task is called.
69
- # todo, this might be more complex if the before and after tasks are going
70
- # to be part of the input and output chain
71
- def define_action(name, options={}, &block)
72
- @action[name] = (options[:action_class] || Action).new(name, self, options)
73
-
74
- if self.respond_to?(name) && !( block_given? || options[:method] )
75
- # if it was already defined and we aren't trying to re-define it then
76
- # what we are trying to do is define it the same way it is defined now
77
- # only with options being sent to it.
78
- metaclass.send(:alias_method, "old_#{name}".intern, name)
79
- #self.class.send(:alias_method, "old_#{name}".intern, name)
80
- #define_method("#{name.to_s}_new".intern) do
81
- define_method(name) do
82
- begin
83
- result = self.send("old_#{name}", options)
84
- end
85
- result
86
- end
87
- return
88
- end
89
-
90
- define_method(name) do
91
- #logger.debug "executing task #{name}"
92
- begin
93
- if block_given?
94
- result = instance_eval( &block )
95
- elsif options[:method]
96
- #result = self.send(options[:method], options[:args])
97
- result = self.send(options[:method])
98
- # here we need to have a thing where we can send the arguments
99
- # define the method 'content' so that would take the other options
100
- # if there are options (any hash) just send along that hash. this needs more work
101
- end
102
- end
103
- result
104
- end
105
-
106
- end
107
-
108
- def metaclass
109
- class << self; self; end
110
- end
111
-
112
- # rotate Actions
113
- def via_mv; rotator.rotate_via_mv(last_result); end
114
- def via_ssh; rotator.rotate_via_ssh(last_result); end
115
- def via_ftp; rotator.rotate_via_ftp(last_result); end
116
- def via_s3; rotator.rotate_via_s3(last_result); end
117
-
118
- # By default, +:content+ can perform one of three actions
119
- # * +:is_file+
120
- # * +:is_folder+
121
- # + +:is_contents_of+
122
- #
123
- # Examples:
124
- # action :content, :is_file => "/path/to/file" # content is a single file
125
- # action :content, :is_folder => "/path/to/folder" # content is the folder itself
126
- # action :content, :is_contents_of => "/path/to/other/folder" # files in folder/
127
- #
128
- # +:is_file+ and +:is_folder+ are basically the same thing in that they
129
- # backup the whole file/folder whereas +:is_contents_of+ backs up the
130
- # <em>contents</em> of the given folder.
131
- #
132
- # Note that +:is_contents_of+ performs a very spcific action:
133
- # * a temporary directory is created
134
- # * all of the files are moved (including subdirectories) into the temporary directory
135
- # * the archive is created from the temporary directory
136
- #
137
- # If you wish to copy the files out of the original directory instead of
138
- # moving them. Then you may specify the +copy+ option passing a +true+
139
- # value like so:
140
- #
141
- # action :content, :is_contents_of => "/path/to/other/folder",
142
- # :copy => true
143
- #
144
- # This will copy recursively.
145
- #
146
- # If this is not your desired behavior then you can easily write your own.
147
- # Also, these options only work for local files. If you are getting the
148
- # files from a foreign server you will have to write a custom +:content+
149
- # method.
150
- #
151
- def content(opts={})
152
- return opts[:is_file] if opts[:is_file]
153
- return opts[:is_folder] if opts[:is_folder]
154
- if opts[:is_contents_of]
155
- orig = opts[:is_contents_of]
156
- tmpdir = c[:tmp_dir] + "/tmp_" + Time.now.strftime("%Y%m%d%H%M%S") +"_#{rand}"
157
- new_orig = tmpdir + "/" + File.basename(orig)
158
- mkdir_p tmpdir
159
- mkdir_p new_orig
160
- if opts[:copy]
161
- cp_r orig + '/.', new_orig
162
- else
163
- mv orig + '/.', new_orig
164
- end
165
- dirty_file new_orig
166
- return new_orig
167
- end
168
- if opts[:is_hg_repository]
169
- orig = opts[:is_hg_repository]
170
- name = opts[:as] || File.basename(orig)
171
- new_orig = c[:tmp_dir] + '/' + name
172
- sh "hg clone #{orig} #{new_orig}"
173
- dirty_file new_orig
174
- return new_orig
175
- end
176
- raise "Unknown option in :content. Try :is_file, :is_folder " +
177
- ":is_contents_of or :is_hg_repository"
178
- end
179
-
180
- # Given name of a file in +string+ adds that file to @dirty_files. These
181
- # files will be removed when the +cleanup+ task is called.
182
- def dirty_file(string)
183
- @dirty_files << string
184
- end
185
-
186
- # +cleanup+ takes every element from @dirty_files and performs an +rm -rf+ on the value
187
- def cleanup(opts={})
188
- dirty_files.each do |f|
189
- rm_rf f
190
- end
191
- end
192
-
193
- private
194
- def define_method(name, &block)
195
- metaclass.send(:define_method, name, &block)
196
- end
197
-
198
- def store_result(result)
199
- @result_history.push result
200
- end
201
-
202
- def last_result
203
- @result_history.last
204
- end
205
-
206
- end
207
-
208
- end
@@ -1,200 +0,0 @@
1
- require 'rake'
2
-
3
- module Backup
4
- include FileUtils
5
- # An Actor is the entity that actually does the work of determining which
6
- # servers should be the target of a particular task, and of executing the
7
- # task on each of them in parallel. An Actor is never instantiated
8
- # directly--rather, you create a new Configuration instance, and access the
9
- # new actor via Configuration#actor.
10
- class Actor
11
- # The configuration instance associated with this actor.
12
- attr_reader :configuration
13
-
14
- # Alias for #configuration
15
- alias_method :c, :configuration
16
-
17
- # A hash of the tasks known to this actor, keyed by name. The values are
18
- # instances of Actor::Action.
19
- attr_reader :action
20
-
21
- # A stack of the results of the actions called
22
- attr_reader :result_history
23
-
24
- # the rotator instance
25
- attr_reader :rotator
26
-
27
- # Returns an Array of Strings specifying dirty files. These files will be
28
- # +rm -rf+ when the +cleanup+ task is called.
29
- attr_reader :dirty_files
30
-
31
- class Action #:nodoc:
32
- attr_reader :name, :actor, :options
33
-
34
- def initialize(name, actor, options)
35
- @name, @actor, @options = name, actor, options
36
- end
37
- end
38
-
39
- def initialize(config) #:nodoc:
40
- @configuration = config
41
- @action = {}
42
- @result_history = []
43
- @dirty_files = []
44
- @rotator = Backup::Rotator.new(self)
45
- end
46
-
47
- # each action in the action_order is part of the chain. so you start by
48
- # setting the output as 'nil' then you try to call before_ action, then
49
- # store the output, then cal action with the args if action takes the args
50
- # you are sending. if it doesnt give an intelligent error message. do this
51
- # for all actions. then call after_action with the output if it exists.
52
- # each time out are calilng the method with the arguemtns f the method
53
- # exists and the method takes the arguments.
54
- def start_process!
55
- configuration[:action_order].each do |a|
56
- self.send_and_store("before_" + a)
57
- self.send_and_store(a)
58
- self.send_and_store("after_" + a)
59
- end
60
- last_result
61
- end
62
-
63
- def send_and_store(name)
64
- store_result self.send(name) if self.respond_to? name
65
- end
66
-
67
- # Define a new task for this actor. The block will be invoked when this
68
- # task is called.
69
- # todo, this might be more complex if the before and after tasks are going
70
- # to be part of the input and output chain
71
- def define_action(name, options={}, &block)
72
- @action[name] = (options[:action_class] || Action).new(name, self, options)
73
-
74
- if self.respond_to?(name) && !( block_given? || options[:method] )
75
- # if it was already defined and we aren't trying to re-define it then
76
- # what we are trying to do is define it the same way it is defined now
77
- # only with options being sent to it.
78
- metaclass.send(:alias_method, "old_#{name}".intern, name)
79
- #self.class.send(:alias_method, "old_#{name}".intern, name)
80
- #define_method("#{name.to_s}_new".intern) do
81
- define_method(name) do
82
- begin
83
- result = self.send("old_#{name}", options)
84
- end
85
- result
86
- end
87
- return
88
- end
89
-
90
- define_method(name) do
91
- #logger.debug "executing task #{name}"
92
- begin
93
- if block_given?
94
- result = instance_eval( &block )
95
- elsif options[:method]
96
- #result = self.send(options[:method], options[:args])
97
- result = self.send(options[:method])
98
- # here we need to have a thing where we can send the arguments
99
- # define the method 'content' so that would take the other options
100
- # if there are options (any hash) just send along that hash. this needs more work
101
- end
102
- end
103
- result
104
- end
105
-
106
- end
107
-
108
- def metaclass
109
- class << self; self; end
110
- end
111
-
112
- # rotate Actions
113
- def via_mv; rotator.rotate_via_mv(last_result); end
114
- def via_ssh; rotator.rotate_via_ssh(last_result); end
115
- def via_ftp; rotator.rotate_via_ftp(last_result); end
116
- def via_s3; rotator.rotate_via_s3(last_result); end
117
-
118
- # By default, +:content+ can perform one of three actions
119
- # * +:is_file+
120
- # * +:is_folder+
121
- # + +:is_contents_of+
122
- #
123
- # Examples:
124
- # action :content, :is_file => "/path/to/file" # content is a single file
125
- # action :content, :is_folder => "/path/to/folder" # content is the folder itself
126
- # action :content, :is_contents_of => "/path/to/other/folder" # files in folder/
127
- #
128
- # +:is_file+ and +:is_folder+ are basically the same thing in that they
129
- # backup the whole file/folder whereas +:is_contents_of+ backs up the
130
- # <em>contents</em> of the given folder.
131
- #
132
- # Note that +:is_contents_of+ performs a very spcific action:
133
- # * a temporary directory is created
134
- # * all of the files are moved (including subdirectories) into the temporary directory
135
- # * the archive is created from the temporary directory
136
- #
137
- # If you wish to copy the files out of the original directory instead of
138
- # moving them. Then you may specify the +copy+ option passing a +true+
139
- # value like so:
140
- #
141
- # action :content, :is_contents_of => "/path/to/other/folder",
142
- # :copy => true
143
- #
144
- # This will copy recursively.
145
- #
146
- # If this is not your desired behavior then you can easily write your own.
147
- # Also, these options only work for local files. If you are getting the
148
- # files from a foreign server you will have to write a custom +:content+
149
- # method.
150
- #
151
- def content(opts={})
152
- return opts[:is_file] if opts[:is_file]
153
- return opts[:is_folder] if opts[:is_folder]
154
- if opts[:is_contents_of]
155
- orig = opts[:is_contents_of]
156
- tmpdir = c[:tmp_dir] + "/tmp_" + Time.now.strftime("%Y%m%d%H%M%S") +"_#{rand}"
157
- new_orig = tmpdir + "/" + File.basename(orig)
158
- mkdir_p tmpdir
159
- mkdir_p new_orig
160
- if opts[:copy]
161
- cp_r orig + '/.', new_orig
162
- else
163
- mv orig + '/.', new_orig
164
- end
165
- dirty_file new_orig
166
- return new_orig
167
- end
168
- raise "Unknown option in :content. Try :is_file, :is_folder " +
169
- "or :is_contents_of"
170
- end
171
-
172
- # Given name of a file in +string+ adds that file to @dirty_files. These
173
- # files will be removed when the +cleanup+ task is called.
174
- def dirty_file(string)
175
- @dirty_files << string
176
- end
177
-
178
- # +cleanup+ takes every element from @dirty_files and performs an +rm -rf+ on the value
179
- def cleanup(opts={})
180
- dirty_files.each do |f|
181
- rm_rf f
182
- end
183
- end
184
-
185
- private
186
- def define_method(name, &block)
187
- metaclass.send(:define_method, name, &block)
188
- end
189
-
190
- def store_result(result)
191
- @result_history.push result
192
- end
193
-
194
- def last_result
195
- @result_history.last
196
- end
197
-
198
- end
199
-
200
- end