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

38
app.js
View File

@ -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();
});
});
req.busboy.on('finish', function() {
res.redirect(routes.root);
});
});
})
})
});
app.get(routes.import_crontab, function(req, res) {
crontab.import_crontab()

View File

@ -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(){

View File

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

View File

@ -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) {
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);
})
});
db.find({}).sort({ created: -1 }).exec(function(err, docs){
callback(docs);
});
}
};
exports.delete = function(db_name){
fs.unlink(__dirname + '/crontabs/' + db_name);