#!/usr/bin/env ruby require 'rubygems' require 'aws/s3' class SVNS3Backup def initialize AWS::S3::Base.establish_connection!( :access_key_id => '00000000000000000000', :secret_access_key => '0000000000000000000000000000000000000000' ) @backup_key = 'fcit_svn' @repository = '/srv/svn/repository' @youngest_revision = `svnlook youngest #{@repository}`.chomp.to_i @bucket = AWS::S3::Bucket.find '00000000000000000000.komodo_backups' @backups = @bucket.objects :prefix => @backup_key end def process! unless @backups.empty? revisions = @backups.collect { |obj| obj.key.split('.').last.to_i }.sort last_backup = revisions.last revised = revisions.all? { |r| r < @youngest_revision } revised ? svn_dump(last_backup+1) : log("No changes to repository since last backup (r#{last_backup}).") else # No backups in the bucket so store the first one. log "No backups on file, sending entire repository." svn_dump end end private def svn_dump(from_revision = 0) base_name = [@backup_key, @youngest_revision].join('.') dump_path = "/tmp/#{base_name}" file_path = "#{dump_path}.tar.bz2" system "svnadmin dump #{@repository} -r #{from_revision}:#{@youngest_revision} --incremental > #{dump_path}" system "tar -cjf #{file_path} #{dump_path}" AWS::S3::S3Object.store base_name, open(file_path), @bucket.name system "rm #{dump_path} #{file_path}" log "Successfully backed up revisions #{from_revision} through #{@youngest_revision}." end def log(message) puts "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}] #{message}" end end SVNS3Backup.new.process!