diff --git a/CHANGES b/CHANGES index 9438a157c..212262aba 100644 --- a/CHANGES +++ b/CHANGES @@ -1776,3 +1776,6 @@ * Update nodejs to 12.14.1 * Update MySQL addon packet size to 64M +[4.5.0] +* Show backup disk usage in graphs + diff --git a/src/apptask.js b/src/apptask.js index 2aa9dc414..11fa09155 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -52,7 +52,7 @@ var addons = require('./addons.js'), util = require('util'), _ = require('underscore'); -const COLLECTD_CONFIG_EJS = fs.readFileSync(__dirname + '/collectd.config.ejs', { encoding: 'utf8' }), +const COLLECTD_CONFIG_EJS = fs.readFileSync(__dirname + '/collectd/app.ejs', { encoding: 'utf8' }), MV_VOLUME_CMD = path.join(__dirname, 'scripts/mvvolume.sh'), LOGROTATE_CONFIG_EJS = fs.readFileSync(__dirname + '/logrotate.ejs', { encoding: 'utf8' }), CONFIGURE_LOGROTATE_CMD = path.join(__dirname, 'scripts/configurelogrotate.sh'); diff --git a/src/backups.js b/src/backups.js index a4111376c..cb38773ea 100644 --- a/src/backups.js +++ b/src/backups.js @@ -30,6 +30,8 @@ exports = module.exports = { checkConfiguration: checkConfiguration, + configureCollectd: configureCollectd, + SECRET_PLACEHOLDER: String.fromCharCode(0x25CF).repeat(8), // for testing @@ -44,12 +46,14 @@ var addons = require('./addons.js'), assert = require('assert'), backupdb = require('./backupdb.js'), BoxError = require('./boxerror.js'), + collectd = require('./collectd.js'), constants = require('./constants.js'), crypto = require('crypto'), database = require('./database.js'), DataLayout = require('./datalayout.js'), debug = require('debug')('box:backups'), df = require('@sindresorhus/df'), + ejs = require('ejs'), eventlog = require('./eventlog.js'), fs = require('fs'), locker = require('./locker.js'), @@ -69,6 +73,7 @@ var addons = require('./addons.js'), zlib = require('zlib'); const BACKUP_UPLOAD_CMD = path.join(__dirname, 'scripts/backupupload.js'); +const COLLECTD_CONFIG_EJS = fs.readFileSync(__dirname + '/collectd/cloudron-backup.ejs', { encoding: 'utf8' }); function debugApp(app) { assert(typeof app === 'object'); @@ -1302,3 +1307,15 @@ function checkConfiguration(callback) { callback(null, message); }); } + +function configureCollectd(backupConfig, callback) { + assert.strictEqual(typeof backupConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (backupConfig.provider === 'filesystem') { + const collectdConf = ejs.render(COLLECTD_CONFIG_EJS, { backupDir: backupConfig.backupFolder }); + collectd.addProfile('cloudron-backup', collectdConf, callback); + } else { + collectd.removeProfile('cloudron-backup', callback); + } +} \ No newline at end of file diff --git a/src/collectd.config.ejs b/src/collectd/app.ejs similarity index 100% rename from src/collectd.config.ejs rename to src/collectd/app.ejs diff --git a/src/collectd/cloudron-backup.ejs b/src/collectd/cloudron-backup.ejs new file mode 100644 index 000000000..1dab316c0 --- /dev/null +++ b/src/collectd/cloudron-backup.ejs @@ -0,0 +1,9 @@ + + + + Instance "cloudron-backup" + Dir "<%= backupDir %>" + + + + diff --git a/src/settings.js b/src/settings.js index 6e5781fa4..a2d2a18ca 100644 --- a/src/settings.js +++ b/src/settings.js @@ -378,7 +378,7 @@ function setBackupConfig(backupConfig, callback) { notifyChange(exports.BACKUP_CONFIG_KEY, backupConfig); - callback(null); + backups.configureCollectd(backupConfig, callback); }); }); }); diff --git a/src/system.js b/src/system.js index 18b6782af..f861692ec 100644 --- a/src/system.js +++ b/src/system.js @@ -16,7 +16,8 @@ const apps = require('./apps.js'), notifications = require('./notifications.js'), os = require('os'), paths = require('./paths.js'), - safe = require('safetydance'); + safe = require('safetydance'), + settings = require('./settings.js'); function getDisks(callback) { assert.strictEqual(typeof callback, 'function'); @@ -45,6 +46,7 @@ function getDisks(callback) { platformDataDisk: values[2].filesystem, appsDataDisk: values[3].filesystem, dockerDataDisk: values[4].filesystem, + backupsDisk: null, apps: {} }; @@ -64,7 +66,18 @@ function getDisks(callback) { }, function (error) { if (error) return callback(error); - callback(null, disks); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(error); + + if (backupConfig.provider !== 'filesystem') return callback(null, disks); + + dfFileAsync(backupConfig.backupFolder, function (error, result) { + if (error) return callback(error); + + disks.backupsDisk = result.filesystem; + callback(null, disks); + }); + }); }); }); });