BackupMan 0.1.3 → 0.1.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/BackupMan.gemspec +89 -0
- data/features/dsl_parameters.feature +3 -1
- data/features/step_definitions/dsl_parameters_steps.rb +2 -1
- data/lib/backup_man/backup.rb +15 -61
- data/lib/backup_man/cli.rb +1 -1
- data/lib/backup_man/dsl.rb +65 -2
- data/lib/backup_man/mysql.rb +4 -2
- data/lib/backup_man/rsync.rb +4 -2
- data/lib/backup_man/tar.rb +4 -2
- metadata +4 -3
data/BackupMan.gemspec
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{BackupMan}
|
8
|
+
s.version = "0.1.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Markus Strauss"]
|
12
|
+
s.date = %q{2010-03-01}
|
13
|
+
s.default_executable = %q{backup_man}
|
14
|
+
s.description = %q{A tool for system administrators to easily configure pull-over-SSH backups. Install this gem on your backup server. Configure your backups definitions in /etc/backup_man and run backup_man from cron to securely pull your data over SSH.}
|
15
|
+
s.email = %q{Markus@ITstrauss.eu}
|
16
|
+
s.executables = ["backup_man"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
".yardopts",
|
25
|
+
"BackupMan.gemspec",
|
26
|
+
"LICENSE",
|
27
|
+
"README.rdoc",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"bin/backup_man",
|
31
|
+
"examples/example-host-config",
|
32
|
+
"features/development.feature",
|
33
|
+
"features/dsl_parameters.feature",
|
34
|
+
"features/logfile.feature",
|
35
|
+
"features/overview.feature",
|
36
|
+
"features/step_definitions/common_steps.rb",
|
37
|
+
"features/step_definitions/dsl_parameters_steps.rb",
|
38
|
+
"features/step_definitions/logfile_steps.rb",
|
39
|
+
"features/support/common.rb",
|
40
|
+
"features/support/env.rb",
|
41
|
+
"features/support/matchers.rb",
|
42
|
+
"lib/backup_man.rb",
|
43
|
+
"lib/backup_man/backup.rb",
|
44
|
+
"lib/backup_man/backup_man.rb",
|
45
|
+
"lib/backup_man/cli.rb",
|
46
|
+
"lib/backup_man/command.rb",
|
47
|
+
"lib/backup_man/dsl.rb",
|
48
|
+
"lib/backup_man/log.rb",
|
49
|
+
"lib/backup_man/mysql.rb",
|
50
|
+
"lib/backup_man/rsync.rb",
|
51
|
+
"lib/backup_man/tar.rb",
|
52
|
+
"spec/BackupMan_spec.rb",
|
53
|
+
"spec/spec.opts",
|
54
|
+
"spec/spec_helper.rb"
|
55
|
+
]
|
56
|
+
s.homepage = %q{http://github.com/oowoo/BackupMan}
|
57
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
58
|
+
s.require_paths = ["lib"]
|
59
|
+
s.rubyforge_project = %q{backupman}
|
60
|
+
s.rubygems_version = %q{1.3.6}
|
61
|
+
s.summary = %q{A tool for system administrators to easily configure pull-over-SSH backups.}
|
62
|
+
s.test_files = [
|
63
|
+
"spec/BackupMan_spec.rb",
|
64
|
+
"spec/spec_helper.rb"
|
65
|
+
]
|
66
|
+
|
67
|
+
if s.respond_to? :specification_version then
|
68
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
69
|
+
s.specification_version = 3
|
70
|
+
|
71
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
72
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
73
|
+
s.add_development_dependency(%q<yard>, [">= 0.4.0"])
|
74
|
+
s.add_development_dependency(%q<cucumber>, [">= 0.4.4"])
|
75
|
+
s.add_runtime_dependency(%q<log4r>, [">= 1.1.2"])
|
76
|
+
else
|
77
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
78
|
+
s.add_dependency(%q<yard>, [">= 0.4.0"])
|
79
|
+
s.add_dependency(%q<cucumber>, [">= 0.4.4"])
|
80
|
+
s.add_dependency(%q<log4r>, [">= 1.1.2"])
|
81
|
+
end
|
82
|
+
else
|
83
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
84
|
+
s.add_dependency(%q<yard>, [">= 0.4.0"])
|
85
|
+
s.add_dependency(%q<cucumber>, [">= 0.4.4"])
|
86
|
+
s.add_dependency(%q<log4r>, [">= 1.1.2"])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
@@ -13,21 +13,23 @@ Feature: The DSL supports various parameters
|
|
13
13
|
| Tar | onlyif, backup, to, user, host, filename, options | ok |
|
14
14
|
| Mysql | onlyif, backup, to, user, host, filename, options | ok |
|
15
15
|
| Rsync | onlyif, backup, to, user, host, options | ok |
|
16
|
+
| Tidy | onlyif, directory | ok |
|
16
17
|
|
17
18
|
Scenarios: full set, but invalid parameters are present
|
18
19
|
| task | parameters | result |
|
19
20
|
| Tar | onlyif, backup, to, user, host, filename, options, invalid_parameter | fatal "undefined method `invalid_parameter'" |
|
20
21
|
| Mysql | onlyif, backup, to, user, host, filename, options, invalid_parameter | fatal "undefined method `invalid_parameter'" |
|
21
22
|
| Rsync | onlyif, backup, to, user, host, options, invalid_parameter | fatal "undefined method `invalid_parameter'" |
|
23
|
+
| Tidy | onlyif, directory, invalid_parameter | fatal "undefined method `invalid_parameter'" |
|
22
24
|
|
23
25
|
Scenarios: minimal set, all required parameters are provided
|
24
26
|
| task | parameters | result |
|
25
27
|
| Tar | backup | ok |
|
26
28
|
| Mysql | | ok |
|
27
29
|
| Rsync | backup | ok |
|
30
|
+
| Tidy | | ok |
|
28
31
|
|
29
32
|
Scenarios: one required parameter is missing
|
30
33
|
| task | parameters | result |
|
31
34
|
| Tar | onlyif, to, user, host, filename, options | error "A required parameter is missing: backup" |
|
32
35
|
| Rsync | onlyif, to, user, host, options | error "A required parameter is missing: backup" |
|
33
|
-
|
data/lib/backup_man/backup.rb
CHANGED
@@ -45,78 +45,32 @@ module BackupMan
|
|
45
45
|
# because the default values are not available at that time;
|
46
46
|
def set_defaults
|
47
47
|
@data_sources = [] unless @data_sources
|
48
|
-
@backup_directory =
|
48
|
+
@backup_directory = Backup.make_default_backup_directory(@name) unless @backup_directory
|
49
49
|
@onlyif = "true" if @onlyif.nil?
|
50
50
|
@user = 'root' unless @user
|
51
51
|
@host = @name unless @host
|
52
52
|
end
|
53
|
-
|
54
|
-
#
|
55
|
-
#
|
56
|
-
def
|
57
|
-
|
58
|
-
yield(self) if block_given?
|
59
|
-
BackupMan.instance.register_backup( self )
|
53
|
+
|
54
|
+
# DRY method for creating the default backup directory. Also used for
|
55
|
+
# creating the default tidy directory.
|
56
|
+
def self.make_default_backup_directory( name )
|
57
|
+
"#{BackupMan.instance.destdir}/#{name}"
|
60
58
|
end
|
61
59
|
|
62
|
-
# calling this actually runs the backup; DO NOT override this; override
|
63
|
-
# _run instead
|
64
|
-
def run
|
65
|
-
log_begin_of_run
|
66
|
-
set_defaults
|
67
|
-
debug_log_dsl_info
|
68
|
-
unless missing_required_parameters.empty?
|
69
|
-
Log.error( "#{self}: A required parameter is missing: #{missing_required_parameters.join ' '}")
|
70
|
-
return
|
71
|
-
end
|
72
|
-
onlyif = eval( @onlyif )
|
73
|
-
Log.debug( "onlyif = { #{@onlyif} } evaluates #{onlyif}" )
|
74
|
-
if onlyif
|
75
|
-
unless @backup_directory
|
76
|
-
Log.error( "#{self}: No backup directory. Don't know where to store all this stuff.")
|
77
|
-
else
|
78
|
-
FileUtils.mkdir_p @backup_directory
|
79
|
-
_run
|
80
|
-
end
|
81
|
-
else
|
82
|
-
Log.info( "#{self}: Preconditions for backup run not fulfilled.")
|
83
|
-
end
|
84
|
-
log_end_of_run
|
85
|
-
end
|
86
|
-
|
87
|
-
# @return [String]
|
88
|
-
def to_s
|
89
|
-
"#{self.class} #{self.name}"
|
90
|
-
end
|
91
|
-
|
92
|
-
|
93
60
|
|
94
61
|
private
|
95
|
-
|
96
|
-
# @abstract override this to implement the actual backup commands
|
62
|
+
|
97
63
|
def _run
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
missing << name if mandatory && self.instance_variable_get("@#{var}").empty?
|
64
|
+
# checking if we have the backup_directory
|
65
|
+
unless @backup_directory
|
66
|
+
Log.error( "#{self}: No backup directory. Don't know where to store all this stuff.")
|
67
|
+
return false
|
68
|
+
else
|
69
|
+
FileUtils.mkdir_p @backup_directory
|
70
|
+
return true
|
106
71
|
end
|
107
|
-
missing
|
108
72
|
end
|
109
|
-
|
110
|
-
# not used acutally
|
111
|
-
def log_begin_of_run
|
112
|
-
Log.info( "Starting #{self.class} run for #{@name}." )
|
113
|
-
end
|
114
|
-
|
115
|
-
# simply logs that the program terminates
|
116
|
-
def log_end_of_run
|
117
|
-
Log.info( "Finished #{self.class} run for #{@name}." )
|
118
|
-
end
|
119
|
-
|
73
|
+
|
120
74
|
# @return [String] the ssh command string including user@host
|
121
75
|
def ssh_connect_cmd
|
122
76
|
"#{BackupMan.instance.ssh_app} #{@user}@#{@host}"
|
data/lib/backup_man/cli.rb
CHANGED
data/lib/backup_man/dsl.rb
CHANGED
@@ -16,6 +16,14 @@ module BackupMan
|
|
16
16
|
host_class.extend(ClassMethods)
|
17
17
|
end
|
18
18
|
|
19
|
+
# yields the block which comes from the DSL configuration file; also
|
20
|
+
# registers the new backup configuration with {BackupMan}
|
21
|
+
def initialize( name )
|
22
|
+
@name = name
|
23
|
+
yield(self) if block_given?
|
24
|
+
BackupMan.instance.register_backup( self )
|
25
|
+
end
|
26
|
+
|
19
27
|
def debug_log_dsl_info
|
20
28
|
Log.debug( "Job settings:")
|
21
29
|
self.class.dsl_methods.each do |method, var|
|
@@ -23,6 +31,61 @@ module BackupMan
|
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
34
|
+
# calling this actually runs the backup/task; DO NOT override this; override
|
35
|
+
# _run instead
|
36
|
+
def run
|
37
|
+
log_begin_of_run
|
38
|
+
set_defaults
|
39
|
+
debug_log_dsl_info
|
40
|
+
unless missing_required_parameters.empty?
|
41
|
+
Log.error( "#{self}: A required parameter is missing: #{missing_required_parameters.join ' '}")
|
42
|
+
return
|
43
|
+
end
|
44
|
+
onlyif = eval( @onlyif )
|
45
|
+
Log.debug( "onlyif = { #{@onlyif} } evaluates #{onlyif}" )
|
46
|
+
if onlyif
|
47
|
+
_run
|
48
|
+
else
|
49
|
+
Log.info( "#{self}: Preconditions for backup run not fulfilled.")
|
50
|
+
end
|
51
|
+
log_end_of_run
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String]
|
55
|
+
def to_s
|
56
|
+
"#{self.class} #{self.name}"
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# @abstract override this to implement the actual backup commands
|
61
|
+
def _run
|
62
|
+
throw "Hey. Cannot run just 'Backup'."
|
63
|
+
end
|
64
|
+
private :_run
|
65
|
+
|
66
|
+
# @return [Array of Strings] of missing parameters
|
67
|
+
def missing_required_parameters
|
68
|
+
missing = []
|
69
|
+
self.class.dsl_methods.each do |name, var, mandatory|
|
70
|
+
missing << name if mandatory && self.instance_variable_get("@#{var}").empty?
|
71
|
+
end
|
72
|
+
missing
|
73
|
+
end
|
74
|
+
private :missing_required_parameters
|
75
|
+
|
76
|
+
# not used acutally
|
77
|
+
def log_begin_of_run
|
78
|
+
Log.info( "Starting #{self.class} run for #{@name}." )
|
79
|
+
end
|
80
|
+
private :log_begin_of_run
|
81
|
+
|
82
|
+
# simply logs that the program terminates
|
83
|
+
def log_end_of_run
|
84
|
+
Log.info( "Finished #{self.class} run for #{@name}." )
|
85
|
+
end
|
86
|
+
private :log_end_of_run
|
87
|
+
|
88
|
+
|
26
89
|
module ClassMethods
|
27
90
|
|
28
91
|
# @param [String] name
|
@@ -30,7 +93,7 @@ module BackupMan
|
|
30
93
|
# @param [Boolean] mandatory, true if this var is a required parameter
|
31
94
|
def def_dsl( name, var = name, mandatory = false )
|
32
95
|
class_eval( %Q{
|
33
|
-
def #{name}( #{var} )
|
96
|
+
def #{name}( #{var} = true )
|
34
97
|
@#{var} = #{var}
|
35
98
|
end
|
36
99
|
})
|
@@ -59,7 +122,7 @@ module BackupMan
|
|
59
122
|
@dsl_methods
|
60
123
|
end
|
61
124
|
|
62
|
-
|
63
125
|
end # ClassMethods
|
126
|
+
|
64
127
|
end #DSL
|
65
128
|
end #BackupMan
|
data/lib/backup_man/mysql.rb
CHANGED
@@ -19,8 +19,10 @@ module BackupMan
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def _run
|
22
|
-
|
23
|
-
|
22
|
+
if super
|
23
|
+
remote_cmd = "mysqldump #{@options}"
|
24
|
+
Command.new("#{ssh_connect_cmd} '#{remote_cmd} | gzip' > '#{@backup_directory}/#{@filename}'").run
|
25
|
+
end
|
24
26
|
end
|
25
27
|
|
26
28
|
# returns true if the backup already exists
|
data/lib/backup_man/rsync.rb
CHANGED
@@ -17,8 +17,10 @@ module BackupMan
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def _run
|
20
|
-
|
21
|
-
|
20
|
+
if super
|
21
|
+
@data_sources.each do |dir|
|
22
|
+
Command.new("rsync #{@options} -e '#{BackupMan.instance.ssh_app}' '#{@user}@#{@host}:#{dir}' '#{@backup_directory}'").run
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
data/lib/backup_man/tar.rb
CHANGED
@@ -20,8 +20,10 @@ module BackupMan
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def _run
|
23
|
-
|
24
|
-
|
23
|
+
if super
|
24
|
+
remote_cmd = "tar -c#{@options}f - ", @data_sources.join(" ")
|
25
|
+
Command.new("#{ssh_connect_cmd} #{remote_cmd} > '#{@backup_directory}/#{@filename}'").run
|
26
|
+
end
|
25
27
|
end
|
26
28
|
|
27
29
|
# returns true if the backup already exists
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 4
|
9
|
+
version: 0.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Markus Strauss
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-03-01 00:00:00 +01:00
|
18
18
|
default_executable: backup_man
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- .document
|
87
87
|
- .gitignore
|
88
88
|
- .yardopts
|
89
|
+
- BackupMan.gemspec
|
89
90
|
- LICENSE
|
90
91
|
- README.rdoc
|
91
92
|
- Rakefile
|