Compare commits

...

5 Commits

Author SHA1 Message Date
Girish Ramakrishnan c93c06ba88 gcs: fix crash
(cherry picked from commit 05d3f8a667)
2019-05-12 18:14:17 -07:00
Girish Ramakrishnan 36d64b3566 4.0.2 changes
(cherry picked from commit 3fa45ea728)
2019-05-12 14:04:26 -07:00
Girish Ramakrishnan e0c531564c Add option to skip backup before update
(cherry picked from commit a7d2098f09)
2019-05-12 13:59:07 -07:00
Girish Ramakrishnan 1e0ec75f0a gcdns: fix crash
(cherry picked from commit e1ecb49d59)
2019-05-12 12:57:06 -07:00
Girish Ramakrishnan 36ac02d29f Fix crash because params was undefined
(cherry picked from commit 800e25a7a7)
2019-05-10 13:08:26 -07:00
8 changed files with 33 additions and 19 deletions
+4
View File
@@ -1593,3 +1593,7 @@
* Make it easier to import email * Make it easier to import email
* Give SFTP access only to admins * Give SFTP access only to admins
[4.0.2]
* Fix GCDNS crash
* Add option to update without backing up
+1 -1
View File
@@ -204,7 +204,7 @@ function boxAutoupdatePatternChanged(pattern) {
var updateInfo = updateChecker.getUpdateInfo(); var updateInfo = updateChecker.getUpdateInfo();
if (updateInfo.box) { if (updateInfo.box) {
debug('Starting autoupdate to %j', updateInfo.box); debug('Starting autoupdate to %j', updateInfo.box);
updater.updateToLatest(auditSource.CRON, NOOP_CALLBACK); updater.updateToLatest({ skipBackup: false }, auditSource.CRON, NOOP_CALLBACK);
} else { } else {
debug('No box auto updates available'); debug('No box auto updates available');
} }
+2 -2
View File
@@ -15,7 +15,7 @@ var assert = require('assert'),
dns = require('../native-dns.js'), dns = require('../native-dns.js'),
domains = require('../domains.js'), domains = require('../domains.js'),
DomainsError = require('../domains.js').DomainsError, DomainsError = require('../domains.js').DomainsError,
GCDNS = require('@google-cloud/dns'), GCDNS = require('@google-cloud/dns').DNS,
util = require('util'), util = require('util'),
waitForDns = require('./waitfordns.js'), waitForDns = require('./waitfordns.js'),
_ = require('underscore'); _ = require('underscore');
@@ -46,7 +46,7 @@ function getZoneByName(dnsConfig, zoneName, callback) {
assert.strictEqual(typeof zoneName, 'string'); assert.strictEqual(typeof zoneName, 'string');
assert.strictEqual(typeof callback, 'function'); assert.strictEqual(typeof callback, 'function');
var gcdns = GCDNS(getDnsCredentials(dnsConfig)); var gcdns = new GCDNS(getDnsCredentials(dnsConfig));
gcdns.getZones(function (error, zones) { gcdns.getZones(function (error, zones) {
if (error && error.message === 'invalid_grant') return callback(new DomainsError(DomainsError.ACCESS_DENIED, 'The key was probably revoked')); if (error && error.message === 'invalid_grant') return callback(new DomainsError(DomainsError.ACCESS_DENIED, 'The key was probably revoked'));
+3 -1
View File
@@ -57,8 +57,10 @@ function getDisks(req, res, next) {
} }
function update(req, res, next) { function update(req, res, next) {
if ('skipBackup' in req.body && typeof req.body.skipBackup !== 'boolean') return next(new HttpError(400, 'skipBackup must be a boolean'));
// this only initiates the update, progress can be checked via the progress route // this only initiates the update, progress can be checked via the progress route
updater.updateToLatest(auditSource.fromRequest(req), function (error, taskId) { updater.updateToLatest(req.body, auditSource.fromRequest(req), function (error, taskId) {
if (error && error.reason === UpdaterError.ALREADY_UPTODATE) return next(new HttpError(422, error.message)); if (error && error.reason === UpdaterError.ALREADY_UPTODATE) return next(new HttpError(422, error.message));
if (error && error.reason === UpdaterError.BAD_STATE) return next(new HttpError(409, error.message)); if (error && error.reason === UpdaterError.BAD_STATE) return next(new HttpError(409, error.message));
if (error) return next(new HttpError(500, error)); if (error) return next(new HttpError(500, error));
+1 -1
View File
@@ -38,7 +38,7 @@ function update(req, res, next) {
debug('triggering update'); debug('triggering update');
// this only initiates the update, progress can be checked via the progress route // this only initiates the update, progress can be checked via the progress route
updater.updateToLatest(auditSource.SYSADMIN, function (error, taskId) { updater.updateToLatest({ skipBackup: false }, auditSource.SYSADMIN, function (error, taskId) {
if (error && error.reason === UpdaterError.ALREADY_UPTODATE) return next(new HttpError(422, error.message)); if (error && error.reason === UpdaterError.ALREADY_UPTODATE) return next(new HttpError(422, error.message));
if (error && error.reason === UpdaterError.BAD_STATE) return next(new HttpError(409, error.message)); if (error && error.reason === UpdaterError.BAD_STATE) return next(new HttpError(409, error.message));
if (error) return next(new HttpError(500, error)); if (error) return next(new HttpError(500, error));
+2 -2
View File
@@ -25,7 +25,7 @@ var assert = require('assert'),
BackupsError = require('../backups.js').BackupsError, BackupsError = require('../backups.js').BackupsError,
debug = require('debug')('box:storage/gcs'), debug = require('debug')('box:storage/gcs'),
EventEmitter = require('events'), EventEmitter = require('events'),
GCS = require('@google-cloud/storage'), GCS = require('@google-cloud/storage').Storage,
PassThrough = require('stream').PassThrough, PassThrough = require('stream').PassThrough,
path = require('path'); path = require('path');
@@ -53,7 +53,7 @@ function getBucket(apiConfig) {
} }
}; };
return GCS(gcsConfig).bucket(apiConfig.bucket); return new GCS(gcsConfig).bucket(apiConfig.bucket);
} }
// storage api // storage api
+7 -7
View File
@@ -263,7 +263,7 @@ function copy(apiConfig, oldFilePath, newFilePath) {
endBytes = startBytes + chunkSize; endBytes = startBytes + chunkSize;
if (endBytes > size) endBytes = size; if (endBytes > size) endBytes = size;
var params = { var partCopyParams = {
Bucket: apiConfig.bucket, Bucket: apiConfig.bucket,
Key: path.join(newFilePath, relativePath), Key: path.join(newFilePath, relativePath),
CopySource: encodeCopySource(apiConfig.bucket, entry.fullPath), // See aws-sdk-js/issues/1302 CopySource: encodeCopySource(apiConfig.bucket, entry.fullPath), // See aws-sdk-js/issues/1302
@@ -272,12 +272,12 @@ function copy(apiConfig, oldFilePath, newFilePath) {
UploadId: uploadId UploadId: uploadId
}; };
events.emit('progress', `Copying part ${params.PartNumber} - ${params.CopySource} ${params.CopySourceRange}`); events.emit('progress', `Copying part ${partCopyParams.PartNumber} - ${partCopyParams.CopySource} ${partCopyParams.CopySourceRange}`);
s3.uploadPartCopy(params, function (error, result) { s3.uploadPartCopy(partCopyParams, function (error, result) {
if (error) return done(error); if (error) return done(error);
events.emit('progress', `Uploaded part ${params.PartNumber} - Etag: ${result.CopyPartResult.ETag}`); events.emit('progress', `Uploaded part ${partCopyParams.PartNumber} - Etag: ${result.CopyPartResult.ETag}`);
uploadedParts.push({ ETag: result.CopyPartResult.ETag, PartNumber: partNumber }); uploadedParts.push({ ETag: result.CopyPartResult.ETag, PartNumber: partNumber });
@@ -287,16 +287,16 @@ function copy(apiConfig, oldFilePath, newFilePath) {
return copyNextChunk(); return copyNextChunk();
} }
var params = { var completeMultipartParams = {
Bucket: apiConfig.bucket, Bucket: apiConfig.bucket,
Key: path.join(newFilePath, relativePath), Key: path.join(newFilePath, relativePath),
MultipartUpload: { Parts: uploadedParts }, MultipartUpload: { Parts: uploadedParts },
UploadId: uploadId UploadId: uploadId
}; };
events.emit('progress', `Finishing multipart copy - ${params.Key}`); events.emit('progress', `Finishing multipart copy - ${completeMultipartParams.Key}`);
s3.completeMultipartUpload(params, done); s3.completeMultipartUpload(completeMultipartParams, done);
}).on('retry', function (response) { }).on('retry', function (response) {
++retryCount; ++retryCount;
events.emit('progress', `Retrying (${response.retryCount+1}) multipart copy of ${relativePath || oldFilePath}. Error: ${response.error} ${response.httpResponse.statusCode}`); events.emit('progress', `Retrying (${response.retryCount+1}) multipart copy of ${relativePath || oldFilePath}. Error: ${response.error} ${response.httpResponse.statusCode}`);
+13 -5
View File
@@ -154,8 +154,9 @@ function downloadAndVerifyRelease(updateInfo, callback) {
}); });
} }
function update(boxUpdateInfo, progressCallback, callback) { function update(boxUpdateInfo, options, progressCallback, callback) {
assert(boxUpdateInfo && typeof boxUpdateInfo === 'object'); assert(boxUpdateInfo && typeof boxUpdateInfo === 'object');
assert(options && typeof options === 'object');
assert.strictEqual(typeof progressCallback, 'function'); assert.strictEqual(typeof progressCallback, 'function');
assert.strictEqual(typeof callback, 'function'); assert.strictEqual(typeof callback, 'function');
@@ -164,9 +165,15 @@ function update(boxUpdateInfo, progressCallback, callback) {
downloadAndVerifyRelease(boxUpdateInfo, function (error, packageInfo) { downloadAndVerifyRelease(boxUpdateInfo, function (error, packageInfo) {
if (error) return callback(error); if (error) return callback(error);
progressCallback({ percent: 10, message: 'Backing up' }); function maybeBackup(next) {
if (options.skipBackup) return next();
backups.backupBoxAndApps((progress) => progressCallback({ percent: 10+progress.percent*70/100, message: progress.message }), function (error) { progressCallback({ percent: 10, message: 'Backing up' });
backups.backupBoxAndApps((progress) => progressCallback({ percent: 10+progress.percent*70/100, message: progress.message }), next);
}
maybeBackup(function (error) {
if (error) return callback(error); if (error) return callback(error);
debug('updating box %s', boxUpdateInfo.sourceTarballUrl); debug('updating box %s', boxUpdateInfo.sourceTarballUrl);
@@ -201,7 +208,8 @@ function canUpdate(boxUpdateInfo, callback) {
}); });
} }
function updateToLatest(auditSource, callback) { function updateToLatest(options, auditSource, callback) {
assert.strictEqual(typeof options, 'object');
assert.strictEqual(typeof auditSource, 'object'); assert.strictEqual(typeof auditSource, 'object');
assert.strictEqual(typeof callback, 'function'); assert.strictEqual(typeof callback, 'function');
@@ -215,7 +223,7 @@ function updateToLatest(auditSource, callback) {
error = locker.lock(locker.OP_BOX_UPDATE); error = locker.lock(locker.OP_BOX_UPDATE);
if (error) return callback(new UpdaterError(UpdaterError.BAD_STATE, `Cannot update now: ${error.message}`)); if (error) return callback(new UpdaterError(UpdaterError.BAD_STATE, `Cannot update now: ${error.message}`));
let task = tasks.startTask(tasks.TASK_UPDATE, [ boxUpdateInfo ]); let task = tasks.startTask(tasks.TASK_UPDATE, [ boxUpdateInfo, options ]);
task.on('error', (error) => callback(new UpdaterError(UpdaterError.INTERNAL_ERROR, error))); task.on('error', (error) => callback(new UpdaterError(UpdaterError.INTERNAL_ERROR, error)));
task.on('start', (taskId) => { task.on('start', (taskId) => {
eventlog.add(eventlog.ACTION_UPDATE, auditSource, { taskId, boxUpdateInfo }); eventlog.add(eventlog.ACTION_UPDATE, auditSource, { taskId, boxUpdateInfo });