diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/app.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/app.js index 92f8d99..10380b0 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/app.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/app.js @@ -64,6 +64,8 @@ webdav.confIsValid().then( } ) +const cronTools = require('./tools/cronTools'); +cronTools.startCron(); module.exports = app; diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/package-lock.json b/nextcloud_backup/rootfs/opt/nextcloud_backup/package-lock.json index 5e7644a..a586030 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/package-lock.json +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/package-lock.json @@ -299,6 +299,14 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cron": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.2.tgz", + "integrity": "sha512-+SaJ2OfeRvfQqwXQ2kgr0Y5pzBR/lijf5OpnnaruwWnmI799JfWr2jN2ItOV9s3A/+TFOt6mxvKzQq5F0Jp6VQ==", + "requires": { + "moment-timezone": "^0.5.x" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1167,6 +1175,14 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, + "moment-timezone": { + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "requires": { + "moment": ">= 2.9.0" + } + }, "morgan": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json b/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json index 2fbe9ee..bfa3af5 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "cookie-parser": "~1.4.4", + "cron": "^1.7.2", "debug": "~2.6.9", "ejs": "~2.6.1", "express": "~4.16.1", diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js index 38d55d1..f578ccc 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js @@ -15,6 +15,7 @@ const cronTools = require('../tools/cronTools'); router.get('/status', (req, res, next) => { + cronTools.updatetNextDate(); let status = statusTools.getStatus(); res.json(status); }); @@ -26,8 +27,8 @@ router.get('/status', (req, res, next) => { router.get('/formated-local-snap', function(req, res, next) { hassioApiTools.getSnapshots().then( (snaps) => { - snaps.sort((a, b) =>{ - if(moment(a.date).isBefore(moment(b.date))) + snaps.sort((a, b) => { + if (moment(a.date).isBefore(moment(b.date))) return 1; else return -1; @@ -88,6 +89,13 @@ router.get('/nextcloud-settings', function(req, res, next) { router.post('/manual-backup', function(req, res, next) { let id = req.query.id; let name = req.query.name; + let status = statusTools.getStatus(); + if (status.status == "creating" && status.status == "upload" && status.status == "download"){ + res.status(503); + res.send(); + return; + } + hassioApiTools.downloadSnapshot(id) .then(() => { webdav.uploadFile(id, '/Hassio Backup/Manual/' + name + '.tar'); @@ -102,7 +110,13 @@ router.post('/manual-backup', function(req, res, next) { }); router.post('/new-backup', function(req, res, next) { - + + let status = statusTools.getStatus(); + if (status.status == "creating" && status.status == "upload" && status.status == "download"){ + res.status(503); + res.send(); + return; + } let name = 'Manual-' + moment().format('YYYY-MM-DD_HH:mm'); hassioApiTools.createNewBackup(name).then((id) => { hassioApiTools.downloadSnapshot(id) @@ -119,23 +133,23 @@ router.post('/new-backup', function(req, res, next) { }); -router.get('/backup-settings', function(req, res, next){ +router.get('/backup-settings', function(req, res, next) { res.send(settingsTools.getSettings()); }); -router.post('/backup-settings', function(req, res, next){ - //TODO check if config is valid - if(cronTools.checkConfig(req.body)){ +router.post('/backup-settings', function(req, res, next) { + if (cronTools.checkConfig(req.body)) { settingsTools.setSettings(req.body); + cronTools.startCron(); res.send(); } - else{ + else { res.status(400); res.send(); } - - + + }); diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/cronTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/cronTools.js index ba269d0..af6e055 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/cronTools.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/cronTools.js @@ -1,4 +1,14 @@ +const settingsTools = require('./settingsTools'); +const WebdavTools = require('./webdavTools') +const webdav = new WebdavTools().getInstance(); + +const hassioApiTools = require('./hassioApiTools'); + +const statusTools = require('./status'); + +var CronJob = require('cron').CronJob; +const moment = require('moment'); function checkConfig(conf) { if (conf.cron_base != null) { @@ -17,15 +27,15 @@ function checkConfig(conf) { else return false; } - - if ( conf.cron_base == '3'){ + + if (conf.cron_base == '3') { if (conf.cron_month_day != null && conf.cron_month_day >= 1 && conf.cron_month_day <= 28) return true; else return false; } - if(conf.cron_base == '0') + if (conf.cron_base == '0') return true } else @@ -34,4 +44,103 @@ function checkConfig(conf) { return false; } -exports.checkConfig = checkConfig; \ No newline at end of file +function startCron() { + let cronContainer = new Singleton().getInstance(); + cronContainer.init(); +} + +function updatetNextDate(){ + let cronContainer = new Singleton().getInstance(); + cronContainer.updatetNextDate(); +} + + +class CronContainer { + constructor() { + this.cronJob = null; + } + + init() { + let settings = settingsTools.getSettings(); + let cronStr = ""; + if (this.cronJob != null) { + console.log("Stoping Cron...") + this.cronJob.stop(); + this.cronJob = null; + } + switch (settings.cron_base) { + case '0': + console.log("No Cron settings available.") + return; + case '1': { + let splited = settings.cron_hour.split(':'); + cronStr = "" + splited[1] + " " + splited[0] + " * * *"; + break; + } + + case '2': { + let splited = settings.cron_hour.split(':'); + cronStr = "" + splited[1] + " " + splited[0] + " * * " + settings.cron_weekday; + break; + } + + case '3': { + let splited = settings.cron_hour.split(':'); + cronStr = "" + splited[1] + " " + splited[0] + " " + settings.cron_month_day + " * *"; + break; + } + + + } + console.log("Starting Cron...") + this.cronJob = new CronJob(cronStr, this._createBackup, null, false, Intl.DateTimeFormat().resolvedOptions().timeZone); + this.cronJob.start(); + this.updatetNextDate(); + } + + updatetNextDate() { + let date; + if( this.cronJob == null) + date = "Not configured"; + else + date = this.cronJob.nextDate().format('MMM D, YYYY HH:mm'); + let status = statusTools.getStatus(); + status.next_backup = date; + statusTools.setStatus(status); + } + + _createBackup() { + let status = statusTools.getStatus(); + if(status.status == "creating" && status.status == "upload" && status.status == "download") + return; + + let name = 'Auto-' + moment().format('YYYY-MM-DD_HH:mm'); + hassioApiTools.createNewBackup(name).then((id) => { + hassioApiTools.downloadSnapshot(id) + .then(() => { + webdav.uploadFile(id, '/Hassio Backup/Auto/' + name + '.tar'); + }).catch(() => { + + }) + }).catch(() => { + + }) + } +} + + +class Singleton { + constructor() { + if (!Singleton.instance) { + Singleton.instance = new CronContainer(); + } + } + + getInstance() { + return Singleton.instance; + } +} + +exports.checkConfig = checkConfig; +exports.startCron = startCron; +exports.updatetNextDate = updatetNextDate; \ No newline at end of file diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs index 377133b..cdd9241 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs @@ -125,7 +125,7 @@
Next Backup
-
+
@@ -241,13 +241,13 @@
@@ -414,6 +414,10 @@ if ($('#last_back_status').html() != data.last_backup) $('#last_back_status').html(data.last_backup); } + if (data.next_backup != null) { + if ($('#next_back_status').html() != data.next_backup) + $('#next_back_status').html(data.next_backup); + } }