require 'digest/md5'
require 'aws/s3'
include AWS::S3
class S3Backup < S3Object
# set_current_bucket_to `hostname`.strip
def initialize
current_bucket = `hostname`.strip
unless Service.buckets.include?(current_bucket)
Bucket.create(current_bucket)
end
S3Backup.set_current_bucket_to current_bucket
super
end
def backup(filename)
@filename = filename
if should_upload_file?
begin
STDOUT.puts "Uploading #{@filename} to #{S3Backup.current_bucket}:#{self.s3_key}"
S3Backup.store(self.s3_key,File.open(@filename,'r'))
rescue => e
STDERR.puts "Error storing file: #{e}"
end
else
STDOUT.puts "#{@filename} is up-to-date."
end
end
protected
def get_s3_file
begin
S3Backup.find(self.s3_key)
rescue NoSuchKey
nil
end
end
def should_upload_file?
if last_s3_backup = get_s3_file and last_s3_backup.etag == self.etag
false
else
true
end
end
def s3_key
"backup/#{Time.now.strftime('%Y-%m-%d@%H:%M:%S')}/#{File.basename(@filename)}"
end
def etag
Digest::MD5.hexdigest(File.read(@filename))
end
end
class RepositoryBackup
REPOSITORIES = %w() # your subversion repo names here, space-separated
BACKUP_DIR = "."
def RepositoryBackup.backup(repo)
begin
backup_dest = File.join(RepositoryBackup::BACKUP_DIR,"#{File.basename(repo)}.dmp.gz")
`svnadmin dump -q #{repo} | gzip > #{backup_dest}`
S3Backup.new.backup(backup_dest)
rescue => e
STDERR.puts "Error backing up repository #{repo}: #{e}"
end
end
end
class MySQLBackup
DATABASES = %w() # your mysql DBs names here, space-separated
BACKUP_DIR = "."
def MySQLBackup.backup(db)
begin
backup_dest = File.join(MySQLBackup::BACKUP_DIR,"#{db}.sql.gz")
`sudo mysqldump --defaults-file=/root/.my.cnf -u root #{db} | gzip -qf > #{backup_dest}`
S3Backup.new.backup(backup_dest)
rescue => e
STDERR.puts "Error backing up database #{db}: #{e}"
end
end
end
class PostgresBackup
DATABASES = %w() # your postgres DBs names here, space-separated
BACKUP_DIR = "."
def PostgresBackup.backup(db)
begin
backup_dest = File.join(PostgresBackup::BACKUP_DIR,"#{db}.sql.gz")
`pg_dump --user=postgres #{db} | gzip -qf > #{backup_dest}`
S3Backup.new.backup(backup_dest)
rescue => e
STDERR.puts "Error backing up database #{db}: #{e}"
end
end
end
if __FILE__ == $0
begin
Base.establish_connection!(:access_key_id => '<YOUR AWS KEY HERE>',
:secret_access_key => '<YOUR AWS SECRET HERE>'
)
RepositoryBackup::REPOSITORIES.each do |repo|
RepositoryBackup.backup(repo)
end
PostgresBackup::DATABASES.each do |db|
PostgresBackup.backup(db)
end
MySQLBackup::DATABASES.each do |db|
MySQLBackup.backup(db)
end
rescue => e
STDERR.puts "Error: #{e}"
STDERR.puts e.backtrace
ensure
Base.disconnect!
end
end