backup-restorer 0.1.0
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/Manifest +6 -0
- data/README.rdoc +3 -0
- data/Rakefile +20 -0
- data/backup-restorer.gemspec +36 -0
- data/bin/backup-restore +79 -0
- data/conf/settings.yml +10 -0
- data/lib/backup-restorer.rb +77 -0
- metadata +88 -0
data/Manifest
ADDED
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
Echoe.new('backup-restorer', '0.1.0') do |p|
|
8
|
+
p.runtime_dependencies = ['net-ssh', 'net-scp']
|
9
|
+
p.project = 'yurimello'
|
10
|
+
p.author = 'Yuri Mello'
|
11
|
+
p.summary = 'A command-line tool to restore backups'
|
12
|
+
p.description = "Tool for use with backup gem to restore your backups"
|
13
|
+
#p.url = "http://github.com/yurimello/backup-restorer"
|
14
|
+
#p.author = "Yuri Mello"
|
15
|
+
p.email = "yuri.mcr@gmail.com"
|
16
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
17
|
+
p.development_dependencies = []
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{backup-restorer}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = [%q{Yuri Mello}]
|
9
|
+
s.date = %q{2011-06-16}
|
10
|
+
s.description = %q{Tool for use with backup gem to restore your backups}
|
11
|
+
s.email = %q{yuri.mcr@gmail.com}
|
12
|
+
s.executables = [%q{backup-restore}]
|
13
|
+
s.extra_rdoc_files = [%q{README.rdoc}, %q{bin/backup-restore}, %q{lib/backup-restorer.rb}]
|
14
|
+
s.files = [%q{Manifest}, %q{README.rdoc}, %q{Rakefile}, %q{backup-restorer.gemspec}, %q{bin/backup-restore}, %q{conf/settings.yml}, %q{lib/backup-restorer.rb}]
|
15
|
+
s.homepage = %q{http://yurimello.github.com/yurimello/backup-restorer/}
|
16
|
+
s.rdoc_options = [%q{--line-numbers}, %q{--inline-source}, %q{--title}, %q{Backup-restorer}, %q{--main}, %q{README.rdoc}]
|
17
|
+
s.require_paths = [%q{lib}]
|
18
|
+
s.rubyforge_project = %q{yurimello}
|
19
|
+
s.rubygems_version = %q{1.8.5}
|
20
|
+
s.summary = %q{A command-line tool to restore backups}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_runtime_dependency(%q<net-ssh>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<net-scp>, [">= 0"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<net-ssh>, [">= 0"])
|
30
|
+
s.add_dependency(%q<net-scp>, [">= 0"])
|
31
|
+
end
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<net-ssh>, [">= 0"])
|
34
|
+
s.add_dependency(%q<net-scp>, [">= 0"])
|
35
|
+
end
|
36
|
+
end
|
data/bin/backup-restore
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/backup-restorer')
|
3
|
+
require 'rubygems'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'net/ssh'
|
6
|
+
require 'net/scp'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
def help
|
10
|
+
puts "backup-restorer [-t|--type type] < -f|--files file [files...] >"
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_settings
|
14
|
+
conf_struct = YAML.load_file "#{File.dirname(__FILE__)}/../conf/settings.yml"
|
15
|
+
puts "Please insert an local source path(If not use local source, let blank)"
|
16
|
+
conf_struct["paths"]["source"]["local"] = STDIN.gets.chomp
|
17
|
+
|
18
|
+
puts "Please insert an remote source path(If not use remote source, let blank)"
|
19
|
+
conf_struct["paths"]["source"]["remote"] = STDIN.gets.chomp
|
20
|
+
|
21
|
+
puts "Please insert an destination path(Only local)"
|
22
|
+
conf_struct["paths"]["destination"] = STDIN.gets.chomp
|
23
|
+
|
24
|
+
if conf_struct["paths"]["source"]["remote"]
|
25
|
+
puts "Please insert an host address for your remote source"
|
26
|
+
conf_struct["ssh"]["host"] = STDIN.gets.chomp
|
27
|
+
puts "Please insert your username from remote host"
|
28
|
+
conf_struct["ssh"]["username"] = STDIN.gets.chomp
|
29
|
+
puts "Please insert your password from remote host(If uses you a public key, let blank)"
|
30
|
+
system "stty -echo"
|
31
|
+
conf_struct["ssh"]["password"] = STDIN.gets.chomp
|
32
|
+
system "stty echo"
|
33
|
+
end
|
34
|
+
FileUtils.mkdir_p("#{ENV["HOME"]}/.backup-restorer")
|
35
|
+
file = File.open("#{ENV["HOME"]}/.backup-restorer/config.yml", "w")
|
36
|
+
file.write(conf_struct.to_yaml)
|
37
|
+
file.close
|
38
|
+
puts "The configuration file was generated with success."
|
39
|
+
puts "If you wish edit this file, the path is\n#{ENV["HOME"]}/.backup-restorer/config.yml"
|
40
|
+
end
|
41
|
+
|
42
|
+
files_first_index = nil
|
43
|
+
type = "remote"
|
44
|
+
ARGV.each_with_index do |arg, index|
|
45
|
+
if arg == "-h" || arg == "--help"
|
46
|
+
help
|
47
|
+
exit 0
|
48
|
+
end
|
49
|
+
if arg == "-c" || arg == "--config"
|
50
|
+
set_settings
|
51
|
+
exit 0
|
52
|
+
end
|
53
|
+
if arg == "-t" || arg == "--type"
|
54
|
+
type = ARGV[ index + 1 ]
|
55
|
+
if type != "local" && type != "remote"
|
56
|
+
help
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
if arg == "-f" || arg == "--files"
|
61
|
+
files_first_index = index + 1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
unless File.exist?("#{ENV["HOME"]}/.backup-restorer/config.yml")
|
66
|
+
puts "You have not the configuration file..."
|
67
|
+
puts "So, answer a few questions to generate a configuration file."
|
68
|
+
set_settings
|
69
|
+
end
|
70
|
+
|
71
|
+
unless files_first_index
|
72
|
+
help
|
73
|
+
exit 1
|
74
|
+
end
|
75
|
+
|
76
|
+
CONF = YAML.load_file "#{ENV["HOME"]}/.backup-restorer/config.yml"
|
77
|
+
restorer = BackupRestorer::Restorer.new(type, ARGV.slice(files_first_index, ARGV.length))
|
78
|
+
restorer.restore
|
79
|
+
|
data/conf/settings.yml
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
module BackupRestorer
|
2
|
+
class Restorer
|
3
|
+
def initialize(type, files)
|
4
|
+
@type = type
|
5
|
+
@files = files
|
6
|
+
@file_paths = get_file_paths
|
7
|
+
end
|
8
|
+
|
9
|
+
def restore
|
10
|
+
@type == "local" ? restore_local : restore_remote
|
11
|
+
end
|
12
|
+
private
|
13
|
+
def restore_local
|
14
|
+
@file_paths.each do |file_path|
|
15
|
+
remove_from_destination(file_path) if file_path.exists_on_destination?
|
16
|
+
begin
|
17
|
+
FileUtils.cp_r("#{CONF["paths"]["source"][@type]}/#{file_path.full_path}", "#{CONF["paths"]["destination"]}/#{file_path.parent_path}")
|
18
|
+
puts "#{CONF["paths"]["source"][@type]}/#{file_path.full_path}: Copied."
|
19
|
+
rescue Errno::ENOENT
|
20
|
+
puts "#{CONF["paths"]["source"][@type]}/#{file_path.full_path}: No such file or directory."
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def restore_remote
|
26
|
+
Net::SSH.start( CONF["ssh"]["host"], CONF["ssh"]["username"], :password => CONF["ssh"]["password"] ) do |ssh|
|
27
|
+
@file_paths.each do |file_path|
|
28
|
+
remove_from_destination(file_path) if file_path.exists_on_destination?
|
29
|
+
begin
|
30
|
+
ssh.scp.download!( "#{CONF["paths"]["source"][@type]}/#{file_path.full_path}", "#{CONF["paths"]["destination"]}/#{file_path.parent_path}", :recursive => true )
|
31
|
+
puts "#{CONF["paths"]["source"][@type]}/#{file_path.full_path}: Copied."
|
32
|
+
rescue Net::SCP::Error
|
33
|
+
puts "#{CONF["paths"]["source"][@type]}/#{file_path.full_path}: No such file or directory."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_from_destination(file_path)
|
40
|
+
puts "Already exists file: #{CONF["paths"]["destination"]}/#{file_path.full_path}. Deleting..."
|
41
|
+
FileUtils.rm_r("#{CONF["paths"]["destination"]}/#{file_path.full_path}", {:force => true})
|
42
|
+
end
|
43
|
+
|
44
|
+
def strip_absent_files(file_paths)
|
45
|
+
file_paths.select { |file_path| file_path if file_path.exists_on_source?(@type) }
|
46
|
+
end
|
47
|
+
def get_file_paths
|
48
|
+
@files = strip_types_from_files
|
49
|
+
@files.map { |file| FilePath.new(file) }
|
50
|
+
end
|
51
|
+
|
52
|
+
def strip_types_from_files
|
53
|
+
@files.select { |file| file if file != 'local' and file != 'remote' }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class FilePath
|
58
|
+
attr_accessor :full_path, :parent_path, :existance_on_source
|
59
|
+
def initialize(filepath)
|
60
|
+
@full_path = filepath
|
61
|
+
@parent_path = get_parent_path
|
62
|
+
end
|
63
|
+
def exists_on_destination?
|
64
|
+
File.exist?("#{CONF["paths"]["destination"]}/#{@full_path}")
|
65
|
+
end
|
66
|
+
|
67
|
+
def exists_on_source?(type)
|
68
|
+
return @existance_on_source if type == "remote"
|
69
|
+
File.exist?("#{CONF["paths"]["source"][@type]}/#{file_path.full_path}")
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def get_parent_path
|
74
|
+
@full_path.split("/").slice(0..-2).join("/")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: backup-restorer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Yuri Mello
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-16 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: net-ssh
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: net-scp
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id002
|
37
|
+
description: Tool for use with backup gem to restore your backups
|
38
|
+
email: yuri.mcr@gmail.com
|
39
|
+
executables:
|
40
|
+
- backup-restore
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- README.rdoc
|
45
|
+
- bin/backup-restore
|
46
|
+
- lib/backup-restorer.rb
|
47
|
+
files:
|
48
|
+
- Manifest
|
49
|
+
- README.rdoc
|
50
|
+
- Rakefile
|
51
|
+
- backup-restorer.gemspec
|
52
|
+
- bin/backup-restore
|
53
|
+
- conf/settings.yml
|
54
|
+
- lib/backup-restorer.rb
|
55
|
+
homepage: http://yurimello.github.com/yurimello/backup-restorer/
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --line-numbers
|
61
|
+
- --inline-source
|
62
|
+
- --title
|
63
|
+
- Backup-restorer
|
64
|
+
- --main
|
65
|
+
- README.rdoc
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "1.2"
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project: yurimello
|
83
|
+
rubygems_version: 1.8.5
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: A command-line tool to restore backups
|
87
|
+
test_files: []
|
88
|
+
|