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 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
-
@@ -7,7 +7,8 @@ def defaults
7
7
  "user" => "'user'",
8
8
  "host" => "'host'",
9
9
  "filename" => "'filename'",
10
- "options" => "'options'"
10
+ "options" => "'options'",
11
+ "directory" => "'directory'"
11
12
  }
12
13
  end
13
14
 
@@ -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 = "#{BackupMan.instance.destdir}/#{@name}" unless @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
- # yields the block which comes from the DSL configuration file; also
55
- # registers the new backup configuration with {BackupMan}
56
- def initialize( name )
57
- @name = name
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
- throw "Hey. Cannot run just 'Backup'."
99
- end
100
-
101
- # @return [Array of Strings] of missing parameters
102
- def missing_required_parameters
103
- missing = []
104
- self.class.dsl_methods.each do |name, var, mandatory|
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}"
@@ -6,7 +6,7 @@ require_relative 'log'
6
6
  require_relative 'tar'
7
7
  require_relative 'rsync'
8
8
  require_relative 'mysql'
9
-
9
+ require_relative 'tidy'
10
10
 
11
11
  module BackupMan
12
12
  class CLI
@@ -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
@@ -19,8 +19,10 @@ module BackupMan
19
19
  end
20
20
 
21
21
  def _run
22
- remote_cmd = "mysqldump #{@options}"
23
- Command.new("#{ssh_connect_cmd} '#{remote_cmd} | gzip' > '#{@backup_directory}/#{@filename}'").run
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
@@ -17,8 +17,10 @@ module BackupMan
17
17
  end
18
18
 
19
19
  def _run
20
- @data_sources.each do |dir|
21
- Command.new("rsync #{@options} -e '#{BackupMan.instance.ssh_app}' '#{@user}@#{@host}:#{dir}' '#{@backup_directory}'").run
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
 
@@ -20,8 +20,10 @@ module BackupMan
20
20
  end
21
21
 
22
22
  def _run
23
- remote_cmd = "tar -c#{@options}f - ", @data_sources.join(" ")
24
- Command.new("#{ssh_connect_cmd} #{remote_cmd} > '#{@backup_directory}/#{@filename}'").run
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
- - 3
9
- version: 0.1.3
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-02-26 00:00:00 +01:00
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