You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

170 lines
3.9 KiB

var express = require('express');
var app = express();
var crontab = require("./crontab");
var restore = require("./restore");
var moment = require('moment');
var path = require('path');
var mime = require('mime');
var fs = require('fs');
var busboy = require('connect-busboy'); // for file upload
// include the routes
var routes = require("./routes").routes;
// set the view engine to ejs
app.set('view engine', 'ejs');
var bodyParser = require('body-parser');
app.use( bodyParser.json() ); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
}));
app.use(busboy()); // to support file uploads
// include all folders
app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/public/css'));
app.use(express.static(__dirname + '/public/js'));
app.set('views', __dirname + '/views');
//set port
app.set('port', (process.env.PORT || 8000));
app.get(routes.root, function(req, res) {
// get all the crontabs
crontab.reload_db();
crontab.crontabs( function(docs){
res.render('index', {
routes : JSON.stringify(routes),
crontabs : JSON.stringify(docs),
backups : crontab.get_backup_names(),
env : crontab.get_env(),
moment: moment
});
});
});
app.post(routes.save, function(req, res) {
// new job
if(req.body._id == -1){
crontab.create_new(req.body.name, req.body.command, req.body.schedule, req.body.logging);
}
// edit job
else{
crontab.update(req.body);
}
res.end();
});
app.post(routes.stop, function(req, res) {
crontab.status(req.body._id, true);
res.end();
});
app.post(routes.start, function(req, res) {
crontab.status(req.body._id, false);
res.end();
});
app.post(routes.remove, function(req, res) {
crontab.remove(req.body._id);
res.end();
});
app.get(routes.crontab, function(req, res, next) {
crontab.set_crontab(req.query.env_vars, function(err) {
if (err) next(err);
else res.end();
});
});
app.get(routes.backup, function(req, res) {
crontab.backup();
res.end();
});
app.get(routes.restore, function(req, res) {
// get all the crontabs
restore.crontabs(req.query.db, function(docs){
res.render('restore', {
routes : JSON.stringify(routes),
crontabs : JSON.stringify(docs),
backups : crontab.get_backup_names(),
db: req.query.db
});
});
});
app.get(routes.delete_backup, function(req, res) {
restore.delete(req.query.db);
res.end();
});
app.get(routes.restore_backup, function(req, res) {
crontab.restore(req.query.db);
res.end();
});
app.get(routes.export, function(req, res) {
var file = __dirname + '/crontabs/crontab.db';
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
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 () {
crontab.reload_db();
res.redirect(routes.root);
});
});
});
app.get(routes.import_crontab, function(req, res) {
crontab.import_crontab();
res.end();
});
app.get(routes.logger, function(req, res) {
var fs = require("fs");
_file = crontab.log_folder +"/"+req.query.id+".log";
if (fs.existsSync(_file))
res.sendFile(_file);
else
res.end("No errors logged yet");
});
// error handler
app.use(function(err, req, res, next) {
var data = {};
var statusCode = err.statusCode || 500;
data.message = err.message || 'Internal Server Error';
if (process.env.NODE_ENV === 'development' && err.stack) {
data.stack = err.stack
}
if (parseInt(data.statusCode) >= 500) {
console.error(err);
}
res.status(statusCode).json(data);
});
app.listen(app.get('port'), function() {
console.log("Crontab UI is running at http://localhost:" + app.get('port'));
});