yore 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +0 -6
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/bin/yore +0 -2
- data/lib/yore/yore_core.rb +27 -114
- data/yore.gemspec +5 -8
- metadata +3 -13
data/README.rdoc
CHANGED
@@ -15,12 +15,6 @@ and can use Amazon S3 for storage.
|
|
15
15
|
* Compressed, encrypted, single file backups of folders and mysql databases
|
16
16
|
* Can be called regularly eg. by cron
|
17
17
|
* Backups can be uploaded to Amazon S3
|
18
|
-
* will later remove old files that don't match the configurable scheme for backup history,
|
19
|
-
but keeping a useful history eg.
|
20
|
-
- backup every day
|
21
|
-
- keep 2 weeks of daily backups
|
22
|
-
- keep 12 weeks of friday backups
|
23
|
-
- keep the first friday backup of each month forever
|
24
18
|
* Can automatically collect and compress database all user data from particular applications
|
25
19
|
to a single file, and restore to another server. Known applications are Rails-centric but others
|
26
20
|
can be manually configured.
|
data/Rakefile
CHANGED
@@ -12,9 +12,8 @@ begin
|
|
12
12
|
gem.authors = ["buzzware"]
|
13
13
|
gem.rubyforge_project = "buzzware"
|
14
14
|
gem.add_dependency('cmdparse', '>= 2.0.2')
|
15
|
-
gem.add_dependency('buzzcore', '>= 0.
|
15
|
+
gem.add_dependency('buzzcore', '>= 0.3.1')
|
16
16
|
gem.add_dependency('nokogiri', '>= 1.3.3')
|
17
|
-
gem.add_dependency('buzzcore', '>= 0.2.6')
|
18
17
|
gem.add_dependency('aws-s3', '>= 0.6.2')
|
19
18
|
gem.add_development_dependency "thoughtbot-shoulda"
|
20
19
|
#gem.files.include %w(
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/bin/yore
CHANGED
data/lib/yore/yore_core.rb
CHANGED
@@ -13,64 +13,6 @@ THIS_DIR = File.dirname(THIS_FILE)
|
|
13
13
|
|
14
14
|
module YoreCore
|
15
15
|
|
16
|
-
class KeepDaily
|
17
|
-
|
18
|
-
attr_reader :keep_age
|
19
|
-
|
20
|
-
def initialize(aKeepAge=14)
|
21
|
-
@keep_age = aKeepAge
|
22
|
-
end
|
23
|
-
|
24
|
-
def is?
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
def age(aDate)
|
29
|
-
|
30
|
-
end
|
31
|
-
def keep?(aDate)
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class KeepWeekly
|
37
|
-
|
38
|
-
attr_reader :keep_age
|
39
|
-
|
40
|
-
def initialize(aKeepAge=14)
|
41
|
-
@keep_age = aKeepAge
|
42
|
-
end
|
43
|
-
|
44
|
-
def is?
|
45
|
-
|
46
|
-
end
|
47
|
-
def age(aDate)
|
48
|
-
|
49
|
-
end
|
50
|
-
def keep?(aDate)
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class KeepMonthly
|
56
|
-
|
57
|
-
attr_reader :keep_age
|
58
|
-
|
59
|
-
def initialize(aKeepAge=14)
|
60
|
-
@keep_age = aKeepAge
|
61
|
-
end
|
62
|
-
|
63
|
-
def is?
|
64
|
-
|
65
|
-
end
|
66
|
-
def age(aDate)
|
67
|
-
|
68
|
-
end
|
69
|
-
def keep?(aDate)
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
16
|
class Yore
|
75
17
|
|
76
18
|
DEFAULT_CONFIG = {
|
@@ -78,9 +20,6 @@ module YoreCore
|
|
78
20
|
:basepath => String,
|
79
21
|
:backup_id => String,
|
80
22
|
:backup_email => String,
|
81
|
-
:keep_daily => 14,
|
82
|
-
:keep_weekly => 12,
|
83
|
-
:keep_monthly => 12,
|
84
23
|
:crypto_iv => "3A63775C1E3F291B0925578165EB917E", # apparently a string of up to 32 random hex digits
|
85
24
|
:crypto_key => "07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE", # apparently a string of up to 64 random hex digits
|
86
25
|
:first_hour => 4,
|
@@ -105,7 +44,6 @@ module YoreCore
|
|
105
44
|
attr_reader :config
|
106
45
|
attr_reader :logger
|
107
46
|
attr_reader :reporter
|
108
|
-
attr_reader :keepers
|
109
47
|
attr_reader :s3client
|
110
48
|
|
111
49
|
def initialize(aConfig=nil)
|
@@ -133,7 +71,7 @@ module YoreCore
|
|
133
71
|
#aOptions may require {:basepath => File.dirname(File.expand_path(job))}
|
134
72
|
def self.launch(aConfigXml,aCmdOptions=nil,aOptions=nil)
|
135
73
|
if !aConfigXml
|
136
|
-
path = MiscUtils.
|
74
|
+
path = MiscUtils.canonize_path('yore.config.xml',aOptions && aOptions[:basepath])
|
137
75
|
aConfigXml = path if File.exists?(path)
|
138
76
|
end
|
139
77
|
result = Yore.new()
|
@@ -163,46 +101,33 @@ module YoreCore
|
|
163
101
|
return dbyml[aRailsEnv] && dbyml[aRailsEnv].symbolize_keys
|
164
102
|
end
|
165
103
|
|
166
|
-
def self.find_upwards(aStartPath,aPath)
|
167
|
-
curr_path = File.expand_path(aStartPath)
|
168
|
-
while curr_path && !(test_path_exists = File.exists?(test_path = File.join(curr_path,aPath))) do
|
169
|
-
curr_path = MiscUtils.path_parent(curr_path)
|
170
|
-
end
|
171
|
-
curr_path && test_path_exists ? test_path : nil
|
172
|
-
end
|
173
|
-
|
174
104
|
def expand_app_option(kind=nil)
|
175
105
|
kind = config[:kind] unless kind && !kind.empty?
|
176
106
|
return nil unless kind && !kind.empty?
|
177
107
|
config.xmlRoot = create_empty_config_xml() if !config.xmlRoot
|
108
|
+
xmlSources = XmlUtils.single_node(config.xmlRoot,'/Yore/Sources') || XmlUtils.add_xml_from_string('<Sources/>',XmlUtils.single_node(config.xmlRoot,'/Yore'))
|
178
109
|
case kind
|
179
110
|
when 'spree'
|
180
111
|
# add file source
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
EOS
|
188
|
-
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
189
|
-
end
|
112
|
+
strSource = <<-EOS
|
113
|
+
<Source Type="File">
|
114
|
+
<IncludePath BasePath="public/assets">products</IncludePath>
|
115
|
+
</Source>
|
116
|
+
EOS
|
117
|
+
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
190
118
|
expand_app_option('rails') # do again
|
191
119
|
#
|
192
120
|
# if capistrano deployed, uploads are assumed to be in shared/uploads
|
193
121
|
#
|
194
122
|
when 'browsercms'
|
195
123
|
# add file source
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
EOS
|
204
|
-
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
205
|
-
end
|
124
|
+
uploadParent = MiscUtils.expand_magic_path('.../shared',config[:basepath]) || File.join(config[:basepath],'tmp')
|
125
|
+
strSource = <<-EOS
|
126
|
+
<Source Type="File">
|
127
|
+
<IncludePath BasePath="#{uploadParent}">uploads</IncludePath>
|
128
|
+
</Source>
|
129
|
+
EOS
|
130
|
+
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
206
131
|
expand_app_option('rails') # do again
|
207
132
|
when 'rails'
|
208
133
|
# * add db source from database.yml
|
@@ -210,18 +135,16 @@ module YoreCore
|
|
210
135
|
#if (dbyml = YAML::load(File.open(File.expand_path('config/database.yml',config[:basepath]))) rescue nil)
|
211
136
|
# if env = (config[:RAILS_ENV] && config[:RAILS_ENV]!='' && config[:RAILS_ENV])
|
212
137
|
# if (db_details = dbyml[env]) &&
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
<
|
218
|
-
<
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
224
|
-
end
|
138
|
+
|
139
|
+
#<Database Name="#{db_details[:database]}" Host="#{db_details[:host]}" User="#{db_details[:username]}" Password="#{db_details[:password]}">
|
140
|
+
strSource = <<-EOS
|
141
|
+
<Source Type="MySql" >
|
142
|
+
<Database Yml="config/database.yml">
|
143
|
+
<ArchiveFile>rails_app.sql</ArchiveFile>
|
144
|
+
</Database>
|
145
|
+
</Source>
|
146
|
+
EOS
|
147
|
+
XmlUtils.add_xml_from_string(strSource,xmlSources)
|
225
148
|
end
|
226
149
|
end
|
227
150
|
|
@@ -230,7 +153,7 @@ module YoreCore
|
|
230
153
|
def configure(aConfig,aCmdOptions = nil,aOptions = nil)
|
231
154
|
config_to_read = {}
|
232
155
|
if aConfig.is_a?(String)
|
233
|
-
aConfig =
|
156
|
+
aConfig = MiscUtils.canonize_path(aConfig)
|
234
157
|
logger.info "Job file: #{aConfig}"
|
235
158
|
op = {:basepath => File.dirname(aConfig)}
|
236
159
|
xmlString = MiscUtils.string_from_file(aConfig)
|
@@ -257,15 +180,10 @@ module YoreCore
|
|
257
180
|
aCmdOptions.each{|k,v| config_to_read[k.to_sym] = v} if aCmdOptions # merge command options
|
258
181
|
config_to_read.merge!(aOptions) if aOptions # merge options
|
259
182
|
config.read(config_to_read)
|
260
|
-
config[:basepath] =
|
183
|
+
config[:basepath] = MiscUtils.canonize_path(config[:basepath],Dir.pwd)
|
261
184
|
|
262
185
|
expand_app_option()
|
263
186
|
|
264
|
-
@keepers = Array.new
|
265
|
-
@keepers << KeepDaily.new(config[:keep_daily])
|
266
|
-
@keepers << KeepWeekly.new(config[:keep_weekly])
|
267
|
-
@keepers << KeepMonthly.new(config[:keep_monthly])
|
268
|
-
|
269
187
|
@s3client = ::AWSS3Client.new()
|
270
188
|
logger.info "Using S3 key #{@s3client.credentials[:s3_access_key_id]}"
|
271
189
|
end
|
@@ -310,11 +228,6 @@ module YoreCore
|
|
310
228
|
filemap
|
311
229
|
end
|
312
230
|
|
313
|
-
def keep_file?(aFile)
|
314
|
-
|
315
|
-
end
|
316
|
-
|
317
|
-
|
318
231
|
# By default, GNU tar suppresses a leading slash on absolute pathnames while creating or reading a tar archive. (You can suppress this with the -p option.)
|
319
232
|
# tar : http://my.safaribooksonline.com/0596102461/I_0596102461_CHP_3_SECT_9#snippet
|
320
233
|
|
data/yore.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{yore}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["buzzware"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-16}
|
13
13
|
s.default_executable = %q{yore}
|
14
14
|
s.description = %q{yore (as in "days of yore") is a user data management utility for web applications.}
|
15
15
|
s.email = %q{contact@buzzware.com.au}
|
@@ -64,24 +64,21 @@ Gem::Specification.new do |s|
|
|
64
64
|
|
65
65
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
66
66
|
s.add_runtime_dependency(%q<cmdparse>, [">= 2.0.2"])
|
67
|
-
s.add_runtime_dependency(%q<buzzcore>, [">= 0.
|
67
|
+
s.add_runtime_dependency(%q<buzzcore>, [">= 0.3.1"])
|
68
68
|
s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
|
69
|
-
s.add_runtime_dependency(%q<buzzcore>, [">= 0.2.6"])
|
70
69
|
s.add_runtime_dependency(%q<aws-s3>, [">= 0.6.2"])
|
71
70
|
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
72
71
|
else
|
73
72
|
s.add_dependency(%q<cmdparse>, [">= 2.0.2"])
|
74
|
-
s.add_dependency(%q<buzzcore>, [">= 0.
|
73
|
+
s.add_dependency(%q<buzzcore>, [">= 0.3.1"])
|
75
74
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
76
|
-
s.add_dependency(%q<buzzcore>, [">= 0.2.6"])
|
77
75
|
s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
|
78
76
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
79
77
|
end
|
80
78
|
else
|
81
79
|
s.add_dependency(%q<cmdparse>, [">= 2.0.2"])
|
82
|
-
s.add_dependency(%q<buzzcore>, [">= 0.
|
80
|
+
s.add_dependency(%q<buzzcore>, [">= 0.3.1"])
|
83
81
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
84
|
-
s.add_dependency(%q<buzzcore>, [">= 0.2.6"])
|
85
82
|
s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
|
86
83
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
87
84
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- buzzware
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-16 00:00:00 +08:00
|
13
13
|
default_executable: yore
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.1
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: nokogiri
|
@@ -42,16 +42,6 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 1.3.3
|
44
44
|
version:
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: buzzcore
|
47
|
-
type: :runtime
|
48
|
-
version_requirement:
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 0.2.6
|
54
|
-
version:
|
55
45
|
- !ruby/object:Gem::Dependency
|
56
46
|
name: aws-s3
|
57
47
|
type: :runtime
|