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