1
0
Fork 0
mirror of https://github.com/Ylianst/MeshCentral.git synced 2025-03-09 15:40:18 +00:00

First version of auto-upload backup to Google Cloud.

This commit is contained in:
Ylian Saint-Hilaire 2020-08-21 01:57:03 -07:00
parent 335d05a8ec
commit 9d1b0f6134
71 changed files with 1975 additions and 1840 deletions

55
db.js
View file

@ -1329,7 +1329,7 @@ module.exports.CreateDB = function (parent, func) {
} else {
archive = archiver('zip', { zlib: { level: 9 } });
}
output.on('close', function () { obj.performingBackup = false; setTimeout(function () { try { parent.fs.unlink(newBackupPath + '.archive', function () { }); } catch (ex) { console.log(ex); } }, 5000); });
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); });
output.on('end', function () { });
archive.on('warning', function (err) { console.log('Backup warning: ' + err); });
archive.on('error', function (err) { console.log('Backup error: ' + err); });
@ -1350,7 +1350,7 @@ module.exports.CreateDB = function (parent, func) {
} else {
archive = archiver('zip', { zlib: { level: 9 } });
}
output.on('close', function () { obj.performingBackup = false; });
output.on('close', function () { obj.performingBackup = false; obj.performCloudBackup(newAutoBackupPath + '.zip'); });
output.on('end', function () { });
archive.on('warning', function (err) { console.log('Backup warning: ' + err); });
archive.on('error', function (err) { console.log('Backup error: ' + err); });
@ -1384,6 +1384,57 @@ module.exports.CreateDB = function (parent, func) {
return 0;
}
// Perform cloud backup
obj.performCloudBackup = function(filename) {
if (parent.config.settings.autobackup.googledrive != true) return;
obj.Get('GoogleDriveBackup', function (err, docs) {
if ((err != null) || (docs.length != 1) || (docs[0].state == 3)) return;
const {google} = require('googleapis');
const oAuth2Client = new google.auth.OAuth2(docs[0].clientid, docs[0].clientsecret, "urn:ietf:wg:oauth:2.0:oob");
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
oAuth2Client.setCredentials(docs[0].token);
const drive = google.drive({ version: 'v3', auth: oAuth2Client });
const createdTimeSort = function (a, b) { if (a.createdTime > b.createdTime) return 1; if (a.createdTime < b.createdTime) return -1; return 0; }
// Called once we know our folder id, clean up and upload a backup.
var useGoogleDrive = function (folderid) {
// List files to see if we need to delete some
drive.files.list({
q: 'trashed = false and \'' + folderid + '\' in parents',
fields: 'nextPageToken, files(id, name, size, createdTime)',
}, function (err, res) {
if (err) { console.log('GoogleDrive error: ' + err); return; }
// Delete any old files if more than 10 files are present in the backup folder.
res.data.files.sort(createdTimeSort);
while (res.data.files.length > 10) { drive.files.delete({ fileId: res.data.files.shift().id }, function (err, res) { }); }
});
// Upload the backup
drive.files.create({
requestBody: { name: require('path').basename(filename), mimeType: 'text/plain', parents: [folderid] },
media: { mimeType: 'application/zip', body: require('fs').createReadStream(filename) },
}, function (err, res) {
if (err) { console.log('GoogleDrive error: ' + err); return; }
});
}
// Find our backup folder, create one if needed.
drive.files.list({
q: 'mimeType = \'application/vnd.google-apps.folder\' and name=\'MeshCentral-Backups\' and trashed = false',
fields: 'nextPageToken, files(id, name)',
}, function (err, res) {
if (err) { console.log('GoogleDrive error: ' + err); return; }
if (res.data.files.length == 0) {
// Create a folder
drive.files.create({ resource: { 'name': 'MeshCentral-Backups', 'mimeType': 'application/vnd.google-apps.folder' }, fields: 'id' }, function (err, file) {
if (err) { console.log('GoogleDrive error: ' + err); return; }
useGoogleDrive(file.data.id);
});
} else { useGoogleDrive(res.data.files[0].id); }
});
});
}
function padNumber(number, digits) { return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number; }
// Called when a node has changed