FEATURE: upload backups

This commit is contained in:
Régis Hanol
2014-02-22 01:41:01 +01:00
parent 23066edbe1
commit 68a935c36b
16 changed files with 1093 additions and 25 deletions

View File

@ -2,7 +2,7 @@ require_dependency "backup_restore"
class Admin::BackupsController < Admin::AdminController
skip_before_filter :check_xhr, only: [:index, :show, :logs]
skip_before_filter :check_xhr, only: [:index, :show, :logs, :check_chunk, :upload_chunk]
def index
respond_to do |format|
@ -83,4 +83,51 @@ class Admin::BackupsController < Admin::AdminController
render nothing: true
end
def check_chunk
identifier = params.fetch(:resumableIdentifier)
filename = params.fetch(:resumableFilename)
chunk_number = params.fetch(:resumableChunkNumber)
current_chunk_size = params.fetch(:resumableCurrentChunkSize).to_i
# path to chunk file
chunk = Backup.chunk_path(identifier, filename, chunk_number)
# check whether the chunk has already been uploaded
has_chunk_been_uploaded = File.exists?(chunk) && File.size(chunk) == current_chunk_size
# 200 = exists, 404 = not uploaded yet
status = has_chunk_been_uploaded ? 200 : 404
render nothing: true, status: status
end
def upload_chunk
filename = params.fetch(:resumableFilename)
return render nothing:true, status: 415 unless filename.to_s.end_with?(".tar.gz")
file = params.fetch(:file)
identifier = params.fetch(:resumableIdentifier)
chunk_number = params.fetch(:resumableChunkNumber).to_i
chunk_size = params.fetch(:resumableChunkSize).to_i
total_size = params.fetch(:resumableTotalSize).to_i
current_chunk_size = params.fetch(:resumableCurrentChunkSize).to_i
# path to chunk file
chunk = Backup.chunk_path(identifier, filename, chunk_number)
dir = File.dirname(chunk)
# ensure directory exists
FileUtils.mkdir_p(dir) unless Dir.exists?(dir)
# save chunk to the directory
File.open(chunk, "wb") { |f| f.write(file.tempfile.read) }
uploaded_file_size = chunk_number * chunk_size
# when all chunks are uploaded
if uploaded_file_size + current_chunk_size >= total_size
# merge all the chunks in a background thread
Jobs.enqueue(:backup_chunks_merger, filename: filename, identifier: identifier, chunks: chunk_number)
end
render nothing: true
end
end