outback 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README +112 -0
- data/VERSION +1 -1
- data/lib/outback/backup.rb +1 -1
- data/lib/outback/directory_source.rb +2 -2
- data/lib/outback/directory_target.rb +6 -3
- data/lib/outback/s3_target.rb +3 -2
- data/lib/outback/target.rb +4 -4
- metadata +4 -3
data/README
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
== Welcome to Outback
|
2
|
+
|
3
|
+
Outback is a Ruby backup tool, enabling you to create backups of
|
4
|
+
your server files and databases and storing them in a local or
|
5
|
+
remote repository.
|
6
|
+
|
7
|
+
Using a simple DSL, you can specify multiple sources that generate
|
8
|
+
backup data, as well as multiple targets, where backups are going
|
9
|
+
to be stored.
|
10
|
+
|
11
|
+
Outback configuration files are pure Ruby, so writing dynamic
|
12
|
+
configurations or even customized backup sources and targets is a
|
13
|
+
piece of cake.
|
14
|
+
|
15
|
+
|
16
|
+
== A simple configuration example
|
17
|
+
|
18
|
+
# You can instantiate as many configurations as you like
|
19
|
+
# Outback will enqueue and execute all configurations that were
|
20
|
+
# instantiated during a single run.
|
21
|
+
|
22
|
+
Outback::Configuration.new 'name' do
|
23
|
+
source :directory, '/ver/www' do
|
24
|
+
exclude '/var/www/foo'
|
25
|
+
exclude '/var/www/icons/*.png'
|
26
|
+
end
|
27
|
+
|
28
|
+
source :mysql do
|
29
|
+
user 'mysqlusername'
|
30
|
+
password 'mysqlpassword'
|
31
|
+
host 'localhost'
|
32
|
+
exclude 'mysql', 'information_schema'
|
33
|
+
|
34
|
+
#
|
35
|
+
# If you do not specify a specific database, all databases
|
36
|
+
# will be dumped and included in the backup
|
37
|
+
# database 'specific_database'
|
38
|
+
end
|
39
|
+
|
40
|
+
# Amazon S3 storage
|
41
|
+
target :s3 do
|
42
|
+
access_key 'S3 access key'
|
43
|
+
secret_key 'S3 secret key'
|
44
|
+
bucket 'bucketname'
|
45
|
+
prefix 'backups/daily'
|
46
|
+
|
47
|
+
# Backups will be purged after the time specified here.
|
48
|
+
# Just omit the definition to keep archives forever.
|
49
|
+
ttl 1.month
|
50
|
+
end
|
51
|
+
|
52
|
+
# Store on a local filesystem path
|
53
|
+
target :directory, '/media/backups/daily' do
|
54
|
+
# If you specify the move option, archives will be moved from the temporary
|
55
|
+
# filesystem location in order to speed up things. Otherwise, archives will
|
56
|
+
# be copied. Note that a 'move'-to target must be specified last in the target
|
57
|
+
# chain.
|
58
|
+
move true
|
59
|
+
ttl 1.day
|
60
|
+
user 'root'
|
61
|
+
group 'root'
|
62
|
+
directory_permissions 0700
|
63
|
+
archive_permissions 0600
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
== Default configurations and commandline options
|
69
|
+
|
70
|
+
If you place your backup configurations in the file /etc/outback.conf they
|
71
|
+
will be read automatically when the outback executable is invoked. Make
|
72
|
+
sure to have correct permissions on the configuration files, as they might
|
73
|
+
include database passwords.
|
74
|
+
|
75
|
+
Alternatively, you can pass in the configuration file to read as a
|
76
|
+
commandline argument. The default configuration file in /etc will then be
|
77
|
+
ignored.
|
78
|
+
|
79
|
+
If you have several backup configurations in a single file, say, for daily
|
80
|
+
and monthly backups, you can use the -c commandline option to select the
|
81
|
+
backup to be invoked:
|
82
|
+
|
83
|
+
$ outback -c 'myservername-daily'
|
84
|
+
|
85
|
+
This will run only the backup with the specified name, which enables you to
|
86
|
+
write DRY configurations like this:
|
87
|
+
|
88
|
+
{ :daily => [14.days, 5.days], :monthly => [1.year, 1.year] }.each do |frequency, ttls|
|
89
|
+
s3_ttl, directory_ttl = ttls
|
90
|
+
|
91
|
+
Outback::Configuration.new "yourserver-#{frequency}" do
|
92
|
+
source :directory, '/home'
|
93
|
+
source :directory, '/var/svn'
|
94
|
+
|
95
|
+
target :s3 do
|
96
|
+
access_key 'foo'
|
97
|
+
secret_key 'foo'
|
98
|
+
bucket 'somebucket'
|
99
|
+
prefix "yourserver/#{frequency}"
|
100
|
+
ttl s3_ttl
|
101
|
+
end
|
102
|
+
|
103
|
+
target :directory, "/media/backups/#{frequency}" do
|
104
|
+
move true
|
105
|
+
ttl directory_ttl
|
106
|
+
user 'root'
|
107
|
+
group 'root'
|
108
|
+
directory_permissions 0700
|
109
|
+
archive_permissions 0600
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/lib/outback/backup.rb
CHANGED
@@ -23,10 +23,10 @@ module Outback
|
|
23
23
|
archive_name = Pathname.new(tmpdir).join("#{backup_name}_#{timestamp}_#{source_name}.tar.gz")
|
24
24
|
exclude_list = Pathname.new(tmpdir).join('exclude_list.txt')
|
25
25
|
File.open(exclude_list, 'w') { |f| f << excludes.join("\n") }
|
26
|
-
commandline = "tar --create --file #{archive_name} --preserve-permissions --gzip --
|
26
|
+
commandline = "tar --create --file #{archive_name} --preserve-permissions --gzip --exclude-from #{exclude_list} #{source_dir}"
|
27
27
|
Outback.debug "executing command: #{commandline}"
|
28
28
|
result = `#{commandline}`
|
29
|
-
Outback.debug result
|
29
|
+
#Outback.debug result
|
30
30
|
[TempArchive.new(archive_name, self)]
|
31
31
|
end
|
32
32
|
end
|
@@ -14,6 +14,7 @@ module Outback
|
|
14
14
|
def put(archives)
|
15
15
|
Dir.mkdir(path) unless path.directory?
|
16
16
|
FileUtils.chmod directory_permissions || 0700, path
|
17
|
+
size = 0
|
17
18
|
archives.each do |archive|
|
18
19
|
basename = Pathname.new(archive.filename).basename
|
19
20
|
if move
|
@@ -29,12 +30,14 @@ module Outback
|
|
29
30
|
if user && group
|
30
31
|
Outback.debug "setting owner #{user}, group #{group} for #{archived_file}"
|
31
32
|
FileUtils.chown user, group, archived_file
|
32
|
-
end
|
33
|
+
end
|
34
|
+
size += archived_file.size
|
33
35
|
end
|
36
|
+
Outback.debug "#{move ? 'Moved' : 'Copied'} #{archives.size} archives (#{size} bytes) to directory #{path}"
|
34
37
|
end
|
35
38
|
|
36
|
-
def list_archives
|
37
|
-
path.files(Archive::NAME_PATTERN).map { |f| DirectoryArchive.new(f, self) }
|
39
|
+
def list_archives(name)
|
40
|
+
path.files(Archive::NAME_PATTERN).map { |f| DirectoryArchive.new(f, self) }.select(&its.backup_name == name)
|
38
41
|
end
|
39
42
|
|
40
43
|
end
|
data/lib/outback/s3_target.rb
CHANGED
@@ -20,12 +20,13 @@ module Outback
|
|
20
20
|
object_exists = AWS::S3::S3Object.exists?(object_name, bucket)
|
21
21
|
Outback.debug "Checking if object exists: #{object_exists}"
|
22
22
|
end
|
23
|
+
Outback.debug "Uploaded #{archives.sum(&:size)} bytes to S3"
|
23
24
|
end
|
24
25
|
|
25
|
-
def list_archives
|
26
|
+
def list_archives(name)
|
26
27
|
connect
|
27
28
|
entries = AWS::S3::Bucket.objects(bucket).select { |e| e.key.start_with?(prefix.to_s) && e.key[prefix.to_s.size..-1].match(Archive::NAME_PATTERN) }
|
28
|
-
entries.map { |e| S3Archive.new(e.key, self) }
|
29
|
+
entries.map { |e| S3Archive.new(e.key, self) }.select(&its.backup_name == name)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
data/lib/outback/target.rb
CHANGED
@@ -2,12 +2,12 @@ module Outback
|
|
2
2
|
class Target
|
3
3
|
include Configurable
|
4
4
|
|
5
|
-
def outdated_archives
|
6
|
-
list_archives.select(&:outdated?)
|
5
|
+
def outdated_archives(name)
|
6
|
+
list_archives(name).select(&:outdated?)
|
7
7
|
end
|
8
8
|
|
9
|
-
def purge!
|
10
|
-
outdated_archives.each &:purge!
|
9
|
+
def purge!(name)
|
10
|
+
outdated_archives(name).each &:purge!
|
11
11
|
end
|
12
12
|
|
13
13
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: outback
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matthias Grosser
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- bin/outback
|
86
86
|
- MIT-LICENSE
|
87
87
|
- VERSION
|
88
|
+
- README
|
88
89
|
has_rdoc: true
|
89
90
|
homepage: http://rubygems.org/gems/outback
|
90
91
|
licenses: []
|