berty 0.0.1

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/bin/berty ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'berty'
4
+
5
+ servers = Berty.servers
6
+
7
+ for server in servers
8
+ case ARGV.first
9
+ when 'setup'
10
+ Berty.logger.info "Started server setup..."
11
+ server.setup!
12
+ Berty.logger.info "Finished server setup..."
13
+ puts "Server '#{server.hostname}' setup..."
14
+ when 'info'
15
+ puts " * #{server.username}@#{server.hostname}"
16
+ for directory in server.directories
17
+ puts " #{directory[:path]} -> #{directory[:destination]}"
18
+ end
19
+ if server.mysql_backup?
20
+ puts " MySQL backup using password: #{server.mysql_password.gsub(/[a-zA-Z]/, '*')}"
21
+ end
22
+ puts unless server == servers.last
23
+ else
24
+ Berty.logger.info "Started backup..."
25
+ server.backup!
26
+ Berty.logger.info "Finished backup..."
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ module Berty
2
+ class BackupRun
3
+
4
+ def run!
5
+ for server in Berty.servers
6
+ puts "server: #{server.hostname}"
7
+ server.backup!
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,94 @@
1
+ module Berty
2
+ class Server
3
+
4
+ attr_reader :hostname
5
+
6
+ def initialize(hostname, options = {})
7
+ @hostname = hostname
8
+ @options = options
9
+ end
10
+
11
+ ## Return all directories which need to be backed up
12
+ def directories
13
+ (@options['directories'] || []).map do |dir|
14
+ path, label = dir.split(':')
15
+ label ||= path.split('/').last
16
+ {:path=> path, :label => label, :destination => File.join(backup_path, label)}
17
+ end
18
+ end
19
+
20
+ ## Which username should be used when connecting to this server?
21
+ def username
22
+ @options['username']
23
+ end
24
+
25
+ ## Return the full path where backups for this server should be stored on the local file system.
26
+ def backup_path
27
+ File.join(Berty.config['root'], hostname)
28
+ end
29
+
30
+ ## Return the full path to where mysql backups are stored
31
+ def mysql_backup_path
32
+ File.join(backup_path, 'mysql')
33
+ end
34
+
35
+ ## Execute a backup of this server (backing up all directories to the appropriate locations)
36
+ def backup!
37
+ run "mkdir -p #{backup_path}"
38
+ for dir in directories
39
+ destination =
40
+ Berty.logger.info " starting backup of: '#{dir[:path]}' to '#{dir[:destination]}'"
41
+ run "rsync -a #{username}@#{hostname}:#{dir[:path]}/ #{dir[:destination]}"
42
+ Berty.logger.info " finished backup of: '#{dir[:path]}' to '#{dir[:destination]}'"
43
+ end
44
+ backup_mysql!
45
+ end
46
+
47
+ ## Setup the connection to this server by sshing to it and doing nothing. This gives the option to accept
48
+ ## any host keys.
49
+ def setup!
50
+ key = File.read("#{ENV['HOME']}/.ssh/id_rsa.pub")
51
+ ssh "echo '#{key.chomp}' >> ~/.ssh/authorized_keys"
52
+ end
53
+
54
+ ## Should this server backup a mysql database?
55
+ def mysql_backup?
56
+ @options['mysql_password'].is_a?(String)
57
+ end
58
+
59
+ ## What password should be used for accessing the database?
60
+ def mysql_password
61
+ @options['mysql_password']
62
+ end
63
+
64
+ ## Execute mysql backups?
65
+ def backup_mysql!
66
+ return unless mysql_backup?
67
+ run "mkdir -p #{mysql_backup_path}"
68
+ Berty.logger.info " starting mysql backup on: #{hostname}"
69
+ ## create a dump on the remote system as '/tmp/bert-mysqldump'
70
+ ssh "mysqldump --all-databases -u root -p#{mysql_password} > /tmp/berty-mysqldump"
71
+ ## pull the file over to us
72
+ scp "/tmp/berty-mysqldump", File.join(mysql_backup_path, "#{Time.now.strftime("%Y-%m-%d-%H-%M")}.sql")
73
+ Berty.logger.info " finishing mysql backup on: #{hostname}"
74
+ end
75
+
76
+ private
77
+
78
+ def run(command)
79
+ Berty.logger.info "executing: #{command}"
80
+ system(command)
81
+ end
82
+
83
+ def ssh(command)
84
+ run "ssh #{username}@#{hostname} \"#{command}\""
85
+ end
86
+
87
+ def scp(remote, local)
88
+ run "scp #{username}@#{hostname}:#{remote} #{local}"
89
+ end
90
+
91
+
92
+ end
93
+ end
94
+
data/lib/berty.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'logger'
2
+ require 'yaml'
3
+
4
+ require 'berty/backup'
5
+ require 'berty/server'
6
+
7
+ module Berty
8
+
9
+ class Error < StandardError; end
10
+
11
+ class << self
12
+ def config_path
13
+ [File.expand_path('../../config/berty.example.conf', __FILE__), '/etc/berty.conf'].each do |file|
14
+ return file if File.exist?(file)
15
+ end
16
+ raise Error, "Configuration file not found. Please ensure it is defined in '/etc/berty.conf'"
17
+ end
18
+
19
+ def config
20
+ @config ||= YAML.load_file(config_path)
21
+ end
22
+
23
+ def logger
24
+ @logger ||= Logger.new(config['log_file'] || STDERR)
25
+ end
26
+
27
+ def servers
28
+ @servers ||= config['servers'].map{|key,value| Berty::Server.new(key, value) }
29
+ end
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: berty
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Adam Cooke
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-03-23 00:00:00 +00:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description:
22
+ email: adam@atechmedia.com
23
+ executables:
24
+ - berty
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - bin/berty
31
+ - lib/berty/backup.rb
32
+ - lib/berty/server.rb
33
+ - lib/berty.rb
34
+ has_rdoc: true
35
+ homepage: http://www.atechmedia.com
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ requirements: []
58
+
59
+ rubyforge_project:
60
+ rubygems_version: 1.3.6
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Berty the backup gem
64
+ test_files: []
65
+