165 lines
No EOL
4.2 KiB
JavaScript
165 lines
No EOL
4.2 KiB
JavaScript
var exec = require('child_process').exec,
|
|
fs = require ('fs'),
|
|
path = require('path'),
|
|
exec_helper = require('./exec_helper'),
|
|
redis = require('redis'),
|
|
client = redis.createClient(),
|
|
later = require('later').later;
|
|
enParser = require('later').enParser,
|
|
job_queue = [];
|
|
|
|
fs.exists || (fs.exists = path.exists);
|
|
|
|
function execute_job(file) {
|
|
exec_helper.execute_program(file, true);
|
|
console.log("execute_job");
|
|
console.log(file.key);
|
|
|
|
client.hmset(file.key, "last_run", new Date(), function() {
|
|
//repopulate the job list in the editor
|
|
});
|
|
}
|
|
|
|
function schedule_job(key, job) {
|
|
var is_new_job = true,
|
|
l = later(60),
|
|
schedule = enParser().parse(job.text);
|
|
|
|
l.exec(schedule, new Date(), execute_job, job);
|
|
console.log("Job Scheduled: ", schedule);
|
|
|
|
var len = job_queue.length;
|
|
for (var i=0; i<len; i++) {
|
|
if (job_queue[i].key === key) {
|
|
//job already exists, but has been modified, let's stop the existing one
|
|
job_queue[i].later.stopExec();
|
|
|
|
//replace it in the queue
|
|
job_queue[i] = {key: key, later: l};
|
|
|
|
is_new_job = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_new_job) {
|
|
job_queue.push({key: key, later: l});
|
|
}
|
|
|
|
//console.log(job_queue);
|
|
}
|
|
|
|
|
|
exports.emit_scheduled_jobs = function emit_scheduled_jobs(username, socket) {
|
|
var job_list = [];
|
|
client.smembers("jobs", function(err, res) {
|
|
res.forEach(function(key, i) {
|
|
client.hgetall(key, function(err, job_data) {
|
|
if (job_data.username === username) {
|
|
job_list.push(job_data);
|
|
}
|
|
|
|
if (res.length === (i+1)) {
|
|
socket.emit('scheduled-job-list', job_list);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
/*
|
|
* Create new schedule
|
|
*/
|
|
exports.add_schedule = function(schedule, socket, session) {
|
|
var self = this;
|
|
schedule.file.username = session.username;
|
|
var file_path = schedule.file.path.replace('\/filesystem\/', '\/repositories\/');
|
|
var key = "jobs:" + file_path.replace(/\W/g, ''); //keep only alphanumeric for key
|
|
var job_data = {
|
|
text: schedule.text,
|
|
name: schedule.file.name,
|
|
key: key,
|
|
last_run: "",
|
|
active: "1",
|
|
path: file_path,
|
|
extension: schedule.file.extension,
|
|
username: schedule.file.username
|
|
};
|
|
console.log("add_schedule");
|
|
console.log(job_data);
|
|
|
|
client.sadd("jobs", key, function() {
|
|
client.hmset(key, job_data, function() {
|
|
schedule_job(key, job_data);
|
|
//repopulate the job list in the editor
|
|
self.emit_scheduled_jobs(session.username, socket);
|
|
});
|
|
});
|
|
};
|
|
|
|
exports.delete_job = function(key, socket, session) {
|
|
var self = this;
|
|
var len = job_queue.length;
|
|
for (var i=0; i<len; i++) {
|
|
if (job_queue[i].key === key) {
|
|
//job exists, lets delete it
|
|
job_queue[i].later.stopExec();
|
|
//remove from array
|
|
job_queue.splice(i, 1);
|
|
//remove from redis
|
|
client.del(key);
|
|
client.srem("jobs", key);
|
|
//emit change to front-end
|
|
self.emit_scheduled_jobs(session.username, socket);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
exports.toggle_job = function(key, socket, session) {
|
|
var self = this;
|
|
console.log(key);
|
|
client.hgetall(key, function(err, job) {
|
|
console.log(job);
|
|
//toggle status
|
|
job.active = 1-job.active;
|
|
|
|
client.hmset(key, "active", job.active, function() {
|
|
if (!job.active) {
|
|
//remove job from queue, but not redis
|
|
var len = job_queue.length;
|
|
for (var i=0; i<len; i++) {
|
|
if (job_queue[i].key === key) {
|
|
//job exists, lets delete it
|
|
job_queue[i].later.stopExec();
|
|
//remove from array
|
|
job_queue.splice(i, 1);
|
|
//emit change to front-end
|
|
self.emit_scheduled_jobs(session.username, socket);
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
schedule_job(key, job);
|
|
//repopulate the job list in the editor
|
|
self.emit_scheduled_jobs(session.username, socket);
|
|
}
|
|
|
|
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
/*
|
|
* Jobs initialized at server startup
|
|
*/
|
|
exports.initialize_jobs = function() {
|
|
client.smembers("jobs", function(err, res) {
|
|
res.forEach(function(key) {
|
|
client.hgetall(key, function(err, job_data) {
|
|
schedule_job(key, job_data);
|
|
});
|
|
});
|
|
});
|
|
}; |