siba 0.4.3
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/.gitignore +7 -0
- data/Gemfile +4 -0
- data/Guardfile +18 -0
- data/LICENSE +22 -0
- data/README.md +47 -0
- data/Rakefile +27 -0
- data/bin/siba +5 -0
- data/lib/siba.rb +27 -0
- data/lib/siba/backup.rb +31 -0
- data/lib/siba/console.rb +196 -0
- data/lib/siba/errors.rb +8 -0
- data/lib/siba/generator.rb +115 -0
- data/lib/siba/globals.rb +19 -0
- data/lib/siba/helpers/encoding_helper.rb +38 -0
- data/lib/siba/helpers/file_helper.rb +89 -0
- data/lib/siba/helpers/gem_helper.rb +22 -0
- data/lib/siba/helpers/password_strength.rb +94 -0
- data/lib/siba/helpers/security_helper.rb +30 -0
- data/lib/siba/helpers/string_helper.rb +32 -0
- data/lib/siba/helpers/test/extend_test.rb +114 -0
- data/lib/siba/helpers/test/file_mock.rb +38 -0
- data/lib/siba/helpers/test/helper.rb +55 -0
- data/lib/siba/helpers/test/kernel_mock.rb +44 -0
- data/lib/siba/helpers/test/removable_constants.rb +18 -0
- data/lib/siba/helpers/test/require.rb +12 -0
- data/lib/siba/logger_plug.rb +36 -0
- data/lib/siba/options_backup.rb +37 -0
- data/lib/siba/options_loader.rb +38 -0
- data/lib/siba/plugins/archive/tar/archive.rb +117 -0
- data/lib/siba/plugins/archive/tar/init.rb +38 -0
- data/lib/siba/plugins/archive/tar/options.yml +1 -0
- data/lib/siba/plugins/destination/dir/dest_dir.rb +77 -0
- data/lib/siba/plugins/destination/dir/init.rb +31 -0
- data/lib/siba/plugins/destination/dir/options.yml +2 -0
- data/lib/siba/plugins/encryption/gpg/encryption.rb +140 -0
- data/lib/siba/plugins/encryption/gpg/init.rb +45 -0
- data/lib/siba/plugins/encryption/gpg/options.yml +2 -0
- data/lib/siba/plugins/installed_plugins.rb +77 -0
- data/lib/siba/plugins/plugin_loader.rb +100 -0
- data/lib/siba/plugins/plugins.rb +57 -0
- data/lib/siba/plugins/plugins.yml +9 -0
- data/lib/siba/plugins/source/files/files.rb +166 -0
- data/lib/siba/plugins/source/files/init.rb +33 -0
- data/lib/siba/plugins/source/files/options.yml +11 -0
- data/lib/siba/restore.rb +113 -0
- data/lib/siba/scaffold.rb +166 -0
- data/lib/siba/siba_check.rb +75 -0
- data/lib/siba/siba_file.rb +89 -0
- data/lib/siba/siba_kernel.rb +37 -0
- data/lib/siba/siba_logger.rb +172 -0
- data/lib/siba/tasks/siba_task.rb +42 -0
- data/lib/siba/tasks/siba_tasks.rb +120 -0
- data/lib/siba/test_files.rb +76 -0
- data/lib/siba/test_files/a_file +1 -0
- data/lib/siba/test_files/files_and_dirs/.hidden +1 -0
- data/lib/siba/test_files/files_and_dirs/.hidden_dir/file10 +1 -0
- data/lib/siba/test_files/files_and_dirs/File With Spaces +1 -0
- data/lib/siba/test_files/files_and_dirs/dir1/file10 +1 -0
- data/lib/siba/test_files/files_and_dirs/dir1/sub-dir/file111.txt +1 -0
- data/lib/siba/test_files/files_and_dirs/file1 +1 -0
- data/lib/siba/test_files/files_and_dirs/file2.txt +1 -0
- data/lib/siba/tmp_dir.rb +94 -0
- data/lib/siba/version.rb +5 -0
- data/scaffolds/archive.rb +26 -0
- data/scaffolds/destination.rb +20 -0
- data/scaffolds/encryption.rb +26 -0
- data/scaffolds/project/.gitignore +5 -0
- data/scaffolds/project/Gemfile +4 -0
- data/scaffolds/project/Guardfile +9 -0
- data/scaffolds/project/LICENSE +22 -0
- data/scaffolds/project/README.md +33 -0
- data/scaffolds/project/Rakefile +28 -0
- data/scaffolds/project/lib/siba-c6y-demo.rb +11 -0
- data/scaffolds/project/lib/siba-c6y-demo/options.yml +2 -0
- data/scaffolds/project/lib/siba-c6y-demo/version.rb +9 -0
- data/scaffolds/project/siba-c6y-demo.gemspec +26 -0
- data/scaffolds/project/test/helper/require_integration.rb +5 -0
- data/scaffolds/project/test/helper/require_unit.rb +4 -0
- data/scaffolds/project/test/integration/i9n_init.rb +35 -0
- data/scaffolds/project/test/unit/test_init.rb +43 -0
- data/scaffolds/project/test/unit/yml/valid.yml +8 -0
- data/scaffolds/shared/examples.rb +47 -0
- data/scaffolds/shared/init_example.rb +13 -0
- data/scaffolds/source.rb +25 -0
- data/siba.gemspec +30 -0
- data/test/helper/require_integration.rb +4 -0
- data/test/helper/require_unit.rb +4 -0
- data/test/integration/helpers/i9n_file_helper.rb +50 -0
- data/test/integration/i9n_backup.rb +53 -0
- data/test/integration/i9n_console.rb +16 -0
- data/test/integration/i9n_generator.rb +29 -0
- data/test/integration/i9n_options_backup.rb +22 -0
- data/test/integration/i9n_scaffold.rb +27 -0
- data/test/integration/i9n_siba_file.rb +30 -0
- data/test/integration/i9n_test_unicode_files.rb +40 -0
- data/test/integration/i9n_tmp_dir.rb +44 -0
- data/test/integration/plugins/archive/tar/i9n_archive.rb +18 -0
- data/test/integration/plugins/destination/dir/i9n_dest_dir.rb +52 -0
- data/test/integration/plugins/encryption/gpg/i9n_encryption.rb +87 -0
- data/test/integration/plugins/i9n_installed_plugins.rb +13 -0
- data/test/integration/plugins/source/files/i9n_files.rb +146 -0
- data/test/integration/tasks/i9n_siba_tasks.rb +30 -0
- data/test/integration/yml/valid.yml +16 -0
- data/test/unit/helpers/test_encoding_helper.rb +17 -0
- data/test/unit/helpers/test_gem_helper.rb +17 -0
- data/test/unit/helpers/test_security_helper.rb +21 -0
- data/test/unit/helpers/test_string_helper.rb +35 -0
- data/test/unit/plugins/archive/tar/test_archive.rb +41 -0
- data/test/unit/plugins/archive/tar/test_init.rb +36 -0
- data/test/unit/plugins/archive/tar/yml/archive/check_installed.yml +2 -0
- data/test/unit/plugins/archive/tar/yml/init/default_compression.yml +1 -0
- data/test/unit/plugins/archive/tar/yml/init/invalid_compression.yml +2 -0
- data/test/unit/plugins/archive/tar/yml/init/valid.yml +2 -0
- data/test/unit/plugins/destination/dir/test_dest_dir.rb +41 -0
- data/test/unit/plugins/destination/dir/test_init.rb +36 -0
- data/test/unit/plugins/destination/dir/yml/init/valid.yml +2 -0
- data/test/unit/plugins/encryption/gpg/test_encryption.rb +70 -0
- data/test/unit/plugins/encryption/gpg/test_init.rb +47 -0
- data/test/unit/plugins/source/files/test_files.rb +44 -0
- data/test/unit/plugins/source/files/test_init.rb +48 -0
- data/test/unit/plugins/source/files/test_path_match.rb +140 -0
- data/test/unit/plugins/source/files/yml/ignore_list.yml +8 -0
- data/test/unit/plugins/source/files/yml/ignore_not_array.yml +5 -0
- data/test/unit/plugins/source/files/yml/include_not_array.yml +3 -0
- data/test/unit/plugins/source/files/yml/include_subdirs_false.yml +6 -0
- data/test/unit/plugins/source/files/yml/include_subdirs_missing.yml +5 -0
- data/test/unit/plugins/source/files/yml/no_ignore.yml +4 -0
- data/test/unit/plugins/source/files/yml/no_include.yml +1 -0
- data/test/unit/plugins/source/files/yml/valid.yml +9 -0
- data/test/unit/plugins/test_installed_plugins.rb +32 -0
- data/test/unit/plugins/test_plugin_loader.rb +27 -0
- data/test/unit/plugins/test_plugins.rb +44 -0
- data/test/unit/tasks/test_siba_task.rb +30 -0
- data/test/unit/tasks/test_siba_tasks.rb +84 -0
- data/test/unit/tasks/yml/task/invalid.yml +4 -0
- data/test/unit/tasks/yml/task/valid.yml +7 -0
- data/test/unit/test_backup.rb +18 -0
- data/test/unit/test_console.rb +166 -0
- data/test/unit/test_generator.rb +21 -0
- data/test/unit/test_globals.rb +34 -0
- data/test/unit/test_log_message.rb +26 -0
- data/test/unit/test_logger_plug.rb +49 -0
- data/test/unit/test_options_backup.rb +21 -0
- data/test/unit/test_options_loader.rb +72 -0
- data/test/unit/test_password_strength.rb +76 -0
- data/test/unit/test_restore.rb +18 -0
- data/test/unit/test_scaffold.rb +26 -0
- data/test/unit/test_siba_check.rb +118 -0
- data/test/unit/test_siba_logger.rb +174 -0
- data/test/unit/test_tmp_dir.rb +21 -0
- data/test/unit/yml/options_loader/array.yml +2 -0
- data/test/unit/yml/options_loader/empty.yml +0 -0
- data/test/unit/yml/options_loader/invalid.yml +4 -0
- data/test/unit/yml/options_loader/string.yml +1 -0
- data/test/unit/yml/options_loader/utf8_with_bom.yml +2 -0
- data/test/unit/yml/options_loader/valid.yml +12 -0
- data/test/unit/yml/siba_options_backup.yml +20 -0
- data/test/unit/yml/valid.yml +18 -0
- metadata +240 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module SibaTest
|
|
4
|
+
# mocks all Siba::SibaFile methods
|
|
5
|
+
class FileMock
|
|
6
|
+
def method_missing(meth, *args, &block)
|
|
7
|
+
if FileMock.method_defined? meth
|
|
8
|
+
# do nothing
|
|
9
|
+
else
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def respond_to?(meth)
|
|
15
|
+
if FileMock.method_defined? meth
|
|
16
|
+
true
|
|
17
|
+
else
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.mock_all_methods
|
|
23
|
+
Siba::FilePlug.siba_file = SibaTest::FileMock.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def file_expand_path(file_name)
|
|
27
|
+
file_name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def self.method_defined?(method_name)
|
|
33
|
+
file_class, method = Siba::SibaFile.get_file_class(method_name)
|
|
34
|
+
return true if !file_class.nil? && file_class.respond_to?(method)
|
|
35
|
+
Siba::SibaFile.instance_methods(false).include? method_name.to_sym
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module SibaTest
|
|
4
|
+
IS_WINDOWS = !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/).nil?
|
|
5
|
+
UNICODE_FILE_NAME = "алиен学"
|
|
6
|
+
TmpDirMocked = "/tmp"
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
include Siba::TmpDirPlug
|
|
10
|
+
|
|
11
|
+
def init
|
|
12
|
+
require 'minitest/pride' unless SibaTest::IS_WINDOWS
|
|
13
|
+
|
|
14
|
+
@loaded_options = {}
|
|
15
|
+
@current_dir = siba_file.file_utils_pwd
|
|
16
|
+
|
|
17
|
+
MiniTest::Unit::TestCase.add_setup_hook do
|
|
18
|
+
Siba::SibaLogger.quiet = true
|
|
19
|
+
Siba::SibaLogger.no_log = true
|
|
20
|
+
Siba::LoggerPlug.create "Test", nil
|
|
21
|
+
Siba::SibaLogger.messages = []
|
|
22
|
+
Siba.settings = {}
|
|
23
|
+
Siba.current_dir = @current_dir
|
|
24
|
+
Siba.backup_name = "siba"
|
|
25
|
+
SibaTest::KernelMock.mock_all_methods # prevents tests from accessing Kernel methods
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
MiniTest::Unit::TestCase.add_teardown_hook do
|
|
29
|
+
Siba::LoggerPlug.close
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def init_unit
|
|
34
|
+
init
|
|
35
|
+
MiniTest::Unit::TestCase.add_setup_hook do
|
|
36
|
+
SibaTest::FileMock.mock_all_methods # prevents tests from doing file operations
|
|
37
|
+
Siba.class_eval {@tmp_dir = SibaTest::TmpDirMocked}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def init_integration
|
|
42
|
+
init
|
|
43
|
+
MiniTest::Unit::TestCase.add_teardown_hook do
|
|
44
|
+
# cleanup after each integration test
|
|
45
|
+
Siba.current_dir = @current_dir
|
|
46
|
+
Siba.cleanup_tmp_dir
|
|
47
|
+
SibaTest.cleanup_tmp_dir
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def load_options(path_to_yml)
|
|
52
|
+
@loaded_options[path_to_yml] ||= Siba::OptionsLoader.load_yml(path_to_yml)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module SibaTest
|
|
4
|
+
# mocks all Siba::SibaKernel methods
|
|
5
|
+
class KernelMock
|
|
6
|
+
undef_method :puts
|
|
7
|
+
def method_missing(meth, *args, &block)
|
|
8
|
+
if KernelMock.method_defined? meth
|
|
9
|
+
# do nothing
|
|
10
|
+
else
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def respond_to?(meth)
|
|
16
|
+
if KernelMock.method_defined? meth
|
|
17
|
+
true
|
|
18
|
+
else
|
|
19
|
+
super
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class << self
|
|
25
|
+
# the valud 'siba_kernel.gets' method will return
|
|
26
|
+
attr_accessor :gets_return_value
|
|
27
|
+
|
|
28
|
+
def mock_all_methods
|
|
29
|
+
Siba::KernelPlug.siba_kernel = SibaTest::KernelMock.new
|
|
30
|
+
SibaTest::KernelMock.gets_return_value = nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def gets(*args)
|
|
35
|
+
SibaTest::KernelMock.gets_return_value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def self.method_defined?(method_name)
|
|
41
|
+
return Kernel.respond_to? method_name
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
# Helper used to re-init constants
|
|
4
|
+
# Based on http://stackoverflow.com/questions/3375360/how-to-redefine-a-ruby-constant-without-warning
|
|
5
|
+
module SibaTest
|
|
6
|
+
module RemovableConstants
|
|
7
|
+
class << self
|
|
8
|
+
def def_if_not_defined(cls, const, value)
|
|
9
|
+
cls.const_set(const, value) unless cls.const_defined?(const)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def redef_without_warning(cls, const, value)
|
|
13
|
+
cls.send(:remove_const, const) if cls.const_defined?(const)
|
|
14
|
+
cls.const_set(const, value)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
gem 'minitest' # loads minitest from gem, not the included one
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
|
|
7
|
+
require 'siba'
|
|
8
|
+
require 'siba/helpers/test/file_mock'
|
|
9
|
+
require 'siba/helpers/test/kernel_mock'
|
|
10
|
+
require 'siba/helpers/test/extend_test'
|
|
11
|
+
require 'siba/helpers/test/removable_constants'
|
|
12
|
+
require 'siba/helpers/test/helper'
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'siba/siba_logger'
|
|
4
|
+
|
|
5
|
+
module Siba
|
|
6
|
+
# Used to inject "logger" to classes that include this module
|
|
7
|
+
module LoggerPlug
|
|
8
|
+
def logger
|
|
9
|
+
LoggerPlug.logger
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
def logger
|
|
14
|
+
raise Siba::Error, "Log is not created" unless LoggerPlug.opened?
|
|
15
|
+
@logger
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def create(name, path_to_log_file, show_start_message = true)
|
|
19
|
+
raise Siba::Error, "Log is already created" if LoggerPlug.opened?
|
|
20
|
+
@logger = SibaLogger.new name, path_to_log_file, show_start_message
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def close
|
|
24
|
+
@logger.close if LoggerPlug.opened?
|
|
25
|
+
@logger = nil
|
|
26
|
+
SibaLogger.quiet = false
|
|
27
|
+
SibaLogger.verbose = false
|
|
28
|
+
SibaLogger.no_log = false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def opened?
|
|
32
|
+
!@logger.nil?
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module Siba
|
|
4
|
+
class OptionsBackup
|
|
5
|
+
OPTIONS_BACKUP_FILE_NAME = "siba_options_backup.yml"
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
include Siba::FilePlug
|
|
9
|
+
include Siba::LoggerPlug
|
|
10
|
+
|
|
11
|
+
def save_options_backup(path_to_options, to_dir)
|
|
12
|
+
data = Siba::FileHelper.read path_to_options
|
|
13
|
+
data << "\n\ncurrent_dir: \"#{Siba::StringHelper.escape_for_yaml(Siba.current_dir)}\""
|
|
14
|
+
options_backup_path = File.join to_dir, OPTIONS_BACKUP_FILE_NAME
|
|
15
|
+
siba_file.run_this do
|
|
16
|
+
Siba::FileHelper.write options_backup_path, data
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def load_source_from_backup(dir)
|
|
21
|
+
path_to_options_backup = File.join dir, OPTIONS_BACKUP_FILE_NAME
|
|
22
|
+
options_backup = Siba::OptionsLoader.load_yml path_to_options_backup
|
|
23
|
+
Siba.current_dir = SibaCheck.options_string options_backup, "current_dir"
|
|
24
|
+
unless siba_file.file_directory? Siba.current_dir
|
|
25
|
+
begin
|
|
26
|
+
siba_file.file_utils_mkpath Siba.current_dir
|
|
27
|
+
rescue Exception
|
|
28
|
+
logger.error "Can not access the backup current directory #{Siba.current_dir}"
|
|
29
|
+
raise
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
SibaTask.new options_backup, "source"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'erb'
|
|
4
|
+
require 'yaml'
|
|
5
|
+
|
|
6
|
+
module Siba
|
|
7
|
+
module OptionsLoader
|
|
8
|
+
class << self
|
|
9
|
+
include Siba::LoggerPlug
|
|
10
|
+
def load_yml(path_to_yml)
|
|
11
|
+
logger.debug "Loading options from #{path_to_yml}"
|
|
12
|
+
raise Siba::Error, "Options file must have .yml extension: #{path_to_yml}" unless path_to_yml =~ /\.yml$/
|
|
13
|
+
|
|
14
|
+
unless File.exists? path_to_yml
|
|
15
|
+
raise Siba::Error, "Could not read the options file #{path_to_yml}.
|
|
16
|
+
Make sure the file exists and you have read access to it."
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
hash = load_hash_from_yml path_to_yml
|
|
21
|
+
raise Siba::Error, "invalid format" unless hash.is_a? Hash
|
|
22
|
+
return hash
|
|
23
|
+
rescue Exception => e
|
|
24
|
+
raise Siba::Error, "Error loading options file #{path_to_yml}: " + e.message
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def load_hash_from_yml(path_to_yml)
|
|
29
|
+
YAML.load(load_erb path_to_yml)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def load_erb(path_to_file)
|
|
33
|
+
data = Siba::FileHelper.read path_to_file
|
|
34
|
+
ERB.new(data).result
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module Siba::Archive
|
|
4
|
+
module Tar
|
|
5
|
+
class Archive
|
|
6
|
+
include Siba::FilePlug
|
|
7
|
+
include Siba::LoggerPlug
|
|
8
|
+
attr_accessor :compression
|
|
9
|
+
|
|
10
|
+
def initialize(compression)
|
|
11
|
+
@compression = compression
|
|
12
|
+
check_installed
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Returns the archive name
|
|
16
|
+
def archive(sources_dir, dest_dir, dest_file_name)
|
|
17
|
+
Siba::Archive::Tar::Archive.check_compression_type compression
|
|
18
|
+
|
|
19
|
+
options = get_tar_option
|
|
20
|
+
extension = Archive.get_tar_extension compression
|
|
21
|
+
|
|
22
|
+
archive_name = "#{dest_file_name}.tar#{extension}"
|
|
23
|
+
archive_path = File.join(dest_dir, archive_name)
|
|
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)
|
|
26
|
+
|
|
27
|
+
siba_file.file_utils_cd dest_dir
|
|
28
|
+
command_text = %(tar c#{options}f #{archive_name} -C "#{sources_dir}" .)
|
|
29
|
+
# Using -C 'change directory' option to make it work on Windows
|
|
30
|
+
# because Windows will not understand absolute path to tar: "tar cf c:\dir\file.tar ."
|
|
31
|
+
siba_file.run_shell command_text, "Failed to archive: #{command_text}"
|
|
32
|
+
raise Siba::Error, "Failed to create archive: #{command_text}" unless siba_file.file_file?(archive_path)
|
|
33
|
+
end
|
|
34
|
+
archive_name
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def extract(archive_path, destination_dir)
|
|
38
|
+
options = get_tar_option
|
|
39
|
+
archive_name = File.basename archive_path
|
|
40
|
+
archive_dir = File.dirname archive_path
|
|
41
|
+
siba_file.file_utils_cd archive_dir
|
|
42
|
+
command_text = %(tar x#{options}f #{archive_name} -C "#{destination_dir}")
|
|
43
|
+
# Using -C 'change directory' option to make it work on Windows
|
|
44
|
+
# because Windows will not understand absolute path to tar: "tar xf c:\dir\file.tar"
|
|
45
|
+
|
|
46
|
+
siba_file.run_this do
|
|
47
|
+
unless siba_file.shell_ok? command_text
|
|
48
|
+
raise Siba::Error, "Failed to extract archive: #{command_text}"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Making sure tar is installed and works: tars and un-tars a test file
|
|
54
|
+
def check_installed
|
|
55
|
+
siba_file.run_this("test installed") do
|
|
56
|
+
siba_file.run_shell("tar --help", "'tar' utility is not found. Please install it.")
|
|
57
|
+
|
|
58
|
+
begin
|
|
59
|
+
test_archive_and_extract
|
|
60
|
+
rescue Exception
|
|
61
|
+
logger.error "'tar' utility does not work correctly. Try reinstalling it."
|
|
62
|
+
raise
|
|
63
|
+
end
|
|
64
|
+
logger.debug "TAR archiver is verified"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_archive_and_extract
|
|
69
|
+
# archive
|
|
70
|
+
src_dir = Siba::TestFiles.prepare_test_dir "tar-archive-src"
|
|
71
|
+
dest_dir = Siba::TestFiles.mkdir_in_tmp_dir "tar-archive-dest"
|
|
72
|
+
file_name = "myname"
|
|
73
|
+
archive src_dir, dest_dir, file_name
|
|
74
|
+
path_to_file = File.join(dest_dir,"#{file_name}.tar#{Archive.get_tar_extension(compression)}")
|
|
75
|
+
raise unless siba_file.file_file? path_to_file
|
|
76
|
+
|
|
77
|
+
# extract
|
|
78
|
+
extracted_dir = Siba::TestFiles.mkdir_in_tmp_dir "tar-archive-extracted"
|
|
79
|
+
extract path_to_file, extracted_dir
|
|
80
|
+
|
|
81
|
+
# compare
|
|
82
|
+
Siba::FileHelper.dirs_same? src_dir, extracted_dir
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.check_compression_type(compression)
|
|
86
|
+
raise Siba::CheckError, "'Compression' should be one of the following: #{CompressionTypes.join(', ')}" unless CompressionTypes.include?(compression)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
protected
|
|
90
|
+
def self.get_tar_extension(compression)
|
|
91
|
+
case compression
|
|
92
|
+
when "none"
|
|
93
|
+
""
|
|
94
|
+
when "gzip"
|
|
95
|
+
".gz"
|
|
96
|
+
when "bzip2"
|
|
97
|
+
".bz2"
|
|
98
|
+
else
|
|
99
|
+
raise
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def get_tar_option
|
|
104
|
+
case compression
|
|
105
|
+
when "none"
|
|
106
|
+
""
|
|
107
|
+
when "gzip"
|
|
108
|
+
"z"
|
|
109
|
+
when "bzip2"
|
|
110
|
+
"j"
|
|
111
|
+
else
|
|
112
|
+
raise
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'siba/plugins/archive/tar/archive'
|
|
4
|
+
|
|
5
|
+
module Siba::Archive
|
|
6
|
+
module Tar
|
|
7
|
+
DefaultCompression = "gzip"
|
|
8
|
+
CompressionTypes = ["gzip", "bzip2", "none"]
|
|
9
|
+
|
|
10
|
+
class Init
|
|
11
|
+
include Siba::LoggerPlug
|
|
12
|
+
|
|
13
|
+
attr_accessor :archive
|
|
14
|
+
|
|
15
|
+
def initialize(options)
|
|
16
|
+
options = options
|
|
17
|
+
compression = Siba::SibaCheck.options_string options, "compression", true, DefaultCompression
|
|
18
|
+
Archive.check_compression_type compression
|
|
19
|
+
@archive = Archive.new compression
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Archive the contents of sources_dir and put it to dest_dir.
|
|
23
|
+
# Return the archive file name. It must start with dest_file_name
|
|
24
|
+
# and its ending must not vary with time.
|
|
25
|
+
def backup(sources_dir, dest_dir, dest_file_name)
|
|
26
|
+
logger.info "Archiving with 'tar', compression: '#{archive.compression}'"
|
|
27
|
+
@archive.archive sources_dir, dest_dir, dest_file_name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Extract archive file (path_to_archive) to_dir
|
|
31
|
+
# No return value is expected.
|
|
32
|
+
def restore(path_to_archive, to_dir)
|
|
33
|
+
logger.info "Extracting 'tar' archive, compression: '#{archive.compression}'"
|
|
34
|
+
@archive.extract path_to_archive, to_dir
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
compression: gzip # bgip2 or none
|