Support for backup, import, export of templates

v0.1.7
Dan Krieger 2016-05-09 15:42:36 -07:00
parent 70ebf96e3e
commit e28c9b54b9
4 changed files with 81 additions and 30 deletions

36
app.js
View File

@ -108,11 +108,18 @@ app.get(routes.backup, function(req, res) {
app.get(routes.restore, function(req, res) { app.get(routes.restore, function(req, res) {
// get all the crontabs // get all the crontabs
restore.crontabs(req.query.db, function(docs){ restore.loadBackupFile(req.query.db, function(docs, templates) {
res.render('restore', { res.render('restore', {
routes : JSON.stringify(routes), routes : JSON.stringify(routes),
crontabs : JSON.stringify(docs), crontabs : JSON.stringify(docs),
templates: templates,
templatesById: templates.reduce(function(memo, t) {
memo[t._id] = t;
return memo;
}, {}),
backups : crontab.get_backup_names(), backups : crontab.get_backup_names(),
env : crontab.get_env(),
moment: moment,
db: req.query.db db: req.query.db
}); });
}); });
@ -129,31 +136,30 @@ app.get(routes.restore_backup, function(req, res) {
}) })
app.get(routes.export, 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); res.setHeader('Content-disposition', 'attachment; filename=crontab_ui_backup.json');
var mimetype = mime.lookup(file); res.setHeader('Content-type', 'application/json');
res.setHeader('Content-disposition', 'attachment; filename=' + filename); res.end(JSON.stringify(backupData));
res.setHeader('Content-type', mimetype); });
var filestream = fs.createReadStream(file);
filestream.pipe(res);
})
app.post(routes.import, function(req, res) { app.post(routes.import, function(req, res) {
var fstream; var fstream;
req.pipe(req.busboy); req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) { req.busboy.on('file', function (fieldname, file, filename) {
fstream = fs.createWriteStream(__dirname + '/crontabs/crontab.db');
file.pipe(fstream); file.on('data', function(data) {
fstream.on('close', function () { crontab.restore_data(JSON.parse(data.toString('utf8')));
crontab.reload_db(); crontab.reload_db();
});
});
req.busboy.on('finish', function() {
res.redirect(routes.root); res.redirect(routes.root);
});
});
}) })
});
app.get(routes.import_crontab, function(req, res) { app.get(routes.import_crontab, function(req, res) {
crontab.import_crontab() crontab.import_crontab()

View File

@ -1,8 +1,12 @@
//load database //load database
exports.crontab_db_file = __dirname + '/crontabs/crontab.db';
exports.templates_db_file = __dirname + '/crontabs/templates.db';
var Datastore = require('nedb'); var Datastore = require('nedb');
var db = { var db = {
crontabs: new Datastore({ filename: __dirname + '/crontabs/crontab.db', autoload: true }), crontabs: new Datastore({ filename: exports.crontab_db_file, autoload: true }),
templates: new Datastore({ filename: __dirname + '/crontabs/templates.db', autoload: true }), templates: new Datastore({ filename: exports.templates_db_file, autoload: true }),
}; };
var exec = require('child_process').exec; var exec = require('child_process').exec;
var fs = require('fs'); var fs = require('fs');
@ -166,18 +170,39 @@ exports.get_backup_names = function(){
return backups; return backups;
} }
exports.backup = function(){ exports.backup_data = function() {
//TODO check if it failed //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){ 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.crontabs.loadDatabase(); // reload the database
db.templates.loadDatabase();
} }
exports.reload_db = function(){ exports.reload_db = function(){
db.crontabs.loadDatabase(); db.crontabs.loadDatabase();
db.templates.loadDatabase();
} }
exports.get_env = function(){ exports.get_env = function(){

View File

@ -15,6 +15,7 @@
"mime": "latest", "mime": "latest",
"moment": "^2.13.0", "moment": "^2.13.0",
"nedb": "latest", "nedb": "latest",
"tmp": "0.0.28",
"underscore": "^1.8.3" "underscore": "^1.8.3"
}, },
"engines": { "engines": {

View File

@ -3,15 +3,34 @@ var Datastore = require('nedb');
var exec = require('child_process').exec; var exec = require('child_process').exec;
var fs = require('fs'); var fs = require('fs');
var tmp = require('tmp');
exports.crontabs = function(db_name, callback){ exports.loadBackupFile = function(db_name, callback) {
var db = new Datastore({ filename: __dirname + '/crontabs/' + db_name });
db.loadDatabase(function (err) { 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);
})
}); });
db.find({}).sort({ created: -1 }).exec(function(err, docs){
callback(docs); };
});
}
exports.delete = function(db_name){ exports.delete = function(db_name){
fs.unlink(__dirname + '/crontabs/' + db_name); fs.unlink(__dirname + '/crontabs/' + db_name);