namespace :backup do desc "Backup Mysql" require File.join(Rails.root, 'config', 'initializers', '_load_app_config.rb') require 'cloudfiles' task :mysql do NUMBER_OF_DAYS = 3 puts("event=backup status=start type=mysql") db = YAML::load(File.open(File.join(File.dirname(__FILE__), '..','..', 'config', 'database.yml'))) user = db['production']['user'] password = db['production']['password'] database = db['production']['database'] if AppConfig[:cloudfiles_username] && AppConfig[:cloudfiles_api_key] && !user.blank? puts "Logging into Cloud Files" cf = CloudFiles::Connection.new(:username => AppConfig[:cloudfiles_username], :api_key => AppConfig[:cloudfiles_api_key]) mysql_container = cf.container("MySQL Backup") puts "Dumping Mysql" `mkdir -p /tmp/backup/mysql` `mysqldump --user=#{user} --password=#{password} #{database} >> /tmp/backup/mysql/backup.txt ` tar_name = "mysql_#{Time.now.to_i}.tar" `tar cfP /tmp/backup/#{tar_name} /tmp/backup/mysql` file = mysql_container.create_object(tar_name) if file.write File.open("/tmp/backup/" + tar_name) puts("event=backup status=success type=mysql") `rm /tmp/backup/#{tar_name}` `rm -rf /tmp/backup/mysql/` files = mysql_container.objects files.sort!.pop(NUMBER_OF_DAYS * 24) files.each do |file| mysql_container.delete_object(file) end else puts("event=backup status=failure type=mysql") end else puts "Cloudfiles username and api key needed" end end task :photos do puts("event=backup status=start type=photos") if AppConfig[:cloudfiles_username] && AppConfig[:cloudfiles_api_key] puts "Logging into Cloud Files" cf = CloudFiles::Connection.new(:username => AppConfig[:cloudfiles_username], :api_key => AppConfig[:cloudfiles_api_key]) photo_container = cf.container("Photo Backup") tar_name = "photos_#{Time.now.to_i}.tar" `tar cfP /dev/stdout /usr/local/app/diaspora/public/uploads/images/ | split -d -b 4831838208 - /tmp/backup/#{tar_name}` (0..99).each do |n| padded_str = n.to_s.rjust(2,'0') file = photo_container.create_object(tar_name + padded_str) file_path = "/tmp/backup/" + tar_name + padded_str if File.exists?(file_path) if file.write File.open(file_path) puts("event=backup status=success type=photos") else puts("event=backup status=failure type=photos") end `rm #{file_path}` end end else puts "Cloudfiles username and api key needed" end end end