BackupMan 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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