Improved messages when using autobackup command in MyServer console.

Ylian Saint-Hilaire committed Sep 8, 2020 at 13:02 UTC fb0994e77e49de457e226bfdf22e3a7ad0f53005
2 files changed +35 -13
db.js
+32 -12
@@ -1315,7 +1315,7 @@ module.exports.CreateDB = function (parent, func) {
1315 }
1316
1317 obj.performingBackup = false;
1318 - obj.performBackup = function () {
1318 + obj.performBackup = function (func) {
1319 try {
1320 if (obj.performingBackup) return 1;
1321 obj.performingBackup = true;
@@ -1355,10 +1355,10 @@ module.exports.CreateDB = function (parent, func) {
1355 } else {
1356 archive = archiver('zip', { zlib: { level: 9 } });
1357 }
1358 - output.on('close', function () { obj.performingBackup = false; obj.performCloudBackup(newAutoBackupPath + '.zip'); setTimeout(function () { try { parent.fs.unlink(newBackupPath + '.archive', function () { }); } catch (ex) { console.log(ex); } }, 5000); });
1358 + output.on('close', function () { obj.performingBackup = false; if (func) { func('Auto-backup completed.'); } obj.performCloudBackup(newAutoBackupPath + '.zip', func); setTimeout(function () { try { parent.fs.unlink(newBackupPath + '.archive', function () { }); } catch (ex) { console.log(ex); } }, 5000); });
1359 output.on('end', function () { });
1360 - archive.on('warning', function (err) { console.log('Backup warning: ' + err); });
1361 - archive.on('error', function (err) { console.log('Backup error: ' + err); });
1360 + archive.on('warning', function (err) { console.log('Backup warning: ' + err); if (func) { func('Backup warning: ' + err); } });
1361 + archive.on('error', function (err) { console.log('Backup error: ' + err); if (func) { func('Backup error: ' + err); } });
1362 archive.pipe(output);
1363 archive.file(newBackupPath + '.archive', { name: newBackupFile + '.archive' });
1364 archive.directory(parent.datapath, 'meshcentral-data');
@@ -1376,10 +1376,10 @@ module.exports.CreateDB = function (parent, func) {
1376 } else {
1377 archive = archiver('zip', { zlib: { level: 9 } });
1378 }
1379 - output.on('close', function () { obj.performingBackup = false; obj.performCloudBackup(newAutoBackupPath + '.zip'); });
1379 + output.on('close', function () { obj.performingBackup = false; if (func) { func('Auto-backup completed.'); } obj.performCloudBackup(newAutoBackupPath + '.zip', func); });
1380 output.on('end', function () { });
1381 - archive.on('warning', function (err) { console.log('Backup warning: ' + err); });
1382 - archive.on('error', function (err) { console.log('Backup error: ' + err); });
1381 + archive.on('warning', function (err) { console.log('Backup warning: ' + err); if (func) { func('Backup warning: ' + err); } });
1382 + archive.on('error', function (err) { console.log('Backup error: ' + err); if (func) { func('Backup error: ' + err); } });
1383 archive.pipe(output);
1384 archive.directory(parent.datapath, 'meshcentral-data');
1385 archive.finalize();
@@ -1411,10 +1411,11 @@ module.exports.CreateDB = function (parent, func) {
1411 }
1412
1413 // Perform cloud backup
1414 - obj.performCloudBackup = function (filename) {
1414 + obj.performCloudBackup = function (filename, func) {
1415 if (typeof parent.config.settings.autobackup.googledrive != 'object') return;
1416 obj.Get('GoogleDriveBackup', function (err, docs) {
1417 if ((err != null) || (docs.length != 1) || (docs[0].state != 3)) return;
1418 + if (func) { func('Attempting Google Drive upload...'); }
1419 const {google} = require('googleapis');
1420 const oAuth2Client = new google.auth.OAuth2(docs[0].clientid, docs[0].clientsecret, "urn:ietf:wg:oauth:2.0:oob");
1421 oAuth2Client.on('tokens', function(tokens) { if (tokens.refresh_token) { docs[0].token = tokens.refresh_token; parent.db.Set(docs[0]); } }); // Update the token in the database
@@ -1430,7 +1431,11 @@ module.exports.CreateDB = function (parent, func) {
1431 q: 'trashed = false and \'' + folderid + '\' in parents',
1432 fields: 'nextPageToken, files(id, name, size, createdTime)',
1433 }, function (err, res) {
1433 - if (err) { console.log('GoogleDrive (files.list) error: ' + err); return; }
1434 + if (err) {
1435 + console.log('GoogleDrive (files.list) error: ' + err);
1436 + if (func) { func('GoogleDrive (files.list) error: ' + err); }
1437 + return;
1438 + }
1439 // Delete any old files if more than 10 files are present in the backup folder.
1440 res.data.files.sort(createdTimeSort);
1441 while (res.data.files.length >= parent.config.settings.autobackup.googledrive.maxfiles) { drive.files.delete({ fileId: res.data.files.shift().id }, function (err, res) { }); }
@@ -1438,13 +1443,20 @@ module.exports.CreateDB = function (parent, func) {
1443 }
1444
1445 //console.log('Uploading...');
1446 + if (func) { func('Uploading to Google Drive...'); }
1447 +
1448 // Upload the backup
1449 drive.files.create({
1450 requestBody: { name: require('path').basename(filename), mimeType: 'text/plain', parents: [folderid] },
1451 media: { mimeType: 'application/zip', body: require('fs').createReadStream(filename) },
1452 }, function (err, res) {
1446 - if (err) { console.log('GoogleDrive (files.create) error: ' + err); return; }
1453 + if (err) {
1454 + console.log('GoogleDrive (files.create) error: ' + err);
1455 + if (func) { func('GoogleDrive (files.create) error: ' + err); }
1456 + return;
1457 + }
1458 //console.log('Upload done.');
1459 + if (func) { func('Google Drive upload completed.'); }
1460 });
1461 }
1462
@@ -1457,11 +1469,19 @@ module.exports.CreateDB = function (parent, func) {
1469 q: 'mimeType = \'application/vnd.google-apps.folder\' and name=\'' + folderName + '\' and trashed = false',
1470 fields: 'nextPageToken, files(id, name)',
1471 }, function (err, res) {
1460 - if (err) { console.log('GoogleDrive error: ' + err); return; }
1472 + if (err) {
1473 + console.log('GoogleDrive error: ' + err);
1474 + if (func) { func('GoogleDrive error: ' + err); }
1475 + return;
1476 + }
1477 if (res.data.files.length == 0) {
1478 // Create a folder
1479 drive.files.create({ resource: { 'name': folderName, 'mimeType': 'application/vnd.google-apps.folder' }, fields: 'id' }, function (err, file) {
1464 - if (err) { console.log('GoogleDrive (folder.create) error: ' + err); return; }
1480 + if (err) {
1481 + console.log('GoogleDrive (folder.create) error: ' + err);
1482 + if (func) { func('GoogleDrive (folder.create) error: ' + err); }
1483 + return;
1484 + }
1485 useGoogleDrive(file.data.id);
1486 });
1487 } else { useGoogleDrive(res.data.files[0].id); }
meshuser.js
+3 -1
@@ -1197,7 +1197,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1197 break;
1198 }
1199 case 'autobackup': {
1200 - var backupResult = parent.db.performBackup();
1200 + var backupResult = parent.db.performBackup(function (msg) {
1201 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: msg, tag: command.tag })); } catch (ex) { }
1202 + });
1203 if (backupResult == 0) { r = 'Starting auto-backup...'; } else { r = 'Backup alreay in progress.'; }
1204 break;
1205 }