class RdsBackup::Backup

Attributes

backups_to_keep[RW]
file_name[RW]
fog_directory[RW]
logger[RW]
mysql_database[RW]
mysql_host[RW]
mysql_password[RW]
mysql_ssl[RW]
mysql_user[RW]
rds_cert_path[RW]

Public Class Methods

new(config_file = 'config.yml') click to toggle source
# File lib/rds_backup/backup.rb, line 9
def initialize(config_file = 'config.yml')
  config = YAML.load(File.open(config_file))
  config_google(config)
  config_mysql(config)
  config_logger(config)

  @backups_to_keep = config['backups_to_keep'] || 3
  current_utc_time = Time.now.getutc.strftime('%Y%m%d%H%M%S')
  @file_name = "#{mysql_database}-#{current_utc_time}.sql.gz"
end

Public Instance Methods

backup() click to toggle source
# File lib/rds_backup/backup.rb, line 20
def backup
  logger.info 'Starting...'
  dump_database
  upload_backup
  prune_old_backups
  remove_local_dump
ensure
  logger.info 'Exiting...'
  logger.close
end

Private Instance Methods

config_google(config) click to toggle source
# File lib/rds_backup/backup.rb, line 46
def config_google(config)
  google_access = config['cloud_storage']['access_key_id']
  google_secret = config['cloud_storage']['secret_access_key']
  connection = Fog::Storage.new(
    provider: 'Google',
    google_storage_access_key_id: google_access,
    google_storage_secret_access_key: google_secret
  )
  @fog_directory = connection.directories.get('idxp-rds-backup')
end
config_hipchat_adapter(logger, config) click to toggle source
# File lib/rds_backup/backup.rb, line 73
def config_hipchat_adapter(logger, config)
  logger.adapter :hipchat_adapter,
                 format: Yell::BasicFormat,
                 hipchat_token: config['hipchat']['token'],
                 hipchat_rooms: config['hipchat']['rooms']
end
config_logger(config) click to toggle source
# File lib/rds_backup/backup.rb, line 57
def config_logger(config)
  @logger = Yell.new do |yell_logger|
    config['loggers'].each do |logger|
      send("config_#{logger}_adapter", yell_logger, config)
    end
  end
end
config_mysql(config) click to toggle source
# File lib/rds_backup/backup.rb, line 37
def config_mysql(config)
  @mysql_database = config['mysql']['database']
  @mysql_host = config['mysql']['host']
  @mysql_user = config['mysql']['user']
  @mysql_password = config['mysql']['password']
  @mysql_ssl = config['mysql']['ssl']
  @rds_cert_path = config['mysql']['rds_cert_path'] if @mysql_ssl
end
config_ses_adapter(logger, config) click to toggle source
# File lib/rds_backup/backup.rb, line 65
def config_ses_adapter(logger, config)
  logger.adapter :ses_adapter,
                 format: Yell::BasicFormat,
                 aws_access_key_id: config['aws']['access_key_id'],
                 aws_secret_access_key: config['aws']['secret_access_key'],
                 email_config: config['email']
end
dump_database() click to toggle source
# File lib/rds_backup/backup.rb, line 80
def dump_database
  _out, err, _status = Open3.capture3 mysqldump_cmd

  if err.empty?
    logger.info 'Database dump successfully created'
  else
    logger.error "Error when dumping the database: #{err.strip}"
    remove_local_dump
    fail RuntimeError
  end
end
mysqldump_cmd() click to toggle source
# File lib/rds_backup/backup.rb, line 92
def mysqldump_cmd
  cmd = "mysqldump -u#{mysql_user} "
  cmd += "-p#{mysql_password} " if mysql_password
  cmd += "--ssl_ca=#{rds_cert_path} " if mysql_ssl
  cmd += '--single-transaction --routines --triggers '\
         "-h #{mysql_host} #{mysql_database} "\
         "| gzip -c > #{file_name}"
  cmd
end
prune_old_backups() click to toggle source
# File lib/rds_backup/backup.rb, line 109
def prune_old_backups
  sorted_files = fog_directory.files.reload.sort do |x, y|
    x.last_modified <=> y.last_modified
  end
  sorted_files[0 .. -backups_to_keep - 1].each { |f| f.destroy }
  logger.info 'Old backups pruned'
rescue
  logger.error 'Error while pruning old backups'
end
remove_local_dump() click to toggle source
# File lib/rds_backup/backup.rb, line 119
def remove_local_dump
  Open3.capture3 "rm -rf #{file_name}"
end
upload_backup() click to toggle source
# File lib/rds_backup/backup.rb, line 102
def upload_backup
  fog_directory.files.create(key: file_name, body: File.open(file_name))
  logger.info 'Backup uploaded to Google'
rescue
  logger.error 'Error while uploading dump to Google'
end