From e28c9b54b940e6cbd1359536ccacec1e30678434 Mon Sep 17 00:00:00 2001 From: Dan Krieger Date: Mon, 9 May 2016 15:42:36 -0700 Subject: [PATCH] Support for backup, import, export of templates --- app.js | 40 +++++++++++++++++++++++----------------- crontab.js | 35 ++++++++++++++++++++++++++++++----- package.json | 1 + restore.js | 35 +++++++++++++++++++++++++++-------- 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/app.js b/app.js index b8b580f..2ccfa64 100755 --- a/app.js +++ b/app.js @@ -108,11 +108,18 @@ app.get(routes.backup, function(req, res) { app.get(routes.restore, function(req, res) { // get all the crontabs - restore.crontabs(req.query.db, function(docs){ + restore.loadBackupFile(req.query.db, function(docs, templates) { res.render('restore', { routes : JSON.stringify(routes), crontabs : JSON.stringify(docs), + templates: templates, + templatesById: templates.reduce(function(memo, t) { + memo[t._id] = t; + return memo; + }, {}), backups : crontab.get_backup_names(), + env : crontab.get_env(), + moment: moment, db: req.query.db }); }); @@ -129,31 +136,30 @@ app.get(routes.restore_backup, function(req, res) { }) app.get(routes.export, function(req, res) { - var file = __dirname + '/crontabs/crontab.db'; + var backupData = crontab.backup_data(); - var filename = path.basename(file); - var mimetype = mime.lookup(file); + res.setHeader('Content-disposition', 'attachment; filename=crontab_ui_backup.json'); + res.setHeader('Content-type', 'application/json'); - res.setHeader('Content-disposition', 'attachment; filename=' + filename); - res.setHeader('Content-type', mimetype); - - var filestream = fs.createReadStream(file); - filestream.pipe(res); -}) + res.end(JSON.stringify(backupData)); +}); app.post(routes.import, function(req, res) { var fstream; req.pipe(req.busboy); req.busboy.on('file', function (fieldname, file, filename) { - fstream = fs.createWriteStream(__dirname + '/crontabs/crontab.db'); - file.pipe(fstream); - fstream.on('close', function () { + + file.on('data', function(data) { + crontab.restore_data(JSON.parse(data.toString('utf8'))); crontab.reload_db(); - res.redirect(routes.root); - }); - }); -}) + }); + }); + + req.busboy.on('finish', function() { + res.redirect(routes.root); + }) +}); app.get(routes.import_crontab, function(req, res) { crontab.import_crontab() diff --git a/crontab.js b/crontab.js index 143dfd6..243807d 100644 --- a/crontab.js +++ b/crontab.js @@ -1,8 +1,12 @@ //load database + +exports.crontab_db_file = __dirname + '/crontabs/crontab.db'; +exports.templates_db_file = __dirname + '/crontabs/templates.db'; + var Datastore = require('nedb'); var db = { - crontabs: new Datastore({ filename: __dirname + '/crontabs/crontab.db', autoload: true }), - templates: new Datastore({ filename: __dirname + '/crontabs/templates.db', autoload: true }), + crontabs: new Datastore({ filename: exports.crontab_db_file, autoload: true }), + templates: new Datastore({ filename: exports.templates_db_file, autoload: true }), }; var exec = require('child_process').exec; var fs = require('fs'); @@ -166,18 +170,39 @@ exports.get_backup_names = function(){ return backups; } -exports.backup = function(){ +exports.backup_data = function() { //TODO check if it failed - fs.createReadStream( __dirname + '/crontabs/crontab.db').pipe(fs.createWriteStream( __dirname + '/crontabs/backup ' + (new Date()).toString().replace("+", " ") + '.db')); + var crontabData = fs.readFileSync( exports.crontab_db_file ).toString('utf8') + var templateData = fs.readFileSync( exports.templates_db_file ).toString('utf8') + + return { + version: 1, + crontabs: crontabData, + templates: templateData, + }; +} + +exports.backup = function(){ + var backupFile = __dirname + '/crontabs/backup ' + (new Date()).toString().replace("+", " ") + '.db'; + + fs.writeFileSync(backupFile, JSON.stringify(exports.backup_data())); } exports.restore = function(db_name){ - fs.createReadStream( __dirname + '/crontabs/' + db_name).pipe(fs.createWriteStream( __dirname + '/crontabs/crontab.db')); + exports.restore_data(JSON.parse(fs.readFileSync( __dirname + '/crontabs/' + db_name ))) +} + +exports.restore_data = function(backupData) { + fs.writeFileSync(exports.crontab_db_file, backupData.crontabs); + fs.writeFileSync(exports.templates_db_file, backupData.templates); + db.crontabs.loadDatabase(); // reload the database + db.templates.loadDatabase(); } exports.reload_db = function(){ db.crontabs.loadDatabase(); + db.templates.loadDatabase(); } exports.get_env = function(){ diff --git a/package.json b/package.json index 425f9f4..cee0e0e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "mime": "latest", "moment": "^2.13.0", "nedb": "latest", + "tmp": "0.0.28", "underscore": "^1.8.3" }, "engines": { diff --git a/restore.js b/restore.js index 637fe41..91348cd 100644 --- a/restore.js +++ b/restore.js @@ -3,15 +3,34 @@ var Datastore = require('nedb'); var exec = require('child_process').exec; var fs = require('fs'); +var tmp = require('tmp'); -exports.crontabs = function(db_name, callback){ - var db = new Datastore({ filename: __dirname + '/crontabs/' + db_name }); - db.loadDatabase(function (err) { - }); - db.find({}).sort({ created: -1 }).exec(function(err, docs){ - callback(docs); - }); -} +exports.loadBackupFile = function(db_name, callback) { + + console.log(__dirname + '/crontabs/' + db_name); + + var backupFileData = fs.readFileSync(__dirname + '/crontabs/' + db_name).toString('utf8'); + console.log(backupFileData); + var data = JSON.parse(backupFileData); + + + var crontabFile = tmp.fileSync(); + var templateFile = tmp.fileSync(); + + fs.writeFileSync(crontabFile.name, data.crontabs); + fs.writeFileSync(templateFile.name, data.templates); + + var crontabDB = new Datastore({ filename: crontabFile.name , autoload: true }); + var templateDB = new Datastore({ filename: templateFile.name , autoload: true }); + + crontabDB.find({}).sort({ created: -1 }).exec(function(err, docs){ + templateDB.find({}).sort({ name: 1 }).exec(function(err, templates) { + + callback(docs, templates); + }) + }); + +}; exports.delete = function(db_name){ fs.unlink(__dirname + '/crontabs/' + db_name);