Skip to content
Extraits de code Groupes Projets
backup.rake 2,63 ko
Newer Older
  • Learn to ignore specific revisions
  • namespace :backup do
    
    maxwell's avatar
    maxwell a validé
      desc "Backup Mysql"
    
    zhitomirskiyi's avatar
    zhitomirskiyi a validé
      require File.join(Rails.root, 'config', 'initializers', '_load_app_config.rb')
      require 'cloudfiles'
    
    
    maxwell's avatar
    maxwell a validé
      task :mysql do
    
        NUMBER_OF_DAYS = 3
    
    maxwell's avatar
    maxwell a validé
        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?
    
    danielvincent's avatar
    danielvincent a validé
          puts "Logging into Cloud Files"
    
    
          cf = CloudFiles::Connection.new(:username => AppConfig[:cloudfiles_username], :api_key => AppConfig[:cloudfiles_api_key])
    
    maxwell's avatar
    maxwell a validé
          mysql_container = cf.container("MySQL Backup")
    
    maxwell's avatar
    maxwell a validé
          puts "Dumping Mysql"
          `mkdir -p /tmp/backup/mysql`
    
          `mysqldump --user=#{user} --password=#{password} #{database} >> /tmp/backup/mysql/backup.txt `
    
    maxwell's avatar
    maxwell a validé
          tar_name = "mysql_#{Time.now.to_i}.tar"
          `tar cfP /tmp/backup/#{tar_name} /tmp/backup/mysql`
    
    maxwell's avatar
    maxwell a validé
          file = mysql_container.create_object(tar_name)
    
    danielvincent's avatar
    danielvincent a validé
    
          if file.write File.open("/tmp/backup/" + tar_name)
    
    maxwell's avatar
    maxwell a validé
            puts("event=backup status=success type=mysql")
    
            `rm /tmp/backup/#{tar_name}`
    
    maxwell's avatar
    maxwell a validé
            `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
    
    danielvincent's avatar
    danielvincent a validé
          else
    
    maxwell's avatar
    maxwell a validé
            puts("event=backup status=failure type=mysql")
    
    danielvincent's avatar
    danielvincent a validé
          end
    
        else
          puts "Cloudfiles username and api key needed"
        end
    
    zhitomirskiyi's avatar
    zhitomirskiyi a validé
    
      task :photos do
    
        puts("event=backup status=start type=photos")
    
        if AppConfig[:cloudfiles_username] && AppConfig[:cloudfiles_api_key]
    
    danielvincent's avatar
    danielvincent a validé
          puts "Logging into Cloud Files"
    
    
          cf = CloudFiles::Connection.new(:username => AppConfig[:cloudfiles_username], :api_key => AppConfig[:cloudfiles_api_key])
    
    zhitomirskiyi's avatar
    zhitomirskiyi a validé
          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}`
    
    danielvincent's avatar
    danielvincent a validé
          end
    
    zhitomirskiyi's avatar
    zhitomirskiyi a validé
        else
          puts "Cloudfiles username and api key needed"
        end
      end