yore 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/Manifest.txt +4 -0
- data/README.rdoc +33 -6
- data/bin/yore +22 -7
- data/lib/ihl_ruby/config.rb +95 -0
- data/lib/ihl_ruby/database_utils.rb +89 -0
- data/lib/ihl_ruby/extend_base_classes.rb +6 -0
- data/lib/ihl_ruby/misc_utils.rb +2 -1
- data/lib/ihl_ruby/xml_utils.rb +19 -5
- data/lib/yore.orig.rb +1 -1
- data/lib/yore/yore_core.rb +265 -141
- data/test/S3_test.rb +141 -0
- data/test/loadsave_yore_test.rb +182 -0
- data/test/test_job_b.xml +6 -13
- data/test/yore_test.rb +10 -139
- metadata +7 -4
data/test/S3_test.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'RequirePaths'; require 'require_paths'
|
3
|
+
require_paths '../../..','../lib'
|
4
|
+
require 'ihl_ruby/misc_utils'
|
5
|
+
require 'ihl_ruby/shell_extras'
|
6
|
+
require 'yore/yore_core'
|
7
|
+
require 'test/unit'
|
8
|
+
gem 'Shoulda'; require 'shoulda'
|
9
|
+
require 'fileutils'
|
10
|
+
|
11
|
+
def ensure_clean_bucket(aName)
|
12
|
+
`s3cmd createbucket #{aName}`
|
13
|
+
`s3cmd deleteall #{aName}`
|
14
|
+
end
|
15
|
+
|
16
|
+
# finwa example : yore backup /var/www/joomla/deploy-system/finwa_yore.xml >/dev/null 2>&1
|
17
|
+
|
18
|
+
class S3Test < Test::Unit::TestCase
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@yore = YoreCore::Yore.new
|
22
|
+
end
|
23
|
+
|
24
|
+
should "upload and download files intact" do
|
25
|
+
bucket = 'yore_test'
|
26
|
+
ensure_clean_bucket(bucket)
|
27
|
+
@yore.configure({
|
28
|
+
:bucket => bucket
|
29
|
+
})
|
30
|
+
content = 'this is my test content'
|
31
|
+
temp_dir = MiscUtils.make_temp_dir()
|
32
|
+
temp_file = MiscUtils.make_temp_file(nil, temp_dir, content)
|
33
|
+
puts @yore.upload(temp_file)
|
34
|
+
orig_file = temp_file+'.orig'
|
35
|
+
File.rename(temp_file, orig_file)
|
36
|
+
puts @yore.download(temp_file)
|
37
|
+
down_file_content = MiscUtils.string_from_file(temp_file)
|
38
|
+
assert_equal content, down_file_content
|
39
|
+
end
|
40
|
+
|
41
|
+
should "backup and restore multiple directories of file" do
|
42
|
+
# create a temp dir
|
43
|
+
temp_dir = MiscUtils::make_temp_dir('yore_test')
|
44
|
+
# create source and dest subfolders
|
45
|
+
source_dir = File.expand_path('source',temp_dir)
|
46
|
+
source1 = File.join(source_dir,'source1')
|
47
|
+
source2 = File.join(source_dir,'source2')
|
48
|
+
dest_dir = File.expand_path('dest',temp_dir)
|
49
|
+
bucket = 'yore_test'
|
50
|
+
|
51
|
+
FileUtils.mkdir_p([source1,source2,dest_dir])
|
52
|
+
# create some dirs and files in source
|
53
|
+
['a','a/1','b','c'].each {|p| FileUtils.mkdir_p(File.expand_path(p,source1))}
|
54
|
+
%w(a/blah.txt a/1/blahblah.txt b/apples.txt c/carrots.txt).each do |f|
|
55
|
+
MiscUtils::make_temp_file(f,source1)
|
56
|
+
end
|
57
|
+
['w','x/1','y/2','z'].each {|p| FileUtils.mkdir_p(File.expand_path(p,source2))}
|
58
|
+
%w(w/zonk.txt x/1/eggs.txt y/2/bloop.txt z/zax.txt).each do |f|
|
59
|
+
MiscUtils::make_temp_file(f,source2)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
ensure_clean_bucket(bucket)
|
64
|
+
|
65
|
+
# create job file
|
66
|
+
job_template = <<-EOF
|
67
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
68
|
+
<Yore>
|
69
|
+
<SimpleItems>
|
70
|
+
<Item Name="crypto_iv">3A63775C1E3F291B0925578165EB917E</Item>
|
71
|
+
<Item Name="crypto_key">07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE</Item>
|
72
|
+
<Item Name="prefix">backup</Item>
|
73
|
+
<Item Name="log_level">INFO</Item>
|
74
|
+
<Item Name="bucket">${BUCKET}</Item>
|
75
|
+
</SimpleItems>
|
76
|
+
<Sources>
|
77
|
+
<Source Type="File" BasePath="${SOURCE_DIR}">
|
78
|
+
<IncludePath>source1</IncludePath>
|
79
|
+
<IncludePath>source2</IncludePath>
|
80
|
+
</Source>
|
81
|
+
</Sources>
|
82
|
+
</Yore>
|
83
|
+
EOF
|
84
|
+
|
85
|
+
job_content = StringUtils::render_template(job_template,{
|
86
|
+
'SOURCE_DIR' => source_dir,
|
87
|
+
'BUCKET' => bucket
|
88
|
+
})
|
89
|
+
MiscUtils::string_to_file(job_content,job_file = MiscUtils::temp_file)
|
90
|
+
|
91
|
+
# call yore script with ruby from the command line, then download result and check contents
|
92
|
+
begin
|
93
|
+
_xmlRoot = XmlUtils.get_xml_root(job_content)
|
94
|
+
cmd_options = {:config => job_file}
|
95
|
+
@yore_upload = YoreCore::Yore::launch(_xmlRoot,cmd_options,{:basepath => File.dirname(File.expand_path(job_file))})
|
96
|
+
@yore_upload.backup([job_file],cmd_options)
|
97
|
+
rescue ::StandardError => e
|
98
|
+
flunk e.inspect
|
99
|
+
end
|
100
|
+
|
101
|
+
#puts result
|
102
|
+
yore = YoreCore::Yore.new()
|
103
|
+
yore.configure({
|
104
|
+
:bucket => bucket
|
105
|
+
})
|
106
|
+
|
107
|
+
retrieved_fname = File.expand_path(yore.encode_file_name(), dest_dir)
|
108
|
+
collection_fname = MiscUtils::temp_file
|
109
|
+
|
110
|
+
puts yore.download(retrieved_fname)
|
111
|
+
puts yore.unpack(retrieved_fname,collection_fname)
|
112
|
+
|
113
|
+
filelist = MiscUtils::recursive_file_list(source_dir,false)
|
114
|
+
|
115
|
+
# check contains filelist files
|
116
|
+
cmd = "tar --list --file=#{collection_fname}"
|
117
|
+
filelist_out = yore.shell(cmd)
|
118
|
+
filelist_out = filelist_out.split("\n").sort
|
119
|
+
assert_equal filelist, filelist_out
|
120
|
+
end
|
121
|
+
|
122
|
+
should "handle test_file_b" do
|
123
|
+
aController = YoreCore::Yore.new # main program object
|
124
|
+
srcdir = '/tmp/yoretest'
|
125
|
+
FileUtils.rm_rf srcdir+'/*'
|
126
|
+
FileUtils.mkdir_p srcdir
|
127
|
+
['a','a/1','b','c'].each {|p| FileUtils.mkdir_p(File.expand_path(p,srcdir))}
|
128
|
+
%w(a/blah.txt a/1/blahblah.txt b/apples.txt c/carrots.txt).each do |f|
|
129
|
+
MiscUtils::make_temp_file(f,srcdir)
|
130
|
+
end
|
131
|
+
|
132
|
+
job = File.expand_path('../../test/test_job_b.xml',THIS_DIR)
|
133
|
+
aController.configure(job)
|
134
|
+
aController.backup([job])
|
135
|
+
end
|
136
|
+
|
137
|
+
should "provide configurable criteria for keeping old files"
|
138
|
+
|
139
|
+
should "clean a folder full of files, removing files that don't match configurable criteria for keeping old files"
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'RequirePaths'; require 'require_paths'
|
3
|
+
require_paths '../../..','../lib'
|
4
|
+
|
5
|
+
require 'ihl_ruby/misc_utils'
|
6
|
+
require 'ihl_ruby/config'
|
7
|
+
require 'ihl_ruby/shell_extras'
|
8
|
+
require 'yore/yore_core'
|
9
|
+
require 'test/unit'
|
10
|
+
gem 'Shoulda'; require 'shoulda'
|
11
|
+
require 'fileutils'
|
12
|
+
|
13
|
+
|
14
|
+
class LoadsaveYoreTest < Test::Unit::TestCase
|
15
|
+
|
16
|
+
def setup
|
17
|
+
#@yore = YoreCore::Yore.new
|
18
|
+
end
|
19
|
+
|
20
|
+
should "save a spree applications data to a file and then load it into a different project" do
|
21
|
+
require "mysql"
|
22
|
+
cred = Credentials.new()
|
23
|
+
db_details = {
|
24
|
+
:username => cred[:mysql_username],
|
25
|
+
:password => cred[:mysql_password]
|
26
|
+
}
|
27
|
+
|
28
|
+
def create_spree_db(aDbDetails)
|
29
|
+
assert mysql = Mysql.new("localhost",aDbDetails[:username],aDbDetails[:password])
|
30
|
+
mysql.query("DROP DATABASE IF EXISTS #{aDbDetails[:database]}")
|
31
|
+
mysql.query("CREATE DATABASE #{aDbDetails[:database]}")
|
32
|
+
#assert mysql.query("GRANT ALL ON #{aName}.* TO rubyuser@localhost IDENTIFIED by 'ruby'")
|
33
|
+
mysql.select_db(aDbDetails[:database])
|
34
|
+
mysql.query("
|
35
|
+
CREATE TABLE products (
|
36
|
+
id int(11) NOT NULL AUTO_INCREMENT,
|
37
|
+
name varchar(30),
|
38
|
+
description varchar(50),
|
39
|
+
PRIMARY KEY (id)
|
40
|
+
)
|
41
|
+
")
|
42
|
+
mysql.query("INSERT INTO products (name,description) VALUES('spoon', 'golden spoon -#{aDbDetails[:database]}')")
|
43
|
+
mysql.query("INSERT INTO products (name,description) VALUES('fork', 'silver fork -#{aDbDetails[:database]}')")
|
44
|
+
mysql.query("
|
45
|
+
CREATE TABLE customers (
|
46
|
+
id int(11) NOT NULL AUTO_INCREMENT,
|
47
|
+
name varchar(30),
|
48
|
+
address varchar(50),
|
49
|
+
PRIMARY KEY (id)
|
50
|
+
)
|
51
|
+
")
|
52
|
+
mysql.query("INSERT INTO customers (name,address) VALUES('fred', '1 some st -#{aDbDetails[:database]}')")
|
53
|
+
mysql.query("INSERT INTO customers (name,address) VALUES('mary', '2 another rd -#{aDbDetails[:database]}')")
|
54
|
+
return mysql
|
55
|
+
end
|
56
|
+
|
57
|
+
#users = [{:name => 'Bob', :permissions => ['Read']},
|
58
|
+
# {:name => 'Alice', :permissions => ['Read', 'Write']}]
|
59
|
+
#
|
60
|
+
## Serialize
|
61
|
+
#open('users', 'w') { |f| YAML.dump(users, f) }
|
62
|
+
#
|
63
|
+
## And deserialize
|
64
|
+
#users2 = open("users") { |f| YAML.load(f) }
|
65
|
+
## => [{:permissions=>["Read"], :name=>"Bob"},
|
66
|
+
## {:permissions=>["Read", "Write"], :name=>"Alice"}]
|
67
|
+
|
68
|
+
def hash_from_yaml_file(aFile)
|
69
|
+
return YAML::load(File.open(aFile)) rescue nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def yaml_file_from_hash(aName,aHash)
|
73
|
+
open(aName, 'w') { |f| YAML.dump(aHash, f) }
|
74
|
+
end
|
75
|
+
|
76
|
+
RAND_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
77
|
+
def random_string(aLength)
|
78
|
+
rand_max = RAND_CHARS.size
|
79
|
+
ret = ""
|
80
|
+
aLength.times{ ret << RAND_CHARS[rand(rand_max)] }
|
81
|
+
ret
|
82
|
+
end
|
83
|
+
|
84
|
+
def random_filename(aPrefix=nil)
|
85
|
+
aPrefix.to_s+random_string(8)+'.'+random_string(3)
|
86
|
+
end
|
87
|
+
|
88
|
+
def create_random_file(aPath,aLength,aName=nil)
|
89
|
+
aName ||= random_filename()
|
90
|
+
path = File.join(aPath,aName)
|
91
|
+
MiscUtils.string_to_file(random_string(aLength),path)
|
92
|
+
end
|
93
|
+
|
94
|
+
# eg
|
95
|
+
def create_spree_folder(aParentDir,aFolderName,aDatabaseParams)
|
96
|
+
path = File.expand_path(aFolderName,aParentDir)
|
97
|
+
FileUtils.mkdir_p(path)
|
98
|
+
FileUtils.mkdir_p(File.join(path,'config'))
|
99
|
+
FileUtils.mkdir_p(File.join(path,'kind'))
|
100
|
+
FileUtils.mkdir_p(File.join(path,'public/assets/products'))
|
101
|
+
# create database yml file
|
102
|
+
dbs = {
|
103
|
+
'bogus' => {
|
104
|
+
'adapter' => 'mysql',
|
105
|
+
'database' => 'sdsdsad',
|
106
|
+
'username' => 'asdsadasd',
|
107
|
+
'password' => 'dfdsgdfg'
|
108
|
+
}
|
109
|
+
}
|
110
|
+
params = {'adapter' => 'mysql'}
|
111
|
+
aDatabaseParams.values.first.each {|k,v| params[k.to_s] = v}
|
112
|
+
dbs[aDatabaseParams.keys.first.to_s] = params
|
113
|
+
yaml_file_from_hash(File.join(path,'config/database.yml'),dbs)
|
114
|
+
|
115
|
+
3.times { create_random_file(File.join(path,'kind'),1+rand(100),random_filename(aFolderName+'_')) }
|
116
|
+
3.times { create_random_file(File.join(path,'public'),1+rand(100),random_filename(aFolderName+'_')) }
|
117
|
+
3.times { create_random_file(File.join(path,'public/assets'),1+rand(100),random_filename(aFolderName+'_')) }
|
118
|
+
3.times { create_random_file(File.join(path,'public/assets/products'),1+rand(100),random_filename(aFolderName+'_')) }
|
119
|
+
return path
|
120
|
+
end
|
121
|
+
|
122
|
+
def filelist_with_sizes(aPath)
|
123
|
+
result = MiscUtils.recursive_file_list(aPath,true)
|
124
|
+
result.map! do |f|
|
125
|
+
shortf = MiscUtils.path_debase(f,aPath)
|
126
|
+
shortf + "|#{File.size?(f).to_s}"
|
127
|
+
end
|
128
|
+
result
|
129
|
+
end
|
130
|
+
|
131
|
+
tempdir = MiscUtils.make_temp_dir("yore_spree_test")
|
132
|
+
|
133
|
+
# set up spree-like A&B (different) test databases & files
|
134
|
+
db_a = create_spree_db(db_details.merge(:database=>"spree_test_a"))
|
135
|
+
path_a = create_spree_folder(tempdir,"spree_test_a",:test => db_details.merge(:database=>"spree_test_a"))
|
136
|
+
db_b = create_spree_db(db_details.merge(:database=>"spree_test_b"))
|
137
|
+
path_b = create_spree_folder(tempdir,"spree_test_b",:test => db_details.merge(:database=>"spree_test_b"))
|
138
|
+
|
139
|
+
DatabaseUtils::save_database(db_details.merge(:database=>"spree_test_a"),File.join(tempdir,'spree_test_a.sql'))
|
140
|
+
db_a_s = MiscUtils.string_from_file(File.join(tempdir,'spree_test_a.sql')).gsub!(/\n--.*$/,'')
|
141
|
+
DatabaseUtils::save_database(db_details.merge(:database=>"spree_test_b"),File.join(tempdir,'spree_test_b.sql'))
|
142
|
+
db_b_s = MiscUtils.string_from_file(File.join(tempdir,'spree_test_b.sql')).gsub!(/\n--.*$/,'')
|
143
|
+
|
144
|
+
files_a_s = filelist_with_sizes(path_a).join("\n")
|
145
|
+
files_products_a_s = filelist_with_sizes(File.join(path_a,'public/assets/products')).join("\n")
|
146
|
+
files_b_s = filelist_with_sizes(path_b).join("\n")
|
147
|
+
files_products_b_s = filelist_with_sizes(File.join(path_b,'public/assets/products')).join("\n")
|
148
|
+
|
149
|
+
assert_not_equal files_a_s,files_b_s
|
150
|
+
assert_not_equal files_products_a_s,files_products_b_s
|
151
|
+
|
152
|
+
# launch yore to save A to file system equivalent to :
|
153
|
+
# cd spree_test_a; yore save --app=spree --RAILS_ENV=test spree_test_a.tgz
|
154
|
+
@yore_a = YoreCore::Yore.launch(nil,{:kind => 'spree',:RAILS_ENV => 'test'},{:basepath => path_a})
|
155
|
+
spree_test_a_tgz = File.join(tempdir,'spree_test_a.tgz')
|
156
|
+
@yore_a.save(spree_test_a_tgz)
|
157
|
+
|
158
|
+
# launch yore to load file into B
|
159
|
+
@yore_b = YoreCore::Yore.launch(nil,{:kind => 'spree',:RAILS_ENV => 'test'},{:basepath => path_b})
|
160
|
+
@yore_b.load(spree_test_a_tgz)
|
161
|
+
|
162
|
+
DatabaseUtils::save_database(db_details.merge(:database=>"spree_test_b"),File.join(tempdir,'spree_test_b_after.sql'))
|
163
|
+
db_b_after_s = MiscUtils.string_from_file(File.join(tempdir,'spree_test_b_after.sql')).gsub!(/\n--.*$/,'')
|
164
|
+
|
165
|
+
# assert files in A & B are the same within public/assets/products, and different elsewhere
|
166
|
+
assert_not_equal db_a_s,db_b_s
|
167
|
+
|
168
|
+
db_a_s.gsub!(/\n--.*$/,'')
|
169
|
+
db_b_after_s.gsub!(/\n--.*$/,'')
|
170
|
+
MiscUtils.string_to_file(db_a_s,"/Users/gary/temp/db_a_s.txt")
|
171
|
+
MiscUtils.string_to_file(db_b_after_s,"/Users/gary/temp/db_b_after_s.txt")
|
172
|
+
assert_equal db_a_s,db_b_after_s
|
173
|
+
|
174
|
+
files_b_after_s = filelist_with_sizes(path_b).join("\n")
|
175
|
+
files_products_b_after_s = filelist_with_sizes(File.join(path_b,'public/assets/products')).join("\n")
|
176
|
+
|
177
|
+
assert_not_equal files_b_s,files_b_after_s
|
178
|
+
assert_not_equal files_products_b_after_s,files_products_b_s
|
179
|
+
assert_equal files_products_a_s,files_products_b_after_s
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
data/test/test_job_b.xml
CHANGED
@@ -14,28 +14,21 @@
|
|
14
14
|
|
15
15
|
<Item Name="mail_host">mail.authsmtp.com</Item>
|
16
16
|
<Item Name="mail_port">25</Item>
|
17
|
-
<Item Name="mail_helodomain">
|
18
|
-
<Item Name="mail_user">
|
19
|
-
<Item Name="mail_password">
|
17
|
+
<Item Name="mail_helodomain">blah.com</Item>
|
18
|
+
<Item Name="mail_user">erewrwer</Item>
|
19
|
+
<Item Name="mail_password">werewrewr</Item>
|
20
20
|
<Item Name="mail_from">noreply@buzzware.com.au</Item>
|
21
|
-
<Item Name="mail_from_alias">
|
22
|
-
<Item Name="mail_to">
|
23
|
-
<Item Name="mail_to_alias">
|
21
|
+
<Item Name="mail_from_alias">Web Server</Item>
|
22
|
+
<Item Name="mail_to">sadsd@blah.com</Item>
|
23
|
+
<Item Name="mail_to_alias">sdsadsd</Item>
|
24
24
|
<Item Name="mail_auth">login</Item>
|
25
|
-
|
26
25
|
<Item Name="mysqldump">/usr/local/mysql/bin/mysqldump</Item>
|
27
26
|
|
28
27
|
</SimpleItems>
|
29
28
|
<Sources>
|
30
29
|
<Source Type="File">
|
31
30
|
<IncludePath>/tmp/yoretest</IncludePath>
|
32
|
-
<!-- <ExcludePath></ExcludePath> -->
|
33
31
|
</Source>
|
34
|
-
<!--<Source Type="MySql" > -->
|
35
|
-
<!-- <Database Name="joomla_db" Host="localhost" User="root" Password="prot123ection">-->
|
36
|
-
<!-- <ToFile>/Users/gary/temp/test.sql</ToFile> -->
|
37
|
-
<!-- </Database> -->
|
38
|
-
<!--</Source> -->
|
39
32
|
</Sources>
|
40
33
|
</Yore>
|
41
34
|
|
data/test/yore_test.rb
CHANGED
@@ -1,22 +1,12 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
gem 'RequirePaths'; require 'require_paths'
|
3
|
-
require_paths '
|
4
|
-
|
5
|
-
require 'test/unit'
|
6
|
-
gem 'Shoulda'; require 'shoulda'
|
7
|
-
|
8
|
-
|
3
|
+
require_paths '../../..','../lib'
|
9
4
|
require 'ihl_ruby/misc_utils'
|
10
5
|
require 'ihl_ruby/shell_extras'
|
11
|
-
|
12
|
-
require 'fileutils'
|
13
|
-
|
14
6
|
require 'yore/yore_core'
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
`s3cmd deleteall #{aName}`
|
19
|
-
end
|
7
|
+
require 'test/unit'
|
8
|
+
gem 'Shoulda'; require 'shoulda'
|
9
|
+
require 'fileutils'
|
20
10
|
|
21
11
|
class YoreTest < Test::Unit::TestCase
|
22
12
|
|
@@ -24,7 +14,7 @@ class YoreTest < Test::Unit::TestCase
|
|
24
14
|
@yore = YoreCore::Yore.new
|
25
15
|
end
|
26
16
|
|
27
|
-
should "collect a list of files into a single file
|
17
|
+
should "collect a list of files into a single file" do
|
28
18
|
# create a temp dir
|
29
19
|
temp_dir = MiscUtils::make_temp_dir('yore_test')
|
30
20
|
# create source and dest subfolders
|
@@ -38,22 +28,20 @@ class YoreTest < Test::Unit::TestCase
|
|
38
28
|
end
|
39
29
|
# collect into dest file
|
40
30
|
# get recursive file list, without carrots
|
41
|
-
filelist = MiscUtils::recursive_file_list(source_dir) {|p| not p =~ /carrots.txt/}
|
31
|
+
filelist = MiscUtils::recursive_file_list(source_dir,false) {|p| not p =~ /carrots.txt/}
|
42
32
|
dest_file = File.join(dest_dir,'destfile.bzb')
|
43
33
|
|
44
|
-
@yore.
|
34
|
+
@yore.compress(filelist,dest_file,source_dir)
|
45
35
|
|
46
|
-
# check contains filelist files
|
36
|
+
# check contains filelist files
|
47
37
|
cmd = "tar --list --file=#{dest_file}"
|
48
38
|
filelist_out = `#{cmd}`
|
49
39
|
i = 0
|
50
40
|
filelist_out.each_line {|line|
|
51
|
-
next if line==".contents\n"
|
52
41
|
assert i < filelist.length
|
53
|
-
assert_equal line.chomp("\n"),
|
42
|
+
assert_equal line.chomp("\n"), filelist[i] # .bite('/')
|
54
43
|
i += 1
|
55
44
|
}
|
56
|
-
# could also check .contents file against actual contents
|
57
45
|
end
|
58
46
|
|
59
47
|
should "encrypt and unencrypt a file with a standard iv but a supplied key" do
|
@@ -81,125 +69,8 @@ class YoreTest < Test::Unit::TestCase
|
|
81
69
|
assert_equal Time.local(2008, 12, 31), @yore.decode_file_name(calc_filename)
|
82
70
|
end
|
83
71
|
|
84
|
-
should "upload and download files intact" do
|
85
|
-
bucket = 'yore_test'
|
86
|
-
ensure_clean_bucket(bucket)
|
87
|
-
@yore.configure({
|
88
|
-
:bucket => bucket
|
89
|
-
})
|
90
|
-
content = 'this is my test content'
|
91
|
-
temp_dir = MiscUtils.make_temp_dir()
|
92
|
-
temp_file = MiscUtils.make_temp_file(nil, temp_dir, content)
|
93
|
-
puts @yore.upload(temp_file)
|
94
|
-
orig_file = temp_file+'.orig'
|
95
|
-
File.rename(temp_file, orig_file)
|
96
|
-
puts @yore.download(temp_file)
|
97
|
-
down_file_content = MiscUtils.string_from_file(temp_file)
|
98
|
-
assert_equal content, down_file_content
|
99
|
-
end
|
100
|
-
|
101
|
-
should "backup and restore multiple directories of file" do
|
102
|
-
# create a temp dir
|
103
|
-
temp_dir = MiscUtils::make_temp_dir('yore_test')
|
104
|
-
# create source and dest subfolders
|
105
|
-
source_dir = File.expand_path('source',temp_dir)
|
106
|
-
source1 = File.join(source_dir,'source1')
|
107
|
-
source2 = File.join(source_dir,'source2')
|
108
|
-
dest_dir = File.expand_path('dest',temp_dir)
|
109
|
-
bucket = 'yore_test'
|
110
|
-
|
111
|
-
FileUtils.mkdir_p([source1,source2,dest_dir])
|
112
|
-
# create some dirs and files in source
|
113
|
-
['a','a/1','b','c'].each {|p| FileUtils.mkdir_p(File.expand_path(p,source1))}
|
114
|
-
%w(a/blah.txt a/1/blahblah.txt b/apples.txt c/carrots.txt).each do |f|
|
115
|
-
MiscUtils::make_temp_file(f,source1)
|
116
|
-
end
|
117
|
-
['w','x/1','y/2','z'].each {|p| FileUtils.mkdir_p(File.expand_path(p,source2))}
|
118
|
-
%w(w/zonk.txt x/1/eggs.txt y/2/bloop.txt z/zax.txt).each do |f|
|
119
|
-
MiscUtils::make_temp_file(f,source2)
|
120
|
-
end
|
121
|
-
|
122
|
-
# create job file
|
123
|
-
job_template = <<EOF
|
124
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
125
|
-
<Yore>
|
126
|
-
<SimpleItems>
|
127
|
-
<Item Name="crypto_iv">3A63775C1E3F291B0925578165EB917E</Item>
|
128
|
-
<Item Name="crypto_key">07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE</Item>
|
129
|
-
<Item Name="prefix">backup</Item>
|
130
|
-
<Item Name="log_level">INFO</Item>
|
131
|
-
<Item Name="bucket">${BUCKET}</Item>
|
132
|
-
</SimpleItems>
|
133
|
-
<Sources>
|
134
|
-
<Source Type="File">
|
135
|
-
<IncludePath>${SOURCE1}</IncludePath>
|
136
|
-
<IncludePath>${SOURCE2}</IncludePath>
|
137
|
-
</Source>
|
138
|
-
</Sources>
|
139
|
-
</Yore>
|
140
|
-
EOF
|
141
|
-
|
142
|
-
job_content = StringUtils::render_template(job_template,{
|
143
|
-
'SOURCE1' => source1,
|
144
|
-
'SOURCE2' => source2,
|
145
|
-
'BUCKET' => bucket
|
146
|
-
})
|
147
|
-
MiscUtils::string_to_file(job_content,job_file = MiscUtils::temp_file)
|
148
|
-
|
149
|
-
ensure_clean_bucket(bucket)
|
150
|
-
@yore.configure({
|
151
|
-
:bucket => bucket
|
152
|
-
})
|
153
|
-
|
154
|
-
# call yore script with ruby from the command line, then download result and check contents
|
155
|
-
begin
|
156
|
-
result = @yore.shell("ruby #{File.expand_path('../../bin/yore',THIS_DIR)} backup #{job_file}")
|
157
|
-
rescue ::StandardError => e
|
158
|
-
flunk e.inspect
|
159
|
-
end
|
160
|
-
|
161
|
-
puts result
|
162
|
-
|
163
|
-
retrieved_fname = File.expand_path(@yore.encode_file_name(), dest_dir)
|
164
|
-
collection_fname = MiscUtils::temp_file
|
165
|
-
|
166
|
-
puts @yore.download(retrieved_fname)
|
167
|
-
puts @yore.unpack(retrieved_fname,collection_fname)
|
168
|
-
|
169
|
-
filelist = MiscUtils::recursive_file_list(source_dir,false)
|
170
|
-
|
171
|
-
# check contains filelist files ignoring .contents
|
172
|
-
cmd = "tar --list --file=#{collection_fname}"
|
173
|
-
filelist_out = @yore.shell(cmd)
|
174
|
-
filelist_out = filelist_out.split("\n").sort
|
175
|
-
assert_equal filelist, filelist_out
|
176
|
-
# i = 0
|
177
|
-
# filelist_out.each {|line|
|
178
|
-
# next if line==".contents\n"
|
179
|
-
# i.should < filelist.length
|
180
|
-
# line.chomp("\n").should == MiscUtils.path_debase(filelist[i],source_dir) # .bite('/')
|
181
|
-
# i += 1
|
182
|
-
# }
|
183
|
-
# could also check .contents file against actual contents
|
184
|
-
end
|
185
|
-
|
186
|
-
should "handle test_file_b" do
|
187
|
-
aController = YoreCore::Yore.new # main program object
|
188
|
-
job = File.expand_path('../../test/test_job_b.xml',THIS_DIR)
|
189
|
-
xmlRoot = XmlUtils.get_file_root(job)
|
190
|
-
srcdir = '/tmp/yoretest'
|
191
|
-
FileUtils.rm_rf srcdir+'/*'
|
192
|
-
FileUtils.mkdir_p srcdir
|
193
|
-
['a','a/1','b','c'].each {|p| FileUtils.mkdir_p(File.expand_path(p,srcdir))}
|
194
|
-
%w(a/blah.txt a/1/blahblah.txt b/apples.txt c/carrots.txt).each do |f|
|
195
|
-
MiscUtils::make_temp_file(f,srcdir)
|
196
|
-
end
|
197
|
-
|
198
|
-
aController.configure(xmlRoot,nil,{:basepath => File.dirname(File.expand_path(job))})
|
199
|
-
aController.backup(job)
|
200
|
-
end
|
201
|
-
|
202
72
|
should "provide configurable criteria for keeping old files"
|
203
73
|
|
204
74
|
should "clean a folder full of files, removing files that don't match configurable criteria for keeping old files"
|
75
|
+
|
205
76
|
end
|