diff options
Diffstat (limited to 'lib/backup.rb')
-rw-r--r-- | lib/backup.rb | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/backup.rb b/lib/backup.rb new file mode 100644 index 00000000000..ad80ab1c7f7 --- /dev/null +++ b/lib/backup.rb @@ -0,0 +1,56 @@ +require 'yaml' + +class Backup + attr_reader :config, :db_dir + + def initialize + @config = YAML.load_file(File.join(Rails.root,'config','database.yml'))[Rails.env] + @db_dir = File.join(Gitlab.config.backup.path, 'db') + FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir) + end + + def backup_db + case config["adapter"] + when /^mysql/ then + system("mysqldump #{mysql_args} #{config['database']} > #{db_file_name}") + when "postgresql" then + pg_env + system("pg_dump #{config['database']} > #{db_file_name}") + end + end + + def restore_db + case config["adapter"] + when /^mysql/ then + system("mysql #{mysql_args} #{config['database']} < #{db_file_name}") + when "postgresql" then + pg_env + system("pg_restore #{config['database']} #{db_file_name}") + end + end + + protected + + def db_file_name + File.join(db_dir, 'database.sql') + end + + def mysql_args + args = { + 'host' => '--host', + 'port' => '--port', + 'socket' => '--socket', + 'username' => '--user', + 'encoding' => '--default-character-set', + 'password' => '--password' + } + args.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact.join(' ') + end + + def pg_env + ENV['PGUSER'] = config["username"] if config["username"] + ENV['PGHOST'] = config["host"] if config["host"] + ENV['PGPORT'] = config["port"].to_s if config["port"] + ENV['PGPASSWORD'] = config["password"].to_s if config["password"] + end +end |