From 07d49f54067cfb8666f650323c7ffefe1e860b24 Mon Sep 17 00:00:00 2001 From: Stefan Wintermeyer Date: Wed, 6 Feb 2013 16:03:43 +0100 Subject: Use CarrierWave to store the backup file. --- app/models/backup_job.rb | 27 +++++++---- app/uploaders/backup_file_uploader.rb | 55 ++++++++++++++++++++++ config/backup.rb | 2 +- ...20130206144829_add_backup_file_to_backup_job.rb | 5 ++ db/schema.rb | 23 ++++++++- 5 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 app/uploaders/backup_file_uploader.rb create mode 100644 db/migrate/20130206144829_add_backup_file_to_backup_job.rb diff --git a/app/models/backup_job.rb b/app/models/backup_job.rb index c9bde2b..c1f12e4 100644 --- a/app/models/backup_job.rb +++ b/app/models/backup_job.rb @@ -1,6 +1,8 @@ class BackupJob < ActiveRecord::Base attr_accessible :started_at, :finished_at, :state, :directory, :size_of_the_backup + mount_uploader :backup_file, BackupFileUploader + before_create :set_state_to_queued after_create :initiate_backup after_destroy :delete_the_backup_directory @@ -16,17 +18,26 @@ class BackupJob < ActiveRecord::Base end def make_a_backup + backup_directory = '/var/backups/GS5' + backup_name_prefix = 'GS5-backup-' if self.finished_at.nil? && self.state == 'queued' self.state = 'running' self.save - original_directories = Dir.glob('/var/backups/GS5/*') + original_directories = Dir.glob("#{backup_directory}/*") system "backup perform --trigger GS5 --config_file #{Rails.root.join('config','backup.rb')}" - self.directory = (Dir.glob('/var/backups/GS5/*') - original_directories).first - if self.directory.blank? + tmp_backup_directory = (Dir.glob("#{backup_directory}/*") - original_directories).first + if tmp_backup_directory.blank? self.state = 'failed' else - file = File::Stat.new(self.directory) + system "cd #{backup_directory} && tar czf #{backup_name_prefix}#{tmp_backup_directory}.tar.gz #{tmp_backup_directory}" + require 'fileutils' + FileUtils.rm_rf tmp_backup_directory + file = File::Stat.new("#{backup_directory}/#{backup_name_prefix}#{tmp_backup_directory}.tar.gz") + self.size_of_the_backup = file.size + + self.backup_file = File.open("#{backup_directory}/#{backup_name_prefix}#{tmp_backup_directory}.tar.gz") + self.finished_at = Time.now self.state = 'successful' end @@ -35,9 +46,9 @@ class BackupJob < ActiveRecord::Base end def delete_the_backup_directory - if !self.directory.blank? - require 'fileutils' - FileUtils.rm_rf self.directory - end + # if !tmp_backup_directory.blank? + # require 'fileutils' + # FileUtils.rm_rf tmp_backup_directory + # end end end diff --git a/app/uploaders/backup_file_uploader.rb b/app/uploaders/backup_file_uploader.rb new file mode 100644 index 0000000..8b126a9 --- /dev/null +++ b/app/uploaders/backup_file_uploader.rb @@ -0,0 +1,55 @@ +# encoding: utf-8 + +class BackupFileUploader < CarrierWave::Uploader::Base + + # Include RMagick or MiniMagick support: + # include CarrierWave::RMagick + # include CarrierWave::MiniMagick + + # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility: + # include Sprockets::Helpers::RailsHelper + # include Sprockets::Helpers::IsolatedHelper + + # Choose what kind of storage to use for this uploader: + storage :file + # storage :fog + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + # def default_url + # # For Rails 3.1+ asset pipeline compatibility: + # # asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) + # + # "/images/fallback/" + [version_name, "default.png"].compact.join('_') + # end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + # version :thumb do + # process :scale => [50, 50] + # end + + # Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + # def extension_white_list + # %w(jpg jpeg gif png) + # end + + # Override the filename of the uploaded files: + # Avoid using model.id or version_name here, see uploader/store.rb for details. + # def filename + # "something.jpg" if original_filename + # end + +end diff --git a/config/backup.rb b/config/backup.rb index d57a47e..d1cbcdc 100644 --- a/config/backup.rb +++ b/config/backup.rb @@ -11,7 +11,7 @@ Backup::Model.new(:GS5, 'GS5 backup') do # Split the backup file in to chunks of 2 GB # if the backup file size exceeds 2 GB # - split_into_chunks_of 2048 + # split_into_chunks_of 2048 ## # MySQL [Database] diff --git a/db/migrate/20130206144829_add_backup_file_to_backup_job.rb b/db/migrate/20130206144829_add_backup_file_to_backup_job.rb new file mode 100644 index 0000000..e02f2b3 --- /dev/null +++ b/db/migrate/20130206144829_add_backup_file_to_backup_job.rb @@ -0,0 +1,5 @@ +class AddBackupFileToBackupJob < ActiveRecord::Migration + def change + add_column :backup_jobs, :backup_file, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 5d4b5e3..5e51305 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130202140927) do +ActiveRecord::Schema.define(:version => 20130206144829) do create_table "access_authorizations", :force => true do |t| t.string "access_authorizationable_type" @@ -124,6 +124,26 @@ ActiveRecord::Schema.define(:version => 20130202140927) do t.string "music" end + create_table "backup_jobs", :force => true do |t| + t.datetime "started_at" + t.datetime "finished_at" + t.string "state" + t.string "directory" + t.integer "size_of_the_backup" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "backup_file" + end + + create_table "backups", :force => true do |t| + t.datetime "start_at" + t.datetime "end_at" + t.string "directory" + t.string "size" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "call_forward_cases", :force => true do |t| t.string "value" t.datetime "created_at", :null => false @@ -358,6 +378,7 @@ ActiveRecord::Schema.define(:version => 20130202140927) do t.string "locked_by" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false + t.string "queue" end add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" -- cgit v1.2.3