Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c93c06ba88 | ||
|
|
36d64b3566 | ||
|
|
e0c531564c | ||
|
|
1e0ec75f0a | ||
|
|
36ac02d29f |
4
CHANGES
4
CHANGES
@@ -1593,3 +1593,7 @@
|
||||
* Make it easier to import email
|
||||
* Give SFTP access only to admins
|
||||
|
||||
[4.0.2]
|
||||
* Fix GCDNS crash
|
||||
* Add option to update without backing up
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ function boxAutoupdatePatternChanged(pattern) {
|
||||
var updateInfo = updateChecker.getUpdateInfo();
|
||||
if (updateInfo.box) {
|
||||
debug('Starting autoupdate to %j', updateInfo.box);
|
||||
updater.updateToLatest(auditSource.CRON, NOOP_CALLBACK);
|
||||
updater.updateToLatest({ skipBackup: false }, auditSource.CRON, NOOP_CALLBACK);
|
||||
} else {
|
||||
debug('No box auto updates available');
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ var assert = require('assert'),
|
||||
dns = require('../native-dns.js'),
|
||||
domains = require('../domains.js'),
|
||||
DomainsError = require('../domains.js').DomainsError,
|
||||
GCDNS = require('@google-cloud/dns'),
|
||||
GCDNS = require('@google-cloud/dns').DNS,
|
||||
util = require('util'),
|
||||
waitForDns = require('./waitfordns.js'),
|
||||
_ = require('underscore');
|
||||
@@ -46,7 +46,7 @@ function getZoneByName(dnsConfig, zoneName, callback) {
|
||||
assert.strictEqual(typeof zoneName, 'string');
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
|
||||
var gcdns = GCDNS(getDnsCredentials(dnsConfig));
|
||||
var gcdns = new GCDNS(getDnsCredentials(dnsConfig));
|
||||
|
||||
gcdns.getZones(function (error, zones) {
|
||||
if (error && error.message === 'invalid_grant') return callback(new DomainsError(DomainsError.ACCESS_DENIED, 'The key was probably revoked'));
|
||||
|
||||
@@ -57,8 +57,10 @@ function getDisks(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
|
||||
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.BAD_STATE) return next(new HttpError(409, error.message));
|
||||
if (error) return next(new HttpError(500, error));
|
||||
|
||||
@@ -38,7 +38,7 @@ function update(req, res, next) {
|
||||
debug('triggering update');
|
||||
|
||||
// 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.BAD_STATE) return next(new HttpError(409, error.message));
|
||||
if (error) return next(new HttpError(500, error));
|
||||
|
||||
@@ -25,7 +25,7 @@ var assert = require('assert'),
|
||||
BackupsError = require('../backups.js').BackupsError,
|
||||
debug = require('debug')('box:storage/gcs'),
|
||||
EventEmitter = require('events'),
|
||||
GCS = require('@google-cloud/storage'),
|
||||
GCS = require('@google-cloud/storage').Storage,
|
||||
PassThrough = require('stream').PassThrough,
|
||||
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
|
||||
|
||||
@@ -263,7 +263,7 @@ function copy(apiConfig, oldFilePath, newFilePath) {
|
||||
endBytes = startBytes + chunkSize;
|
||||
if (endBytes > size) endBytes = size;
|
||||
|
||||
var params = {
|
||||
var partCopyParams = {
|
||||
Bucket: apiConfig.bucket,
|
||||
Key: path.join(newFilePath, relativePath),
|
||||
CopySource: encodeCopySource(apiConfig.bucket, entry.fullPath), // See aws-sdk-js/issues/1302
|
||||
@@ -272,12 +272,12 @@ function copy(apiConfig, oldFilePath, newFilePath) {
|
||||
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);
|
||||
|
||||
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 });
|
||||
|
||||
@@ -287,16 +287,16 @@ function copy(apiConfig, oldFilePath, newFilePath) {
|
||||
return copyNextChunk();
|
||||
}
|
||||
|
||||
var params = {
|
||||
var completeMultipartParams = {
|
||||
Bucket: apiConfig.bucket,
|
||||
Key: path.join(newFilePath, relativePath),
|
||||
MultipartUpload: { Parts: uploadedParts },
|
||||
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) {
|
||||
++retryCount;
|
||||
events.emit('progress', `Retrying (${response.retryCount+1}) multipart copy of ${relativePath || oldFilePath}. Error: ${response.error} ${response.httpResponse.statusCode}`);
|
||||
|
||||
@@ -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(options && typeof options === 'object');
|
||||
assert.strictEqual(typeof progressCallback, 'function');
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
|
||||
@@ -164,9 +165,15 @@ function update(boxUpdateInfo, progressCallback, callback) {
|
||||
downloadAndVerifyRelease(boxUpdateInfo, function (error, packageInfo) {
|
||||
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);
|
||||
|
||||
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 callback, 'function');
|
||||
|
||||
@@ -215,7 +223,7 @@ function updateToLatest(auditSource, callback) {
|
||||
error = locker.lock(locker.OP_BOX_UPDATE);
|
||||
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('start', (taskId) => {
|
||||
eventlog.add(eventlog.ACTION_UPDATE, auditSource, { taskId, boxUpdateInfo });
|
||||
|
||||
Reference in New Issue
Block a user