astrails-safe 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/astrails/safe.rb +2 -0
- data/lib/astrails/safe/archive.rb +2 -0
- data/lib/astrails/safe/config/builder.rb +1 -1
- data/lib/astrails/safe/engine.rb +19 -17
- data/lib/astrails/safe/mysqldump.rb +2 -0
- data/lib/astrails/safe/tmp_file.rb +4 -0
- data/lib/extensions/mktmpdir.rb +45 -0
- data/safe.gemspec +2 -1
- data/templates/script.rb +6 -6
- metadata +2 -1
data/lib/astrails/safe.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'extensions/mktmpdir'
|
1
2
|
require 'astrails/safe/tmp_file'
|
2
3
|
require 'astrails/safe/config/node'
|
3
4
|
require 'astrails/safe/config/builder'
|
@@ -20,6 +21,7 @@ module Astrails
|
|
20
21
|
|
21
22
|
Astrails::Safe::Mysqldump.run(config[:mysqldump, :databases], timestamp)
|
22
23
|
Astrails::Safe::Archive.run(config[:tar, :archives], timestamp)
|
24
|
+
Astrails::Safe::TmpFile.cleanup
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -3,7 +3,7 @@ module Astrails
|
|
3
3
|
module Config
|
4
4
|
class Builder
|
5
5
|
COLLECTIONS = %w/database archive/
|
6
|
-
ITEMS = %w/s3 key secret bucket path gpg password keep local mysqldump options
|
6
|
+
ITEMS = %w/s3 key secret bucket path prefix gpg password keep local mysqldump options
|
7
7
|
user socket tar files exclude/
|
8
8
|
NAMES = COLLECTIONS + ITEMS
|
9
9
|
def initialize(node)
|
data/lib/astrails/safe/engine.rb
CHANGED
@@ -21,7 +21,7 @@ module Astrails
|
|
21
21
|
def run
|
22
22
|
puts "#{kind}: #{@id}" if $_VERBOSE
|
23
23
|
|
24
|
-
stream = Stream.new(@config, command,
|
24
|
+
stream = Stream.new(@config, command, backup_filepath)
|
25
25
|
stream.run # execute backup comand. result is file stream.filename
|
26
26
|
|
27
27
|
# UPLOAD
|
@@ -34,24 +34,26 @@ module Astrails
|
|
34
34
|
|
35
35
|
protected
|
36
36
|
|
37
|
-
def kind
|
38
|
-
|
37
|
+
def self.kind
|
38
|
+
name.split('::').last.downcase
|
39
39
|
end
|
40
|
-
|
41
|
-
|
42
|
-
@backup_filename ||= "#{kind}-#{id}.#{timestamp}.tar"
|
40
|
+
def kind
|
41
|
+
self.class.kind
|
43
42
|
end
|
44
43
|
|
45
44
|
def expand(path)
|
46
|
-
path
|
45
|
+
path .
|
46
|
+
gsub(/:kind\b/, kind) .
|
47
|
+
gsub(/:id\b/, id) .
|
48
|
+
gsub(/:timestamp\b/, timestamp)
|
47
49
|
end
|
48
50
|
|
49
|
-
def
|
50
|
-
@
|
51
|
+
def s3_prefix
|
52
|
+
@s3_prefix ||= expand(@config[:s3, :prefix] || ":kind/:id")
|
51
53
|
end
|
52
54
|
|
53
|
-
def
|
54
|
-
@
|
55
|
+
def backup_filepath
|
56
|
+
@backup_filepath ||= File.expand_path(expand(@config[:path] || raise(RuntimeError, "missing :path in configuration"))) << "." << extension
|
55
57
|
end
|
56
58
|
|
57
59
|
|
@@ -63,7 +65,7 @@ module Astrails
|
|
63
65
|
|
64
66
|
return unless bucket && key && secret
|
65
67
|
|
66
|
-
upload_path = File.join(
|
68
|
+
upload_path = File.join(s3_prefix, File.basename(filename))
|
67
69
|
|
68
70
|
puts "Uploading file #{filename} to #{bucket}/#{upload_path}" if $_VERBOSE || $DRY_RUN
|
69
71
|
if $LOCAL
|
@@ -74,7 +76,7 @@ module Astrails
|
|
74
76
|
|
75
77
|
unless $DRY_RUN
|
76
78
|
AWS::S3::Bucket.create(bucket)
|
77
|
-
AWS::S3::S3Object.store(
|
79
|
+
AWS::S3::S3Object.store(upload_path, open(filename), bucket)
|
78
80
|
end
|
79
81
|
end
|
80
82
|
puts "...done" if $_VERBOSE
|
@@ -112,12 +114,12 @@ module Astrails
|
|
112
114
|
|
113
115
|
base = File.basename(filename).split(".").first
|
114
116
|
|
115
|
-
puts "listing files in #{bucket}:#{
|
116
|
-
files = AWS::S3::Bucket.objects(bucket, :prefix =>
|
117
|
-
puts files.collect
|
117
|
+
puts "listing files in #{bucket}:#{s3_prefix}"
|
118
|
+
files = AWS::S3::Bucket.objects(bucket, :prefix => s3_prefix, :max_keys => keep * 2)
|
119
|
+
puts files.collect {|x| x.key} if $_VERBOSE
|
118
120
|
|
119
121
|
files = files.
|
120
|
-
collect
|
122
|
+
collect {|x| x.key}.
|
121
123
|
select{|f| File.basename(f)[0..(base.length - 1)] == base}.
|
122
124
|
sort
|
123
125
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
|
3
|
+
unless Dir.respond_to?(:mktmpdir)
|
4
|
+
# backward compat for 1.8.6
|
5
|
+
class Dir
|
6
|
+
def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil)
|
7
|
+
case prefix_suffix
|
8
|
+
when nil
|
9
|
+
prefix = "d"
|
10
|
+
suffix = ""
|
11
|
+
when String
|
12
|
+
prefix = prefix_suffix
|
13
|
+
suffix = ""
|
14
|
+
when Array
|
15
|
+
prefix = prefix_suffix[0]
|
16
|
+
suffix = prefix_suffix[1]
|
17
|
+
else
|
18
|
+
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
19
|
+
end
|
20
|
+
tmpdir ||= Dir.tmpdir
|
21
|
+
t = Time.now.strftime("%Y%m%d")
|
22
|
+
n = nil
|
23
|
+
begin
|
24
|
+
path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
25
|
+
path << "-#{n}" if n
|
26
|
+
path << suffix
|
27
|
+
Dir.mkdir(path, 0700)
|
28
|
+
rescue Errno::EEXIST
|
29
|
+
n ||= 0
|
30
|
+
n += 1
|
31
|
+
retry
|
32
|
+
end
|
33
|
+
|
34
|
+
if block_given?
|
35
|
+
begin
|
36
|
+
yield path
|
37
|
+
ensure
|
38
|
+
FileUtils.remove_entry_secure path
|
39
|
+
end
|
40
|
+
else
|
41
|
+
path
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/safe.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "safe"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.9"
|
4
4
|
s.date = "2009-03-15"
|
5
5
|
s.summary = "Astrails Safe"
|
6
6
|
s.email = "we@astrails.com"
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
lib/astrails/safe/engine.rb
|
19
19
|
lib/astrails/safe/archive.rb
|
20
20
|
lib/astrails/safe/tmp_file.rb
|
21
|
+
lib/extensions/mktmpdir.rb
|
21
22
|
templates/script.rb
|
22
23
|
safe.gemspec
|
23
24
|
)
|
data/templates/script.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
safe do
|
2
|
-
#
|
2
|
+
# backup file path (full, including filename)
|
3
|
+
# Note: do not include .tar, .sql, .gz or .pgp, it will be added automatically
|
3
4
|
# supported substitutions:
|
4
5
|
# :kind -> backup 'engine' kind, e.g. "mysqldump" or "archive"
|
5
6
|
# :id -> backup 'id', e.g. "blog", "production", etc.
|
7
|
+
# :timestamp -> current run timestamp (same for all the backups in the same 'run')
|
6
8
|
# you can set separate :path for all backups (or once globally here)
|
7
|
-
path "/backup/:kind/:id"
|
9
|
+
path "/backup/:kind/:id-:timestamp"
|
8
10
|
|
9
11
|
## uncomment to enable uploads to Amazon S3
|
10
12
|
## Amazon S3 auth (optional)
|
@@ -12,6 +14,8 @@ safe do
|
|
12
14
|
# key YOUR_S3_KEY
|
13
15
|
# secret YOUR_S3_SECRET
|
14
16
|
# bucket S3_BUCKET
|
17
|
+
# # prefix for uploads to S3. supports same substitution like :path
|
18
|
+
# prefix ":kind/:id" # this is default
|
15
19
|
# end
|
16
20
|
|
17
21
|
## alternative style:
|
@@ -34,8 +38,6 @@ safe do
|
|
34
38
|
# backup mysql databases with mysqldump
|
35
39
|
mysqldump do
|
36
40
|
# you can override any setting from parent in a child:
|
37
|
-
path "/backup/mysql/:id"
|
38
|
-
|
39
41
|
options "-ceKq --single-transaction --create-options"
|
40
42
|
|
41
43
|
user "astrails"
|
@@ -69,8 +71,6 @@ safe do
|
|
69
71
|
|
70
72
|
|
71
73
|
tar do
|
72
|
-
path "/backup/archives"
|
73
|
-
|
74
74
|
# 'archive' is a collection item, just like 'database'
|
75
75
|
# archive "git-repositories" do
|
76
76
|
# # files and directories to backup
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: astrails-safe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Astrails Ltd.
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/astrails/safe/engine.rb
|
41
41
|
- lib/astrails/safe/archive.rb
|
42
42
|
- lib/astrails/safe/tmp_file.rb
|
43
|
+
- lib/extensions/mktmpdir.rb
|
43
44
|
- templates/script.rb
|
44
45
|
- safe.gemspec
|
45
46
|
has_rdoc: false
|