siba 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/README.md +3 -3
  2. data/Rakefile +6 -6
  3. data/lib/siba/backup.rb +2 -2
  4. data/lib/siba/console.rb +13 -13
  5. data/lib/siba/generator.rb +4 -5
  6. data/lib/siba/helpers/file_helper.rb +6 -6
  7. data/lib/siba/helpers/password_strength.rb +5 -5
  8. data/lib/siba/helpers/security_helper.rb +9 -9
  9. data/lib/siba/helpers/test/extend_test.rb +7 -7
  10. data/lib/siba/helpers/test/helper.rb +3 -3
  11. data/lib/siba/logger_plug.rb +1 -1
  12. data/lib/siba/plugins/archive/tar/archive.rb +8 -8
  13. data/lib/siba/plugins/archive/tar/init.rb +3 -3
  14. data/lib/siba/plugins/destination/dir/dest_dir.rb +7 -7
  15. data/lib/siba/plugins/destination/dir/init.rb +2 -2
  16. data/lib/siba/plugins/encryption/gpg/encryption.rb +10 -10
  17. data/lib/siba/plugins/encryption/gpg/init.rb +1 -1
  18. data/lib/siba/plugins/installed_plugins.rb +10 -6
  19. data/lib/siba/plugins/plugin_loader.rb +6 -5
  20. data/lib/siba/plugins/source/files/files.rb +7 -7
  21. data/lib/siba/plugins/source/files/init.rb +2 -2
  22. data/lib/siba/restore.rb +5 -5
  23. data/lib/siba/scaffold.rb +17 -17
  24. data/lib/siba/siba_check.rb +3 -3
  25. data/lib/siba/siba_file.rb +6 -6
  26. data/lib/siba/siba_logger.rb +11 -11
  27. data/lib/siba/tasks/siba_task.rb +1 -1
  28. data/lib/siba/tasks/siba_tasks.rb +7 -7
  29. data/lib/siba/test_files.rb +4 -4
  30. data/lib/siba/tmp_dir.rb +4 -4
  31. data/lib/siba/version.rb +1 -1
  32. data/scaffolds/archive.rb +3 -3
  33. data/scaffolds/destination.rb +4 -4
  34. data/scaffolds/encryption.rb +3 -3
  35. data/scaffolds/project/siba-c6y-demo.gemspec +2 -2
  36. data/scaffolds/project/test/helper/require_integration.rb +1 -1
  37. data/scaffolds/project/test/integration/i9n_init.rb +4 -4
  38. data/scaffolds/project/test/unit/test_init.rb +8 -8
  39. data/scaffolds/shared/examples.rb +4 -4
  40. data/scaffolds/source.rb +4 -4
  41. data/siba.gemspec +1 -1
  42. data/test/integration/helpers/i9n_file_helper.rb +1 -1
  43. data/test/integration/i9n_backup.rb +1 -1
  44. data/test/integration/i9n_scaffold.rb +1 -1
  45. data/test/integration/i9n_test_unicode_files.rb +1 -1
  46. data/test/integration/i9n_tmp_dir.rb +2 -2
  47. data/test/integration/plugins/destination/dir/i9n_dest_dir.rb +1 -1
  48. data/test/integration/plugins/encryption/gpg/i9n_encryption.rb +4 -4
  49. data/test/integration/plugins/source/files/i9n_files.rb +6 -6
  50. data/test/integration/tasks/i9n_siba_tasks.rb +2 -2
  51. data/test/unit/helpers/test_encoding_helper.rb +1 -1
  52. data/test/unit/helpers/test_gem_helper.rb +1 -1
  53. data/test/unit/helpers/test_security_helper.rb +1 -1
  54. data/test/unit/helpers/test_string_helper.rb +1 -1
  55. data/test/unit/plugins/archive/tar/test_archive.rb +2 -2
  56. data/test/unit/plugins/archive/tar/test_init.rb +2 -2
  57. data/test/unit/plugins/destination/dir/test_dest_dir.rb +1 -1
  58. data/test/unit/plugins/destination/dir/test_init.rb +1 -1
  59. data/test/unit/plugins/encryption/gpg/test_encryption.rb +2 -14
  60. data/test/unit/plugins/encryption/gpg/test_init.rb +3 -3
  61. data/test/unit/plugins/source/files/test_files.rb +2 -2
  62. data/test/unit/plugins/source/files/test_init.rb +3 -3
  63. data/test/unit/plugins/source/files/test_path_match.rb +6 -6
  64. data/test/unit/plugins/test_installed_plugins.rb +4 -0
  65. data/test/unit/plugins/test_plugin_loader.rb +6 -3
  66. data/test/unit/tasks/test_siba_task.rb +2 -2
  67. data/test/unit/tasks/test_siba_tasks.rb +3 -3
  68. data/test/unit/test_backup.rb +2 -2
  69. data/test/unit/test_console.rb +5 -5
  70. data/test/unit/test_generator.rb +1 -1
  71. data/test/unit/test_globals.rb +1 -1
  72. data/test/unit/test_log_message.rb +1 -1
  73. data/test/unit/test_logger_plug.rb +1 -1
  74. data/test/unit/test_options_backup.rb +1 -1
  75. data/test/unit/test_options_loader.rb +27 -39
  76. data/test/unit/test_password_strength.rb +14 -14
  77. data/test/unit/test_restore.rb +2 -2
  78. data/test/unit/test_siba_logger.rb +18 -18
  79. data/test/unit/test_tmp_dir.rb +1 -1
  80. metadata +5 -5
data/README.md CHANGED
@@ -64,15 +64,15 @@ It is recommended to run `siba backup` command daily or hourly. Use your favouri
64
64
  * **mysql**: backup and restore MySQL database ([homepage](https://github.com/evgenyneu/siba-source-mysql)).
65
65
 
66
66
  ### Archive
67
-
67
+
68
68
  * **tar:** archive with optional gzip or bzip2 compression.
69
69
 
70
70
  ### Encryption
71
-
71
+
72
72
  * **gpg:** encrypt with AES256, Blowfish, Twofish, 3DES and other ciphers.
73
73
 
74
74
  ### Destination
75
-
75
+
76
76
  * **dir:** backup to local directory.
77
77
  * **aws-s3:** upload backup to Amazon S3 storage ([homepage](https://github.com/evgenyneu/siba-destination-aws-s3)).
78
78
  * **ftp:** store backups on FTP server ([homepage](https://github.com/evgenyneu/siba-destination-ftp)).
data/Rakefile CHANGED
@@ -3,17 +3,17 @@ require 'rake/testtask'
3
3
 
4
4
  namespace "test" do
5
5
  desc "Run all unit tests"
6
- Rake::TestTask.new("unit") do |t|
6
+ Rake::TestTask.new("unit") do |t|
7
7
  t.pattern = "test/unit/**/test*.rb"
8
- t.libs << 'test'
8
+ t.libs << 'test'
9
9
  end
10
10
 
11
11
  desc "Run all integration tests"
12
- Rake::TestTask.new("integration") do |t|
12
+ Rake::TestTask.new("integration") do |t|
13
13
  t.pattern = "test/integration/**/i9n_*.rb"
14
- t.libs << 'test'
14
+ t.libs << 'test'
15
15
  end
16
-
16
+
17
17
  desc "Run all integration tests"
18
18
  task :i9n => ["test:integration"] do
19
19
  end
@@ -23,5 +23,5 @@ desc "Run all unit tests"
23
23
  task :test => ["test:unit"] do
24
24
  end
25
25
 
26
- desc "Run tests"
26
+ desc "Run tests"
27
27
  task :default => "test:unit"
@@ -20,10 +20,10 @@ private
20
20
  Siba.settings = options["settings"] || {}
21
21
  Siba.backup_name = File.basename path_to_options_yml, ".yml"
22
22
 
23
- TmpDir.test_access
23
+ TmpDir.test_access
24
24
  SibaTasks.new(options, path_to_options_yml, false).backup
25
25
  Siba.cleanup_tmp_dir
26
- rescue Exception => e
26
+ rescue Exception => e
27
27
  logger.fatal e
28
28
  logger.log_exception e, true
29
29
  end
@@ -6,7 +6,7 @@ require 'siba/generator'
6
6
 
7
7
  module Siba
8
8
  class Console
9
- include Siba::FilePlug
9
+ include Siba::FilePlug
10
10
 
11
11
  UNUSED_COMMAND = "unused" # unused command for testing command line options
12
12
  attr_accessor :test_mode, :parser, :options
@@ -28,8 +28,8 @@ module Siba
28
28
  parser = OptionParser.new do |o|
29
29
  o.banner = "Usage: siba command ARGUMENTS [options...]
30
30
 
31
- Examples:
32
- siba generate mybak Generate mybak.yml options file
31
+ Examples:
32
+ siba generate mybak Generate mybak.yml options file
33
33
  siba backup mybak Run backup, reading options from mybak.yml
34
34
  siba restore mybak Restore the backup
35
35
  siba list Show available plugins
@@ -43,12 +43,12 @@ Options:"
43
43
  o.on("--log FILE", "Set path to log FILE") do |log|
44
44
  options['log'] = log
45
45
  end
46
-
47
- o.on("--no-log", "Work without logging") do
46
+
47
+ o.on("--no-log", "Work without logging") do
48
48
  SibaLogger.no_log = true
49
49
  end
50
50
 
51
- o.on("--current-source", "Used with 'restore' command. Restores into the source location which is specified in the CURRENT options file instead of the ORIGINAL source location") do
51
+ o.on("--current-source", "Used with 'restore' command. Restores into the source location which is specified in the CURRENT options file instead of the ORIGINAL source location") do
52
52
  options['cur'] = true
53
53
  end
54
54
 
@@ -74,12 +74,12 @@ Options:"
74
74
  o.separator "Homepage: https://github.com/evgenyneu/siba"
75
75
  end
76
76
 
77
- if argv.empty?
77
+ if argv.empty?
78
78
  show_message parser.to_s
79
79
  return
80
80
  end
81
-
82
- begin
81
+
82
+ begin
83
83
  parser.parse! argv
84
84
  rescue Exception => e
85
85
  @parser = parser
@@ -90,14 +90,14 @@ Options:"
90
90
  show_error "ambiguous usage of both --log and --no-log switches"
91
91
  return
92
92
  end
93
-
93
+
94
94
  parser
95
95
  end
96
96
 
97
97
  def parse_command(argv)
98
98
  command = argv.shift
99
99
  show_error "missing a command", true if command.nil?
100
-
100
+
101
101
  case command.downcase
102
102
  when "b", "backup"
103
103
  backup argv
@@ -173,7 +173,7 @@ Options:"
173
173
 
174
174
  def list
175
175
  show_message "Available SIBA plugins:
176
-
176
+
177
177
  #{Siba::Plugins.get_list} * Currently installed"
178
178
  end
179
179
 
@@ -181,7 +181,7 @@ Options:"
181
181
  file = argv.shift
182
182
  if file.nil?
183
183
  show_error "missing file name"
184
- end
184
+ end
185
185
  begin
186
186
  path_to_yaml = Siba::Generator.new(file).generate
187
187
  show_message "Options file generated: #{path_to_yaml}
@@ -43,15 +43,14 @@ module Siba
43
43
  end
44
44
 
45
45
  unless Siba::InstalledPlugins.installed? category, type
46
- siba_kernel.puts "#{type} plugin is not installed."
47
- siba_kernel.puts "Run 'gem install #{Siba::InstalledPlugins.gem_name(category, type)}' to install it and try again."
46
+ siba_kernel.puts Siba::InstalledPlugins.install_gem_message(category, type)
48
47
  return
49
48
  end
50
49
  else
51
50
  type = types.keys.first
52
51
  end
53
52
 
54
- options = Siba::Generator.load_plugin_yaml_content category, type
53
+ options = Siba::Generator.load_plugin_yaml_content category, type
55
54
  unless options =~ /^\s*type:/
56
55
  options = "type: #{type}\n" + options
57
56
  end
@@ -83,7 +82,7 @@ module Siba
83
82
  raise "Failed to load options for #{InstalledPlugins.plugin_category_and_type(category, type)} plugin from file: #{path}. Error: #{ex.message}"
84
83
  end
85
84
  end
86
- end
85
+ end
87
86
 
88
87
  def get_plugin_yaml_path(category, type)
89
88
  siba_file.run_this do
@@ -107,7 +106,7 @@ module Siba
107
106
  return types[number-1]
108
107
  else
109
108
  siba_kernel.printf msg
110
- end
109
+ end
111
110
  end
112
111
  end
113
112
  end
@@ -46,21 +46,21 @@ module Siba
46
46
  siba_file.dir_entries(dir) - %w{ . .. }
47
47
  end
48
48
 
49
- # Retuns an array containing names of sub-directories located in the dir
49
+ # Retuns an array containing names of sub-directories located in the dir
50
50
  def dirs(dir)
51
51
  entries(dir).select do |entry|
52
52
  siba_file.file_directory?(File.join(dir,entry))
53
53
  end
54
54
  end
55
55
 
56
- # Retuns an array containing names of files located in the dir
56
+ # Retuns an array containing names of files located in the dir
57
57
  def files(dir)
58
58
  entries(dir).select do |entry|
59
59
  siba_file.file_file?(File.join(dir,entry))
60
60
  end
61
61
  end
62
62
 
63
- # Raises error if dirs are not identical
63
+ # Raises error if dirs are not identical
64
64
  def dirs_same?(dir1, dir2)
65
65
  dir1_entries = siba_file.dir_entries dir1
66
66
  dir2_entries = siba_file.dir_entries dir2
@@ -80,13 +80,13 @@ module Siba
80
80
  if siba_file.file_file? sub_dir1_entry
81
81
  raise "#{msg}'#{sub_dir2_entry}' is not a file" unless siba_file.file_file? sub_dir2_entry
82
82
  unless siba_file.file_utils_compare_file sub_dir1_entry, sub_dir2_entry
83
- raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' files are different."
83
+ raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' files are different."
84
84
  end
85
85
  end
86
-
86
+
87
87
  # compare permissions
88
88
  if (siba_file.file_stat(sub_dir1_entry).mode % 01000) != (siba_file.file_stat(sub_dir2_entry).mode % 01000)
89
- raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' entries have different permissions."
89
+ raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' entries have different permissions."
90
90
  end
91
91
 
92
92
  # compare sub-dirs
@@ -1,10 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Siba
4
- # Password strength calculator based on:
4
+ # Password strength calculator based on:
5
5
  # http://snippets.dzone.com/posts/show/4698
6
6
  # https://www.grc.com/haystack.htm
7
- class PasswordStrength
7
+ class PasswordStrength
8
8
  PASSWORD_SETS = {
9
9
  /[a-z]/ => 26,
10
10
  /[A-Z]/ => 26,
@@ -48,7 +48,7 @@ module Siba
48
48
  end
49
49
 
50
50
  # Convert the number of seconds human-friendly timespan string
51
- # Example:
51
+ # Example:
52
52
  # 130: 2 minutes
53
53
  # 12345: 3 hours
54
54
  def seconds_to_timespan(seconds)
@@ -82,8 +82,8 @@ module Siba
82
82
  illion_unit = ""
83
83
  Illions.each_pair do |a,b|
84
84
  ticks_next = ticks.to_f / b
85
- break if ticks_next < 1
86
- illion_unit = a
85
+ break if ticks_next < 1
86
+ illion_unit = a
87
87
  ticks = ticks_next
88
88
  end
89
89
 
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
-
2
+
3
3
  require 'securerandom'
4
4
 
5
5
  module Siba
@@ -8,23 +8,23 @@ module Siba
8
8
  def generate_password_for_yaml(length = 16)
9
9
  characters = (32..126).to_a - "\\\"".bytes.to_a - "`".bytes.to_a
10
10
 
11
- (0...length).map{
11
+ (0...length).map{
12
12
  characters[SecureRandom.random_number(characters.size)].chr
13
- }.join
13
+ }.join
14
14
  end
15
15
 
16
16
  def alphanumeric_password(length = 16, lowercase_only=false, non_ambiguous = false)
17
17
  characters = ('a'..'z').to_a + ('0'..'9').to_a
18
18
  characters += ('A'..'Z').to_a unless lowercase_only
19
19
 
20
- %w{I O l 0 1}.each{ |ambiguous_character|
21
- characters.delete ambiguous_character
22
- } if non_ambiguous
20
+ %w{I O l 0 1}.each{ |ambiguous_character|
21
+ characters.delete ambiguous_character
22
+ } if non_ambiguous
23
23
 
24
- (0...length).map{
24
+ (0...length).map{
25
25
  characters[SecureRandom.random_number(characters.size)]
26
- }.join
26
+ }.join
27
27
  end
28
- end
28
+ end
29
29
  end
30
30
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  class MiniTest::Unit::TestCase
4
- include Siba::FilePlug
4
+ include Siba::FilePlug
5
5
  def must_log(level)
6
6
  verify_log true, level, true
7
7
  end
@@ -32,12 +32,12 @@ class MiniTest::Unit::TestCase
32
32
 
33
33
  def mock_file(name, retval, args=[])
34
34
  mock = new_mock_file
35
- mock.expect name, retval, args
35
+ mock.expect name, retval, args
36
36
  mock
37
37
  end
38
38
 
39
39
  def new_mock_file
40
- Siba::FilePlug.siba_file = MiniTest::Mock.new
40
+ Siba::FilePlug.siba_file = MiniTest::Mock.new
41
41
  end
42
42
 
43
43
  def create_plugin(yml_file_name_or_options_hash)
@@ -46,7 +46,7 @@ class MiniTest::Unit::TestCase
46
46
  else
47
47
  @options = yml_file_name_or_options_hash
48
48
  end
49
-
49
+
50
50
  unless @plugin_category
51
51
  raise Siba::Error, "Initialize '@plugin_category' variable (#{Siba::Plugins.categories_str})"
52
52
  end
@@ -70,7 +70,7 @@ class MiniTest::Unit::TestCase
70
70
  tmp_dir ||= SibaTest.tmp_dir
71
71
  Siba::TestFiles::prepare_test_dir dir_name_part, tmp_dir
72
72
  end
73
-
73
+
74
74
  def prepare_test_file(file_name_part, tmp_dir = nil)
75
75
  tmp_dir ||= SibaTest.tmp_dir
76
76
  Siba::TestFiles::prepare_test_file file_name_part, tmp_dir
@@ -93,13 +93,13 @@ class MiniTest::Unit::TestCase
93
93
  def prepare_options(src_yml_path, replace_data)
94
94
  Siba::TestFiles::prepare_options(src_yml_path, replace_data)
95
95
  end
96
-
96
+
97
97
  def prepare_yml(src_yml_path, replace_data, tmp_dir=nil)
98
98
  tmp_dir ||= SibaTest.tmp_dir
99
99
  Siba::TestFiles::prepare_yml src_yml_path, replace_data, tmp_dir
100
100
  end
101
101
 
102
- private
102
+ private
103
103
 
104
104
  def verify_log(must_change, log_level, exact_level = true)
105
105
  log_count = Siba::SibaLogger.count log_level, exact_level
@@ -20,7 +20,7 @@ module SibaTest
20
20
  Siba::LoggerPlug.create "Test", nil
21
21
  Siba::SibaLogger.messages = []
22
22
  Siba.settings = {}
23
- Siba.current_dir = @current_dir
23
+ Siba.current_dir = @current_dir
24
24
  Siba.backup_name = "siba"
25
25
  SibaTest::KernelMock.mock_all_methods # prevents tests from accessing Kernel methods
26
26
  end
@@ -33,7 +33,7 @@ module SibaTest
33
33
  def init_unit
34
34
  init
35
35
  MiniTest::Unit::TestCase.add_setup_hook do
36
- SibaTest::FileMock.mock_all_methods # prevents tests from doing file operations
36
+ SibaTest::FileMock.mock_all_methods # prevents tests from doing file operations
37
37
  Siba.class_eval {@tmp_dir = SibaTest::TmpDirMocked}
38
38
  end
39
39
  end
@@ -42,7 +42,7 @@ module SibaTest
42
42
  init
43
43
  MiniTest::Unit::TestCase.add_teardown_hook do
44
44
  # cleanup after each integration test
45
- Siba.current_dir = @current_dir
45
+ Siba.current_dir = @current_dir
46
46
  Siba.cleanup_tmp_dir
47
47
  SibaTest.cleanup_tmp_dir
48
48
  end
@@ -13,7 +13,7 @@ module Siba
13
13
  def logger
14
14
  raise Siba::Error, "Log is not created" unless LoggerPlug.opened?
15
15
  @logger
16
- end
16
+ end
17
17
 
18
18
  def create(name, path_to_log_file, show_start_message = true)
19
19
  raise Siba::Error, "Log is already created" if LoggerPlug.opened?
@@ -5,7 +5,7 @@ module Siba::Archive
5
5
  class Archive
6
6
  include Siba::FilePlug
7
7
  include Siba::LoggerPlug
8
- attr_accessor :compression
8
+ attr_accessor :compression
9
9
 
10
10
  def initialize(compression)
11
11
  @compression = compression
@@ -22,7 +22,7 @@ module Siba::Archive
22
22
  archive_name = "#{dest_file_name}.tar#{extension}"
23
23
  archive_path = File.join(dest_dir, archive_name)
24
24
  siba_file.run_this do
25
- raise Siba::Error, "Archive file already exists: #{archive_path}" if siba_file.file_file?(archive_path) || siba_file.file_directory?(archive_path)
25
+ raise Siba::Error, "Archive file already exists: #{archive_path}" if siba_file.file_file?(archive_path) || siba_file.file_directory?(archive_path)
26
26
 
27
27
  siba_file.file_utils_cd dest_dir
28
28
  command_text = %(tar c#{options}f #{archive_name} -C "#{sources_dir}" .)
@@ -38,7 +38,7 @@ module Siba::Archive
38
38
  options = get_tar_option
39
39
  archive_name = File.basename archive_path
40
40
  archive_dir = File.dirname archive_path
41
- siba_file.file_utils_cd archive_dir
41
+ siba_file.file_utils_cd archive_dir
42
42
  command_text = %(tar x#{options}f #{archive_name} -C "#{destination_dir}")
43
43
  # Using -C 'change directory' option to make it work on Windows
44
44
  # because Windows will not understand absolute path to tar: "tar xf c:\dir\file.tar"
@@ -65,7 +65,7 @@ module Siba::Archive
65
65
  end
66
66
  end
67
67
 
68
- def test_archive_and_extract
68
+ def test_archive_and_extract
69
69
  # archive
70
70
  src_dir = Siba::TestFiles.prepare_test_dir "tar-archive-src"
71
71
  dest_dir = Siba::TestFiles.mkdir_in_tmp_dir "tar-archive-dest"
@@ -89,27 +89,27 @@ module Siba::Archive
89
89
  protected
90
90
  def self.get_tar_extension(compression)
91
91
  case compression
92
- when "none"
92
+ when "none"
93
93
  ""
94
94
  when "gzip"
95
95
  ".gz"
96
96
  when "bzip2"
97
97
  ".bz2"
98
98
  else
99
- raise
99
+ raise
100
100
  end
101
101
  end
102
102
 
103
103
  def get_tar_option
104
104
  case compression
105
- when "none"
105
+ when "none"
106
106
  ""
107
107
  when "gzip"
108
108
  "z"
109
109
  when "bzip2"
110
110
  "j"
111
111
  else
112
- raise
112
+ raise
113
113
  end
114
114
  end
115
115
  end