diff --git a/src/backups.js b/src/backups.js index 6388c91f9..7e15b8e30 100644 --- a/src/backups.js +++ b/src/backups.js @@ -192,23 +192,23 @@ function createTarPackStream(sourceDir, key) { var ps = progressStream({ time: 10000 }); // display a progress every 10 seconds pack.on('error', function (error) { - debug('backup: tar stream error.', error); + debug('createTarPackStream: tar stream error.', error); ps.emit('error', new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); gzip.on('error', function (error) { - debug('backup: gzip stream error.', error); + debug('createTarPackStream: gzip stream error.', error); ps.emit('error', new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); ps.on('progress', function(progress) { - debug('backup: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); + debug('createTarPackStream: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); }); if (key !== null) { var encrypt = crypto.createCipher('aes-256-cbc', key); encrypt.on('error', function (error) { - debug('backup: encrypt stream error.', error); + debug('createTarPackStream: encrypt stream error.', error); ps.emit('error', new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); return pack.pipe(gzip).pipe(encrypt).pipe(ps); @@ -224,7 +224,7 @@ function sync(backupConfig, backupId, dataDir, callback) { assert.strictEqual(typeof callback, 'function'); syncer.sync(dataDir, function processTask(task, iteratorCallback) { - debug('processing task: %j', task); + debug('sync: processing task: %j', task); var backupFilePath = path.join(getBackupFilePath(backupConfig, backupId, backupConfig.format), task.path); if (task.operation === 'add') { @@ -267,7 +267,7 @@ function upload(backupId, format, dataDir, callback) { callback = once(callback); - debug('Start box backup with id %s', backupId); + debug('upload: id %s format %s dataDir %s', backupId, format, dataDir); settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); @@ -297,29 +297,34 @@ function tarExtract(inStream, destination, key, callback) { var ps = progressStream({ time: 10000 }); // display a progress every 10 seconds var extract = tar.extract(destination); + inStream.on('error', function (error) { + debug('tarExtract: input stream error.', error); + callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + }); + ps.on('progress', function(progress) { - debug('restore: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); + debug('tarExtract: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); }); gunzip.on('error', function (error) { - debug('restore: gunzip stream error.', error); + debug('tarExtract: gunzip stream error.', error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); extract.on('error', function (error) { - debug('restore: extract stream error.', error); + debug('tarExtract: extract stream error.', error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); extract.on('finish', function () { - debug('restore: done.'); + debug('tarExtract: done.'); callback(null); }); if (key !== null) { var decrypt = crypto.createDecipher('aes-256-cbc', key); decrypt.on('error', function (error) { - debug('restore: decrypt stream error.', error); + debug('tarExtract: decrypt stream error.', error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); inStream.pipe(ps).pipe(decrypt).pipe(gunzip).pipe(extract); @@ -348,7 +353,7 @@ function download(backupId, format, dataDir, callback) { assert.strictEqual(typeof dataDir, 'string'); assert.strictEqual(typeof callback, 'function'); - debug('Start download of id %s to %s (%s)', backupId, dataDir, format); + debug('download: id %s dataDir %s format %s', backupId, dataDir, format); settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 0da6dee9d..1be8bc235 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -70,13 +70,10 @@ function download(apiConfig, sourceFilePath, callback) { debug('download: %s', sourceFilePath); - var ps = new PassThrough(); + if (!safe.fs.existsSync(sourceFilePath)) return callback(new BackupsError(BackupsError.NOT_FOUND, 'File not found')); + var fileStream = fs.createReadStream(sourceFilePath); - fileStream.on('error', function (error) { - ps.emit('error', new BackupsError(BackupsError.NOT_FOUND, error.message)); - }); - fileStream.pipe(ps); - callback(null, ps); + callback(null, fileStream); } function downloadDir(apiConfig, backupFilePath, destDir, callback) { diff --git a/src/storage/s3.js b/src/storage/s3.js index f48d1929c..eefeca943 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -206,11 +206,21 @@ function downloadDir(apiConfig, backupFilePath, destDir, callback) { mkdirp(path.dirname(path.join(destDir, relativePath)), function (error) { if (error) return iteratorCallback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); - var destStream = fs.createWriteStream(path.join(destDir, relativePath)); - destStream.on('error', function (error) { - return iteratorCallback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + download(apiConfig, content.Key, function (error, sourceStream) { + if (error) return iteratorCallback(error); + + var destStream = fs.createWriteStream(path.join(destDir, relativePath)); + + destStream.on('open', function () { + sourceStream.pipe(destStream); + }); + + destStream.on('error', function (error) { + return iteratorCallback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + }); + + destStream.on('finish', iteratorCallback); }); - download(apiConfig, content.Key, destStream, iteratorCallback); }); }, callback); } diff --git a/src/test/storage-test.js b/src/test/storage-test.js index 7bb78b335..54c56069c 100644 --- a/src/test/storage-test.js +++ b/src/test/storage-test.js @@ -190,14 +190,10 @@ describe('Storage', function () { it('cannot download deleted backup', function (done) { filesystem.download(gBackupConfig, gBackupId_1, function (error, stream) { - expect(error).to.be(null); + expect(error).to.be.an('object'); + expect(error.reason).to.equal(BackupsError.NOT_FOUND); - stream.on('error', function (error) { - expect(error).to.be.an('object'); - expect(error.reason).to.equal(BackupsError.NOT_FOUND); - - done(); - }); + done(); }); });