syc-backup 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/README.rdoc +48 -0
- data/Rakefile +7 -0
- data/bin/sycbackup +6 -0
- data/doc/Backup.html +186 -0
- data/doc/Backup/CronEdit.html +381 -0
- data/doc/Backup/Environment.html +231 -0
- data/doc/Backup/FileBackup.html +363 -0
- data/doc/Backup/MySQLBackup.html +305 -0
- data/doc/Backup/Options.html +328 -0
- data/doc/Backup/Process.html +261 -0
- data/doc/Backup/Runner.html +244 -0
- data/doc/README_rdoc.html +202 -0
- data/doc/Rakefile.html +118 -0
- data/doc/TestCronEdit.html +211 -0
- data/doc/TestEnvironment.html +156 -0
- data/doc/TestFileBackup.html +237 -0
- data/doc/TestMySQLBackup.html +167 -0
- data/doc/TestOptions.html +156 -0
- data/doc/TestProcess.html +236 -0
- data/doc/created.rid +18 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +106 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +148 -0
- data/lib/backup/cron_edit.rb +127 -0
- data/lib/backup/environment.rb +44 -0
- data/lib/backup/file_backup.rb +94 -0
- data/lib/backup/mysql_backup.rb +58 -0
- data/lib/backup/options.rb +199 -0
- data/lib/backup/process.rb +99 -0
- data/lib/backup/runner.rb +79 -0
- data/lib/backup_version.rb +9 -0
- data/syc-backup-0.0.1.gem +0 -0
- data/syc-backup-0.0.3.gem +0 -0
- data/sycbackup.gemspec +20 -0
- data/test/test_cron_edit.rb +49 -0
- data/test/test_environment.rb +22 -0
- data/test/test_file_backup.rb +70 -0
- data/test/test_mysql_backup.rb +71 -0
- data/test/test_options.rb +189 -0
- data/test/test_process.rb +40 -0
- metadata +123 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
6
|
+
|
7
|
+
<title>Table of Contents - RDoc Documentation</title>
|
8
|
+
|
9
|
+
<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
|
10
|
+
|
11
|
+
<script type="text/javascript">
|
12
|
+
var rdoc_rel_prefix = "./";
|
13
|
+
</script>
|
14
|
+
|
15
|
+
<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
|
16
|
+
<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
|
17
|
+
<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
|
18
|
+
<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
|
19
|
+
<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
|
20
|
+
<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
|
21
|
+
|
22
|
+
|
23
|
+
<body class="indexpage">
|
24
|
+
<h1>Table of Contents - RDoc Documentation</h1>
|
25
|
+
|
26
|
+
<h2>Pages</h2>
|
27
|
+
<ul>
|
28
|
+
<li class="file">
|
29
|
+
<a href="README_rdoc.html">README</a>
|
30
|
+
|
31
|
+
<img class="toc-toggle" src="images/transparent.png" alt="" title="toggle headings">
|
32
|
+
<ul class="initially-hidden">
|
33
|
+
<li><a href="README_rdoc.html#label-Backup+utility+for+database%2C+folders+and+files">Backup utility for database, folders and files</a>
|
34
|
+
<li><a href="README_rdoc.html#label-Install">Install</a>
|
35
|
+
<li><a href="README_rdoc.html#label-Usage">Usage</a>
|
36
|
+
<li><a href="README_rdoc.html#label-Supported+Platform">Supported Platform</a>
|
37
|
+
<li><a href="README_rdoc.html#label-Notes">Notes</a>
|
38
|
+
<li><a href="README_rdoc.html#label-Tests">Tests</a>
|
39
|
+
<li><a href="README_rdoc.html#label-Links">Links</a>
|
40
|
+
</ul>
|
41
|
+
</li>
|
42
|
+
<li class="file">
|
43
|
+
<a href="Rakefile.html">Rakefile</a>
|
44
|
+
</li>
|
45
|
+
|
46
|
+
</ul>
|
47
|
+
|
48
|
+
<h2 id="classes">Classes/Modules</h2>
|
49
|
+
<ul>
|
50
|
+
<li class="module">
|
51
|
+
<a href="Backup.html">Backup</a>
|
52
|
+
</li>
|
53
|
+
<li class="class">
|
54
|
+
<a href="Backup/CronEdit.html">Backup::CronEdit</a>
|
55
|
+
</li>
|
56
|
+
<li class="class">
|
57
|
+
<a href="Backup/Environment.html">Backup::Environment</a>
|
58
|
+
</li>
|
59
|
+
<li class="class">
|
60
|
+
<a href="Backup/FileBackup.html">Backup::FileBackup</a>
|
61
|
+
</li>
|
62
|
+
<li class="class">
|
63
|
+
<a href="Backup/MySQLBackup.html">Backup::MySQLBackup</a>
|
64
|
+
</li>
|
65
|
+
<li class="class">
|
66
|
+
<a href="Backup/Options.html">Backup::Options</a>
|
67
|
+
</li>
|
68
|
+
<li class="class">
|
69
|
+
<a href="Backup/Process.html">Backup::Process</a>
|
70
|
+
</li>
|
71
|
+
<li class="class">
|
72
|
+
<a href="Backup/Runner.html">Backup::Runner</a>
|
73
|
+
</li>
|
74
|
+
<li class="class">
|
75
|
+
<a href="TestCronEdit.html">TestCronEdit</a>
|
76
|
+
</li>
|
77
|
+
<li class="class">
|
78
|
+
<a href="TestEnvironment.html">TestEnvironment</a>
|
79
|
+
</li>
|
80
|
+
<li class="class">
|
81
|
+
<a href="TestFileBackup.html">TestFileBackup</a>
|
82
|
+
</li>
|
83
|
+
<li class="class">
|
84
|
+
<a href="TestMySQLBackup.html">TestMySQLBackup</a>
|
85
|
+
</li>
|
86
|
+
<li class="class">
|
87
|
+
<a href="TestOptions.html">TestOptions</a>
|
88
|
+
</li>
|
89
|
+
<li class="class">
|
90
|
+
<a href="TestProcess.html">TestProcess</a>
|
91
|
+
</li>
|
92
|
+
|
93
|
+
</ul>
|
94
|
+
|
95
|
+
<h2 id="methods">Methods</h2>
|
96
|
+
<ul>
|
97
|
+
|
98
|
+
<li class="method"><a href="Backup/Process.html#method-c-new">::new — Backup::Process</a>
|
99
|
+
|
100
|
+
<li class="method"><a href="Backup/Runner.html#method-c-new">::new — Backup::Runner</a>
|
101
|
+
|
102
|
+
<li class="method"><a href="Backup/Options.html#method-c-new">::new — Backup::Options</a>
|
103
|
+
|
104
|
+
<li class="method"><a href="Backup/MySQLBackup.html#method-c-new">::new — Backup::MySQLBackup</a>
|
105
|
+
|
106
|
+
<li class="method"><a href="Backup/FileBackup.html#method-c-new">::new — Backup::FileBackup</a>
|
107
|
+
|
108
|
+
<li class="method"><a href="Backup/Environment.html#method-c-ruby">::ruby — Backup::Environment</a>
|
109
|
+
|
110
|
+
<li class="method"><a href="Backup/CronEdit.html#method-i-add_command">#add_command — Backup::CronEdit</a>
|
111
|
+
|
112
|
+
<li class="method"><a href="Backup/FileBackup.html#method-i-backup">#backup — Backup::FileBackup</a>
|
113
|
+
|
114
|
+
<li class="method"><a href="Backup/MySQLBackup.html#method-i-backup">#backup — Backup::MySQLBackup</a>
|
115
|
+
|
116
|
+
<li class="method"><a href="Backup/Process.html#method-i-backup">#backup — Backup::Process</a>
|
117
|
+
|
118
|
+
<li class="method"><a href="Backup/FileBackup.html#method-i-check_for_inexistent">#check_for_inexistent — Backup::FileBackup</a>
|
119
|
+
|
120
|
+
<li class="method"><a href="Backup/CronEdit.html#method-i-cleanup">#cleanup — Backup::CronEdit</a>
|
121
|
+
|
122
|
+
<li class="method"><a href="Backup/MySQLBackup.html#method-i-compress">#compress — Backup::MySQLBackup</a>
|
123
|
+
|
124
|
+
<li class="method"><a href="Backup/FileBackup.html#method-i-compress">#compress — Backup::FileBackup</a>
|
125
|
+
|
126
|
+
<li class="method"><a href="TestCronEdit.html#method-i-crontab_count">#crontab_count — TestCronEdit</a>
|
127
|
+
|
128
|
+
<li class="method"><a href="Backup/CronEdit.html#method-i-remove_command">#remove_command — Backup::CronEdit</a>
|
129
|
+
|
130
|
+
<li class="method"><a href="Backup/Runner.html#method-i-run">#run — Backup::Runner</a>
|
131
|
+
|
132
|
+
<li class="method"><a href="TestProcess.html#method-i-setup">#setup — TestProcess</a>
|
133
|
+
|
134
|
+
<li class="method"><a href="TestFileBackup.html#method-i-setup">#setup — TestFileBackup</a>
|
135
|
+
|
136
|
+
<li class="method"><a href="TestProcess.html#method-i-teardown">#teardown — TestProcess</a>
|
137
|
+
|
138
|
+
<li class="method"><a href="TestFileBackup.html#method-i-teardown">#teardown — TestFileBackup</a>
|
139
|
+
|
140
|
+
</ul>
|
141
|
+
|
142
|
+
|
143
|
+
<footer id="validator-badges">
|
144
|
+
<p><a href="http://validator.w3.org/check/referer">[Validate]</a>
|
145
|
+
<p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
|
146
|
+
<p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
|
147
|
+
</footer>
|
148
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module Backup
|
4
|
+
|
5
|
+
# Adds or removes a command to the user's crontab. To make sure that the
|
6
|
+
# Ruby application is invoked as a cron job it needs the environment
|
7
|
+
# variables that are available when run from command line. To meet these
|
8
|
+
# requirements the environment variables are read and added to the crontab. If
|
9
|
+
# variables already exist in the crontab they are overridden.
|
10
|
+
class CronEdit
|
11
|
+
|
12
|
+
# Temporary file that holds the entries to be written to the crontab
|
13
|
+
CRON_ENTRIES_FILE = ".cron_entries"
|
14
|
+
|
15
|
+
# Adds a command to the user's crontab. If the provided command is empty
|
16
|
+
# add_command will exit the application with exit status -1.
|
17
|
+
# The method uses the <tt>crontab -l</tt> and <tt>crontab file</tt> command.
|
18
|
+
# If the crontab call fails the error message and exit status of
|
19
|
+
# <tt>crontab</tt> will be returned and the application exits
|
20
|
+
def add_command(command, environment=[])
|
21
|
+
command = command.strip.squeeze(" ")
|
22
|
+
|
23
|
+
if command.empty?
|
24
|
+
STDERR.puts "Cannot add empty command to cron"
|
25
|
+
exit -1
|
26
|
+
end
|
27
|
+
|
28
|
+
read_crontab_command = 'crontab -l'
|
29
|
+
|
30
|
+
stdout, stderr, status = Open3.capture3(read_crontab_command)
|
31
|
+
|
32
|
+
entries = [] + environment
|
33
|
+
|
34
|
+
stdout.split(/\n/).each do |entry|
|
35
|
+
entry = entry.strip.squeeze(" ")
|
36
|
+
variable = entry.match(/\A\w+(?=\=)/).to_s
|
37
|
+
unless variable.empty?
|
38
|
+
entries << entry unless environment.grep(/\A#{variable}/)
|
39
|
+
else
|
40
|
+
entries << entry
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
unless entries.include? command
|
45
|
+
entries << command
|
46
|
+
|
47
|
+
cron_entries_file = CRON_ENTRIES_FILE
|
48
|
+
File.open(cron_entries_file, 'w') do |f|
|
49
|
+
entries.each {|entry| f.puts entry}
|
50
|
+
end
|
51
|
+
|
52
|
+
write_crontab_command = "crontab #{cron_entries_file}"
|
53
|
+
|
54
|
+
stdout, stderr, status = Open3.capture3(write_crontab_command)
|
55
|
+
|
56
|
+
cleanup
|
57
|
+
|
58
|
+
unless status.exitstatus == 0
|
59
|
+
STDERR.puts "There is a problem executing command"
|
60
|
+
STDERR.puts write_crontab_command
|
61
|
+
STDERR.puts stderr
|
62
|
+
exit status.exitstatus
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
command
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
# Removes a command from the user's crontab. If the provided command is
|
71
|
+
# empty remove_command will exit the application with exit status -1.
|
72
|
+
# The method uses the <tt>crontab -l</tt> and <tt>crontab file</tt> command.
|
73
|
+
# If the crontab call fails the error message and exit status of
|
74
|
+
# <tt>crontab</tt> will be returned and the application exits
|
75
|
+
def remove_command(command)
|
76
|
+
command = command.strip.squeeze(" ")
|
77
|
+
|
78
|
+
if command.empty?
|
79
|
+
STDERR.puts "Cannot delete empty command from crontab"
|
80
|
+
exit -1
|
81
|
+
end
|
82
|
+
|
83
|
+
read_crontab_command = "crontab -l"
|
84
|
+
|
85
|
+
stdout, stderr, status = Open3.capture3(read_crontab_command)
|
86
|
+
|
87
|
+
unless status.exitstatus == 0
|
88
|
+
STDERR.puts "There is a problem executing command"
|
89
|
+
STDERR.puts read_crontab_command
|
90
|
+
STDERR.puts stderr
|
91
|
+
exit status.existatus
|
92
|
+
end
|
93
|
+
|
94
|
+
entries = stdout.split(/\n/).each {|entry| entry.strip.squeeze(" ")}
|
95
|
+
|
96
|
+
entries.delete(command)
|
97
|
+
|
98
|
+
cron_entries_file = CRON_ENTRIES_FILE #".cron_entries"
|
99
|
+
|
100
|
+
File.open(cron_entries_file, 'w') do |file|
|
101
|
+
entries.each {|entry| file.puts entry}
|
102
|
+
end
|
103
|
+
|
104
|
+
write_crontab_command = "crontab #{cron_entries_file}"
|
105
|
+
|
106
|
+
stdout, stderr, status = Open3.capture3(write_crontab_command)
|
107
|
+
|
108
|
+
cleanup
|
109
|
+
|
110
|
+
unless status.exitstatus == 0
|
111
|
+
STDERR.puts "There is a problem executing command"
|
112
|
+
STDERR.puts write_crontab_command
|
113
|
+
STDERR.puts stderr
|
114
|
+
exit status.exitstatus
|
115
|
+
end
|
116
|
+
|
117
|
+
command
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
# Removes the CRON_ENTRIES_FILE after the values have been written to
|
122
|
+
# crontab
|
123
|
+
def cleanup
|
124
|
+
File.delete CRON_ENTRIES_FILE if File.exists? CRON_ENTRIES_FILE
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Backup
|
2
|
+
|
3
|
+
# Reads and filters the user's environment variables to meet Ruby and Gem
|
4
|
+
# requirements to run the application as a cron job
|
5
|
+
class Environment
|
6
|
+
|
7
|
+
# Contains the environment variable names that are required to run a Ruby
|
8
|
+
# application from as a cron job
|
9
|
+
VARIABLES = ["RVM_BIN_PATH",
|
10
|
+
"GEM_HOME",
|
11
|
+
"SHELL",
|
12
|
+
"MY_RUBY_HOME",
|
13
|
+
"USER",
|
14
|
+
"RVM_PATH",
|
15
|
+
"RVM_PREFIX",
|
16
|
+
"PATH",
|
17
|
+
"RVM_VERSION",
|
18
|
+
"HOME",
|
19
|
+
"LOGNAME",
|
20
|
+
"GEM_PATH",
|
21
|
+
"RUBY_VERSION"]
|
22
|
+
|
23
|
+
# Retrieves the environment variables that are required running a Ruby
|
24
|
+
# application as a cron job. The variable are returned in an Array
|
25
|
+
def self.ruby
|
26
|
+
file = ".current_environment.tmp"
|
27
|
+
system ("env > #{file}")
|
28
|
+
|
29
|
+
lines = []
|
30
|
+
|
31
|
+
File.open(file, 'r') do |f|
|
32
|
+
while line = f.gets
|
33
|
+
variable = line.chomp.match(/\A\w+(?=\=)/).to_s
|
34
|
+
lines << line.chomp if VARIABLES.find_index variable.upcase
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
File.delete file
|
39
|
+
|
40
|
+
lines
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
# Backup contains functions to backup a MySQL database and files and directories
|
5
|
+
# to a default or specified backup directory. Instead of instant backup the
|
6
|
+
# invoked command can be added to a crontab and invoked based on the provided
|
7
|
+
# schedule that is a parameter of the --cron option. The backed up files are
|
8
|
+
# per default compressed but this can be ommitted
|
9
|
+
module Backup
|
10
|
+
|
11
|
+
# Backup directories and files to a backup directory
|
12
|
+
class FileBackup
|
13
|
+
|
14
|
+
# Initializes the files to be backed up. If no file is provided an error
|
15
|
+
# is returned
|
16
|
+
def initialize(files=[])
|
17
|
+
@files = files
|
18
|
+
end
|
19
|
+
|
20
|
+
# Compress the files to the backup directory
|
21
|
+
def compress(files, backup_folder)
|
22
|
+
inexistent_files = check_for_inexistent files
|
23
|
+
unless inexistent_files.empty?
|
24
|
+
STDERR.puts "Cannot compress inexistent files"
|
25
|
+
STDERR.puts "Following #{inexistent_files.size} file(s) do not exist"
|
26
|
+
STDERR.puts inexistent_files.join(" ")
|
27
|
+
exit 2
|
28
|
+
end
|
29
|
+
|
30
|
+
timestamp = Time.now.strftime("%Y%m%d-%H%M%S")
|
31
|
+
backup_folder += '/' unless backup_folder.match(/.*\/\Z/)
|
32
|
+
compress_file = backup_folder + timestamp + "_" + "files.tar.gz"
|
33
|
+
|
34
|
+
tar_command = "tar cfz #{compress_file} " + files.join(" ")
|
35
|
+
|
36
|
+
stdout_str, stderr_str, status = Open3.capture3(tar_command)
|
37
|
+
|
38
|
+
unless status.exitstatus == 0
|
39
|
+
STDERR.puts "There was a problem running tar command"
|
40
|
+
STDERR.puts "--> #{tar_command}"
|
41
|
+
STDERR.puts stderr_str
|
42
|
+
exit(2)
|
43
|
+
end
|
44
|
+
|
45
|
+
status.exitstatus
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
# The files to be backed up are initilized when creating an instance of
|
50
|
+
# FileBackup. These files are then backed up to the backup directory
|
51
|
+
def backup(backup_folder)
|
52
|
+
|
53
|
+
inexistent_files = []
|
54
|
+
|
55
|
+
@files.each do |file|
|
56
|
+
inexistent_files << file unless File.exists? file
|
57
|
+
end
|
58
|
+
|
59
|
+
unless inexistent_files.empty?
|
60
|
+
STDERR.puts "Cannot backup inexistent files"
|
61
|
+
STDERR.puts "Following #{inexistent_files.size} file(s) do not exist"
|
62
|
+
STDERR.puts "#{inexistent_files.join(', ')}"
|
63
|
+
exit 1
|
64
|
+
end
|
65
|
+
|
66
|
+
backup_folder += '/' unless backup_folder.match(/.*\/\Z/)
|
67
|
+
|
68
|
+
Dir.mkdir backup_folder unless File.exists? backup_folder
|
69
|
+
|
70
|
+
backup_files = []
|
71
|
+
|
72
|
+
@files.each.with_index do |file, index|
|
73
|
+
backup_files << backup_file = backup_folder+File.basename(file)
|
74
|
+
FileUtils.cp file, backup_file
|
75
|
+
end
|
76
|
+
|
77
|
+
backup_files
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
# Checks if the files all exist. Files that do not exist are returned in
|
82
|
+
# an Array
|
83
|
+
def check_for_inexistent (files)
|
84
|
+
inexistent_files = []
|
85
|
+
files.each do |f|
|
86
|
+
inexistent_files << f unless File.exists? f
|
87
|
+
end
|
88
|
+
|
89
|
+
inexistent_files
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module Backup
|
4
|
+
|
5
|
+
# MySQLBackup creates a dump file of a MySQL database with _mysqldump_ and
|
6
|
+
# returns the dump file.
|
7
|
+
class MySQLBackup
|
8
|
+
|
9
|
+
# database is the database to be backed up with the user that has the
|
10
|
+
# credentials to access the database with the provided password
|
11
|
+
def initialize(database, user, password)
|
12
|
+
@database = database
|
13
|
+
@user = user
|
14
|
+
@password = password
|
15
|
+
end
|
16
|
+
|
17
|
+
# Compresses the MySQL dump file. If an error occurs when compressing the
|
18
|
+
# file an error message is printed and the application terminates
|
19
|
+
def compress(backup_file)
|
20
|
+
tar_file = backup_file + '.tar.gz'
|
21
|
+
tar_command = "tar cfz #{tar_file} #{backup_file}"
|
22
|
+
stdout_str, stderr_str, status = Open3.capture3(tar_command)
|
23
|
+
unless status.exitstatus == 0
|
24
|
+
File.delete tar_file if File.exists? tar_file
|
25
|
+
STDERR.puts "There was a problem compressing the backup file"
|
26
|
+
STDERR.puts "-->#{tar_command}"
|
27
|
+
STDERR.puts stderr_str
|
28
|
+
exit(2)
|
29
|
+
end
|
30
|
+
|
31
|
+
status.exitstatus
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# Creates a MySQL dump file and returns the file
|
36
|
+
def backup(backup_folder="./")
|
37
|
+
Dir.mkdir backup_folder unless File.exists? backup_folder
|
38
|
+
|
39
|
+
timestamp = Time.now.strftime('%Y%m%d-%H%M%S')
|
40
|
+
backup_file = backup_folder + @database + '_' + timestamp + '.sql'
|
41
|
+
mysqldump = "mysqldump -u#{@user} -p#{@password} #{@database}"
|
42
|
+
|
43
|
+
backup_command = "#{mysqldump} > #{backup_file}"
|
44
|
+
stdout_str, stderr_str, status = Open3.capture3(backup_command)
|
45
|
+
unless status.exitstatus == 0
|
46
|
+
File.delete backup_file if File.exists? backup_file
|
47
|
+
STDERR.puts "There was a problem running mysqldump"
|
48
|
+
STDERR.puts "--> #{backup_command}"
|
49
|
+
STDERR.puts stderr_str
|
50
|
+
exit(1)
|
51
|
+
end
|
52
|
+
|
53
|
+
backup_file
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|